auto_restore_from_backup 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/bin/bash
  2. armb_ver='4_090617'
  3. log_file=/var/log/${0##*/}.log
  4. lock_file=/tmp/${0##*/}.lock
  5. dumps_dir='/var/backups/mysql/daily_from_vs05'
  6. mysql_data_dir='/var/lib/mysql'
  7. db_name=''
  8. db_user=''
  9. db_pass=''
  10. db_connection_host=''
  11. mysql_bin="`which mysql` -u root -h localhost -p`cat /root/.mysql`"
  12. latest_dump=`find $dumps_dir -maxdepth 1 -type f -name "*.snapshot.sql.*" -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f 2`
  13. function update_date() {
  14. test -f $latest_dump || { echo "`date '+%Y/%m/%d:%H:%M:%S'` Error. File $latest_dump doesn't exist!"; return 1; }
  15. latest_date=`date '+%Y-%m-%d %H:%M:%S' -r $latest_dump`
  16. echo "`date '+%Y/%m/%d:%H:%M:%S'` Starting update date in table."
  17. $mysql_bin -B -N -e "UPDATE db_date SET mydate=\"${latest_date}\";" $db_name && \
  18. echo "`date '+%Y/%m/%d:%H:%M:%S'` Update date in table finished." || \
  19. { echo "`date '+%Y/%m/%d:%H:%M:%S'` Error. Something go wrong on update date in table."; return 1; }
  20. }
  21. function init_db() {
  22. echo "`date '+%Y/%m/%d:%H:%M:%S'` Starting function init_db"
  23. $mysql_bin -B -N -e "USE $db_name; CREATE TABLE db_date (mydate DATETIME); INSERT INTO db_date SET mydate=NOW();" && \
  24. echo "`date '+%Y/%m/%d:%H:%M:%S'` Table \"db_date\" created in $db_name. Starting function update_date" && \
  25. update_date
  26. echo "`date '+%Y/%m/%d:%H:%M:%S'` Create privileges"
  27. $mysql_bin -B -N -e "GRANT ALL PRIVILEGES ON $db_name.* TO db_user@$db_connection_host IDENTIFIED BY \"$db_pass\";"
  28. }
  29. function stop_mysql() {
  30. echo "`date '+%Y/%m/%d:%H:%M:%S'` Starting function stop_mysql"
  31. /etc/init.d/mysql stop
  32. if pgrep -x mysqld >/dev/null
  33. then
  34. echo "`date '+%Y/%m/%d:%H:%M:%S'` Error. Something go wrong, Mysql process still running!!!"
  35. return 1
  36. fi
  37. }
  38. function start_mysql() {
  39. echo "`date '+%Y/%m/%d:%H:%M:%S'` Starting function start_mysql"
  40. /etc/init.d/mysql start
  41. if ! pgrep -x mysqld >/dev/null
  42. then
  43. echo "`date '+%Y/%m/%d:%H:%M:%S'` Error. Something go wrong, Mysql process don't start!!!"
  44. return 1
  45. fi
  46. }
  47. function extract_dump() {
  48. echo "`date '+%Y/%m/%d:%H:%M:%S'` Extract dump-file $latest_dump to $mysql_data_dir"
  49. test -d $mysql_data_dir || mkdir -p $mysql_data_dir
  50. tar -xvzf $latest_dump -C $mysql_data_dir && \
  51. echo "`date '+%Y/%m/%d:%H:%M:%S'` Extract dump-file $latest_dump to $mysql_data_dir finished" || \
  52. { echo "`date '+%Y/%m/%d:%H:%M:%S'` Error. Something go wrong on extract dump-file $latest_dump to $mysql_data_dir!"; return 1; }
  53. }
  54. function change_datadir() {
  55. echo "`date '+%Y/%m/%d:%H:%M:%S'` Starting function move_datadir"
  56. which innobackupex > /dev/null 2>&1 || { echo "`date '+%Y/%m/%d:%H:%M:%S'`Error. No innobackupex installed!"; return 1; }
  57. stop_mysql && \
  58. test -d $mysql_data_dir -a "$mysql_data_dir" != '/' && {
  59. echo "`date '+%Y/%m/%d:%H:%M:%S'` Remove $mysql_data_dir"
  60. chattr -i $mysql_data_dir/my.cnf
  61. rm -rf $mysql_data_dir && \
  62. extract_dump && \
  63. chattr -i $mysql_data_dir/my.cnf && \
  64. chown -R mysql:mysql $mysql_data_dir
  65. } && \
  66. start_mysql
  67. }
  68. which flock > /dev/null || { echo "No flock installed. You need to install flock first."; exit 1;}
  69. {
  70. flock -n 9 || { echo "Another copy of ${0##*/} is still running on $myhostname. Lock file $lock_file locked.\n"; exit 1; }
  71. test -f $log_file && mv $log_file $log_file.1
  72. {
  73. echo "`date '+%Y/%m/%d:%H:%M:%S'` Importing dump-file $latest_dump"
  74. change_datadir && \
  75. init_db
  76. echo "`date '+%Y/%m/%d:%H:%M:%S'` Importing dump-file $latest_dump finished."
  77. } >> $log_file 2>> >(tee -a $log_file >&2)
  78. } 9> $lock_file
  79. test -f $lock_file && rm -f $lock_file