【轉】使用 xtrabackup 進行MySQL數據庫物理備份

使用 xtrabackup 進行MySQL數據庫物理備份

轉載 2017年03月15日 11:04:02
 

原文連接:http://www.cnblogs.com/digdeep/p/4946230.htmlhtml

原文連接:http://blog.csdn.net/jiao_fuyou/article/details/62217386mysql

 


0. xtrabackup的功能
能實現的功能:
非阻塞備份innodb等事務引擎數據庫、
備份myisam表會阻塞(須要鎖)、
支持全備、增量備份、壓縮備份、
快速增量備份(xtradb,原理相似於oracle:tracking 上次備份以後發生修改的page.)、
percona支持歸檔redo log的備份、
percona5.6+支持輕量級的backup-lock替代原來重量級的FTWRL,此時即便備份非事務引擎表也不會阻塞innodb的DML語句了、
支持加密備份、流備份(備份到遠程機器)、並行本地備份、並行壓縮、並行加密、並行應用備份期間產生的redo日誌、並行copy-back
支持部分備份,只備份某個庫,某個表
支持部分恢復
支持備份單個表分區
支持備份速度限制,指備份產生的IO速度的限制
支持point-in-time恢復
支持compat備份,也即便不備份索引數據,索引在prepare時--rebuild-indexs
支持備份buffer pool
支持單表export, import到其它庫
支持 rsync 來縮短備份非事務引擎表的鎖定時間
1. 物理備份須要的權限
使用innobackupex/xtrabackup進行備份,必須先配置好權限。須要的權限分爲兩部分:
1>系統層面的權限: 執行 innobackupex/xtrabackup 命令的Linux用戶須要對mysql datadir和保存備份的目錄有讀寫執行的權限,固然須要對這些命令要有執行權限;
2>mysqld層面的權限:innobackupex/xtrabackup --user=bkpuser 該用戶bkpuser是指mysql.user表中的用戶,不是系統層面的用戶;須要一些基本的權限來執行備份過程:
最基本的權限:
create user 'bkpuser'@'localhost' identified by 'xxx';
grant reload,lock tables,replication client on *.* to 'bkpuser'@'localhost';
這些權限僅僅只能完成:全備,增量備份,恢復;
通常若是須要部分備份,export表,import表,還須要: grant create tablespace on *.* to 'bkpuser'@'localhost';
若是還須要對備份的過程當中對鎖進行一些優化,防止發生阻塞全部DML的狀況,則還須要:
grant process,super on *.* to 'bkpuser'@'localhost';
(root@localhost)[(none)]mysql>show grants for 'bkpuser'@'localhost'\G *************************** 1. row *************************** Grants for bkpuser@localhost: GRANT RELOAD, PROCESS, SUPER, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE ON *.* TO 'bkpuser'@'localhost' IDENTIFIED BY PASSWORD '*BDC62F68AF8F0B8BFAE27FF782C5D8CE9F4BAFCB' 1 row in set (0.00 sec)

2. innobackupex 命令選項:sql

  innobackupex --help
3. 使用 innobackupex 備份
3.1 全備
(這裏系統層面使用的root用戶備份,msyql層面使用的是bkpuser用戶,root須要對datadir /var/lib/mysql, 備份目錄/backup/xtrabackup/full有讀寫執行權限;bkpuser也需在mysql中有相關權限)
[ root@localhost ~]#  innobackupex  /backup/xtrabackup/full --user=bkpuser --password=digdeep
  View Code
3.2 恢復
1> 第一步prepare(兩次prepare,第一次應用備份期間產生的redo log,進行前滾和回滾:replay在redo log中已經提交的事務,rollback沒有提交的事務)
注意這裏的路徑,必需要包括最後那個timestamp目錄,否則會下面的錯誤:
複製代碼
[root@localhost ~]# innobackupex --apply-log /backup/xtrabackup/full/ --user=bkpuser --password=digdeep 151106 10:41:48 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!". innobackupex version 2.3.2 based on MySQL server 5.6.24 Linux (i686) (revision id: 306a2e0) xtrabackup: cd to /backup/xtrabackup/full xtrabackup: Error: cannot open ./xtrabackup_checkpoints xtrabackup: error: xtrabackup_read_metadata() xtrabackup: This target seems not to have correct metadata... 2015-11-06 10:41:48 b771e6d0 InnoDB: Operating system error number 2 in a file operation. InnoDB: The error means the system cannot find the path specified. xtrabackup: Warning: cannot open ./xtrabackup_logfile. will try to find. 2015-11-06 10:41:48 b771e6d0 InnoDB: Operating system error number 2 in a file operation. InnoDB: The error means the system cannot find the path specified. xtrabackup: Fatal error: cannot find ./xtrabackup_logfile. xtrabackup: Error: xtrabackup_init_temp_log() failed.
複製代碼
--apply-log會調用 xtrabackup --prepare兩次,第一次前滾和回滾,第二次生成iblogfile[0|1]
[ root@localhost ~]#  innobackupex --apply-log /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 
  View Code
3.3 恢復 --copy-back
直接將上面prepare好的全部文件,複製到mysqld的datadir目錄(會讀取my.cnf中的配置信息)。
--copy--back的注意事項:
1> datadir必須是空的,或者使用--force-non-empty-directories選項;
2> mysqld必須關閉,若是是--import部分恢復,則不能關閉;
3> --copy-back完成以後,須要修改datadir目錄下的文件權限: chown -R mysql:mysql /var/lib/mysql
[ root@localhost ~]# mysqladmin -uroot -pxxx shutdown (關閉mysqld)
[ root@localhost ~]#  cd /var/lib/mysql
[ root@localhost mysql]# ls
aazj         ib_logfile1         mysql-bin.000003  mysql-bin.000008  mysql-bin.000013  performance_schema
auto.cnf     localhost-slow.log  mysql-bin.000004  mysql-bin.000009  mysql-bin.000014  t
general.log  mysql               mysql-bin.000005  mysql-bin.000010  mysql-bin.000015  xtrabackup_binlog_pos_innodb
ibdata1      mysql-bin.000001    mysql-bin.000006  mysql-bin.000011  mysql-bin.000016  xtrabackup_info
ib_logfile0  mysql-bin.000002    mysql-bin.000007  mysql-bin.000012  mysql-bin.index
[ root@localhost mysql]#  mv * /backup/xtrabackup/  (進行清空)
[ root@localhost mysql]# ls
[ root@localhost mysql]#  innobackupex --copy-back /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 
複製代碼
[root@localhost mysql]# innobackupex --copy-back /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 151106 11:07:38 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.3.2 based on MySQL server 5.6.24 Linux (i686) (revision id: 306a2e0) 151106 11:07:38 [01] Copying ib_logfile0 to /var/lib/mysql/ib_logfile0 151106 11:07:40 [01] ...done 151106 11:07:40 [01] Copying ib_logfile1 to /var/lib/mysql/ib_logfile1 151106 11:07:41 [01] ...done 151106 11:07:41 [01] Copying ibdata1 to /var/lib/mysql/ibdata1 151106 11:07:45 [01] ...done 151106 11:07:45 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info 151106 11:07:45 [01] ...done 151106 11:07:45 [01] Copying ./mysql/slave_master_info.ibd to /var/lib/mysql/mysql/slave_master_info.ibd 151106 11:07:45 [01] ...done [... ...] 151106 11:07:57 [01] Copying ./t/db.opt to /var/lib/mysql/t/db.opt 151106 11:07:57 [01] ...done 151106 11:07:57 [01] Copying ./t/t.frm to /var/lib/mysql/t/t.frm 151106 11:07:57 [01] ...done 151106 11:07:57 completed OK! [root@localhost mysql]# pwd /var/lib/mysql [root@localhost mysql]# ls aazj ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema t xtrabackup_binlog_pos_innodb xtrabackup_info
複製代碼
能夠看到恢復以後,沒有 binlog 文件盒index文件
啓動myqld以前須要修改權限:
複製代碼
[root@localhost mysql]# ls -l total 176164 drwx------ 2 root root 4096 Nov 6 11:07 aazj -rw-rw---- 1 mysql mysql 543 Nov 6 11:13 general.log -rw-r----- 1 root root 79691776 Nov 6 11:07 ibdata1 -rw-r----- 1 root root 50331648 Nov 6 11:07 ib_logfile0 -rw-r----- 1 root root 50331648 Nov 6 11:07 ib_logfile1 -rw-rw---- 1 mysql mysql 543 Nov 6 11:13 localhost-slow.log drwx------ 2 root root 4096 Nov 6 11:07 mysql -rw-rw---- 1 mysql mysql 0 Nov 6 11:12 mysql-bin.index drwx------ 2 root root 4096 Nov 6 11:07 performance_schema drwx------ 2 root root 4096 Nov 6 11:07 t -rw-r----- 1 root root 24 Nov 6 11:07 xtrabackup_binlog_pos_innodb -rw-r----- 1 root root 487 Nov 6 11:07 xtrabackup_info [root@localhost mysql]# chown -R mysql:mysql /var/lib/mysql [root@localhost mysql]# ls -l total 176164 drwx------ 2 mysql mysql 4096 Nov 6 11:07 aazj -rw-rw---- 1 mysql mysql 543 Nov 6 11:13 general.log -rw-r----- 1 mysql mysql 79691776 Nov 6 11:07 ibdata1 -rw-r----- 1 mysql mysql 50331648 Nov 6 11:07 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 Nov 6 11:07 ib_logfile1 -rw-rw---- 1 mysql mysql 543 Nov 6 11:13 localhost-slow.log drwx------ 2 mysql mysql 4096 Nov 6 11:07 mysql -rw-rw---- 1 mysql mysql 0 Nov 6 11:12 mysql-bin.index drwx------ 2 mysql mysql 4096 Nov 6 11:07 performance_schema drwx------ 2 mysql mysql 4096 Nov 6 11:07 t -rw-r----- 1 mysql mysql 24 Nov 6 11:07 xtrabackup_binlog_pos_innodb -rw-r----- 1 mysql mysql 487 Nov 6 11:07 xtrabackup_info
複製代碼
否則啓動會在error.log中報錯:
2015-11-06 11:13:55 3542 [ERROR]  InnoDB: ./ibdata1 can't be opened in read-write mode
2015-11-06 11:13:55 3542 [ERROR]  InnoDB: The system tablespace must be writable!
2015-11-06 11:13:55 3542 [ERROR] Plugin 'InnoDB' init function returned error.
2015-11-06 11:13:55 3542 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2015-11-06 11:13:55 3542 [ERROR] Unknown/unsupported storage engine: InnoDB
2015-11-06 11:13:55 3542 [ERROR] Aborting
 
啓動成功以後,datadir目錄下各類文件都產生了:
[ root@localhost mysql]# pwd
/var/lib/mysql
[ root@localhost mysql]# ls
aazj      general.log  ib_logfile0  localhost-slow.log  mysql-bin.000001  performance_schema  xtrabackup_binlog_pos_innodb
auto.cnf  ibdata1      ib_logfile1  mysql               mysql-bin.index   t                   xtrabackup_info
3.4 innobackupex 增量備份
增量備份以前,必須創建一個全備,第一次增量備份是在全備的基礎之上,第二次增量備份是在第一次增量備份的基礎之上的,一次類推
全備:
[ root@localhost mysql]# innobackupex --user=bkpuser --password=digdeep /backup/xtrabackup/full
  View Code
第二次增量備份:
[ root@localhost mysql]#  innobackupex --incremental /backup/xtrabackup/incr2 --incremental-basedir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/ --user=bkpuser --password=digdeep
  View Code
3.5 innobackupex 增量備份的恢復
1> 應用全備的redo log:
[ root@localhost ~]#  innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep
  View Code
2> 應用第一次增量備份的redo log:
[ root@localhost ~]#  innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/ --user=bkpuser --password=digdeep
  View Code
3> 應用第二次(最後一次)增量備份的redo log,而且回滾進行崩潰恢復過程(沒有--redo-only選項):
[ root@localhost ~]#  innobackupex --apply-log /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr2/2015-1  1-06_11-43-22/ --user=bkpuser --password=digdeep
  View Code
而後 --copy-back:
先關閉mysqld: mysqladmin -uroot -pxxx shutdown
[ root@localhost mysql]#  innobackupex --copy-back /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep
  View Code
修改權限:
chown -R mysql:mysql /var/lib/mysql
啓動:mysqld_safe --user=mysql &
最後驗證還原成功。
4. 部分備份
須要啓用 innodb_file_per_table,5.6默認啓用。另外在還原時,prepare以後,並不能直接 --copy-back,而只能一個表一個表的import來還原。
[ root@localhost xtrabackup]#  innobackupex --databases t /backup/xtrabackup/ --user=bkpuser --password=digdeep
  View Code
數據庫 t 中只有兩個表:city, t 都被備份了。
下面咱們來看如何還原:
4.1 部分prepare:
[ root@localhost xtrabackup]#  innobackupex --apply-log --export /backup/xtrabackup/2015-11-06_15-39-34/ --user=bkpuser --password=digdeep
  View Code
4.2 下面咱們將其 import 到一個新的數據庫中:
( root@localhost)[t]mysql>create database partial;
( root@localhost)[t]mysql>use partial;
Database changed
( root@localhost)[partial]mysql>create table city like t.city;
( root@localhost)[partial]mysql> alter table partial.city discard tablespace;
而後將 city.exp 和 city.ibd 拷貝到 /var/lib/mysql/partial/ 目錄下,並修改權限:
[ root@localhost t]#  cp city.exp city.ibd /var/lib/mysql/partial/
[ root@localhost partial]# chown -R mysql:mysql /var/lib/mysql
而後 
( root@localhost)[aazj]mysql> alter table partial.city import tablespace;
Query OK, 0 rows affected, 1 warning (0.11 sec)
 
( root@localhost)[aazj]mysql>select count(*) from partial.city;
+----------+
| count(*) |
+----------+
|     3285 |
+----------+
1 row in set (0.01 sec)
 
能夠看到import 成功了。部分恢復成功。
低於t表也一樣操做就好了。
( root@localhost)[partial]mysql>select count(*) from t;
+----------+
| count(*) |
+----------+
|       11 |
+----------+
1 row in set (0.00 sec)
 
能夠看到,這種部分備份/恢復,操做起來比較麻煩,步驟比較多,還須要一個表一個表的處理。對少數表處理還能夠,若是不少表,就不方面了。
4.3 部分備份恢復之備份/恢復一個或者多個數據庫:
1)備份:
[root@localhost mysql]# innobackupex innobackupex --apply-log /backup/xtrabackup/partial/2015-11-11_15-22-56 --user=bkpuser --password=digdeep
而後 關閉 mysqld, 清空 datadir :
[root@localhost mysql]# pwd
/var/lib/mysql
[root@localhost mysql]# rm -rf *
3)copy-back:
[root@localhost partial]# innobackupex --copy-back /backup/xtrabackup/partial/2015-11-11_15-22-56 --user=bkpuser --password=digdeep
而後修改權限:chown -R mysql:mysql /var/lib/mysql
而後啓動mysqld,發現數據庫 t 被恢復出來了。這裏也能夠一次備份多個數據庫,可是必定要帶上 mysql 數據庫,否則恢復出來時,沒有了數據字典,select讀不出數據:
Restoring Partial Backups:
Restoring should be done by restoring individual tables in the partial backup to the server.
It can also be done by copying back the prepared backup to a clean datadir (in that case, make sure to include the mysql database). System database can be created with: $ sudo mysql_install_db --user=mysql (摘自xtrabackup文檔)
部分恢復通常須要 export, 而後 import. 比較麻煩,可是咱們也能夠在一個空的 datadir 目錄直接 --copy-back,這樣的話,那麼在備份的時候必定要帶上mysql數據庫,固然最好帶上全部的系統數據庫,否則的話,須要使用命令:mysql_install_db --user=mysql --basedir=... 重建那些系統數據庫。這就是爲何在部分備份時帶上了:mysql performance_schema(information_schema是系統視圖,不須要帶上,固然帶上也是能夠的)
4)若是你不想帶上 performance_schema(mysql是必定要帶上的),那麼就必須使用: mysql_install_db --user=mysql --basedir=/usr/local/mysql 來從新生成系統數據庫mysql 和 performance_schema。那麼此時在 --copy-back以前,必須先刪除剛纔生成的 和 咱們要 --copy-back 重複的文件:
[root@localhost mysql]# rm ibdata1 ib_logfile0 ib_logfile1
[root@localhost mysql]# rm -rf mysql
另外 --copy-back 時要帶上參數: --force-non-empty-directories
innobackupex --copy-back --force-non-empty-directories /backup/xtrabackup/partial/2015-11-11_16-17-11/ --user=pkpuser --password=digdeep
由於 datadir 目錄非空,因此須要帶上該參數:
 --force-non-empty-directories
                      This option, when specified, makes --copy-back or
                      --move-back transfer files to non-empty directories. Note
                      that no existing files will be overwritten. If
                      --copy-back or --nove-back has to copy a file from the
                      backup directory which already exists in the destination
                      directory, it will still fail with an error.
即便帶上了該參數,若是還存在重名的文件,仍是會報錯,須要先刪除datadir中的重名文件。
 
5. point-in-time 恢復
利用全備、增量備份最多隻能恢復到全備完成時的那一刻,或者增量備份完成時的那一刻的數據。備份以後產生的數據,咱們須要結合binlog,來恢復。咱們能夠從binlog中得到innobackupex最後一次備份完成時的position,它以後的全部的sql,應用完,這些sql,就能將數據庫恢復到最新的狀態,或者咱們想要的某個時間的狀態。
1> 先來一個全備:
[ root@localhost xtrabackup]#  innobackupex /backup/xtrabackup/full --user=bkpuser --password=digdeep
2> 再來一個增量:
將t表數據刪除一行:delete from t where i=11;
[ root@localhost xtrabackup]#  innobackupex --incremental /backup/xtrabackup/incr1/ --incremental-basedir=/backup/xtrabackup/full/2015-11-06_16-26-08 --user=bkpuser --password=digdeep
3> 再來一個增量:
將t表數據刪除一行:delete from t where i=10;
[ root@localhost xtrabackup]#  innobackupex --incremental /backup/xtrabackup/incr2/ --incremental-basedir=/backup/xtrabackup/incr1/2015-11-06_16-31-13/ --user=bkpuser --password=digdeep
4> 備份完成以後,咱們再來操做 t 表:
( root@localhost)[t]mysql>delete from t where i>3;
此時的狀態:
( root@localhost)[t]mysql>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       927 |
| mysql-bin.000002 |       688 |
+------------------+-----------+
2 rows in set (0.00 sec)
 
( root@localhost)[t]mysql>show master status;
+------------------+----------+--------------+------------------+-------------------+
 | File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      688 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
 
假設此時數據庫表數據所在的磁盤發生故障,可是 binlog 文件是好的。那麼此時,咱們就可使用上面的全備、增量備份、還有binlog文件一塊兒來將數據庫恢復到磁盤發生故障那一刻的最新狀態來。
5> 首先從全備、增量備份獲得最後一次備份完成時的數據:
1)應用全備的redo log:
[ root@localhost xtrabackup]# innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_16-26-08 --user=bkpuser --password=digdeep
2)應用第一次增量備份的redo log:
[ root@localhost xtrabackup]# innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_16-26-08 --incremental-dir=/backup/xtr  abackup/incr1/2015-11-06_16-31-13/ --user=bkpuser --password=digdeep
3)應用第二次增量備份的 redo log,而且僅限回滾(去掉 --redo-only選項):
[ root@localhost xtrabackup]# innobackupex --apply-log /backup/xtrabackup/full/2015-11-06_16-26-08 --incremental-dir=/backup/xtrabackup/incr2/2015-11-06_16-33-57/ --user=bkpuser --password=digdeep
此時已經恢復到了最後一次備份完成時的狀態了。
咱們看一下最後一次增量備份時的 xtrabackup_binlog_info 文件信息:
[ root@localhost xtrabackup]# cat incr2/2015-11-06_16-33-57/xtrabackup_binlog_info
mysql-bin.000002        482
能夠看到對應的binlog postion爲:mysql-bin.000002        482
而崩潰那一刻的binlog postion爲: mysql-bin.000002      688
 
因此咱們須要應用 mysql-bin.000002 文件的 482 到 688之間的sql:
4)先 --copy-back
[ root@localhost mysql]# innobackupex --copy-back /backup/xtrabackup/full/2015-11-06_16-26-08 --user=bkpuser --password=digdeep
修改權限:
[ root@localhost ~]# chown -R mysql:mysql /var/lib/mysql
啓動msyqld:  mysqld_safe --user=mysql &
而後驗證,t 表的數據,應該有i<10 & i>3 的數據:
( root@localhost)[t]mysql>select * from t;
+------+
| i    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
+------+
9 rows in set (0.00 sec)
如咱們所期待的結果同樣。說明到此時,前面的操做徹底是正確的。
5)應用 mysql-bin.000002 文件的 482 到 688之間的sql
[ root@localhost mysql]#   mysqlbinlog /backup/xtrabackup/mysql-bin.000002 --start-position=482 > bin.sql
( root@localhost)[(none)]mysql> source /var/lib/mysql/bin.sql
而後在查看 t 表數據:
( root@localhost)[t]mysql>select * from t;
+------+
| i    |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)
一切完美完成,數據庫被咱們回覆到了最新的狀態。
6. innobackupex 選項優化/最佳實踐
6.1 優化FTWRL鎖:
在備份非innodb數據庫時,會使用:flush tables with read lock 全局鎖鎖住整個數據庫。若是數據庫中有一個長查詢在運行,那麼FTWRL就不能得到,會被阻塞,進而阻塞全部的DML操做。此時即便咱們kill掉FTWRL全局鎖也是沒法從阻塞中恢復出來的。另外在咱們成功的得到了FTWRL全局鎖以後,在copy非事務由於的文件的過程當中,整個數據庫也是被鎖住的。因此咱們應該讓FTWRL的過程儘可能的短。(在copy非事務引擎數據的文件時,會阻塞innodb事務引擎。固然也會阻塞全部其餘非事務引擎。)
1> 防止阻塞:
innobackupex 提供了多個選項來避免發生阻塞:
   --ftwrl-wait-timeout=# 替換 --lock-wait-timeout
                      This option specifies time in seconds that innobackupex
                      should wait for queries that would block FTWRL before
                      running it. If there are still such queries when the
                      timeout expires, innobackupex terminates with an error.
                      Default is 0, in which case innobackupex does not wait
                      for queries to complete and starts FTWRL immediately.
   --ftwrl-wait-threshold=# 替換 --lock-wait-threshold
                      This option specifies the query run time threshold which
                      is used by innobackupex to detect long-running queries
                      with a non-zero value of --ftwrl-wait-timeout. FTWRL is
                      not started until such long-running queries exist. This
                      option has no effect if --ftwrl-wait-timeout is 0.
                      Default value is 60 seconds.
--lock-wait-timeout=60 該選項表示:咱們在FTWRL時,若是有長查詢,那麼咱們能夠最多等待60S的時間,若是60秒以內長查詢執行完了,咱們就能夠成功執行FTWRL了,若是60秒以內沒有執行完,那麼就直接報錯退出,放棄。默認值爲0
--lock-wait-threshold=10 該選項表示運行了多久的時間的sql當作長查詢;對於長查詢最多再等待 --lock-wait-timeout 秒。
--kill-long-queries-timeout=10 該選項表示發出FTWRL以後,再等待多時秒,若是還有長查詢,那麼就將其kill掉。默認爲0,not to kill.
--kill-long-query-type={all|select} 該選項表示咱們僅僅kill select語句,仍是kill全部其餘的類型的長sql語句。
這幾個選項,咱們沒有必要都是有,通常僅僅使用 --lock-wait-timeout=60 就好了。
注意 --lock-* 和 --kill-* 選項的不一樣,一個是等待多時秒再來執行FTWRL,若是仍是不能成功執行就報錯退出;一個是已經執行了FTWRL,超時就進行kill。
 
2> 縮短FTWRL全局鎖的時間:
--rsync 使用該選項來縮短備份非事務引擎表的鎖定時間,若是須要備份的數據庫和表數量不少時,能夠加快速度。
--rsync           Uses the rsync utility to optimize local file transfers.
                      When this option is specified, innobackupex uses rsync to
                      copy all non-InnoDB files instead of spawning a separate
                      cp for each file,  which can be much faster for servers
                      with a large number of databases or tables.  This option
                      cannot be used together with --stream.
3> 並行優化:
  --parallel=# 在備份階段,壓縮/解壓階段,加密/解密階段,--apply-log,--copy-back 階段均可以並行       
                      On backup, this option specifies the number of threads
                      the xtrabackup child process should use to back up files
                      concurrently.  The option accepts an integer argument. It
                      is passed directly to xtrabackup's --parallel option. See
                      the xtrabackup documentation for details.
4> 內存優化:
  --use-memory=# 在crash recovery 階段,也就是 --apply-log 階段使用該選項
                      This option accepts a string argument that specifies the
                      amount of memory in bytes for xtrabackup to use for crash
                      recovery while preparing a backup. Multiples are
                      supported providing the unit (e.g. 1MB, 1GB). It is used
                      only with the option --apply-log. It is passed directly
                      to xtrabackup's --use-memory option. See the xtrabackup
                      documentation for details.
3> 備份slave:
--safe-slave-backup 
                      Stop slave SQL thread and wait to start backup until
                      Slave_open_temp_tables in "SHOW STATUS" is zero. If there
                      are no open temporary tables, the backup will take place,
                      otherwise the SQL thread will be started and stopped
                      until there are no open temporary tables. The backup will
                      fail if Slave_open_temp_tables does not become zero after
                      --safe-slave-backup-timeout seconds. The slave SQL thread
                      will be restarted when the backup finishes.
 
--safe-slave-backup-timeout=#
                      How many seconds --safe-slave-backup should wait for
                      Slave_open_temp_tables to become zero. (default 300)
 
--slave-info   This option is useful when backing up a replication slave
                      server. It prints the binary log position and name of the
                      master server. It also writes this information to the
                      "xtrabackup_slave_info" file as a "CHANGE MASTER"
                      command. A new slave for this master can be set up by
                      starting a slave server on this backup and issuing a
                      "CHANGE MASTER" command with the binary log position
                      saved in the "xtrabackup_slave_info" file.
 
7. 備份原理:
1)innobackupex 是perl寫的腳本,它調用xtrabackup來備份innodb數據庫。而xtrabackup是C語言寫的程序,它調用了innodb的函數庫和mysql客戶端的函數庫。innodb函數庫提供了向數據文件應用的redo log的功能,而mysql客戶端函數庫提供瞭解析命令行參數的功能。innobackupex備份innodb數據庫的功能,都是經過調用 xtrabackup --backup和xtrabackup --prepare來完成的。咱們沒有必要直接使用xtrabackup來備份,經過innobackupex更方便。xtrabakup 經過跳轉到datadir目錄,而後經過兩個線程來完成備份過程:
1> log-copy thread: 備份開始時,該後臺線程一直監控redo log(每秒check一次redo log),將redo log的修改複製到備份以後的文件 xtrabackup_logfile 中。若是redo log生成極快時,有可能log-copy線程跟不上redo log的產生速度,那麼在redo log文件切換進行覆蓋時,xtrabakcup會報錯。
2> data-file-copy thread: 先後有一個複製data file的線程,注意這裏並非簡單的複製,而是調用了innodb函數庫,像innodb數據庫那樣打開數據文件,進行讀取,而後每次複製一個page,而後對page進行驗證,若是驗證錯誤,會最多重複十次。
當數據文件複製完成時,xtrabackup 中止log-copy 線程,並創建一個文件  xtrabackup_checkpoints記錄備份的類型,開始時的lsn和結束時的lsn等信息。
而備份生成的  xtrabackup_binlog_info 文件則含義備份完成時對應的binlog的position信息,相似於:mysql-bin.000002        120
 
在備份開始時記錄下LSN,而後一個線程複製數據文件,一個線程監控redo log,複製在備份過程當中新產生的redo log。雖然咱們的到的數據文件顯然不是一致性的,可是利用innodb的crash-recovery功能,應用備份過程當中產生的redo log文件,就能獲得備份完成時那一刻對應的一致性的數據。
 
注意複製數據文件分紅了兩個過程:
一個是複製innodb事務引擎的數據文件,是不須要持有鎖的;另外一個是複製非事務引擎的數據文件和table的定義文件.frm,複製這些文件時,是須要先經過FTWRL,而後在進行復制的,因此會致使整個數據庫被阻塞。
增量備份時,是經過對錶進行全掃描,比較LSN,若是該page的LSN大於上一次別分時的LSN,那麼就將該page複製到table_name.ibd.delta文件中。回覆時.delta會和redo log應用到全備是的數據文件中。
增量備份在恢復時,除了最後一次增量備份文件以外,其它的增量備份在應用時,只能前滾,不能執行回滾操做,由於沒有提交的事務,可能在下一個增量備份中進行了提交,若是你在上一個增量備份時回滾了,那麼下一個增量備份應用時,顯然就報錯了,由於他沒法提交事務,該事務以及被回滾了。
 
8. 總結:
1)權限:
備份須要兩個層面的權限,Linux層面的權限,mysql層面的權限。
2)全備和恢復
全備:innobackupex  /backup/xtrabackup/full --user=bkpuser --password=digdeep
應用日誌進行prepare: innobackupex --apply-log /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 
關閉mysqld:
copy-back: innobackupex --copy-back /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 
修改權限:chown -R mysql:mysql /var/lib/mysql
3)增量備份和恢復:
全備:
innobackupex --user=bkpuser --password=digdeep /backup/xtrabackup/full
第一次增量備份:
innobackupex --incremental /backup/xtrabackup/incr1/ --incremental-basedir=/backup/xtrabackup/full/2015-11-06_11-29-51/ 
--user=bkpuser --password=digdeep 
第二次增量備份:
innobackupex --incremental /backup/xtrabackup/incr2 --incremental-basedir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/ 
--user=bkpuser --password=digdeep
恢復:
應用全備redo log:
innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep
應用第一次增量備份的redo log:
innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/ 
--user=bkpuser --password=digdeep
應用第二次(最後一次)增量備份的redo log:
innobackupex --apply-log /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr2/2015-11-06_11-43-22/ 
--user=bkpuser --password=digdeep
關閉mysqld,
innobackupex --copy-back /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep
4)部分備份 
innobackupex --databases t /backup/xtrabackup/ --user=bkpuser --password=digdeep
innobackupex --apply-log --export /backup/xtrabackup/2015-11-06_15-39-34/ --user=bkpuser --password=digdeep
新建表結構:create table city like t.city;
alter table partial.city discard tablespace;
而後將 city.exp 和 city.ibd 拷貝到 /var/lib/mysql/partial/ 目錄下,並修改權限:chown -R mysql:mysql /var/lib/mysql
alter table partial.city import tablespace;
5)point-in-time 恢復
在--copy-back以後,引用binlog文件
mysqlbinlog /backup/xtrabackup/mysql-bin.000002 --start-position=482 > bin.sql
( root@localhost)[(none)]mysql>source bin.sql
6) innobackupex 選項優化/最佳實踐
--ftwrl-wait-timeout=60 防止發生阻塞
--rsync 減小FTWRL時間 縮短備份非事務引擎表的鎖定時間
--parallel=4  開並行
--use-memory=4G crash recovery 期間使用的內存
相關文章
相關標籤/搜索