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 -plibstdc++.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獨有的,如果SQL/">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.0008183465069f085ef25-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 $tmpDIR2>>$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 $tmpDIR2>>$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進行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 [email protected] "/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/*.qppartial_backup/ --xtrabackup恢復需要的基本表 cp -pr remote_compress_backup/xtrabackup_checkpointspartial_backup/--xtrabackup恢復需要的基本表 cp -pr remote_compress_backup/mysql partial_backup/--MySQL系統表 cp -pr remote_compress_backup/syspartial_backup/--MySQL系統表 cp -pr remote_compress_backup/lcpartial_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 如果需要恢復到指定的點位,還需要change master to $position xtrabackup_binlog_info : 如果是再master進行備份的話 xtrabackup_slave_info: 如果是在slave進行備份的話
三、已知的限制和不足
- 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
- limitation
1. xtrabackup_logfile 如果超過4GB,那麼--prepare在32位作業系統會失敗 2. xtrabackup 將不明白--set-variable my.cnf 這樣古老的語法,所以最好不要這樣使用它