mysql使用innobackupex備份腳本

 好久沒有寫博客,今天更新一個mysql的備份腳本。腳本里面的help信息寫的很全了。

腳本還是有一些不太智能,不過不影響使用。

  1. #!/bin/bash 
  2.  
  3. #This is a ShellScript For mysql All DB Backup and Bin-log. 
  4. #version v1 
  5. #2013-04-12 
  6.  
  7. #此腳本爲一週一個全庫備份,每天一個增量備份。每週一爲全庫備份,其他爲增量備份。 
  8.  
  9. # Defaults setting 
  10. port=3306 
  11. weekly=1 
  12.  
  13. #setting 
  14. #設置數據庫名,數據庫登錄,備份路徑,日誌路徑,數據文件位置,以及備份方式 
  15. #默認情況下,用sock登錄mysql數據庫,備份至/data/backup/db_backup/ 
  16. BackupPath=/data/backup/db_backup/mysql_$port/ 
  17. LogFile=/var/log/innobackupex_mysql_$port.log 
  18. DBdataPath=/data/mysql_$port/data/ 
  19. innobackupex=/usr/bin/innobackupex 
  20. allbackup="$BackupPath""$port"_$(date +%Y-%m-%d)_full 
  21. mysqlbackup="$BackupPath"mysql_$(date +%Y-%m-%d) 
  22. frmbackup="$BackupPath"frm 
  23. weekly=1 
  24. next=$(expr $weekly + 1) 
  25. #Setting End 
  26.  
  27. recovery_single_table(){ 
  28. cat << EOF 
  29. 導入或導出單張表: 
  30.   默認情況下,InnoDB表不能通過直接複製表文件的方式在mysql服務器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能, 
  31. 不過,此時需要“導出”表的mysql服務器啓用了innodb_file_per_table選項(嚴格來說,是要“導出”的表在其創建之前,mysql服務器就啓用了innodb_file_per_table選項), 
  32. 並且“導入”表的服務器同時啓用了innodb_file_per_table和innodb_expand_import(innodb_import_table_from_xtrabackup=1)選項。 
  33.  
  34. (1)“導出”表 
  35.   導出表是在備份的prepare階段進行的,因此,一旦完全備份完成,就可以在prepare過程中通過--export選項將某表導出了: 
  36.   /usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log --use-memory=4G --export /data/backup/db_backup/mysql_3312/3312_2013-04-15_full 
  37.   /usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log --use-memory=4G --export --incremental --incremental-dir=/data/backup/db_backup/mysql_3312/3312_2013-04-16 /data/backup/db_backup/mysql_3312/3312_2013-04-15_full 
  38.   上面是基於增量備份的,所以--export兩次。多次類似。 
  39. (2)“導入”表 
  40.   要在mysql服務器上導入來自於其它服務器的某innodb表,需要先在當前服務器上創建一個跟原表表結構一致的表,而後才能實現將表導入: 
  41.   mysql> CREATE TABLE mytable (...)  ENGINE=InnoDB;或者如果表結構沒有問題的話,可以mysql> truncate table mytable; 
  42.   然後將此表的表空間刪除: 
  43.   mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE; 
  44.   接下來,將來自於“導出”表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,更改爲mysql.mysql的權限,然後使用如下命令將其“導入”: 
  45.   mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE; 
  46. EOF 
  47.  
  48. recovery_all_data(){ 
  49. cat << EOF 
  50. 全庫恢復: 
  51. 1.解壓包。 
  52. 2./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log /data/backup/db_backup/mysql_3312/3312_2013-04-15_full 
  53.   這裏的--apply-log指明是將日誌應用到數據文件上,完成之後將備份文件中的數據恢復到數據庫中. 
  54. 3./etc/init.d/mysql_3312 stop;cd /data/mysql_3312/;mv data data-bak;mkdir data;chown mysql.root data; 
  55.   要恢復需要停掉mysql,然後把數據文件刪掉,爲了保險把data文件夾改名,新建data文件夾。 
  56. 4./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --copy-back /data/backup/db_backup/mysql_3312/3312_2013-04-15_full 
  57.   這裏的--copy-back指明是進行數據恢復。數據恢復完成之後,需要修改相關文件的權限mysql數據庫才能正常啓動。 
  58. 5.chown -R mysql.root /data/mysql_3312/data/;/etc/init.d/mysql_3312 start 
  59.   恢復完之後,需要更改數據文件爲mysql的使用用戶,然後啓動mysql。 
  60. 6.從庫的話,需要查看xtrabackup_slave_info信息,看同步的MASTER_LOG_FILE和MASTER_LOG_POS。 
  61.   mysql> change master to master_host='172.16.2.25',master_port=3312,master_user='repl',master_password='xxx',master_log_file='mysql-bin.000902',master_log_pos=143068038; 
  62. EOF 
  63.  
  64. recovery_incremental_data(){ 
  65. cat << EOF 
  66. 增量恢復 
  67. 1.解壓包。 
  68. 2./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log /data/backup/db_backup/mysql_3312/3312_2013-04-15_full 
  69.   這裏的--apply-log指明是將日誌應用到數據文件上,完成之後將備份文件中的數據恢復到數據庫中. 
  70. 3./usr/bin/innobackupex --defaults-file=/data/mysql_3309/mysql_3309.cnf --apply-log --use-memory=4G --incremental --incremental-dir=/data/backup/db_backup/mysql_3312/3312_2013-04-16 /data/backup/db_backup/mysql_3312/3312_2013-04-15_full 
  71.   這裏的--incremental-dir爲全庫備份的(或者上一次備份的) 
  72. 4./etc/init.d/mysql_3312 stop;cd /data/mysql_3312/;mv data data-bak;mkdir data;chown mysql.root data; 
  73.   要恢復需要停掉mysql,然後把數據文件刪掉,爲了保險把data文件夾改名,新建data文件夾。 
  74. 5./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --copy-back --use-memory=4G /data/backup/db_backup/mysql_3312/3312_2013-04-15_full 
  75.   這裏的--copy-back指明是進行數據恢復。數據恢復完成之後,需要修改相關文件的權限mysql數據庫才能正常啓動。 
  76. 6.chown -R mysql.root /data/mysql_3312/data/;/etc/init.d/mysql_3312 start 
  77.   恢復完之後,需要更改數據文件爲mysql的使用用戶,然後啓動mysql。 
  78. 7.從庫的話,需要查看xtrabackup_slave_info信息,看同步的MASTER_LOG_FILE和MASTER_LOG_POS。 
  79.   mysql> change master to master_host='172.16.2.25',master_port=3312,master_user='repl',master_password='xxx',master_log_file='mysql-bin.000902',master_log_pos=143068038; 
  80. EOF 
  81.  
  82. usage(){ 
  83. cat << EOF 
  84. Usage: 
  85.   這是一個用來備份mysql的shell腳本,主要是用innobackupex來備份數據,用mysqldump來備份表結構,bin-log是每天備份前一天的。 
  86.   備份策略是每週一個全庫備份,其他天是增量備份。 
  87. Options: 
  88.   -h|--help 
  89.     顯示幫助信息。 
  90.   -p|--port 
  91.     設置mysql端口,默認3306. 
  92.   -w|weekly 
  93.     設置一週內哪一天進行全庫備份。默認週一. 
  94.   --recovery_single_table 
  95.     顯示恢復單張表方法. 
  96.   --recovery_all_data 
  97.     顯示全備份恢復方法. 
  98.   --recovery_incremental_data 
  99.     顯示增量備份恢復方法. 
  100.          
  101. Example: 
  102.   $0 -p 3307 -w 1 
  103. EOF 
  104.  
  105. while test -n "$1"; do 
  106.     case "$1" in 
  107.     -p|--port) 
  108.         port=$2 
  109.         shift 
  110.         ;; 
  111.     -h|--help) 
  112.         echo 
  113.         usage 
  114.         echo 
  115.         exit 
  116.         ;; 
  117.     -w|weekly) 
  118.         weekly=$2 
  119.         shift 
  120.         ;; 
  121.     --recovery_single_table) 
  122.         echo 
  123.         recovery_single_table 
  124.         echo 
  125.         exit 
  126.         ;; 
  127.     --recovery_all_data) 
  128.         echo 
  129.         recovery_all_data 
  130.         echo 
  131.         exit 
  132.         ;; 
  133.     --recovery_incremental_data) 
  134.         echo 
  135.         recovery_incremental_data 
  136.         echo 
  137.         exit 
  138.         ;; 
  139.     *) 
  140.         echo "Unknown argument: $1" 
  141.         usage 
  142.         echo  
  143.         exit 
  144.         ;; 
  145.     esac 
  146.     shift 
  147. done 
  148.  
  149. #setting 
  150. #設置數據庫名,數據庫登錄,備份路徑,日誌路徑,數據文件位置,以及備份方式 
  151. #默認情況下,用sock登錄mysql數據庫,備份至/data/backup/db_backup/ 
  152. BackupPath=/data/backup/db_backup/mysql_$port/ 
  153. LogFile=/var/log/innobackupex_mysql_$port.log 
  154. DBdataPath=/data/mysql_$port/data/ 
  155. innobackupex=/usr/bin/innobackupex 
  156. allbackup="$BackupPath""$port"_$(date +%Y-%m-%d)_full 
  157. frmbackup="$BackupPath"frm 
  158. next=$(expr $weekly + 1) 
  159. #Setting End 
  160.  
  161. echo "---------------------------------------------------------------------" >> $LogFile 
  162. echo " $(date +"%y-%m-%d %H:%M:%S") Start " >> $LogFile 
  163. echo "---------------------------------------------------------------------" >> $LogFile 
  164.  
  165. #check folder  
  166. if ! [ -d $BackupPath ];then 
  167.     /bin/mkdir -p $BackupPath 
  168. fi 
  169.  
  170. if ! [ -d $frmbackup ];then 
  171.     /bin/mkdir -p $frmbackup 
  172. fi 
  173.  
  174. if ! [ -d $BackupPath/mysql-bin ];then 
  175.     /bin/mkdir -p $BackupPath/mysql-bin 
  176. fi 
  177.  
  178. #Backup $port All Database 
  179. if [ -f "$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz ] || [ -f "$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz ];then 
  180.     echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz] || ["$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz]The Backup File is exists,Can't Backup!" >> $LogFile 
  181. else 
  182.     #full backup 
  183.     if [ $(date +%u) == $weekly ];then 
  184.             $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp $allbackup  >> /dev/null 2>&1 
  185.             cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d)_full.tar.gz "$port"_$(date +%Y-%m-%d)_full >> /dev/null 2>&1 
  186.             echo "["$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz]Backup Success!" >> $LogFile 
  187.         if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago') ];then 
  188.             rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago') 
  189.             echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full]Delete Success!" >> $LogFile 
  190.         else  
  191.             echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full] is not exist" >> $LogFile 
  192.         fi 
  193.     #incremental backup 
  194.     elif [ $(date +%u) == $next ];then 
  195.         $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp --incremental --incremental-basedir="$BackupPath""$port"_$(date +%Y-%m-%d --date='1 days ago')_full "$BackupPath""$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1 
  196.         cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d).tar.gz "$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1 
  197.         echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile 
  198.         if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago')_full ];then 
  199.             /bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full 
  200.             echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full]Delete Success!" >> $LogFile 
  201.         else 
  202.             echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full] is not exist" >> $LogFile 
  203.         fi 
  204.     else 
  205.         $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp --incremental --incremental-basedir="$BackupPath""$port"_$(date +%Y-%m-%d --date='1 days ago') "$BackupPath""$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1 
  206.         cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d).tar.gz "$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1 
  207.         echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile 
  208.         if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago') ];then 
  209.             /bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago') 
  210.             echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')]Delete Success!" >> $LogFile 
  211.         else 
  212.             echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')] is not exist" >> $LogFile 
  213.         fi 
  214.     fi 
  215. fi 
  216. ## backup database mysql ########## 
  217. #if [ -f "$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz ];then 
  218. #   echo "["$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz]The Backup File is exists,Can't Backup!" >> $LogFile 
  219. #else 
  220. #    /usr/bin/mysqlhotcopy --sock=/data/mysql_$port/mysql.sock mysql $mysqlbackup >> /dev/null 2>&1 
  221. #    tar -czf $mysqlbackup.tar.gz $mysqlbackup >> /dev/null 2>&1 
  222. #    /bin/rm -rf $mysqlbackup 
  223. #    echo "["$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile 
  224. #fi 
  225.  
  226. ## backup database .frm ########## 
  227. if [ -f "$frmbackup"/"$port"_$(date +%Y-%m-%d).sql ];then 
  228.     echo "["$frmbackup"/"$port"_$(date +%Y-%m-%d).sql]The Backup File is exists,Can't Backup!" >> $LogFile 
  229. else 
  230.     mysqldump --opt -d -A -S /data/mysql_$port/mysql.sock > "$frmbackup"/"$port"_$(date +%Y-%m-%d).sql 
  231.     echo "["$frmbackup"/"$port"_$(date +%Y-%m-%d).sql]Backup Success!" >> $LogFile 
  232. fi 
  233.  
  234. ## backup mysql-bin ############## 
  235. for binlog in $(find /data/mysql_$port/data/ -name "mysql-bin*"  -mtime 1);do 
  236.     /bin/cp $binlog "$BackupPath"mysql-bin/ 
  237.     echo "[$binlog]Backup Success! " >> $LogFile 
  238. done 
  239. /usr/bin/mysql -S /data/mysql_$port/mysql.sock -e 'flush logs;' 
  240.  
  241. echo "-----------------------------------------------------------------------" >> $LogFile 
  242. echo " $(date +"%y-%m-%d %H:%M:%S") Finish " >> $LogFile 
  243. echo "-----------------------------------------------------------------------" >> $LogFile 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章