問題描述:運用xtrabackup進行mysql全備,mysql8之前使用的是innodbxtrabackup,mysql8之后開始使用xtrabackup,innobackupex把功能都集成到xtrabackup中。
腳本在備庫上實現每周末零點進行全備,周一到周六凌晨一點進行增備!
這里下載地址很奇怪,為什么有的人就可以打開下載列表,我這里打開就是空的
下載地址:http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.8/source/
空的:
xtrabackup安裝步驟,解壓即用,我安裝的是tar包,8.0.27高版本向下mysql8.0的兼容
全備腳本:
mysql_full_bakcup.sh
#一主兩備集群,在從庫上進行備份,如果從庫同步失敗,備份停止,備份用戶還要用查看復制狀態的權限 #!/bin/bash # MySQL backup script # Copyright (c) 2022 hzh # Version: 1.0
# mkdir -pv /backup/{33306,backuplog,scripts}
date=`date +%F` #當前時間變量 backupDir=/backup/33306 #備份路徑 target_dir=/backup/$date #全備路徑變量 xtrDir=/root/percona-xtrabackup/bin/xtrabackup #xtrabackup啟動環境變量 mysqlDir=/usr/local/mysql8/bin/mysql #mysql啟動環境變量 backupLog=$backupDir/backuplog #備份日志目錄 mysql_host=192.168.163.21 #備份host mysql_port=33310 #端口 mysql_user=root #用戶 mysql_password=123456 #密碼 mysql_socket=/data/mysql10/db_dxpt10/mysql.sock #socket mysql_cnf=/data/mysql10/db_dxpt10/conf/dxpt10.cnf #配置文件 show_slave_status=`"$mysqlDir" -S"$mysql_socket" -P"$mysql_port" -u"$mysql_user" -p"$mysql_password" -A -e 'show slave status\G;' 2>/dev/null` #獲取slave狀態 slave_sql_running_state=`echo "$show_slave_status" |grep Slave_SQL_Running_State |awk -F ': ' '{print $2}'` #Slave上SQL運行狀態 ms_status=`echo "$show_slave_status" |grep Running: |awk -F ': ' '{if($2=="Yes"){sum += 1}}; END{print sum}'` #IO、SQL線程運行狀態:2表示健康,!2表示不健康 if [ $ms_status -eq 2 ]; #檢查mysql復制狀態 then echo =========================Run full backup beginning========================== >>$backupLog/backup_full_success.log 2>&1 $xtrDir --defaults-file=$mysql_cnf --user=$mysql_user --password=$mysql_password --socket=$mysql_socket --compress --compress-threads=2 --backup --target-dir=$target_dir >>$backupLog/backup_full_success.log 2>&1 echo =========================Run full backup finished successfully========================== >>$backupLog/backup_full_success.log 2>&1 #如果需要 發送郵件 else echo =========================Error,the synchronization may fail. Locate the cause========================== >> $backupLog/backup_failed.log 2>&1 #如果需要 發送郵件 fi #刪除兩周前備份 #find $backupDir -maxdepth 1 -type d -mtime +14 -exec rm -Rf {} \; >>$backupLog/deleted_record.log 2>&1
增備腳本:
mysql_incremental_backup.sh
#一主兩備集群,在從庫上進行備份,如果從庫同步失敗,備份停止,備份用戶還要用查看復制狀態的權限 #!/bin/bash # MySQL backup script # Copyright (c) 2022 hzh # Version: 1.0
date=`date +%F` datenum=`date -d "1 days ago" +%F` #當前時間變量 cur_dateTime=$(date "+%Y-%m-%d %H:%M:%S") backupDir=/backup/33306 #備份路徑 target_dir=/backup/$date #全備路徑變量 xtrDir=/root/percona-xtrabackup/bin/xtrabackup #xtrabackup啟動環境變量 mysqlDir=/usr/local/mysql8/bin/mysql #mysql啟動環境變量 backupLog=$backupDir/backuplog mysql_host=192.168.163.21 #host mysql_port=33310 #端口 mysql_user=root #用戶 mysql_password=123456 #密碼 mysql_socket=/data/mysql10/db_dxpt10/mysql.sock #socket mysql_cnf=/data/mysql10/db_dxpt10/conf/dxpt10.cnf #配置文件 show_slave_status=`"$mysqlDir" -S"$mysql_socket" -P"$mysql_port" -u"$mysql_user" -p"$mysql_password" -A -e 'show slave status\G;' 2>/dev/null` #獲取slave狀態 slave_sql_running_state=`echo "$show_slave_status" |grep Slave_SQL_Running_State |awk -F ': ' '{print $2}'` #Slave上SQL運行狀態 ms_status=`echo "$show_slave_status" |grep Running: |awk -F ': ' '{if($2=="Yes"){sum += 1}}; END{print sum}'` #IO、SQL線程運行狀態:2表示健康,!2表示不健康 if [ $ms_status -eq 2 ]; #檢查mysql復制狀態 then echo -e $cur_dateTime >>$backupLog/backup_incr_success.log 2>&1 echo =========================Run incremental backup beginning========================== >>$backupLog/backup_incr_success.log 2>&1 $xtrDir --defaults-file=$mysql_cnf --port=$mysql_port --user=$mysql_user --password=$mysql_password --socket=$mysql_socket --compress --compress-threads=2 --backup --target-dir=$target_dir --incremental-basedir=$backupDir/$datenum >> $backupLog/backup_incr_success.log 2>&1 echo -e $cur_dateTime >>$backupLog/backup_incr_success.log 2>&1 echo =========================Run incremental backup finished successfully========================== >>$backupLog/backup_incr_success.log 2>&1 #發送郵件 else echo -e $cur_dateTime >>$backupLog/backup_incr_success.log 2>&1 echo =========================Error,the synchronization may fail. Locate the cause========================== >> $backupLog/backup_incr_failed.log 2>&1 #發送郵件 fi #刪除兩周前備份 #find $backupDir -maxdepth 1 -type d -mtime +14 -exec rm -Rf {} \; >>$backupLog/deleted_record.log 2>&1
配合定時任務使用
0 0 * * 7 sh /backup/scripts/mysql_full_backup.sh
0 1 * * 1-6 sh /backup/scripts/mysql_incremental_backup.sh
以上腳本都是使用root用戶進行備份,有些生產限制這個,要換成專門的備份用戶,但是我這邊測試使用備份用戶全備出來的內容跟root全備的內容不一樣,要不然增備的時候出岔子,所以使用了root用戶代替
創建備份用戶 create user backuper@'localhost' identified by 'i6+MgKFN'; GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT,SUPER ON *.* TO 'backuper'@'localhost'; grant create,insert,select on percona_schema.* to 'backuper'@'localhost'; flush privileges;
腳本中還是用的是qp壓縮方式,如果想要解壓備份,還需要安裝qp解壓工具
下載鏈接:http://www.quicklz.com/qpress-11-source.zip
--解壓.qb文件 [root@ ~]# cd /backup/33306/備份目錄 [root@ ~]# for qp in `find . -iname "*\.qp"`; do /usr/local/bin/qpress -d $qp $(dirname $qp) && rm $qp; done
文中細節,歡迎指正!