Mysql開源備份工具Xtrabackup備份部署 Xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。 Xtrabackup有兩個主要的工具:xtrabackup、innobackupex 1、xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表 2、innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個perl腳本封裝,封裝了xtrabackup。主要是為了方便的 同時備份InnoDB和MyISAM引擎的表,但在處理myisam時需要加一個讀鎖。並且加入了一些使用的選項。如slave-info可以記錄備份恢 復後,作為slave需要的一些信息,根據這些信息,可以很方便的利用備份來重做slave。 Xtrabackup下載地址: http://www.percona.com/downloads/XtraBackup/LATEST/binary/ 選擇合適的版本,我這裡選擇binary。 解壓到/usr/src/目錄,解壓後目錄名percona-xtrabackup-2.1.3,進入到bin目錄,即可直接使用innobackupex命令 # pwd /usr/src/percona-xtrabackup-2.1.3/bin # ls -l total 112396 -rwxr-xr-x 1 root root 110738 Jun 7 11:43 innobackupex -rwxr-xr-x 1 root root 110738 Jun 7 11:43 innobackupex-1.5.1 -rwxr-xr-x 1 root root 2211237 Jun 7 11:43 xbcrypt -rwxr-xr-x 1 root root 2285672 Jun 7 11:43 xbstream -rwxr-xr-x 1 root root 13033745 Jun 7 11:43 xtrabackup -rwxr-xr-x 1 root root 16333506 Jun 7 11:43 xtrabackup_55 -rwxr-xr-x 1 root root 80988093 Jun 7 11:43 xtrabackup_56 在開始使用的時候可能會報如下錯誤: sh: xtrabackup_55: command not found innobackupex: fatal error: no 'mysqld' group in MySQL options 解決辦法xtrabackup_55復制到/usr/bin下即可。 # cp /usr/src/percona-xtrabackup-2.1.3/bin/xtrabackup_55 /usr/bin/ 建立mysql備份用戶: mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backupuser'@'localhost' identified by 'skEBfef5E2'; mysql> FLUSH PRIVILEGES; 備份腳本內容(每周一次全備,六次增量備份,保留2周的備份,並壓縮): [plain] #!/bin/bash BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"` format_time=`date +"%Y-%m-%d_%H:%M:%S"` week=`date +%w` backupbin=/usr/src/percona-xtrabackup-2.1.3/bin backdir=/data/databasebak/bak file_cnf=/etc/my.cnf user_name=backupuser password="skEBfef5E2" db="db1 db2 db3 db4" out_log=$backdir/xtrabackup_log_$format_time time_cost=$backdir/xtrabackup_time.txt if [ -f "$backdir.lastlastlastweek.gz" ];then rm -rf $backdir.lastlastweek.gz mv $backdir.lastweek.gz $backdir.lastlastweek.gz fi if [ -d "$backdir/rec5" ];then gzip -cr $backdir >$backdir.lastweek.gz rm -rf $backdir mkdir $backdir fi #full if [ ! -d "$backdir/full" ];then echo "#####start full backup at $BEGINTIME to directory full" >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --slave-info --databases="$db" $backdir/full 1> $out_log 2>&1 break; elif [ ! -d "$backdir/rec0" ];then echo "#####start 0 incremental backup at $BEGINTIME to directory rec0" >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --slave-info --databases="$db" --incremental --incremental-basedir=$backdir/full $backdir/rec0 1> $out_log 2>&1 break; elif [ ! -d "$backdir/rec1" ];then echo "#####start 1 incremental backup at $BEGINTIME to directory rec1" >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --slave-info --databases="$db" --incremental --incremental-basedir=$backdir/rec0 $backdir/rec1 1> $out_log 2>&1 break; elif [ ! -d "$backdir/rec2" ];then echo "#####start 2 incremental backup at $BEGINTIME to directory rec2" >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --slave-info --databases="$db" --incremental --incremental-basedir=$backdir/rec1 $backdir/rec2 1> $out_log 2>&1 break; elif [ ! -d "$backdir/rec3" ];then echo "#####start 3 incremental backup at $BEGINTIME to directory rec3" >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --slave-info --databases="$db" --incremental --incremental-basedir=$backdir/rec2 $backdir/rec3 1> $out_log 2>&1 break; elif [ ! -d "$backdir/rec4" ];then echo "#####start 4 incremental backup at $BEGINTIME to directory rec4" >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --slave-info --databases="$db" --incremental --incremental-basedir=$backdir/rec3 $backdir/rec4 1> $out_log 2>&1 break; elif [ ! -d "$backdir/rec5" ];then echo "#####start 5 incremental backup at $BEGINTIME to directory rec5" >>$time_cost $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --user=$user_name --password=$password --slave-info --databases="$db" --incremental --incremental-basedir=$backdir/rec4 $backdir/rec5 1> $out_log 2>&1 break; fi ENDTIME=`date +"%Y-%m-%d %H:%M:%S"` begin_data=`date -d "$BEGINTIME" +%s` end_data=`date -d "$ENDTIME" +%s` spendtime=`expr $end_data - $begin_data` echo "it takes $spendtime sec for packing the data directory" >>$time_cost 部署備份腳本; # crontab -l 10 2 * * * /opt/cron/mysqldbbakup.sh 恢復: #全備恢復: innobackupex --apply-log --redo-only --defaults-file=$file_cnf --user=$user_name --password=$password $backdir/full #增備恢復,修改增量備份目錄,逐個apply-log,到第五天的增量rec4都是輸出都顯示innobackupex: completed OK! innobackupex --apply-log --redo-only --defaults-file=$file_cnf --user=$user_name --password=$password $backdir/full --incremental-dir=$backdir/rec5