pt-tools系列:xtrabackup最佳實踐
安裝xtrabackup
- 下載2.4版本即可
- 執行報錯
/data/Keithlan/pt_backup/bin/innobackupex: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15` not found (required by /data/Keithlan/pt_backup/bin/innobackupex)
解決問題:
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
發現的確沒有GLIBCXX_3.4.15
那麼需要下載相關檔案並替代
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6_4.7.2-5_amd64.deb 去這裡下載
然後:
ar -x libstdc++6_4.7.2-5_amd64.deb && tar xvf data.tar.gz
cp -p libstdc++.so.6.0.17 /usr/lib64
cd /usr/lib64/
rm libstdc++.so.6
ln -s libstdc++.so.6.0.17 libstdc++.so.6
此問題解決
安裝qpress
1. 這是解壓*.qp的工具,如果你使用了--compress 壓縮備份的話
2. 官方地址:http://www.quicklz.com/
3. tar xf qpress-11-linux-x64.tar
一、生產環境預設引數
- 常用引數
* 基本option:
--defaults-file=[MY.CNF]:
指定配置檔案,一定要放在最引數最前面
--user=$backupUser
--password=$backupPwd
--socket=$socket
--ibbackup=$ibbackup
主要用於指定xtrabackup二進位制檔案的,在某些場景特別有用:比如多個xtrabackup檔案,比如xtrabackup沒有在環境變數中 等等
--stream=xbstream
流式備份的格式,目前常用的是xbstream
--rsync
主要是用來優化本地檔案傳輸的
使用rsync代替cp,用來傳輸所有non-innodb檔案,可以更加快速的傳輸檔案
--kill-long-queries-timeout=30
在FLUSH TABLES WITH READ LOCK 開始之前,xtrabackup等待指定秒數進行kill掉其他query
主要目的就是要保證FLUSH TABLES WITH READ LOCK能夠執行成功,所以xtrabackup使用者需要process和super許可權
--kill-long-query-type=all
什麼型別的query會被kill掉,配合上面的引數一起使用
--parallel=8
備份檔案的時候並行多少個程式,用來加快備份速度,如果你的ibd檔案越多,作用越大。如果你就一個大表,那麼不起作用
--compress:
建立一個壓縮的備份
--compress-threads=#:
派生出幾個工作執行緒用於壓縮
--no-timestamp
指定該引數後,備份目錄BACKUP-ROOT-DIR不會有時間戳
--slave-info
這個引數非常有用,尤其是在slave進行備份
將binlog位置和master的binlog寫到xtrabackup_slave_info,作為change master的命令
--tmpdir=$tmpDIR
臨時檔案存放的目錄
redo日誌就是先存放在這個臨時目錄,然後在拷貝到remote host的。
--copy-back
拷貝所有備份的檔案到original目錄
它不會覆蓋已經存在的檔案,除非你指定了 --force-non-empty-directories
--move-back
跟copy back型別,但是它會刪掉老的檔案 , 使用前請謹慎
傳輸速度: 61440 KB/S
/usr/bin/rsync -auvP --bwlimit=$bwlimit $dataDir 主要適用於針對local備份,然後rsync到remote server用的
* 其他option
--apply-log:
將redo日誌(xtrabackup_logfile)apply到備份中,並且根據backup-my.cnf重新建立redo日誌
innobackupex –apply-log 使用的是backup-my.cnf,或者你顯示指定了–defaults-file ,它主要是初始化innodb_page_size,innodb_log_block_size等等,所以不要隨意新增配置檔案
--backup-locks:
備份鎖是在percona server獨有的,如果MySQL Server不支援back lock,那麼會忽略掉,使用原生態的FLUSH TABLES WITH READ LOCK
--compact:
對所有溢位的二級索引頁建立一個緊湊的(compact)格式,一般情況下有碎片和稀疏
--rebuild-indexes:
這個引數用於--apply-log階段,在每次apply完日誌後,會重建所有二級索引
所以這個引數主要是用來跟上面--compact對應的,用於建立compact backups
--rebuild-threads=NUMBER-OF-THREADS:
重建二級索引的執行緒數
--decompress:
解壓縮--compress的.qp擴充套件的檔案
預設xtrabackup不會自動刪除*.qp檔案,所以如果你需要clean up這些檔案,需要自己手動接入進來
--export:
主要用於export獨立的表(而不是整個備份),用於恢復到另外的server上去
--sshopt=SSH-OPTION:
主要用於傳輸相關ssh的引數,尤其是指定了 --remost-host
- xtrabackup備份相關的常用檔案
* backup-my.cnf
跟原始my.cnf不一樣,這是xtrabackup建立出來的my.cnf
只包含了備份需要的選項
[mysqld]
innodb_checksum_algorithm=crc32
innodb_log_checksum_algorithm=strict_crc32
innodb_data_file_path=ibdata1:4G:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=4294967296
innodb_fast_checksum=false
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=./
innodb_undo_tablespaces=0
server_id=1261261646
redo_log_version=1
server_uuid=f085ef25-dbf5-11e8-8813-ecf4bbf1f518
master_key_id=0
* xtrabackup_checkpoints
包含了LSN和備份的型別
backup_type = full-backuped
from_lsn = 0
to_lsn = 74398727925
last_lsn = 74398729153
compact = 0
recover_binlog_info = 0
* xtrabackup_info
備份相關的日誌資訊
uuid = dcfccff9-f174-11e8-a83b-ecf4bbf1f518
name =
tool_name = innobackupex
tool_command = --defaults-file=/etc/my.cnf --user=pt_kill --password=... --socket=/tmp/mysql.sock --rsync --kill-long-queries-timeout=30 --kill-long-query-type=all --parallel=8 --tmpdir=/data/dbbackup --backup /data/dbbackup/
tool_version = 2.4.12
ibbackup_version = 2.4.12
server_version = 5.7.21-log
start_time = 2018-11-26 20:14:34
end_time = 2018-11-26 20:14:46
lock_time = 0
binlog_pos = filename `xx.bin.000001`, position `18667`, GTID of the last change `f085ef25-dbf5-11e8-8813-ecf4bbf1f518:1-51`
innodb_from_lsn = 0
innodb_to_lsn = 74398957203
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
* xtrabackup_binlog_info
包含了備份時刻的binlog位置,主要用於在master上的備份,這個位置可以用來搭建new slave
xx.bin.000818 3465069 f085ef25-dbf5-11e8-8813-ecf4bbf1f518:1-51
* xtrabackup_slave_info
包含了show slave 的資訊,可用於未來的搭建新的slave,change master用
SET GLOBAL gtid_purged=`f085ef25-dbf5-11e8-8813-ecf4bbf1f518:1-1531`;
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
* xtrabackup_logfile
就是在備份的過程中,拷貝的redo log日誌
這個日誌會用在後面的 --apply-log中
- local
* non-gtid
$innobackupex --defaults-file=$defaultFile --user=$backupUser --password=$backupPwd --socket=$socket --ibbackup=$ibbackup $backupOptions $dataDIR >>$logFile 2>>$xtrabackupLogFile
* gtid
$innobackupex24 --defaults-file=$defaultFile --user=$backupUser --password=$backupPwd --socket=$socket --ibbackup=$ibbackup24 $backupOptions $dataDIR >>$logFile 2>>$xtrabackupLogFile
- remote
* non-gtid
$innobackupex --defaults-file=$defaultFile --user=$backupUser --password=$backupPwd --socket=$socket --ibbackup=$ibbackup $backupOptions --stream=xbstream --tmpdir=$tmpDIR $tmpDIR 2>>$xtrabackupLogFile | ssh root@${destIP} "$xtrabackupDIR/xbstream -x -C ${dataDIR}" >>$logFile 2>>$xtrabackupLogFile
* gtid
$innobackupex24 --defaults-file=$defaultFile --user=$backupUser --password=$backupPwd --socket=$socket --ibbackup=$ibbackup24 $backupOptions --stream=xbstream --tmpdir=$tmpDIR $tmpDIR 2>>$xtrabackupLogFile | ssh root@${destIP} "$xtrabackupDIR24/xbstream -x -C ${dataDIR}" >>$logFile 2>>$xtrabackupLogFile
二、各種場景實戰
2.1 gtid和non-gtid
gtid和non-gtid的備份都差不多,唯一的區別就在還原上
non-gtid,是change master file,position
gtid,是set globa gtid_purged=“, 然後再change master而已。
接下來的案例全部以GTID為例,因為GTID是未來趨勢
2.2 生產環境常用
2.2.1 備份
- gtid: 如何再master進行local備份
/data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --user=pt_kill --password=pt_kill --socket=/tmp/mysql.sock --rsync --kill-long-queries-timeout=30 --kill-long-query-type=all --parallel=8 --tmpdir=/data/dbbackup --backup --slave-info /data/dbbackup
/data/dbbackup 生成一個timestamp(2018-11-27_13-40-33)的備份
- gtid: 如何再master進行local + compress備份
/data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --user=pt_kill --password=pt_kill --socket=/tmp/mysql.sock --rsync --kill-long-queries-timeout=30 --kill-long-query-type=all --parallel=8 --tmpdir=/data/dbbackup --backup --compress --compress-threads=8 --slave-info /data/dbbackup
/data/dbbackup 生成一個timestamp(2018-11-27_13-40-33)的壓縮過後的備份
- gtid: 如何再master進行remote備份
/data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --user=pt_kill --password=pt_kill --socket=/tmp/mysql.sock --stream=xbstream --kill-long-queries-timeout=30 --kill-long-query-type=all --parallel=8 --tmpdir=/data/dbbackup --backup --slave-info /data/dbbackup | ssh root@${destIP} "/data/Keithlan/pt_backup/bin/xbstream -x -C /data/dbbackup/remote_backup"
/data/dbbackup/remote_backup 目錄必須在目標機器上存在,否則報錯
- gtid: 如何再master/slave進行remote的[部分庫、表]備份
之前我一直想這樣的備份有什麼用?現在想想還是有些應用場景的
場景一、有些資料業務不要了,但是不確定能不能刪,所以希望備份不需要的庫、表,如果有異常,還希望能夠恢復並檢視解決問題
/data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --user=pt_kill --password=pt_kill --socket=/tmp/mysql.sock --stream=xbstream --kill-long-queries-timeout=30 --kill-long-query-type=all --parallel=8 --tmpdir=/data/dbbackup --databases="mysql lc performance_schema sys" --slave-info /data/dbbackup | ssh root@$dest_ip "/data/Keithlan/pt_backup/bin/xbstream -x -C /data/dbbackup/remote_partial_backup"
更多的【部分庫、表】備份選項,請參考 https://www.percona.com/doc/percona-xtrabackup/2.4/innobackupex/partial_backups_innobackupex.html
簡單的示例:
* USING THE --INCLUDE OPTION
$ innobackupex --include=`^mydatabase[.]mytable` /path/to/backup
* USING THE --TABLES-FILE OPTION
$ echo "mydatabase.mytable" > /tmp/tables.txt
$ innobackupex --tables-file=/tmp/tables.txt /path/to/backup
* USING THE --DATABASES OPTION
$ innobackupex --databases="mydatabase.mytable mysql" /path/to/backup
- gtid: 如果再master進行remote + compress 備份 –推薦
/data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --user=pt_kill --password=pt_kill --socket=/tmp/mysql.sock --stream=xbstream --kill-long-queries-timeout=30 --kill-long-query-type=all --parallel=8 --tmpdir=/data/dbbackup --backup --compress --compress-threads=8 --slave-info /data/dbbackup | ssh root@xx.xx.126.166 "/data/Keithlan/pt_backup/bin/xbstream -x -C /data/dbbackup/remote_compress_backup"
/data/dbbackup/remote_compress_backup 目錄必須在目標機器上存在,否則報錯
- gtid:如何再slave上進行local備份
跟再master進行local備份一致,請參考
- gtid: 如何再slave上進行remote備份
跟在master上進行remote備份一樣,請參考
- gtid: 如何再slave上進行local + compress備份 –推薦
跟在master上進行local+compress備份一致,請參考
- gtid: 如何再slave上進行remote + compress備份 –推薦
跟在master上進行remote+compress備份一致,請參考
2.2.2 還原備份
- gtid:有一個完整的全備,如何快速還原整個例項
重點: /etc/my.cnf 要存在,這個需要自己備份
innobackupex --defaults-file=/etc/my.cnf --apply-log 2018-11-26_20-20-21
innobackupex --defaults-file=/etc/my.cnf --copy-back 2018-11-26_20-20-21
chown -R mysql:mysql /data/mysql_data
mysqld_safe --user=mysql &
cat xtrabackup_binlog_info : 如果是再master進行備份的話
cat xtrabackup_slave_info : 如果是在slave進行備份的話
reset slave all
reset master
set global gtid_purged=`$gtid_xtrabackup_$binlog_$slave_info`
CHANGE MASTER TO MASTER_HOST = `$master_ip` ,MASTER_PORT = 3306 , MASTER_USER = `repl`,MASTER_PASSWORD = `xx` ,MASTER_AUTO_POSITION = 1
start slave;
- gtid:有一個完整的壓縮全備,如何快速還原整個例項
重點: /etc/my.cnf 要存在,這個需要自己備份
innobackupex --decompress --parallel=16 --remove-original remote_compress_backup
innobackupex --defaults-file=/etc/my.cnf --apply-log remote_compress_backup
innobackupex --defaults-file=/etc/my.cnf --copy-back remote_compress_backup
chown -R mysql:mysql /data/mysql_data
mysqld_safe --user=mysql &
cat xtrabackup_binlog_info : 如果是再master進行備份的話
cat xtrabackup_slave_info : 如果是在slave進行備份的話
reset slave all
reset master
set global gtid_purged=`$gtid_xtrabackup_$binlog_$slave_info`
CHANGE MASTER TO MASTER_HOST = `$master_ip` ,MASTER_PORT = 3306 , MASTER_USER = `repl`,MASTER_PASSWORD = `xx` ,MASTER_AUTO_POSITION = 1
start slave;
- gtid:有一個完整的壓縮全備,如何快速還原單個表
* step1 建立一個部分表目錄,用來存放未來需要恢復的表
mkdir partial_backup/
* step2 拷貝需要恢復的庫、表到剛剛新建的目錄中
cp -pr remote_compress_backup/*.qp partial_backup/ --xtrabackup恢復需要的基本表
cp -pr remote_compress_backup/xtrabackup_checkpoints partial_backup/ --xtrabackup恢復需要的基本表
cp -pr remote_compress_backup/mysql partial_backup/ --MySQL系統表
cp -pr remote_compress_backup/sys partial_backup/ --MySQL系統表
cp -pr remote_compress_backup/lc partial_backup/ --使用者需要恢復的表,我這裡lc庫就是要恢復的單庫
* step3 解壓縮,並行16個執行緒
/data/Keithlan/pt_backup/bin/innobackupex --decompress --parallel=16 --remove-original partial_backup
* step4 prepare階段,應用差異redo日誌,讓備份恢復到FTWRL的點
/data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log partial_backup
* step5 restore階段,copy_back 將資料拷貝到配置檔案所指定的目錄
/data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back partial_backup
* step6 賦予許可權
chown -R mysql:mysql /data/mysql_data
* step7 啟動MySQL
mysqld_safe --user=mysql &
* last
如果需要恢復到指定的點位的話,還需要設定配置檔案,並且set global $gtid_purged=``,change master xx auto_master=1, start slave until $gtid_set
xtrabackup_binlog_info : 如果是再master進行備份的話
xtrabackup_slave_info : 如果是在slave進行備份的話
重要的是:配置檔案需要設定過濾條件
replicate_do_DB: 如果是恢復一個庫
replicate-do-table: 如果是恢復一個表
- gtid: 如果給你一個只備份了部分庫、表的備份(不是全部庫的備份哦),應該如何恢復呢?
跟之前正常的套路一樣,沒啥區別,但是這是野路子,可能會有跟之前資料不一致的情況,但是基本可以放心用
1. /data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log remote_partial_backup
2. /data/Keithlan/pt_backup/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back remote_partial_backup
3. chown -R mysql:mysql /data/mysql_data
4. mysqld_safe --user=mysql &
非常嚴謹的方法可以嘗試用官方推薦(Restoring Individual Tables),但是我覺得麻煩,不樂意。
https://www.percona.com/doc/percona-xtrabackup/2.4/innobackupex/restoring_individual_tables_ibk.html
三、已知的限制和不足
- known issues:
1. 5.1 , 5.5 版本有一些已知的還沒修復的bug,比如:redo-logging on 壓縮表上,有有很多問題。 bug #16267120 , 5.6.12 修復
2. 5.6 版本,對於compress的innodb表,不推薦使用innodb_log_compressed_pages=OFF,這樣會導致backup失敗由於壓縮演算法的原因
3. 如果backup和OPTIMIZE TABLE or ALTER TABLE ... TABLESPACE 同時發生,那麼備份將還原失敗
4. Compact Backups 目前不支援,有bug #1192834.
5. Error 24: `Too many open files` 如果表很多,可能發生這樣的錯誤,所以需要調整/etc/security/limits.conf , 目前最大為1048576
6. throttle引數建議不要使用
https://zhuanlan.zhihu.com/p/43913304
- limitation
1. xtrabackup_logfile 如果超過4GB,那麼--prepare在32位作業系統會失敗
2. xtrabackup 將不明白--set-variable my.cnf 這樣古老的語法,所以最好不要這樣使用它
四、頻繁問到的問題
相關文章
- dart系列之:集合使用最佳實踐Dart
- dart系列之:dart程式碼最佳實踐Dart
- Istio最佳實踐系列:如何實現方法級呼叫跟蹤?
- dart系列之:手寫Library,Library編寫最佳實踐Dart
- JavaScript 最佳實踐JavaScript
- JDBC 最佳實踐JDBC
- Kafka最佳實踐Kafka
- Java最佳實踐Java
- Serilog 最佳實踐
- Flutter 最佳實踐Flutter
- springDataJpa 最佳實踐Spring
- Gradle最佳實踐Gradle
- MongoDB 最佳實踐MongoDB
- Iptables 最佳實踐 !
- AutoMapper 最佳實踐APP
- 《.NET最佳實踐》
- Django 最佳實踐Django
- metaq最佳實踐
- KeyPath 最佳實踐
- Pika最佳實踐
- SnapKit 最佳實踐APK
- dart系列之:和null說再見,null使用最佳實踐DartNull
- Code Review最佳實踐View
- 日誌最佳實踐
- Kubernetes Deployment 最佳實踐
- restful api最佳實踐RESTAPI
- Dockerfile 安全最佳實踐Docker
- 冪等最佳實踐
- MongoDB最佳安全實踐MongoDB
- RocketMQ的最佳實踐MQ
- DHCP最佳實踐(三)
- flutter + getx 最佳實踐Flutter
- DHCP最佳實踐(一)
- DHCP最佳實踐(二)
- 【譯】VueJS 最佳實踐VueJS
- App瘦身最佳實踐APP
- Android MVP 最佳實踐AndroidMVP
- OpenResty 最佳實踐 (1)REST