Advertisement
Guest User

Untitled

a guest
Jan 14th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. #!/bin/bash
  2. # Backup MySQL database with mysqldump
  3. #
  4. # #TODO: comannd line parameters
  5. # OPTIONS:
  6. # -f Check diff between last backup and save only if differs
  7. # -z <Y|M> Compress results Y - yearly, M - monthly
  8. # PARAMS:
  9. # -s <Server>
  10. # -d <Database>
  11. # -u <User>
  12. # -p <Password>
  13. # -t <table1 table2 ... tablen>
  14. # -b <backup folder>
  15.  
  16. self=$(basename $0)
  17. self_cfg=${self%.*}.cfg
  18.  
  19. #Set a default value for variables
  20. source ${self_cfg}
  21. #db_server="<MySQL Server Address>"
  22. #db_user="Backup Username"
  23. #db_pass="Backup Username Password"
  24. #db_name="Database Name"
  25.  
  26. #declare -A db_table
  27. #db_table['<table1>']="field1,field2,...,filedn"
  28. #db_table['<table2>']="*"
  29.  
  30. #do_diff=1 - compare with previos archive
  31. #save_diff=1 - store diff files
  32. #do_inc=0 - delete unmodified files
  33.  
  34. db_tables=${!db_table[@]}
  35. broot="/backup/${db_name}"
  36. droot=`mktemp -d`
  37. lroot=`mktemp -d`
  38.  
  39. chmod 777 ${droot}
  40. chmod 777 ${lroot}
  41.  
  42. opt_dump="--routines --events --triggers --quote-names --skip-add-drop-table"
  43. opt_diff="--ignore-case --ignore-tab-expansion --ignore-blank-lines --ignore-space-change --ignore-matching-lines=^-- -u"
  44. opt_zip="-9 --junk-paths --latest-time"
  45. opt_mysql="--host=${db_server} --user=${db_user} --password=${db_pass} ${db_name}"
  46.  
  47. Y=`date +%Y`
  48. M=`date +%m`
  49. D=`date +%d`
  50.  
  51. #TODO: process command line arguments
  52. #Process the arguments
  53. while getopts fz:s:d:u:p:t:b: opt; do
  54. case "$opt" in
  55. f) do_diff=1;;
  56. z) do_zip=${OPTARG^^};;
  57. s) db_server=$OPTARG;;
  58. d) db_name=$OPTARG;;
  59. u) db_user=$OPTARG;;
  60. p) db_pass=$OPTARG;;
  61. t) db_tables=$OPTARG;;
  62. b) backup_root=$OPTARG;;
  63. esac
  64. done
  65.  
  66. bfolder="${broot}/${Y}/${Y}-${M}"
  67. bfile="${broot}/${Y}/${Y}-${M}/${db_name}_${Y}-${M}-${D}.zip"
  68.  
  69. mkdir -p ${backup_folder}
  70.  
  71. # Dump Structure
  72. mysqldump ${opt_dump} --log-error="${bfile}.log" --user=${db_user} --password=${db_pass} ${db_name} ${db_tables} > "${droot}/mysqldump.sql
  73. "
  74.  
  75. # Dump Tables
  76. for tbl in ${db_tables}; do
  77. sql="SELECT ${db_table[${tbl}]} INTO OUTFILE '${droot}/${tbl}.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED
  78. BY '\\n' FROM ${tbl};"
  79. mysql ${opt_mysql} -e "${sql}" >> ${bfile}.log
  80. if [ -s ${droot}/${tbl}.csv ]; then
  81. echo "${db_table[${tbl}]}" > ${droot}/${tbl}.hdr
  82. else
  83. rm ${droot}/${tbl}.csv
  84. fi
  85. done
  86.  
  87. do_save=1
  88. if (( ${do_diff} )); then
  89. do_save=0
  90. flast=`find ${broot}/${Y} -name "*zip" -type f | xargs ls -tr | tail -1`
  91. unzip ${flast} -d ${lroot}
  92. for f in ${droot}/*.{csv,sql}; do
  93. fn=$(basename "$f")
  94. fl=${lroot}/$fn
  95. if [ -s $fl ]; then
  96. res_diff=`diff --brief ${opt_diff} $f $fl`
  97. if [ -n "${res_diff}" ]; then
  98. do_save=1
  99. if (( ${save_diff} )); then
  100. diff ${opt_diff} $f $fl > ${droot}/$fn.diff
  101. fi
  102. else
  103. if (( ${do_inc} )); then
  104. rm -f $f
  105. rm -f ${droot}/${fn%.*}.hdr
  106. fi
  107. fi
  108. fi
  109. done
  110. fi
  111.  
  112. # Pack Files
  113. if (( ${do_save} )); then
  114. zip ${opt_zip} -r ${bfile} "${droot}"
  115. fi
  116.  
  117. # Delete Temp Files
  118. rm --recursive --force ${droot}
  119. rm --recursive --force ${lroot}
  120. find ${broot} -type f -name *.log -size 0 -exec rm -f {} \;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement