聲明:本文由個人同事@fiona514編寫,是我看過的最用心的中文說明介紹,強烈推薦你們學習使用。前端
Percona Xtrabackup 2.4.1mysql
編譯及軟件依賴ios
centos5,6 須要升級cmake至2.8.2版本以上,解決:安裝cmake版本3.4.3測試經過正則表達式
centos5 gcc g++ 須要升級gcc至4.4以上上 ,解決:安裝4.4.7測試經過算法
另外xtrabackcup另外Boost版本須要1.59.0版本或以上,目前centos5,6默認是1.41.0。解決:升級至1.59.0sql
GTID支持狀況數據庫
測試5.6,5.7開啓GTID下能夠正常備份,還原centos
對MySQL5.5,MySQL5.6版本支持緩存
5.6在開啓和關閉gtid模式下均可以正常備份還原安全
5.5能夠正常備份還原
5.6部分表導出還原測試正常
對現有版本結合新特性的建議
目前線上版本大部分在1.6.3和1.5版本。不少需求是經過第三方工具支持。結合2.4.1的新特性和release歷史和目前狀況,建議幾點以下:
* xtrabackup支持非Innodb表備份,而且Innobackupex在下一版本中移除,建議經過xtrabackup替換innobackupex
* 流式備份經過--stream指定格式爲xbtream而替代tar,支持streaming格式的並行備份和壓縮
* 以前腳本使用第三方壓縮工具pbzip2進行壓縮。建議經過--compress 和--compress-threads選項進行並行壓縮
* 指定--safe-slave-backup,增長備份的一致性。(這個選項中止SQL線程而且等到show status中的slave_open_temp_tables爲0的時候開始備份,若是沒有打開臨時表,bakcup會馬上開始,不然SQL線程啓動或者關閉知道沒有打開的臨時表。若是slave_open_temp_tables在--safe-slave-backup-timeount(默認300秒)秒以後不爲0,從庫sql線程會在備份完成的時候重啓)
* 指定--rsync選項,加速備份過程 (爲了加速備份過程,同時減少FLUSH TBALES WITH READ LOCAK阻塞寫的時間,當該選項指定時innobackupex使用rsync拷貝全部的非InnoDB文件替換cp。尤爲適用於有大量的庫和表的時候會更快。innobackup會調用rsync兩次。一、執行flush tables with read lock先後 ;二、減小讀鎖被持有的時間內。由於第一調用在刷新讀鎖以前,因此它僅僅同步那些非事務的數據的變化)
* 針對緊湊備份和增量備份在雖然某些場景下很是有用,與劉偉商討過暫時繼續先不作計劃作到統一版本中去
release歷史
2.4.1 支持MySQL5.7(5.7.10)
2.3.2 命令行語法跟隨MySQL5.6的變化而變化。另外命令行支持--datadir
2.3.1 innobackupex腳本用c重寫,而且只是xtrabackup的符號鏈接。innobackupex支持2.2版本全部的特性,可是目前已降級在下個Major版本中移除,innobackupex將不支持全部新特性的語法,同時xtrabackup如今支持MyISAM的拷貝而且支持innobakcupex的全部特性。innobackupex先前特性的語法xtrabackup一樣支持
2.2.21 支持5.6(基於5.6.24版本)
2.2.8 基於5.6.22 (解決當總redo log超過4G,prepare會失敗的問題)
2.2.6 經過show variables讀取Mysql選項。在初始化表掃描的時候輸出更詳細信息
2.2.5 基於5.6.21
2.2.1 移除xtrabackup_56 xtrabakcup_55,只保留xtrabakcup.移除Build腳本,支持cmake編譯。基於5.6.16
2.1.6 innobackupex --force-non-empty-directories
2.1.4 MySQL versions 5.1.70, 5.5.30, 5.6.11
innobackupex --no-lock ,拷貝非Innodb數據時不中止複製線程,可是條件是備份期間非事務型表上不能有DDL或者DML操做
innobackupex --decrypt and innobackupex --decompress,
2.1.1 支持緊湊備份,加密備份。不在支持5.0內置Innodb和5.1內置Innoddb。移除--remote-host選項
2.1.0 支持mysql5.6的全部特性(GTID, 可移動表空間,獨立undo表空間,5.6樣式的buffer pool導出文件)
支持5.6引入的innodb buffer pool預載。buffer pool dumps能夠生成或者導入加速啓動。在備份時buffer pool dump拷貝到備份目錄,在還原階段拷貝回data目錄,
--log-copy-interval 可配置log拷貝線程檢查的間隔時間
若是開啓gtid,xtrabackup_binlog_info儲存gtid的值
支持xtrabackup --export,這個選項生成5.6樣式的元數據文件。能夠經過alter table import tablespace導入
2.0.5 --defaults-extra-file 存備份用戶的用戶名和密碼的配置文件
2.0.3 支持--move-back
1.9.1 支持壓縮備份,以前能能streaming備份以後經過外部工具壓縮
支持streaming增量備份
LRU DUMP
1.6.4 innobackupex支持--rsync選項 在datadir目錄進行兩階段rsync(首先沒有寫鎖,以後有寫鎖,)減小寫鎖持有的時間
感興趣的能夠日後看。。。。。。
————————————————————————————————————————————————————————————————————————————————————————————————————
xtrabackup主要功能測試
innobackupex
建立本地Full Backup(建立,prepare,還原)
以後隱去--defaults-file=/data1/mysql5711/my5711.cnf.bakuse --no-timestamp --slave-info --socket=/tmp/mysql5711.sock --user=mysqlha --password=xxx 等選項
建立一份備份
innobackupex /data1/dbatemp/5711back
160321 10:56:00 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!".
160321 10:56:00 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=5711;mysql_socket=/tmp/mysql5711.sock' as 'mysqlha' (using password: YES).
160321 10:56:00 version_check Connected to MySQL server
160321 10:56:00 version_check Executing a version check against the server...
160321 10:56:00 version_check Done.
160321 10:56:00 Connecting to MySQL server host: localhost, user: mysqlha, password: set, port: 5711, socket: /tmp/mysql5711.sock
Using server version 5.7.11-log
/usr/local/xtrabackup/bin/innobackupex version 2.4.1 based on MySQL server 5.7.10 Linux (x86_64) (revision id: a2dc9d4)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /data1/mysql5711
xtrabackup: open files limit requested 0, set to 204800
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = .
xtrabackup: innodb_log_files_in_group = 3
xtrabackup: innodb_log_file_size = 1363148800
xtrabackup: using O_DIRECT
InnoDB: Number of pools: 1
160321 10:56:01 >> log scanned up to (4151116)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 30 for slow_query_log/global_query_review_history, old maximum was 0
160321 10:56:01 [01] Copying ./ibdata1 to /data1/dbatemp/5711back/ibdata1
160321 10:56:02 >> log scanned up to (4151116)
160321 10:56:02 [01] ...done
160321 10:56:02 [01] Copying ./slow_query_log/global_query_review_history.ibd to /data1/dbatemp/5711back/slow_query_log/global_query_review_history.ibd
160321 10:56:02 [01] ...done
160321 10:56:02 [01] Copying ./slow_query_log/global_query_review.ibd to /data1/dbatemp/5711back/slow_query_log/global_query_review.ibd
160321 10:56:02 [01] ...done
160321 10:56:02 [01] Copying ./abc/object_info.ibd to /data1/dbatemp/5711back/abc/object_info.ibd
160321 10:56:02 [01] ...done
160321 10:56:02 [01] Copying ./mysql/time_zone_transition.ibd to /data1/dbatemp/5711back/mysql/time_zone_transition.ibd
160321 10:56:02 [01] ...done
160321 10:56:02 [01] Copying ./mysql/time_zone_name.ibd to /data1/dbatemp/5711back/mysql/time_zone_name.ibd
160321 10:56:02 [01] ...done
160321 10:56:02 [01] Copying ./mysql/slave_worker_info.ibd to /data1/dbatemp/5711back/mysql/slave_worker_info.ibd
160321 10:56:02 [01] ...done
160321 10:56:03 >> log scanned up to (4151116)
160321 10:56:03 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
160321 10:56:03 Executing FLUSH TABLES WITH READ LOCK...
160321 10:56:03 Starting to backup non-InnoDB tables and files
160321 10:56:03 [01] Copying ./slow_query_log/db.opt to /data1/dbatemp/5711back/slow_query_log/db.opt
160321 10:56:03 [01] ...done
160321 10:56:03 [01] Copying ./slow_query_log/global_query_review_history.frm to /data1/dbatemp/5711back/slow_query_log/global_query_review_history.frm
160321 10:56:03 [01] ...done
160321 10:56:04 [01] Copying ./mysql/proc.MYI to /data1/dbatemp/5711back/mysql/proc.MYI
160321 10:56:04 [01] ...done
160321 10:56:04 >> log scanned up to (4151116)
160321 10:56:04 [01] Copying ./mysql/time_zone_transition_type.frm to /data1/dbatemp/5711back/mysql/time_zone_transition_type.frm
160321 10:56:04 [01] ...done
160321 10:56:04 [01] Copying ./mysql/func.MYD to /data1/dbatemp/5711back/mysql/func.MYD
160321 10:56:06 [01] ...done
160321 10:56:06 >> log scanned up to (4151116)
160321 10:56:06 [01] Copying ./sys/schema_auto_increment_columns.frm to /data1/dbatemp/5711back/sys/schema_auto_increment_columns.frm
160321 10:56:07 [01] ...done
160321 10:56:07 >> log scanned up to (4151116)
160321 10:56:07 [01] Copying ./sys/sys_config_update_set_user.TRN to /data1/dbatemp/5711back/sys/sys_config_update_set_user.TRN
160321 10:56:07 [01] ...done
160321 10:56:07 Finished backing up non-InnoDB tables and files
160321 10:56:07 [00] Writing xtrabackup_slave_info
160321 10:56:07 [00] ...done
160321 10:56:07 [00] Writing xtrabackup_binlog_info
160321 10:56:07 [00] ...done
160321 10:56:07 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '4151107'
xtrabackup: Stopping log copying thread.
.160321 10:56:07 >> log scanned up to (4151116)
160321 10:56:07 Executing UNLOCK TABLES
160321 10:56:07 All tables unlocked
160321 10:56:07 [00] Copying ib_buffer_pool to /data1/dbatemp/5711back/ib_buffer_pool
160321 10:56:07 [00] ...done
160321 10:56:07 Backup created in directory '/data1/dbatemp/5711back'
MySQL binlog position: filename 'mysql-bin.000002', position '154'
MySQL slave binlog position: master host '10.75.22.67', filename 'mysql-bin.000007', position '154
160321 10:56:07 [00] Writing backup-my.cnf
160321 10:56:07 [00] ...done
160321 10:56:07 [00] Writing xtrabackup_info
160321 10:56:07 [00] ...done
xtrabackup: Transaction log of lsn (4151107) to (4151116) was copied.
160321 10:56:07 completed OK!
prepare
innobackupex --apply-log /data1/dbatemp/5711back
```
160321 11:04:16 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!」.
/usr/local/xtrabackup/bin/innobackupex version 2.4.1 based on MySQL server 5.7.10 Linux (x86_64) (revision id: a2dc9d4)
xtrabackup: cd to /data1/dbatemp/5711back
xtrabackup: This target seems to be not prepared yet.
InnoDB: Number of pools: 1
xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(4151107)
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = .
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 8388608
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = .
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 8388608
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 104857600 bytes for buffer pool (set by --use-memory parameter)
InnoDB: PUNCH HOLE support not available
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Uses event mutexes
InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Number of pools: 1
InnoDB: Using CPU crc32 instructions
InnoDB: Initializing buffer pool, total size = 100M, instances = 1, chunk size = 100M
InnoDB: Completed initialization of buffer pool
InnoDB: page_cleaner coordinator priority: -20
InnoDB: Highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 4151107
InnoDB: Doing recovery: scanned up to log sequence number 4151116 (0%)
InnoDB: Doing recovery: scanned up to log sequence number 4151116 (0%)
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: xtrabackup: Last MySQL binlog file position 179018, file name mysql-bin.000001
InnoDB: Creating shared tablespace for temporary tables
InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
InnoDB: File './ibtmp1' size is now 12 MB.
InnoDB: 96 redo rollback segment(s) found. 1 redo rollback segment(s) are active.
InnoDB: 32 non-redo rollback segment(s) are active.
InnoDB: 5.7.10 started; log sequence number 4151116
InnoDB: not started
InnoDB: xtrabackup: Last MySQL binlog file position 179018, file name mysql-bin.000001
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 4151291
InnoDB: Number of pools: 1
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = .
xtrabackup: innodb_log_files_in_group = 3
xtrabackup: innodb_log_file_size = 1363148800
InnoDB: PUNCH HOLE support not available
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Uses event mutexes
InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Number of pools: 1
InnoDB: Using CPU crc32 instructions
InnoDB: Initializing buffer pool, total size = 100M, instances = 1, chunk size = 100M
InnoDB: Completed initialization of buffer pool
InnoDB: page_cleaner coordinator priority: -20
InnoDB: Setting log file ./ib_logfile101 size to 1300 MB
InnoDB: Progress in MB:
100 200 300 400 500 600 700 800 900 1000 1100 1200 1300
InnoDB: Setting log file ./ib_logfile1 size to 1300 MB
InnoDB: Progress in MB:
100 200 300 400 500 600 700 800 900 1000 1100 1200 1300
InnoDB: Setting log file ./ib_logfile2 size to 1300 MB
InnoDB: Progress in MB:
100 200 300 400 500 600 700 800 900 1000 1100 1200 1300
InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
InnoDB: New log files created, LSN=4151291
InnoDB: Highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 4151308
InnoDB: Doing recovery: scanned up to log sequence number 4151317 (0%)
InnoDB: Doing recovery: scanned up to log sequence number 4151317 (0%)
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: xtrabackup: Last MySQL binlog file position 179018, file name mysql-bin.000001
InnoDB: Removed temporary tablespace data file: 「ibtmp1」
InnoDB: Creating shared tablespace for temporary tables
InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
InnoDB: File './ibtmp1' size is now 12 MB.
InnoDB: 96 redo rollback segment(s) found. 1 redo rollback segment(s) are active.
InnoDB: 32 non-redo rollback segment(s) are active.
InnoDB: Waiting for purge to start
InnoDB: page_cleaner: 1000ms intended loop took 13284ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
InnoDB: 5.7.10 started; log sequence number 4151317
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 4151336
160321 11:04:32 completed OK!
### 還原全備:
innobackupex --defaults-file=/data1/mysql5711_bak/my5711.cnf.bakuse --copy-back /data1/dbatemp/5711back/
/usr/local/xtrabackup/bin/innobackupex version 2.4.1 based on MySQL server 5.7.10 Linux (x86_64) (revision id: a2dc9d4)
160321 11:29:27 [01] Copying ib_logfile0 to /data1/mysql5711/ib_logfile0
160321 11:29:31 [01] ...done
160321 11:29:31 [01] Copying ib_logfile1 to /data1/mysql5711/ib_logfile1
160321 11:29:34 [01] ...done
160321 11:29:34 [01] Copying ib_logfile2 to /data1/mysql5711/ib_logfile2
160321 11:29:37 [01] ...done
160321 11:29:38 [01] Copying ibdata1 to /data1/mysql5711/ibdata1
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./xtrabackup_info to /data1/mysql5711/xtrabackup_info
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./slow_query_log/global_query_review_history.ibd to /data1/mysql5711/slow_query_log/global_query_review_history.ibd
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./slow_query_log/db.opt to /data1/mysql5711/slow_query_log/db.opt
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./slow_query_log/global_query_review.ibd to /data1/mysql5711/slow_query_log/global_query_review.ibd
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./slow_query_log/global_query_review_history.frm to /data1/mysql5711/slow_query_log/global_query_review_history.frm
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./slow_query_log/global_query_review.frm to /data1/mysql5711/slow_query_log/global_query_review.frm
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./abc/weibo_asset_info.frm to /data1/mysql5711/abc/weibo_asset_info.frm
160321 11:29:38 [01] ...done
160321 11:29:38 [01] Copying ./abc/object_info.ibd to /data1/mysql5711/abc/object_info.ibd
160321 11:29:39 [01] ...done
160321 11:29:39 [01] Copying ./mysql/user.frm to /data1/mysql5711/mysql/user.frm
......
......
160321 11:29:42 [01] ...done
160321 11:29:42 [01] Copying ./xtrabackup_slave_info to /data1/mysql5711/xtrabackup_slave_info
160321 11:29:42 [01] ...done
160321 11:29:42 [01] Copying ./ib_buffer_pool to /data1/mysql5711/ib_buffer_pool
160321 11:29:42 [01] ...done
160321 11:29:42 completed OK!
## stream bakcup
innobackupex --stream=tar ./ |gzip - > backup.tar.gz
innobackupex --compress --compress-threads=8 --stream=xbstream --parallel=4 ./ > backup.xbstream
## 增量備份
### base backup:
innobackupex /data1/dbatemp/
### 基於base bakcup的增量備份:
innobackupex --incremental /data/dbatemp --incremental-basedir=/data1/dbatemp/2016-03-21_12-02-03
160321 12:02:03 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=5711;mysql_socket=/tmp/mysql5711.sock' as 'mysqlha' (using password: YES).
160321 12:02:03 version_check Connected to MySQL server
160321 12:02:03 version_check Executing a version check against the server...
160321 12:02:03 version_check Done.
160321 12:02:03 Connecting to MySQL server host: localhost, user: mysqlha, password: set, port: 5711, socket: /tmp/mysql5711.sock
Using server version 5.7.11-log
/usr/local/xtrabackup/bin/innobackupex version 2.4.1 based on MySQL server 5.7.10 Linux (x86_64) (revision id: a2dc9d4)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /data1/mysql5711
xtrabackup: open files limit requested 0, set to 204800
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = .
xtrabackup: innodb_log_files_in_group = 3
xtrabackup: innodb_log_file_size = 1363148800
xtrabackup: using O_DIRECT
InnoDB: Number of pools: 1
160321 12:02:03 >> log scanned up to (4151364)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 30 for slow_query_log/global_query_review_history, old maximum was 0
160321 12:02:04 [01] Copying ./ibdata1 to /data1/dbatemp/2016-03-21_12-02-03/ibdata1
160321 12:02:04 >> log scanned up to (4151364)
160321 12:02:04 [01] ...done
160321 12:02:04 [01] Copying ./slow_query_log/global_query_review_history.ibd to /data1/dbatemp/2016-03-21_12-02-03/slow_query_log/global_query_review_history.ibd
160321 12:02:04 [01] ...done
160321 12:02:04 [01] Copying ./slow_query_log/global_query_review.ibd to /data1/dbatemp/2016-03-21_12-02-03/slow_query_log/global_query_review.ibd
160321 12:02:05 [01] Copying ./sys/sys_config.ibd to /data1/dbatemp/2016-03-21_12-02-03/sys/sys_config.ibd
160321 12:02:05 [01] ...done
160321 12:02:05 >> log scanned up to (4151364)
160321 12:02:06 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
160321 12:02:06 Executing FLUSH TABLES WITH READ LOCK...
160321 12:02:06 Starting to backup non-InnoDB tables and files
160321 12:02:06 [01] Copying ./slow_query_log/db.opt to /data1/dbatemp/2016-03-21_12-02-03/slow_query_log/db.opt
160321 12:02:06 [01] ...done
160321 12:02:06 [01] Copying ./slow_query_log/global_query_review_history.frm to /data1/dbatemp/2016-03-21_12-02-03/slow_query_log/global_query_review_history.frm
160321 12:02:10 Finished backing up non-InnoDB tables and files
Failed to get master binlog coordinates from SHOW SLAVE STATUS
This means that the server is not a replication slave. Ignoring the --slave-info option
160321 12:02:10 [00] Writing xtrabackup_binlog_info
160321 12:02:10 [00] ...done
160321 12:02:10 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '4151355'
xtrabackup: Stopping log copying thread.
.160321 12:02:10 >> log scanned up to (4151364)
160321 12:02:10 Executing UNLOCK TABLES
160321 12:02:10 All tables unlocked
160321 12:02:10 [00] Copying ib_buffer_pool to /data1/dbatemp/2016-03-21_12-02-03/ib_buffer_pool
160321 12:02:10 [00] ...done
160321 12:02:10 Backup created in directory '/data1/dbatemp/2016-03-21_12-02-03'
MySQL binlog position: filename 'mysql-bin.000001', position '154'
160321 12:02:10 [00] Writing backup-my.cnf
160321 12:02:10 [00] ...done
160321 12:02:10 [00] Writing xtrabackup_info
160321 12:02:10 [00] ...done
xtrabackup: Transaction log of lsn (4151355) to (4151364) was copied.
160321 12:02:10 completed OK!
### prepare增量備份
prepare base
innobackupex --incremental --apply-log --redo-only /data1/dbatemp/2016-03-21_12-02-03/ --use-memory=1G
/usr/local/xtrabackup/bin/innobackupex version 2.4.1 based on MySQL server 5.7.10 Linux (x86_64) (revision id: a2dc9d4)
xtrabackup: cd to /data1/dbatemp/2016-03-21_12-02-03
xtrabackup: This target seems to be not prepared yet.
InnoDB: Number of pools: 1
xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(4151355)
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = .
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 8388608
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = .
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 8388608
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 1073741824 bytes for buffer pool (set by --use-memory parameter)
InnoDB: PUNCH HOLE support not available
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Uses event mutexes
InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Number of pools: 1
InnoDB: Using CPU crc32 instructions
InnoDB: Initializing buffer pool, total size = 1G, instances = 1, chunk size = 128M
InnoDB: Completed initialization of buffer pool
InnoDB: page_cleaner coordinator priority: -20
InnoDB: Highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 4151355
InnoDB: Doing recovery: scanned up to log sequence number 4151364 (0%)
InnoDB: Doing recovery: scanned up to log sequence number 4151364 (0%)
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: xtrabackup: Last MySQL binlog file position 179018, file name mysql-bin.000001
InnoDB: not started
InnoDB: xtrabackup: Last MySQL binlog file position 179018, file name mysql-bin.000001
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 4151373
InnoDB: Number of pools: 1
160321 12:15:37 completed OK!
```
prepare增量:
innobackupex --incremental --apply-log --redo-only /data1/dbatemp/2016-03-21_12-02-03/ --use-memory=1G --incremental-dir=/data1/dbatemp/2016-03-21_12-19-21/
/usr/local/xtrabackup/bin/innobackupex version 2.4.1 based on MySQL server 5.7.10 Linux (x86_64) (revision id: a2dc9d4)
incremental backup from 4151355 is enabled.
xtrabackup: cd to /data1/dbatemp/2016-03-21_12-02-03
xtrabackup: This target seems to be already prepared with --apply-log-only.
InnoDB: Number of pools: 1
xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(4151355)
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = /data1/dbatemp/2016-03-21_12-19-21/
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 8388608
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 30 for slow_query_log/global_query_review_history, old maximum was 0
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//ibdata1.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//ibdata1.delta to ./ibdata1...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//slow_query_log/global_query_review.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//slow_query_log/global_query_review.ibd.delta to ./slow_query_log/global_query_review.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//slow_query_log/global_query_review_history.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//slow_query_log/global_query_review_history.ibd.delta to ./slow_query_log/global_query_review_history.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//abc/weibo_asset_info.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//abc/weibo_asset_info.ibd.delta to ./abc/weibo_asset_info.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//abc/object_info.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//abc/object_info.ibd.delta to ./abc/object_info.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_transition.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_transition.ibd.delta to ./mysql/time_zone_transition.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/slave_relay_log_info.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/slave_relay_log_info.ibd.delta to ./mysql/slave_relay_log_info.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/engine_cost.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/engine_cost.ibd.delta to ./mysql/engine_cost.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/slave_worker_info.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/slave_worker_info.ibd.delta to ./mysql/slave_worker_info.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_leap_second.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_leap_second.ibd.delta to ./mysql/time_zone_leap_second.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/help_category.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/help_category.ibd.delta to ./mysql/help_category.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/slave_master_info.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/slave_master_info.ibd.delta to ./mysql/slave_master_info.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/servers.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/servers.ibd.delta to ./mysql/servers.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_name.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_name.ibd.delta to ./mysql/time_zone_name.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/plugin.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/plugin.ibd.delta to ./mysql/plugin.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/innodb_index_stats.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/innodb_index_stats.ibd.delta to ./mysql/innodb_index_stats.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/server_cost.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/server_cost.ibd.delta to ./mysql/server_cost.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/help_topic.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/help_topic.ibd.delta to ./mysql/help_topic.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_transition_type.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone_transition_type.ibd.delta to ./mysql/time_zone_transition_type.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/help_relation.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/help_relation.ibd.delta to ./mysql/help_relation.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/gtid_executed.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/gtid_executed.ibd.delta to ./mysql/gtid_executed.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/innodb_table_stats.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/innodb_table_stats.ibd.delta to ./mysql/innodb_table_stats.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/time_zone.ibd.delta to ./mysql/time_zone.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//mysql/help_keyword.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//mysql/help_keyword.ibd.delta to ./mysql/help_keyword.ibd...
xtrabackup: page size for /data1/dbatemp/2016-03-21_12-19-21//sys/sys_config.ibd.delta is 16384 bytes
Applying /data1/dbatemp/2016-03-21_12-19-21//sys/sys_config.ibd.delta to ./sys/sys_config.ibd...
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup: innodb_log_group_home_dir = /data1/dbatemp/2016-03-21_12-19-21/
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 8388608
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 1073741824 bytes for buffer pool (set by --use-memory parameter)
InnoDB: PUNCH HOLE support not available
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Uses event mutexes
InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Number of pools: 1
InnoDB: Using CPU crc32 instructions
InnoDB: Initializing buffer pool, total size = 1G, instances = 1, chunk size = 128M
InnoDB: Completed initialization of buffer pool
InnoDB: page_cleaner coordinator priority: -20
InnoDB: Highest supported file format is Barracuda.
InnoDB: Log scan progressed past the checkpoint lsn 4151355
InnoDB: Doing recovery: scanned up to log sequence number 4151364 (0%)
InnoDB: Doing recovery: scanned up to log sequence number 4151364 (0%)
InnoDB: Are you sure you are using the right ib_logfiles to start up the database? Log sequence number in the ib_logfiles is 4151355, less than the log sequence number in the first system tablespace file header, 4151373.
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: xtrabackup: Last MySQL binlog file position 179018, file name mysql-bin.000001
InnoDB: not started
InnoDB: xtrabackup: Last MySQL binlog file position 179018, file name mysql-bin.000001
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 4151373
InnoDB: Number of pools: 1
160321 12:21:44 [01] Copying /data1/dbatemp/2016-03-21_12-19-21/slow_query_log/db.opt to ./slow_query_log/db.opt
160321 12:21:44 [01] ...done
160321 12:21:44 [01] Copying /data1/dbatemp/2016-03-21_12-19-21/slow_query_log/global_query_review_history.frm to ./slow_query_log/global_query_review_history.frm
160321 12:21:44 [01] ...done
160321 12:21:44 [01] Copying /data1/dbatemp/2016-03-21_12-19-21/slow_query_log/global_query_review.frm to ./slow_query_log/global_query_review.frm
160321 12:21:44 [01] ...done
160321 12:21:44 [01] Copying /data1/dbatemp/2016-03-21_12-19-21/abc/weibo_asset_info.frm to ./abc/weibo_asset_info.frm
160321 12:21:44 [01] ...done
160321 12:21:44 [01] Copying /data1/dbatemp/2016-03-21_12-19-21/abc/db.opt to ./abc/db.opt
160321 12:21:44 [01] ...done
160321 12:21:48 [01] Copying /data1/dbatemp/2016-03-21_12-19-21/sys/session.frm to ./sys/session.frm
160321 12:21:48 [01] ...done
160321 12:21:48 [00] Copying /data1/dbatemp/2016-03-21_12-19-21//xtrabackup_binlog_info to ./xtrabackup_binlog_info
160321 12:21:48 [00] ...done
160321 12:21:48 [00] Copying /data1/dbatemp/2016-03-21_12-19-21//xtrabackup_info to ./xtrabackup_info
160321 12:21:48 [00] ...done
160321 12:21:48 completed OK!
[root@hebe211 dbatemp]# cat 2016-03-21_12-02-03/xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 4151355
last_lsn = 4151364
compact = 0
recover_binlog_info = 0
[root@hebe211 dbatemp]# cat 2016-03-21_12-19-21/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 4151355
to_lsn = 4151355
last_lsn = 4151364
compact = 0
recover_binlog_info = 0
prepare(base+incremental) 可選
壓縮備份
innobackupex --compress --compress-threads=8 /data1/dbatemp/
生成QP文件
解壓縮:
innobackupex --decompress /data1/dbatemp/2016-03-21_12-32-46/
須要安裝qpress
備份還原單表
建立單表的Backup
innobackupex --include='abc.weibo_asset_info' /data1/dbatemp/
prepare單表bakcup
innobackupex --apply-log --export /data1/dbatemp/2016-03-21_12-46-24/
xtrabackup: export metadata of table 'abc/weibo_asset_info' to file `./abc/weibo_asset_info.exp` (4 indexes)
xtrabackup: name=PRIMARY, id.low=68, page=3
xtrabackup: name=ip_in, id.low=69, page=4
xtrabackup: name=owner, id.low=70, page=5
-rw-r--r-- 1 root root 1309 Mar 21 12:49 weibo_asset_info.cfg
-rw-r----- 1 root root 16384 Mar 21 12:49 weibo_asset_info.exp
-rw-r----- 1 root root 8980 Mar 21 12:46 weibo_asset_info.frm
-rw-r----- 1 root root 589824 Mar 21 12:46 weibo_asset_info.ibd
還原單表
還原機上執行:
alter table weibo_asset_info discard tablespace;
將weibo_asset_info.exp和weibo_asset_ibd文件傳到目標機目標目錄中
執行:
alter table weibo_asset_info import tablespace;
xtrabackup
fullbackup
建立full backup
xtrabackup --backup --target-dir=/data1/dbatemp/testx/
prepare backup
xtrabackup --prepare --target-dir=/data1/dbatemp/testx/
增量backup
建立一個full backup
xtrabackup --backup --target-dir=/data1/dbatemp/testa/
建立增量
xtrabackup --backup --target-dir=/data1/dbatemp/testa_incremental --incremental-basedir=/data1/dbatemp/testa
prepare base
xtrabackup --prepare --apply-log-only --target-dir=/data1/dbatemp/testa/
prepare incremental
xtrabackup --prepare --apply-log-only --target-dir=/data1/dbatemp/testa/ --incremental-dir=/data1/dbatemp/testa_incremental
prepare base+incremental
xtrabackup --prepare --target-dir=/data1/dbatemp/testa/
還原備份(需手動)
mkdir mysql5711
cd /data1/dbatemp/testa
rsync -rvt --exclude 'xtrabackup_checkpoints' --exclude 'xtrabackup_logfile' ./ /data1/mysql5711
cp my5711.cnf /data1/mysql5711
chown -R my5711:mysql mysql5711
建立基於GTID的SLAVE
建立全備
xtrabackup --backup --target-dir=/data1/dbatemp/testb/
MySQL binlog position: filename 'mysql-bin.000002', position '1099', GTID of the last change 'a34b5a32-e04e-11e5-a5bf-782b22675711:1'
MySQL slave binlog position: master host '10.75.22.67', purge list 'a34b5a32-e04e-11e5-a5bf-782b22675711:1'
prepare
xtrabackup --prepare --target-dir=/data1/dbatemp/testb/
restore,將backup移動到目標目錄或者服務器
配置開啓gtid的slave
set global gtid_purged=「a34b5a32-e04e-11e5-a5bf-782b22675711:1」;
change master to master_host='10.75.22.67', master_user='replica', master_password='eHnNCaQE3ND',MASTER_PORT=5711,MASTER_AUTO_POSITION = 1;
————————————————————————————————————————————————————————————————————————————————————————————————————
xtrabackup2.4.1文檔
Percona Xtrabackup Features
Innobackupex
$ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
$ innobackupex --user=LUKE --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -
$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/
|
|
|
|
|
|
|
|
innobackupex是一個經過xtrabackup結合了xbstream和xbcrypt等來備份一整個數據庫實例的工具
蔣健一個完整備份,除了鏈接數據庫的選項還只須要一個參數,備份存儲目錄的路徑
$ innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
以後檢查確認信息輸出的最後一行:
innobackupex: Backup created in directory ’/path/to/BACKUP-DIR/2013-03-25_00-00-09’
innobackupex: MySQL binlog position: filename ’mysql-bin.000003’, position 1946
111225 00:00:53 innobackupex: completed OK!
備份會最終存儲在以時間戳命名的目錄內
在底層,在後臺,innobackupex被稱做二進制xtrabackup來備份Innodb全部表的數據而且拷貝全部的frm表定義文件,數據,和MyISAM,MERGE,CSV表相關的文件,觸發器,數據庫配置文件到一個時間戳的目錄中去
其餘須要考慮的選項
--no-timestamp:告訴innobackupex不要建立一個時間戳目錄來存儲備份
--defaults-file:能夠提供innobackupex其餘的數據庫配置文件。惟一的限制就是必須放在第一個參數的位置
innobackupex --defaults-file=/tmp/other-my.cnf --user=XXX --password=XXX /path/to/backup
PREPARE階段,用innobackupex prepare Full Backup
在建立了一個backup以後,數據還不能用於還原,由於有未提交的事務未完成或者事務日誌須要重放,作這些待定的操做須要數據文件一致.這些都是prepare階段的目的,一旦這些完成,數據就能夠用了
須要指定選項apply-log:
innobakupex --apply-log /path/to/BACKUP-DIR
若是成功了,innobackupex操做以後,數據是馬上可用的
在後臺,innobackupex經過讀取backup-my.cnf開始prepare進程,在以後,innobackupe重放已提交的事務並回滾未提交的事務,一旦這些操做完成,全部信息在表空間中(innodb文件),Log文件被重建.這些說明了調用xtrabackup --prepare兩次。
注意這個preparation不適合增量備份,若是基於增量備份,將沒法'add'增量部分
經過Innobackupex還原Full Backup
--copy-back選項,在server的datadir目錄執行一份備份的還原
innobakupex --copy-back /path/to/BACKUP-DIR
--copy-back:作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir
會跟具體my.cnf文件裏的配置,拷貝全部數據相關的文件到datadir。
注意:
1.datadir目錄必須爲空。除非指定innobackupex --force-non-empty-directorires選項指定,不然--copy-backup選項不會覆蓋
2.在restore以前,必須shutdown MySQL實例,你不能將一個運行中的實例restore到datadir目錄中
3.因爲文件屬性會被保留,大部分狀況下你須要在啓動實例以前將文件的屬主改成mysql,這些文件將屬於建立備份的用戶
chown -R my5711:mysql /data1/dbrestore
以上須要在用戶調用Innobackupex以前完成
其餘類型備份
經過Innobackupex進行增量備份
在每一個備份之間並非全部的信息都有變化,增量備份的目的是減小須要的存儲容量和建立一份備份的時間
這些能夠完成是由於每一個InnoDB的頁都有一個LSN,這個LSN至關於一整個數據庫的版本號碼,每次數據庫更改,這個Number就會遞增
增量備份就是拷貝某一個指定LSN開始的全部page
一旦這些pages以他們各自的順序被放到一塊兒,應用這些日誌將從新建立影響數據庫的進程,在建立backup時刻產生數據
經過innobakupex建立一份增量備份
首先,建立一份全量備份做爲基礎用於以後的增量備份
innobackupex /data1/dbbackup
將會在/data1/dbbackup目錄生成一個帶有時間戳的目錄,好比假設備份是在上個月月底最後一天建立.BASEDIR是/data1/dbbackup/2016-02-29_23-01-18
能夠經過innobackupex --no-timestamp選項覆蓋這種行爲,備份將會被建立在指定的目錄中
若是檢查BASE-DIR目錄中的xtrabackup-checkpoints文件,你能看到以下:
backup_type = full-backuped
from_lsn = 0
to_lsn = 1291135
次日建立一份增量備份,經過--incremental選項並提供BASEDIR:
innobackupex --incremental /data1/backups --incremental-basedir=BASEDIR
會在/data1/backups目錄裏生成另外一份帶有時間戳的目錄,就是/data1/backups/2016-03-01_23-01-18,該目錄包含了增量備份,咱們稱之爲INCREMENTAL-DIR-1,若是檢查該目錄的xtrabackup-checkpoints文件。會看到以下:
backup_type = incremental
from_len = 1291135
to_lsn = 1352113
相似的,第三天建立另外一份增量備份。可是次日的增量備份變成了BASEDIR
innobackupex --incremental /data/backups --incremental-basedir=INCRENMENTAL-DIR-1
結果生成/data1/backups/2016-03-02_23-01-18,用INCREMENTAL-DIR-2來表示:
backup_type = incremental
from_lsn = 1352113
to_lsn = 1358967
像咱們以前所說,增量備份只拷貝LSN大於一個指定值的pages,提供LSN會產生相同數據的目錄:
innobackupex --incremental /data/backups --incremental-lsn=1291135
innobackupex --incremental /data/bakcups --incremental-lsn=1358967
由於全備或上一個增備並非總在系統中(如備份後傳輸到遠程),用這種方法作增量備份很是有用。這種過程只能影響XtraDB和InnoDB表,其餘引擎的表如MyISAM.在作增量備份的過程當中時候會拷貝所有。
經過innobakupex prepare一份增量備份
prepare增量備份與全量備份不一樣。這裏須要額外注意:
若是在基於base backup中重放提交事務回滾未提交事務,是不能add增量的。若是對於增量的這樣作,是不能add從那刻起的數據和其他的增量。
--redo-only --apply-log:
強制備份日誌時只redo ,跳過rollback。這在作增量備份時很是必要
innobackupex --apply-log --redo-only BASE-DIR
而後,第一個增量Backup能apply給base backup:
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCRENMENTAL-DIR-1
若是沒有--incremental-dir被設置了,innobackupex會選擇在basedir裏最近建立的一個子目錄
此時,BASE-DIR包含了一直到第一次增量備份的數據,注意全備永遠都在base backup目錄裏
而後在第二個增量備份上重複這個過程:
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
若是出現'complete ok',最終的數據會都merge到base backup目錄中去(BASE-DIR)
注意:--redo-only用於merging全部的增量除了最後一個
你能夠經過以上的過程給base增長更多的增量,只要按照備份的完成的時間順序依次便可。若是用錯誤的順序Merge增量,備份就徹底無用了。若是對apply的順序有疑問,能夠檢查每一個目錄的xtrabackup_checkpoints文件
一旦你對base backup目錄merge完全部的增量,接下來prepare,回滾未提交的事務:
innobackupex --apply-log BASE-DIR (innobackupex回滾未提交的事務)
此時的backup能夠馬上用於還原了,此步preparation是可選的,然和,若是你還原沒有這步,database server會開始rollback未提交的事務。若是發生crash時,database server會作一樣的工做。這會延遲db server的啓動時間,若是此步prepare則會避免
注意innobacupex不會建立iblog*這些文件,若是想要建立,用xtrabackup -prepare做用於該目錄,不然,這些文件在server啓動的時候被建立
經過innobackupex還原增量備份
preparing增量備份以後,base dir就是一個full backup,還原方式:
innobackupex --copy-back BASE-DIR
經過xbstream和tar進行增量流式備份
使用xbstream streaming選項,備份能夠被打包成自定義的xbstream格式,一樣須要一個Base backup
innobakcupex /data/bakcups
本地備份:
innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ > incremental.xbstream
解壓備份:
xbstream -x < incremental.xbstream
作一份本地備份並streaming到遠程服務器而後解壓:
innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ | /
ssh user@hostname " cat - | xbstream -x -C > /backup-dir/"
--stream=[tar]
備 份文件輸出格式, tar時使用tar4ibd , 該文件可在XtarBackup binary文件中得到.若是備份時有指定--stream=tar, 則tar4ibd文件所處目錄必定要在$PATH中(由於使用的是tar4ibd去壓縮, 在XtraBackup的binary包中可得到該文件)。
在 使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,若是你備份的時候併發寫入較大的話 xtrabackup_logfile可能會很大(5G+),極可能會撐滿你的/tmp目錄,能夠經過參數--tmpdir指定目錄來解決這個問題
部分備份
只備份部分的表或者db,前提是開啓innodb_file_per_table選項,每張表有獨立的表空間。你不能經過簡單地將prepared的部分備份使用--copy-back選項直接複製回數據目錄,而是要經過導入表的方向來實現還原。固然,有些狀況下,部分備份也能夠直接經過--copy-back進行還原,但這種方式還原而來的數據多數會產生數據不一致的問題,所以,不管如何不推薦使用這種方式。
建立部分備份
有三種方法指定備份那部分數據
innobackupex --include='^mydatabase[.]mytable' /path/to/backup
上面的指令只備份表名相匹配的數據。--include選項傳遞給xtrabackup --tables,對每一個庫中的每一個表逐一匹配,所以會建立全部的庫,不過是空的目錄。
echo "mydatabase.mytable" > /tmp/tables.txt
innobackupex --tables-file=/tmp/tables.txt /path/to/backup
該選項傳遞給xtrabackup --tables-file,與--table選項不一樣,只有要備份的表的庫纔會被建立
innobackupex --databases="mydatabase.mytable mysql" /path/to/backup
該選項對innodb引擎表無效,仍是會備份的
prepare部分備份
prepare部分備份的過程相似於導出表的過程,要使用--export選項進行:
innobackupex --apply-log --export /path/to/partial/backup
此命令執行過程當中,innobackupex會調用xtrabackup命令從數據字典中移除缺失的表,所以,會顯示出許多關於「表不存在」類的警告信息。同時,也會顯示出爲備份文件中存在的表建立.exp文件的相關信息。
還原部分備份
還原部分備份的過程跟導入表的過程相同。固然,也能夠經過直接複製prepared狀態的備份直接至數據目錄中實現還原,不要此時要求數據目錄處於一致狀態。
壓縮備份
備份innodb表的時候可能會忽略輔助索引,會使備份更緊湊而且節約磁盤空間。缺點是輔助索引重建致使backup prepare的過程會須要更長的時間。備份大小區別取決於輔助索引大小的區別。。例如沒有加--compat選項的full backup.
注意:壓縮備份不支持系統表空間,,因此須要打開innodb-file-per-table選項
建立壓縮備份
innobackupex --compact /data/backups
會在/data/backups目錄下建立個時間戳目錄
若是檢查BASE-DIR裏面的xtrabackup_checkpoints文件,能看到以下:
backup_type = full-backuped
from_lsn = 0
to_lsn = 2888984349
last_lsn = 2888984349
compact = 1
沒有--compact選項compact的值爲0,這種方法方便的檢查備份是否包含輔助索引
preparing壓縮備份
preparing壓縮備份須要重建索引,prepare backup須要--rebuild-index跟隨--apply-logs
innobackupex --apply-log --rebuild-indexes /data/backups/2016-03-14_10-29-48
命令輸出,除了標準innobackupex輸出,還包含了索引重建的信息
還原壓縮備份
innnobackupex有一個--copy-back選項。做用是講一份backup還原到server的datadir目錄中去
innobackupex --copy-back /path/to/backup-dir
會將全部數據相關的全部文件拷貝到datadir目錄,由my.cnf配置文件定義
加密備份
2.1版本引入,加密或者解密本地備份或者由xbstream選項備份的流式備份,加密由libgcrypt庫實現
建立加密備份
加密須要指定如下選項(--encrypt-key和--encrypt-key-file只需指定其中之一便可)
--encrypt-key選項使用栗子:
innobackupex --encrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" /data/backups
優化加密過程
引入兩個新的選項加速加密過程,--encrypt-threads和--encrypt-chunk-size
--encrypt-threads選項並行加密,--encrypt-chunk-size指定每一個加密線程buffer的大小(字節,默認64K)
解密加密備份
可經過xbcrypt二進制解密,如下一行解密全部目錄:
for i in ‘find . -iname "*\.xbcrypt"‘; do xbcrypt -d --encrypt-key-file=/root/secret_key --encrypt-
prepare加密備份
在備份解密以後,能夠經過full backup同樣的方式經過--apply-logs prepare
innobackupex --apply-log /data/backups/2016-03-14_08-31-35/
注意,xtrabackup不會自動移除加密文件,爲了清理Backup目錄,須要用戶手動rm *.xbcrypt文件
還原加密備份
--copy-back選項,經過拷貝文件到datadir目錄還原備份
innobackupex --copy-back /path/to/BACKUP-DIR
高級特性
流式和壓縮備份
streaming模式,發送backup以tar或者xbstream格式到標準輸出,取代拷貝文件到backup目錄,這樣容許你使用其餘程序過濾bakcup的輸出提供更靈活的備份,好比,經過管道將backup的輸出壓縮工具進行壓縮,流式備份其中的一項好處是是經過unix管道備份能夠自動加密
使用streaming特性,須要使用--stream選項並提供stream的格式(tar或者stream),和在哪裏存臨時文件
innobackpex --stream=tar /tmp
innobackup以--log-stream模式在子進程中啓動xtrabackup,而且重定向日誌到臨時文件,以後使用xbstream以特殊的xbstream格式將全部數據文件stream到標準輸出。
開啓壓縮時,xtrabakup以指定的壓縮算法,壓縮全部數據,除了元數據和非innodb文件等不被壓縮文件,目前算法只支持quicklz。結果文件爲qpress歸檔文件
使用xbstream做爲stream選項,備份能夠並行拷貝和壓縮,大大的加速了備份過程,以防止備份同時壓縮和加密。須要首先先解密以後再解壓縮
使用xbstream栗子
存儲完整備份到單一文件
innobackupex --stream=xbstream /root/backup/ > /root/backup/backup.xbtream
stream而且壓縮這個備份:
innobackupex --stream=xbstream --compress /root/backup/ > /root/backup/backup.xbstream
解包到/root/backup/目錄:
xbstream -x < backup.xbstream -C /root/backup/
將壓縮backup發送到其餘host並解壓縮:
innobackupex --compress --stream=xbstream /root/backup/ | ssh user@otherhost "xbstream -x -C /root/
使用tar的栗子
將完整的backup存到一個tar歸檔
innobackupex --stream=tar /root/backup/ > /root/backup/out.tar
將tar歸檔發送到其餘host
innobackupex --stream=tar ./ | ssh user@destination \ "cat - > /data/backups/backup.tar"
注意提取percona xtrabackup歸檔須要指定-i選項
tar -xizf backup.tar.gz
可指定喜歡的壓縮工具:
innobackupex --stream=tar ./ | gzip - > backup.tar.gz
innobackupex --stream=tar ./ | bzip2 - > backup.tar.bz2
須要注意的是,流式備份須要在還原以前Prepare,流模式不須要prepare
複製環境中備份
從庫備份須要指定如下選項:
加速備份過程
在applying log以前,壓縮文件須要被解壓縮
爲了加速備份過程,同時減少FLUSH TBALES WITH READ LOCAK阻塞寫的時間,當該選項指定時,innobackupex使用rsync拷貝全部的非InnoDB文件替換cp。尤爲適用於有大量的庫和表的時候會更快。innobackup會調用rsync兩次。一、執行flush tables with read lock以前;二、減小讀鎖被持有的時間內。由於第一調用在刷新讀鎖以前,因此它僅僅同步那些非事務的數據的變化
(它不能和--remote-host、--stream一塊兒使用)
節流(Throttling)備份
雖然innobackupex不會阻塞任何數據庫的操做,可是備份這個過程會給系統增長Load,若是系統沒有更多的IO能力,那麼能夠限制innoabckupex讀寫Innodb數據的頻率,經過--throttle選項控制
該選項直接傳給xtrabackup二進制程序,並僅限制了innodb表的日誌和文件操做的
iostat命令能夠檢查系統上IO操做,
注意innobackup --throttle選項只在備份階段工做,innobackupex --apply-log and innobackupex --copy-back並不工做
--throttle選項很像mysqlbackup中的--sleep選項
還原單表
早於5.6b版本,是不可能在server中間拷貝文件來拷貝表。然而經過Xtrabackup,你能夠任何innodb數據庫中間導出單個表,而且把它們導入到MySQL5.6中(source不必定是MySQL5.6,可是destination必須是),而且只對獨立ibd文件有效
導出表
exporting不是在建立backup的時候,而是在prepare階段完成,一旦full backup建好,用--export選項prepare它
innobackupex --apply-log --export /path/to/backup
會爲每一個有獨立表空間的Innodb建立一個.exp擴展的文件。
舉個栗子:
find /data/backups/mysql/ -name export_test.*
/data/backups/mysql/test/export_test.exp
/data/backups/mysql/test/export_test.ibd
/data/backups/mysql/test/export_test.cfg
有三個文件須要導入線上5.6的表中
MySQL經過dump成一種特別格式的的Innodb字典的.cfg文件,這種格式不一樣於.exp。嚴格來講,.cfg文件不須要導入mysql5.6表空間。表空間即便從不一樣的server上也會導入成功。若是相關的.cfg文件在一樣的目錄中,innodb會作schema驗證
每一個.exp(或者.cfg)用來導入表
注意:innodb 慢停實例(full purge+change buffer merge)經過on --export,不然表空間會不一致而且不會被導入。全部常見的性能問題會被考慮:足夠的buffer pool(例如--use-memory,默認100M)和足夠的存儲,不然將會耗費好久完成導出
導入表
將一張表導入到其餘服務器上,首先以一樣的表結構建立一張新表用於導入:
OTHERSERVER|mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;
而後丟棄表空間:
OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
而後,拷貝mytable.ibd和mytable.exp(若是導入到5.6則是mytable.cfg)到數據庫家目錄,而後導入表空間:
OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
一旦執行完成。導入表的書庫是馬上可用的
基於時間點恢復
經過innobackupex和二進制日誌可恢復指定時間點的數據
注意二進制日誌包含從過去的一個時間點開始數據庫的改變操做,你須要一個full datadir做爲base,而後能夠從二進制日誌中apply一系列的操做使數據匹配你想要的那個時間點的操做
作一份snapshot,咱們能夠經過innobackupex作一份全備full backup
innobackupex /path/to/backup --no-timestamp
出於方便使用--no-timestamp選項。以後咱們開始prepare,爲了以後作好還原的準備
innobackupex --apply-log /path/to/bakcup
如今,假設過去了一段時間,你但願還原數據庫到過去的某個特定點,想下製做快照時點的限制
想要找出二進制日誌狀況,執行show binary logs和show master status
而後找出快照生成時候的pos點。找到backup目錄下的xtrabackup_binlog_info
cat /path/to/backup/xtrabackup_binlog_info
mysql-bin.000003 57
這會告訴備份的時間點的binlog日誌及Pos點,這個pos點在還原備份時候很是有效
innobackupex --copy-back /path/to/backup
下一步就是從二進制日誌中用mysqlbinlog從快照的pos點開始提早查詢語句並重定向到一個文件中
mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 --start-position=57 > mybinlog.sql
注意若是有多個binlog,須要列出全部
時刻觀察來決定哪一個POS點或者時間點是你要還原的那個點。一旦決定好了。管道傳向server,假設時間點是11-12-25 01:00:00:
mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \
--start-position=57 --stop-datetime="11-12-25 01:00:00" | mysql -u root -p
提高FLUSH TABLES WITH READ LOCKING handling
備份時,FLUSH TABLES WITH READ LOCK會在備份非innodb文件以前使用來保證備份的一致性,FLUSH TABLES WITH READ LOCK甚至有查詢執行了幾個小時的時候仍能夠運行,這種狀況下,任何都會鎖在Waiting for table flush or Waiting for master to send event這兩種狀態下,kill掉也不解決任何問題。只有kill掉致使FLUSH鎖住的慢查才能讓server從新正常運行。這就意味着若是長時間運行的查詢時,FLUSH TABLES WITH READ LOCK會被卡住,
注意,上述狀況在backup locks是無效的,Percona Server 5.6+中特性,XtraBackup會自動拷貝非Innodb數據避免阻塞修改InnoDB表的DML查詢
兩件事能夠避免上述問題:
innobackupex 等待好時機
innobackupex 能夠Kill阻止得到全局鎖的查詢(全部或者僅select查詢)
等待查詢完成
獲取全局鎖的好時機是指全部長查詢都執行完畢,爲防止innobackupex等待執行LUSH太長時間。新選項被引入:
innobakcupex --ftwrl-wait-timeout選項,限制等待時間,一旦超時就會報錯退出。默認值爲0,關閉此特性
另外一個是設置等待查詢的類型,innobackupex --ftwrl-sait-query-type,可選址爲all和update,設置爲all時,innobackupex會在執行FLUSH TABLES WITH READ LOCK以前等待全部長時查詢完成(執行時間超過innobackupex--ftwrl-wait-threshold),當值爲update時會等待UPDATE/ALTER/REPLACE/INSERT查詢完成
--lock-wait-threshold用來定義 --locl-wait-query-type中的長運行查詢,若是超過--lock-wait-threshold都算長運行查詢。
kill掉阻塞查詢
能夠經過指定--kill-long-queries-timeout用來指定執行FLUSH TABLES WITH READ LOCK後還能夠執行的時間,0爲不kill,--kill-long-query-type用來指定超時以後,kill的查詢類型,能夠是all或者select
innobackupex --lock-wait-threshold=40 --lock-wait-query-type=all --lock-wait-timeout=180 --kill-long-queries-timeout=20 --kill-long-query-type=all /data/backups/
innobacupex花費不超過3分鐘時間等待超過40秒的查詢完成,FLUSH以後,innobackupex會等待20秒時間獲取全局鎖,若是超過20秒仍然沒有得到,會kill全部的運行時間超過FLUSH命令的查詢
innobackupex是如何工做的
2.3起innobackupex用c重寫而且做爲xtrabackup的符號鏈接,innobackupex支持2.2版本的全部特性和語法。可是如今已降級而且在下一個major版本中將被移除,。新的特性語法將加在xtrabakup中,而不是innobackupex中
making a backup
若是沒有模式指定,innobakucpex默認爲backup模式
默認的,innobackupex經過--suspend-at-end選項啓動xtrabackup,而且讓它拷貝innodb數據文件,當xtrabackup完成,innobackupex看着它建立xtarbackup_suspended_2文件而且執行FLUSH TABLES WITH READ LOCK.
innoabackupex以後檢查MySQL變量來決定server支持哪些特性,特別是backup locks,change page bitmaps,GTID mode等等,若是一切順利,二進制做爲一個子進程啓動
innobackupex在設置--safe-slave-backup選項後等待同步,而且flush全部表with read lock.阻止全部myisam表寫入(除非指定--mo-lock)。
一旦完成,開始備份全部非Innodb文件,.frm,.MRG,.MYD,.MYI,.CSV,.OPT文件等等
當全部文件備份後,執行ibbackup而且等待直到完成備份完成拷貝事務完成。以後,表被解鎖,開啓同步(若是指定--safe-slave-backup)而且與server的鏈接關閉。以後,移除xtrabackup_suspended_2文件並容許xtrabackup退出
同時在備份的目錄建立以下文件:
xtrabackcup_checkpoints 包含備份類型和LSN
xtrabackcup_binlog_info 包含開啓備份時刻的binlog和POS
xtrabackcup_binlog_pos_innodb 包含開始備份InnoDB事務相關的binlog的POS
xtrabackup_slave_info 包含master的binlog和POS(需指定--slave-info)
backup-my.cnf 備份須要的my.cnf中的選項
xtrabackup_binary 包含backup須要的二進制文件
mysql-stderr
mysql-stdout
最終binlog pos打印在標準錯誤輸出而且Innobackupex退出碼爲0退出
經過備份還原
還原備份經過--copy-back選項
innobackupex讀取my.cnf中的變量並檢查相關目錄是否存在
以後拷貝MyISAM表,索引等等。首先是innodb表其次索引,最後是log文件。拷貝時保留文件屬性。
做爲替換,--move-back選項用來還原備份。這個選項與--copy-back類似。惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本
innobackupex 命令行選項
選項
Xtrabackup 二進制
get started
配置xtrabackup
xtrabackup讀取配置文件中的[mysqld]和[xtrabackup]部分,讀取datardir和innodb選項,能夠經過將這些都指定在[xtrabackup]部分。越靠後,越優先。
最簡單的在[xtrabackup]部分只指定target_dir,該選項指定backup默認放的目錄,例如:
[xtrabackup]
target_dir = /data/backups/mysql
Xtrabackup-FULL BAKCUPS
建立一個備份
運行xtrabackup指定--backup ,--target_dir,--datadir.
若是不指定target_dir,xtrabacup會建立它。若是目錄存在且爲空,xtrabackup會成功,xtrabackup不會覆蓋已有文件。會報「file exist」的錯誤
這個工具將工做目錄轉換到datadir,而且執行兩項主要的任務:(後臺運行的log掃描線程掃描redo log,ibdata1上的文件拷貝線程)
preparing the backup
用--backup生成備份後,下一步就是prepare。數據文件不是時間點一致的直到他們被prepare,由於他們在程序運行時不一樣時間拷貝,而且發生時已經改變了,若是你嘗試用這些數據文件啓動innodb,以後會檢測到崩潰,而且crash本身來防止在損壞的數據上繼續運行。--prepare階段讓這些文件在任意時間都一致性,因此你能夠在上面運行Innodb
注意:innobakcupex --apply-log 自動從bakcup-my.cnf讀取innodb配置,或者--defaults-file=bakcup-my.cnf選項傳遞給xtrabackup。不然會致使不正確還緣由爲xtrabackup已經用了錯誤的配置選項
你能夠在任何機器上運行Prepare操做,不須要在備份機上或者還原機上操做,你能夠拷貝backup到一臺專門的中控機而且在prepare
注意:你能夠用新版本prepare一個較老版本建立的backup,但反過來不行。在一臺不支持的Mysql server版本上prepare一個bakcup應該用支持該server的最新版本,例如,若是經過1.6版本xtrabackup備份mysql5.0,用2.2prepare是不支持的。由於2.1版本中移除了5.0
在prepare階段,xtarbackup嵌入了修改過的innodb,禁止了innodb的檢查,好比日誌文件大小是否準確。
prepare階段就是使用這個嵌入的innodb來作經過日誌文件對數據文件進行crash恢復
xtrabackup --prepare --target-dir=/data/backups/mysql
完成以後,能夠看到innodb shutdown的信息和lsn
你的備份如今是乾淨而且一致的了,而且準備好還原,然而,你可能但願額外的步驟讓還原更快。這須要第二次Prepare。第一次prepare讓數據文件完美的一致性。可是不常見新鮮的Innodb日誌文件,若是這時候還原備份而且啓動Mysql,它須要建立新的日誌文件,這須要一段時間。你也許不想等待。若是你第二次運行--prepare,xtrabackup會建立日誌文件,redo log的大小決定於mysql的配置文件
xtrabackup --prepare --target-dir=/data/backups/mysql/
xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to ’--prepare’.
101107 16:54:10 InnoDB: Log file ./ib_logfile0 did not exist: new to be created InnoDB: Setting log file ./ib_logfile0 size to <SIZE> MB
InnoDB: Database physically writes the file full: wait...
101107 16:54:10 InnoDB: Log file ./ib_logfile1 did not exist: new to be created InnoDB: Setting log file ./ib_logfile1 size to <SIZE> MB
InnoDB: Database physically writes the file full: wait...
101107 16:54:15 InnoDB: Shutdown completed; log sequence number 1284108
第二次或者第三次prepare不會改變已經Prepare的數據文件,你能夠看輸出:
xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to ’--prepare’.
不推薦prepare的時候中斷xtrabackup進程,會致使數據文件損壞而且backup不可用,中斷prepare進程不保證backup可用性
若是之後會拿這份這份backup做爲基礎而進行增量備份,prepare的時候要使用--apply-log-only選項,不然你沒法apply增量備份到這份basic全備。
還原全備
xtrabackup沒有還原備份的功能。由用戶來作,你能夠經過rsync或者cp來還原,你應該檢查還原文件有正確的屬主和權限
注意:datadir在還原備份以前必須爲空,一樣重要的是Mysql server須要還原以前shutdown,你不能在Mysql運行時還原到datadir目錄(除非是導入部分備份)
rsync命令還原:
rsync -avrP /data1/backup/ /data1/mysql
文件屬性保留,大多數狀況下須要在啓動實例以前改變文件的屬主
chown -R mysql5711:mysql /data1/mysql5711
注意,xtrabackup只備份Innodb數據,你必須單獨還原mysql系統庫,myisam數據,表定義文件。或者innobakcupex
其餘類型備份
增量備份
xtrabackup和Innobacupex都支持增量備份,意味着能夠只拷貝自從上次全備以後變化的數據,你能夠在每一個full backup之間作不少份增量備份,這樣你能夠作這樣一個備份程序一週作一次full backup天天一次增量,或者一天作一次full backup每小時作一次增量
增量備份原理,每一個Innodb頁都有一個LSN號,一份增量備份拷貝每一個比上次增量備份或者全備LSN更新的page。
有兩個算法能夠找到這樣的須要拷貝的Page的集合
增量備份不會不會實際的和上次的備份比較數據文件。你若是知道LSN的話甚至在沒有先前備份的狀況下使用經過--incremental-lsn執行一次增量備份。增量備份簡單的讀取page而且比較他們的LSN與上次備份的LSN。然而你仍然須要一個full bakcup來恢復增量的變化。若是沒有一個full bakcup做爲一個base,增量備份是沒有用的
建立一份增量備份
建立一份增量備份,須要從一個full backup開始,xtrabakcup寫一個叫xtrabackup_checkporints的文件到備份目標目錄,這個文件包含一行顯示to_lsn(backup結束時候的lsn)
xtrabackup --backup --target-dir=/data/backups/base --datadir=/data1/mysql5711
xtrabakcup_checkpoints文件包括
backup_type = full-bakcuped
from_lsn =0
to_lsn =1291135
基於這個full backup建立一份增量:
xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base --datadir=/data1/mysql5711
/data/backup/inc1/目錄包含了增量的文件,好比ibdata1.delta和test/table1.idb.delta ,表明了從LSN1291135以來的變化,若是檢查這個目錄的xtrabacup_checkpoints文件,會看見以下:
bacup_type = incremental
from_lsn = 1291135
to_lsn = 1291340
如今能夠拿inc1當作接下來增量備份的base目錄:
xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1 --datadir=/data1/mysql5711/
prepare增量備份
增量備份的--prepare階段與正常備份不一樣,在正常備份中,執行兩種類型操做來保證數據庫一致性,已提交的事務會在數據文件中重放,未提交的事務回滾,prepare備份的時候你須要跳過未提交事務的回滾,由於在備份的那個時刻未提交的事務正在進行中,而且明顯的它們會在下次增量備份的提交。你須要使用--apply-log-only選項來阻止回滾階段
若是你不用--apply-log-only選項阻止回滾,那麼以後的增量備份就無效了。事務若是被回滾,那以後的增量備份就不能被重放
從你開始建立的full backup,你能夠Prepare它,以後重放增量的區別,回憶你已經有以下備份base/,inc1/,inc2/
prepare base備份,而後阻止回滾:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
輸出顯示lsn爲1291135.
備份若是如今還原是很是安全的,甚至回滾的步驟被跳過了,若是你如今還原並啓動MySQL,InnoDB會檢測到回滾沒有執行,以後再在後臺進行開始crash恢復,通知你數據沒有被正常關閉
重放第一個增量備份給full backup:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
這樣給/data/backups/base目錄重放delta文件。將備份的時間前進到增量備份的時間點,以後照常重放事務日誌,最終數據是在/data/backups/base並不在增量目錄裏.
顯示以下:
incremental backup from 1291135 is enabled.
xtrabackup: cd to /data/backups/base/
xtrabackup: This target seems to be already prepared.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1291340)
Applying /data/backups/inc1/ibdata1.delta ...
Applying /data/backups/inc1/test/table1.ibd.delta ...
.... snip
101107 20:56:30 InnoDB: Shutdown completed; log sequence number 1291340
若是經過/data/backups/base目錄還原,你能夠看見數據庫的狀態是第一次備份時的狀態
prepare第二次增量備份以一樣的步驟,apply增量到上步的base,將數據的時間點同步到第二次增量備份的時間點
xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2
--apply-log-only用在merging全部增量除最後一個。最後一步仍然能夠用,備份最終也是一直的可是server不會執行回滾步驟
部分備份
須要開啓innodb_file_per_table,有三種方式支持部分備份
注意:若是任何匹配的或者列入的表在備份期間刪除,xtrabackup會失敗
壓縮備份
不包含輔助索引頁,佔用更少磁盤空間,缺點是prepare的時間更長由於須要重建輔助索引
注意:壓縮備份不支持系統表空間,因此應該打開innodb-file-per-table選項
建立壓縮備份
經過--compact選項
xtrabackup --bakcup --compact --target-dir=/data/backups
檢查target-dir目錄下的xtrabackup-checkpoints文件。以下:
backup_type = full-backuped
from_lsn = 0
to_lsn = 2888984349
last_lsn = 2888984349
compact = 1
若是不使用--compact的話--value的值爲0,這個方法能夠快速檢測備份是否包含輔助索引頁
prepare 壓縮備份
經過--rebuild-indexes和--apply-logs一塊兒使用
xtrabackup --prepare --rebuild-indexes /data/backups
經過--rebuild-threads選項多線程重建索引
xtrabackup --prepare --rebuild-indexes --rebuild-threads=16 /data/backups/
還原壓縮備份
沒有現成工具,能夠經過rsync或者cp完成,須要檢查還原文件是否有正確權限
高級特性:
throttling備份
xtrabackup不會阻塞數據庫讀寫,backup增長系統壓力,能夠經過--throttle選項,這個選項限制IO操做的數量爲每秒每MB
在--backup模式,這個選項限制了xtrabackup每秒執行的對(read和write)。若是你建立一個增量備份。而後限制每秒讀IO的數量
默認,no throttling,xtrabackup最快的讀寫數據,若是你IO限制過於嚴格,備份會很是慢而且追不上innodb寫事務日誌的速度,備份將永遠沒法完成
編寫備份腳本
suspending after copying
在備份模式中,xtarbackup在後臺拷貝日誌文件,前端線程拷貝數據文件,,以後中止日誌線程並完成。若是你使用--suspend-at-end選項而不是中止日誌線程並完成。xtrabacup會繼續拷貝日誌文件,並在target目錄生成一個xtrabackup_suspended文件,以後要這個文件存在,xtrabackup會繼續觀察事務日誌並把他們拷貝到target目錄中xtrabackup_logfile文件。當這個文件移除的時候,xtrabackup會中止拷貝事務日誌並退出
該功能協調備份Innodb數據和其餘動做時很是有用,最明顯的是拷貝表定義文件(.frm)以便備份能被還原,你能夠後臺啓動xtrabakcup,等待xtrabackup_suspended文件被建立,而後拷貝全部你須要完成這個備份的任何文件。。這個就是innobakcupex工具作的工做
生成元數據
備份包含任何你須要還原備份時候須要的信息是個好主意,xtarbackup能打印my.cnf文件中須要還原的數據和日誌文件的內容,若是增長--print-param選項。會打印以下內容:
```
This MySQL options file was generated by XtraBackup.
[mysqld]
datadir = /data/mysql/
innodb_data_home_dir = /data/innodb/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data/innodb-logs/
```
能夠重定向輸出到backup的target目錄
協商source目錄
配置文件或者其餘因素會致使xtrabackup從不一樣的位置備份數據。爲了防止這些,你能夠用--print-param來查找從哪裏copy數據。你能夠用輸出來保證xtrabackup和你的腳本處理一樣的數據集
log streaming
能夠經過--log-stream 讓xtrabackup將redo log文件streaming而不是拷貝,這樣會自動添加--suspend-at-end選項。你的腳本能夠執行
stream遠程備份並經過管道將log文件傳給ssh而且經過rsync或者xbstream等工具將數據拷貝到遠程服務器上
分析表統計信息
xtrabackup以只讀模式分析InnoDB數據文件並提供給統計。能夠經過--stats選項。能夠同--ables選項一塊兒使用限制檢查的的文件。還有--use-memory選項。
你能夠在一臺運行實例的機器上執行分析,在分析期間數據更改會有出錯的概率。或者能夠分析備份的拷貝。若是須要使用統計的特性,你須要一個乾淨的拷貝包括正確的Logfile大小,,因此你須要在一次備份上執行--prepare兩次
使用binlog
xtrabakcup提取了innodb事務日誌關於對應已提交事務的binlog pos,這個能夠打印出backup對應的binlog pos,你能夠經過搭建一些列從庫或者進行基於時間點的恢復
找到binlog pos
一旦backup prepare以後你能夠找到binlog pos,經過運行xtrabakcup --prepare或者innobackupex --apply-log均可以完成。若是bakcup是來源打開binlog的實例。xtrabackup會在target目錄建立一個xtrabakcup_binglog_info的文件。這個文件包含了與prepare對應的binlog名字和pos點位
輸出的信息在xtrabakcup_binlog_pos_info文件中找到,只有使用innodb引擎纔會準確
其餘引擎,好比myisam,你應該使用xtrabackup_binlog_info文件得到位置
基於時間點恢復
從一份xtrabackup的備份裏基於時間點的恢復,你須要prepare而且還原備份,以後重放xtrabackup_binlog_info中記錄的點開始的binlog
搭建一個新的從庫
須要先prepare,而後在新從庫的data目錄中還原,以後使用change master to命令,使用xtrabackup_binlog_info文件的binlog和pos啓動複製
還原單獨表
在5.6版本以前,即便打開innodb_file_per_table選項,仍然不可能經過在實例之間經過拷貝文件來拷貝表。然而,經過Xtrabackup你能夠從任何InnoDB數據庫中導出單表,而且導入到5.6中去(source沒必要是5.6可是destination必須是!!!!!)只在獨立.ibd文件生效,若是沒有獨立ibd文件是不可以導出單表的!!!!!
導出單表
這個表必須在打開innodb_file_per_table模式下建立。因此在在--bakcup建立一份備份以後,.ibd文件應該已經存在於target目錄中
當你prepare的時候,須要額外加--export命令:
xtrabacup --prepare --export --target-dir=/data/backups/mysql5711
如今你能夠在target目錄找到.exp文件
$ find /data/backups/mysql5711/ -name export_test.*
/data/backups/mysql5711/test/export_test.exp
/data/backups/mysql5711/test/export_test.ibd
/data/backups/mysql711/test/export_test.cfg
這三個文件是你將表導入5.6的全部文件
說明:mysql使用cfg文件,這個文件包含了Innodb字典dump。這種格式不一樣於xtrabDB的.exp文件。嚴格來說,.cfg文件在5.6以及以後是不在須要的。若是存在cfg文件,那麼Innodb會經過cfg文件作schema驗證
導入表
在5.6,以一樣表結構建立一張表,而後執行如下步驟:
實施
xtrabakcup的限制
有如下須要注意:
* 若是xtrabakcup_logfile超過4G,32位系統上的xtrabakcup在--prepare階段會失敗
* xtrabackup在第一次--prepare的不會生成新的redo log文件,必須--prepare兩次,在第二次的時候纔會生成
* 不支持my.cnf裏有--set-variable這種格式設置
實施細節
文件權限
xtrabacup以讀寫方式打開源數據文件,但不更改這些文件,意味着你必須以有寫這些文件權限的用戶來運行xtrabackup。以讀寫模式打開文件的緣由是xtrabakcup使用內置的Innodb庫來打開讀寫文件,而且Innodb以讀寫模式打開由於正常假設是須要寫這些文件了
調整os buffers
由於xtrabackup讀取文件系統的大量數據,可能它使用posix_fadvise()指導操做系統不要嘗試緩存從磁盤讀取的block。沒有這個提示。假設xtrabackup很快再次須要這些塊,操做系統更願意緩存這些塊。緩存如此大的文件會給操做系統的虛擬內存增長壓力併到底其餘進程,好比數據庫swap out。xtrabakcup工具經過source和destination以下提示來避免這種狀況發生:
posix_fadvise(file,0,0,POSIX_FADV_DONTNEED)
另外,xtrabackup讓操做系統在源文件上來執行更挑戰性的read-ahead優化
posix_fadvise(file, 0, 0, POSIX_FADV_SEQUENTIAL)
拷貝數據文件
當向target目錄拷貝數據文件的時候,xtrabakcup一次讀寫1MB數據。這是不可配置的。當拷貝事務日誌,xtrabackup一次讀寫512字節。着一樣不能配置。是符合Innodb的(percona server的解決辦法是有額外的參數innodb_log_block_size)
讀取文件以後,xtrabackup一次1MBbuffer遍歷page。並經過innodb buf_page_is corrupted()函數檢查每一個Page的corruption。若是page損壞,便會重讀而且每一個page重試10次,二次寫buffer會跳過這個檢查
手冊
xtrabackup選項
選項
xbstream
支持同時壓縮和流式化。須要客服傳統歸檔tar,cpio和其餘不容許動態streaming生成的文件的限制,例如動態壓縮文件,xbstream超越其餘傳統流式/歸檔格式的的優勢是,併發stream多個文件而且更緊湊的數據存儲(因此能夠和--parallel選項選項一塊兒使用xbstream格式進行streaming)
像tar同樣使用:
* -x 選項 從標準輸入stream read中提取文件到當前目錄,除非指定其餘-C選項
* -c 選項 stream命令行指定的文件到標準輸出
目的,經過posix_fadvise()調用減小對OS page cache的影響
xtrabackup開啓壓縮的時候素有數據被壓縮,包括事務日誌和元數據文件,經過指定的壓縮算法,惟一當前支持度呃算法是quicklz,結果文件是qpress歸檔個事。每隔xtrabakcup生成的.qp文件能夠經過qpress文件歸檔提取或者解壓縮。這就意味着不須要經過tar.gz解壓縮整個bakcup來還原一個單表
文件能夠經過qpress解壓縮,qpress支持多線程解壓縮
xtrabakcup工做原理
xtrabackup基於InnoDB crash-recovery功能,拷貝innodb數據文件,這會致使數據內部不一致,,可是以後它在文件上執行crash recovery使數據文件一致
innodb維護redo log又稱事務日誌。redo log日誌中包含innodb數據的每次變更。當innodb啓動時會去檢查數據文件和事務日誌,而後又兩個步驟,1,apply應用已提交的事務日誌到數據文件,2,已更改但未提交的事務進行undo操做
percona xtrabackup在啓動的時候記錄LSN,而後拷貝數據文件,這會須要一些時間,,因此若是文件改變了,它反映出不一樣時間點數據庫的狀態,。同時,xtrabakcup啓動一個後臺進行監控事務日誌,並拷貝變更(複製修改).xtrabakcup須要持續運行以上由於事務日誌是循環寫的,過段時間以後會被複用,xtrabackup須要每次數據文件變化對應的事務日誌記錄
上述是備份的進程,下一步是prepare的進程,在這個過程當中,xtarabakcup經過已拷貝的事務日誌在已拷貝的數據文件上執行crash recovery。以後,數據庫已經能夠進行還原並可使用了
以上經過編譯好的二進制xtrabakcup實施了。
Innobackup在此基礎上增長了更多功能,好比備份Myisam表和.frm文件。它啓動xtrabakcup而且等待它完成拷貝文件,以後執行FLUSH TABLES WITH READ LOCK防止mysql數據更改,獲得表全局鎖,而後flush全部的myisam表到磁盤,以後再釋放表全局鎖
備份的myisam和innodb表最終會一致,由於在prepare(recovery)以後,innodb數據會前滾到備份完成時候的時間點,而不是回滾到備份開始時候的時間點。這個時間點與FLUSH TABLES WITH READ LOCK發生時一致,全部myisam與已prepare過的Innodb數據是同步的
percona xtrabakcup是一些列以下的工具:
innobackupex:xtrabackup的符號鏈接,innobakcupex支持2.2版本的全部特性和語法,可是如今已經降級而且在以一個主要版本中remove
xtrabackup:編譯的C程序提供備份一整個數據庫實例myisam和Innodb表
xbstream:以xbstream格式streaming和提取文件