轉自:https://www.cnblogs.com/waynechou/p/xtrabackup_backup.html 閱讀目錄 xtrabackup 選項 xtrabackup 全量備份恢復 xtrabackup 增量備份恢復 轉自:https://www.cnblogs.com/waynec ...
轉自:https://www.cnblogs.com/waynechou/p/xtrabackup_backup.html
閱讀目錄
前一篇文章我們講到了PXB的原理以及安裝方法,接下來將詳細介紹 XtraBackup 備份和恢復的具體過程。
回到頂部xtrabackup 選項
xtrabackup 工具有許多參數,具體可去官網查詢(xtrabackup 參數選項 | innobackupex 參數選項),這裡簡單介紹 innobackupex 一些常用的參數。
1) innobackupex 參數選項
--defaults-file=[MY.CNF] //指定配置文件:只能從給定的文件中讀取預設選項。 且必須作為命令行上的第一個選項;必須是一個真實的文件,它不能是一個符號鏈接。
--databases=# //指定備份的資料庫和表,格式為:--database="db1[.tb1] db2[.tb2]" 多個庫之間以空格隔開,如果此選項不被指定,將會備份所有的資料庫。
--include=REGEXP //用正則表達式的方式指定要備份的資料庫和表,格式為 --include=‘^mydb[.]mytb’ ,對每個庫中的每個表逐一匹配,因此會創建所有的庫,不過是空的目錄。--include 傳遞給 xtrabackup --tables。
--tables-file=FILE //此選項的參數需要是一個文件名,此文件中每行包含一個要備份的表的完整名稱,格式為databasename.tablename。該選項傳遞給 xtrabackup --tables-file,與--tables選項不同,只有要備份的表的庫才會被創建。
註意:部分備份(--include、--tables-file、--database)需要開啟 innodb_file_per_table 。
--compact //創建緊湊型備份,忽略所有輔助索引頁,只備份data page;通過--apply-log中重建索引--rebuild-indexs。
--compress //此選項指示xtrabackup壓縮備份的InnoDB數據文件,會生成 *.qp 文件。
--decompress //解壓縮qp文件,為瞭解壓縮,必須安裝 qpress 工具。 Percona XtraBackup不會自動刪除壓縮文件,為了清理備份目錄,用戶應手動刪除 * .qp文件:find /data/backup -name "*.qp" | xargs rm。
--no-timestamp //指定了這個選項備份將會直接存儲在 BACKUP-DIR 目錄,不再創建時間戳文件夾。
--apply-log //應用 BACKUP-DIR 中的 xtrabackup_logfile 事務日誌文件。一般情況下,在備份完成後,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處於不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件使得數據文件處於一致性狀態。
--use-memory=# //此選項接受一個字元參數(1M/1MB,1G/1GB,預設100M),僅與--apply-log一起使用,該選項指定prepare時用於崩潰恢復(crash-recovery)的記憶體。
--copy-back //拷貝先前備份所有文件到它們的原始路徑。但原路徑下不能有任何文件或目錄,除非指定 --force-non-empty-directories 選項。
--force-non-empty-directories //恢復時指定此選項,可使 --copy-back 和 --move-back 複製文件到非空目錄,即原data目錄下可以有其他文件,但是不能有與恢覆文件中同名的文件,否則恢復失敗。
--rsync //此選項可優化本地文件(非InnoDB)的傳輸。rsync工具一次性拷貝所有非InnoDB文件,而不是為每個文件單獨創建cp,在備份恢復很多資料庫和表時非常高效。此選項不能和 --stream 一起使用。
--incremental //這個選項告訴 xtrabackup 創建一個增量備份,而不是完全備份。它傳遞到 xtrabackup 子進程。當指定這個選項,可以設置 --incremental-lsn 或 --incremental-basedir。如果這2個選項都沒有被指定,--incremental-basedir 傳遞給 xtrabackup 預設值,預設值為:基礎備份目錄的第一個時間戳備份目錄。
--incremental-basedir=DIRECTORY //該選項接受一個字元串參數,該參數指定作為增量備份的基本數據集的完整備份目錄。它與 --incremental 一起使用。
--incremental-dir=DIRECTORY //該選項接受一個字元串參數,該參數指定了增量備份將與完整備份相結合的目錄,以便進行新的完整備份。它與 --incremental 選項一起使用。
--redo-only //在“準備基本完整備份” 和 “合併所有的增量備份(除了最後一個增備)”時使用此選項。它直接傳遞給xtrabackup的 xtrabackup --apply-log-only 選項,使xtrabackup跳過"undo"階段,只做"redo"操作。如果後面還有增量備份應用到這個全備,這是必要的。有關詳細信息,請參閱xtrabackup文檔。
--parallel=NUMBER-OF-THREADS //此選項接受一個整數參數,指定xtrabackup子進程應用於同時備份文件的線程數。請註意,此選項僅適用於文件級別,也就是說,如果您有多個.ibd文件,則它們將被並行複製; 如果您的表一起存儲在一個表空間文件中,它將不起作用。
2) xtrabackup 參數選項
--apply-log-only //這個選項使在準備備份(prepare)時,只執行重做(redo)階段,這對於增量備份非常重要。
回到頂部xtrabackup 全量備份恢復
1. 完全備份
創建用於備份恢復的用戶 pxb 並賦予許可權
mysql> create user pxb@'localhost' identified by '123456'; mysql> grant reload,process,lock tables,replication client on *.* to pxb@localhost;
創建存放目錄
[root@centos6 mysql]# mkdir -pv /data/pxb mkdir: 已創建目錄 "/data" mkdir: 已創建目錄 "/data/pxb"
進行資料庫全備
[root@centos6 pxb]# innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/tmp/mysql.sock /data/pxb 170424 02:46:11 innobackupex: Starting the backup operation IMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints "completed OK!". ………… 170424 02:46:12 >> log scanned up to (2627779) 170424 02:46:13 Executing FLUSH NO_WRITE_TO_BINLOG TABLES... 170424 02:46:13 Executing FLUSH TABLES WITH READ LOCK... 170424 02:46:13 Starting to backup non-InnoDB tables and files ………… 170424 02:46:15 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS... xtrabackup: The latest check point (for incremental): '2627770' xtrabackup: Stopping log copying thread. .170424 02:46:15 >> log scanned up to (2627779) 170424 02:46:15 Executing UNLOCK TABLES 170424 02:46:15 All tables unlocked 170424 02:46:15 [00] Copying ib_buffer_pool to /data/pxb/2017-04-24_02-46-11/ib_buffer_pool 170424 02:46:15 [00] ...done 170424 02:46:15 Backup created in directory '/data/pxb/2017-04-24_02-46-11/' MySQL binlog position: filename 'mysql-bin.000002', position '2628' 170424 02:46:15 [00] Writing backup-my.cnf 170424 02:46:15 [00] ...done 170424 02:46:15 [00] Writing xtrabackup_info 170424 02:46:15 [00] ...done xtrabackup: Transaction log of lsn (2627770) to (2627779) was copied. 170424 02:46:15 completed OK!
可以看到整個備份過程:連接資料庫,開始拷貝redo log,拷貝innodb表文件,鎖表、拷貝非innodb表文件,停止拷貝redo log,解鎖。
查看生成的文件:
[root@centos6 pxb]# ll 2017-04-24_02-46-11/ 總用量 12340 -rw-r----- 1 root root 427 4月 24 02:46 backup-my.cnf -rw-r----- 1 root root 358 4月 24 02:46 ib_buffer_pool -rw-r----- 1 root root 12582912 4月 24 02:46 ibdata1 drwxr-x--- 2 root root 4096 4月 24 02:46 mysql drwxr-x--- 2 root root 4096 4月 24 02:46 performance_schema drwxr-x--- 2 root root 12288 4月 24 02:46 sys drwxr-x--- 2 root root 4096 4月 24 02:46 test drwxr-x--- 2 root root 4096 4月 24 02:46 test1 -rw-r----- 1 root root 22 4月 24 02:46 xtrabackup_binlog_info -rw-r----- 1 root root 113 4月 24 02:46 xtrabackup_checkpoints -rw-r----- 1 root root 518 4月 24 02:46 xtrabackup_info -rw-r----- 1 root root 2560 4月 24 02:46 xtrabackup_logfile
其中,mysql/, performance_schema/, sys/ ,test/ ,test1/ 下存放的是資料庫文件。
backup-my.cnf,備份命令用到的配置選項信息;
[root@centos6 2017-04-24_02-46-11]# cat backup-my.cnf # This MySQL options file was generated by innobackupex. # The MySQL server [mysqld] innodb_checksum_algorithm=innodb innodb_log_checksum_algorithm=strict_crc32 innodb_data_file_path=ibdata1:12M:autoextend innodb_log_files_in_group=2 innodb_log_file_size=50331648 innodb_fast_checksum=false innodb_page_size=16384 innodb_log_block_size=512 innodb_undo_directory=./ innodb_undo_tablespaces=0 server_id=153 redo_log_version=1
ib_buffer_pool, buffer pool 中的熱數據,當設置 innodb_buffer_pool_dump_at_shutdown=1 ,在關閉 MySQL 時,會把記憶體中的熱數據保存在磁碟里 ib_buffer_pool 文件中,位於數據目錄下。
ibdata1,備份的共用表空間文件;
xtrabackup_binlog_info,mysql伺服器當前正在使用的二進位日誌文件及至備份這一刻為止二進位日誌事件的位置;
[root@centos6 2017-04-24_02-46-11]# cat xtrabackup_binlog_info mysql-bin.000002 2628
xtrabackup_checkpoints,備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日誌序列號)範圍信息;
[root@centos6 2017-04-24_02-46-11]# cat xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 2627770 last_lsn = 2627779 compact = 0 recover_binlog_info = 0
xtrabackup_info,記錄備份的基本信息,uuid、備份命令、備份時間、binlog、LSN、以及其他加密壓縮等信息。
[root@centos6 2017-04-24_02-46-11]# cat xtrabackup_info uuid = 216881a3-2855-11e7-bc84-080027b387ba name = tool_name = innobackupex tool_command = --defaults-file=/etc/my.cnf --user=pxb --password=... --socket=/tmp/mysql.sock /data/pxb tool_version = 2.4.6 ibbackup_version = 2.4.6 server_version = 5.7.10-log start_time = 2017-04-24 02:46:11 end_time = 2017-04-24 02:46:15 lock_time = 0 binlog_pos = filename 'mysql-bin.000002', position '2628' innodb_from_lsn = 0 innodb_to_lsn = 2627770 partial = N incremental = N format = file compact = N compressed = N encrypted = N
xtrabackup_logfile,備份的重做日誌文件。
2. 全備恢復
關閉資料庫並刪除數據文件
[root@centos6 data]# /etc/init.d/mysqld stop Shutting down MySQL.. [確定] [root@centos6 mysql]# cd /home/mysql [root@centos6 mysql]# mv data/ data_bak/ [root@centos6 mysql]# mkdir data
準備(prepare)一個完全備份: --apply-log ( /data/pxb/2017-04-24_02-46-11/ 為備份目錄,執行之後 xtrabackup_checkpoints 文件中的 backup_type = full-prepared )
[root@centos6 mysql]# innobackupex --apply-log /data/pxb/2017-04-24_02-46-11/ 170424 15:50:20 innobackupex: Starting the apply-log operation IMPORTANT: Please check that the apply-log run completes successfully. At the end of a successful apply-log run innobackupex prints "completed OK!". ………… InnoDB: 5.7.13 started; log sequence number 2628117 xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: FTS optimize thread exiting. InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 2628136 170424 15:50:24 completed OK!
執行恢復操作:
[root@centos6 2017-04-24_02-46-11]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/2017-04-24_02-46-11/ 170424 16:02:26 innobackupex: Starting the copy-back operation IMPORTANT: Please check that the copy-back run completes successfully. At the end of a successful copy-back run innobackupex prints "completed OK!". innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7) 170424 16:02:26 [01] Copying ib_logfile0 to /home/mysql/data/ib_logfile0 170424 16:02:26 [01] ...done 170424 16:02:26 [01] Copying ib_logfile1 to /home/mysql/data/ib_logfile1 170424 16:02:26 [01] ...done 170424 16:02:26 [01] Copying ibdata1 to /home/mysql/data/ibdata1 170424 16:02:26 [01] ...done …… 170424 16:02:31 [01] Copying ./xtrabackup_info to /home/mysql/data/xtrabackup_info 170424 16:02:31 [01] ...done 170424 16:02:31 [01] Copying ./xtrabackup_binlog_pos_innodb to /home/mysql/data/xtrabackup_binlog_pos_innodb 170424 16:02:31 [01] ...done 170424 16:02:31 completed OK!
更改 data/ 目錄許可權並啟動mysql:
[root@centos6 mysql]# chown -R mysql.mysql data/ [root@centos6 data]# /etc/init.d/mysqld start Starting MySQL. [確定]
可以看到資料庫和表均已恢復:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | | test1 | +--------------------+ 6 rows in set (0.00 sec)回到頂部
xtrabackup 增量備份恢復
我們以之前做的全備為基準,在其基礎上做增量備份:
##新建一張表,並插入數據作為增量##
mysql> create table tb2 (id int,name varchar(40)); Query OK, 0 rows affected (0.06 sec) mysql> insert into tb2 values (1,'aaa'),(2,'bbb'),(3,'ccc'),(26,'zzz'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from tb2; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | | 26 | zzz | +------+------+ 4 rows in set (0.00 sec)
增量備份1:( 以全備為基準:/data/pxb/2017-04-24_02-46-11/ )
[root@centos6 pxb]# innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/tmp/mysql.sock --incremental /data/pxb/inc --incremental-basedir=/data/pxb/2017-04-24_02-46-11/ --parallel=2 [root@centos6 2017-04-28_01-09-40]# cat xtrabackup_checkpoints backup_type = incremental ##說明是增量備份 from_lsn = 2627770 to_lsn = 2636739 last_lsn = 2636748 compact = 0 recover_binlog_info = 0
再往 tb2 里插入數據:
mysql> insert into tb2 values (201,'aaa'),(202,'bbb'),(203,'ccc'),(326,'zzz'); Query OK, 4 rows affected (0.12 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> mysql> select * from tb2; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | | 26 | zzz | | 201 | aaa | | 202 | bbb | | 203 | ccc | | 326 | zzz | +------+------+ 8 rows in set (0.00 sec)
增量備份2:( 以增量1為基準:/data/pxb/inc/2017-04-28_01-09-40/ )
innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/tmp/mysql.sock --incremental /data/pxb/inc --incremental-basedir=/data/pxb/inc/2017-04-28_01-09-40/ --parallel=2 [root@centos6 2017-04-28_01-27-46]# cat xtrabackup_checkpoints backup_type = incremental from_lsn = 2636739 to_lsn = 2643563 last_lsn = 2643572 compact = 0 recover_binlog_info = 0
增量備份的恢復
增量備份的恢復需要有3個步驟
- 恢復完全備份
- 恢復增量備份到完全備份(開始恢復的增量備份要添加--redo-only參數,到最後一次增量備份要去掉--redo-only)
- 對整體的完全備份進行恢復,回滾未提交的數據
##準備一個全備##
[root@centos6 pxb]# innobackupex --apply-log --redo-only /data/pxb/2017-04-24_02-46-11/ xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 2628145 InnoDB: Number of pools: 1 170428 01:33:52 completed OK! ##將增量1應用到完全備份## [root@centos6 pxb]# innobackupex --apply-log --redo-only /data/pxb/2017-04-24_02-46-11/ --incremental-dir=/data/pxb/inc/2017-04-28_01-09-40/ ##將增量2應用到完全備份,註意不加 --redo-only 參數了## [root@centos6 pxb]# innobackupex --apply-log /data/pxb/2017-04-24_02-46-11/ --incremental-dir=/data/pxb/inc/2017-04-28_01-27-46/ ##把所有合在一起的完全備份整體進行一次apply操作,回滾未提交的數據## [root@centos6 pxb]# innobackupex --apply-log /data/pxb/2017-04-24_02-46-11/ xtrabackup: Log applied to lsn 2628145 xtrabackup: The intended lsn is 2643563
模擬測試:
mysql> drop table tb2; Query OK, 0 rows affected (0.05 sec) [root@centos6 mysql]# /etc/init.d/mysqld stop [root@centos6 mysql]# mv data data_bak2 [root@centos6 mysql]# mkdir data innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/2017-04-24_02-46-11/ [root@centos6 mysql]# chown -R mysql:mysql data/ [root@centos6 mysql]# /etc/init.d/mysqld start ##數據已經恢復## mysql> select * from tb2; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | | 26 | zzz | | 201 | aaa | | 202 | bbb | | 203 | ccc | | 326 | zzz | +------+------+ 8 rows in set (0.01 sec)