系統CentOS Linux release 7.2.1511 (Core) X_86 64位最小化安裝
mysql版本是官方二進制版本5.7.22-22,mysql採用的是二進制安裝,單機上開啓2個mysql實例,mysql實例要開啓定時器event_scheduler=ON. 並且2個mysql實例都要開啓Gtid
xtrabackup 採用的是rpm包安裝,版本是version 2.4.13html
1.建立測試數據:mysql
建立一個定時器和存儲過程來生成數據模擬演示xtrabackup 的備份過程linux
建立一個測試庫testdbsql
create database testdb; use testdb;
建立一個測試表以下:數據庫
CREATE TABLE `test1_event` ( `id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) )ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
建立一個存儲過程和一個定時器,讓其定時在表test1_event 中寫數據:tomcat
DELIMITER // DROP PROCEDURE IF EXISTS p_test2// CREATE PROCEDURE p_test2() BEGIN INSERT INTO test1_event(username,password,create_time) values('tomcat', 'xiaohuahua',now()); END// CREATE EVENT e_test ON SCHEDULE EVERY 2 second STARTS TIMESTAMP '2019-08-08 08:29:00' ON COMPLETION PRESERVE DO BEGIN CALL p_test2(); END// delimiter ; 存儲過程和定時器簡單描述: A.建立一個存儲過程p_test2(), 這個存儲過程就是insert 數據到表test1_event B.建立一個定時器,從2019-08-08 08:29:00 這個時間點開始,每隔2秒插入一條數據到表test1_event.相似於linux下的定時任務
2.xtrabackup rpm包安裝:session
xtrabackup安裝使用介紹以下:多線程
官網下載地址:
https://www.percona.com/downloads/XtraBackup/LATEST/
https://www.percona.com/downloads/
https://www.percona.com/doc/percona-xtrabackup/2.4/using_xtrabackup/privileges.htmlapp
下載rpm包來安裝ide
wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.14/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm yum localinstall percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm [root@mgr01 ~]# which xtrabackup /usr/bin/xtrabackup [root@mgr01 ~]# which innobackupex /usr/bin/innobackupex
nnobackupex命令實際上是軟鏈接到xtrabackup的。可是備份數據時要採用innobackupex命令
[root@mgr01 ~]# ll /usr/bin/innobackupex
lrwxrwxrwx 1 root root 10 Apr 13 20:04 /usr/bin/innobackupex -> xtrabackup
到此處安裝完成
2.1 採用xtrabackup 備份數據庫數據時必須得有登陸本地數據庫的權限:
權限通常給reload,replication client, lock tables, process super grant reload,replication client,lock tables,process,super on *.* to backupuser@'localhost' identified by '123456';flush privileges;
或者
grant reload,replication client,lock tables,process,super on *.* to backupuser@'127.0.0.1' identified by '123456';flush privileges;
2.2 備份命令說明:
全量備份命令:
innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf -ubackupuser -p123456 --host=127.0.0.1 -S /tmp/mysql3306.sock --no-timestamp /data/backup/db_3306_`date +%Y%m%d` 或者是 innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf -ubackupuser -p123456 --host=localhost -S /tmp/mysql3306.sock --no-timestamp /data/backup/db_3306_`date +%Y%m%d`
固然在給的權限是localhost時,也能夠去掉--host選項。以下命令:
innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf -ubackupuser -p123456 -S /tmp/mysql3306.sock --no-timestamp /data/backup/db_3306_`date +%Y%m%d`
是支持並行備份的,有個命令參數 parallel。若是生產環境的話,庫的壓力是很是的小的話,可使用這個參數進行並行備份的,可是庫的壓力大的話,就不要用這個參數了。
innobackupex --help|grep parallel
A:備份未使用並行備份的時的時間:
[root@mgr01 backup]# time innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf -ubackupuser -p123456 --host=127.0.0.1 -S /tmp/mysql3306.sock --no-timestamp /data/backup/db_3306_`date +%Y%m%d` 190808 10:02:25 completed OK! real 0m11.294s user 0m0.490s sys 0m1.006s
使用的時間是11秒
B:備份使用了並行備份參數的備份時間: 使用4個線程並行備份
time innobackupex --defaults-file=/data/mysql/mysql3306/my.cnf -ubackupuser -p123456 --host=127.0.0.1 -S /tmp/mysql3306.sock --parallel=4 --no-timestamp /data/backup/db_3306_`date +%Y%m%d` 190808 09:58:01 completed OK! real 0m6.548s user 0m0.378s sys 0m0.703s
使用的時間6秒
xtrabackup 備份數據提示:
xtrabackup在備份時,必定要避開業務的高峯期操做,若是在業務的高峯期操做,會產生大量的redo 文件,在恢復數據庫的過程當中會很是的慢。並且在備份過程當中是存在鎖表的。影響到數據的正常寫入。
並且備份最好是在slave庫上進行備份。由於slave庫上是容許延遲的
鎖表驗證:
從備份的日誌看到是從11:42:08 開始鎖表的
190808 11:42:08 Executing FLUSH TABLES WITH READ LOCK... 190808 11:42:08 Starting to backup non-InnoDB tables and files 到11:42:13 13秒後完成解鎖 190808 11:42:13 Executing UNLOCK TABLES 190808 11:42:13 All tables unlocked
此時查看錶test1_event中的數據(實際是每2秒insert 一條) 5621 | tomcat | xiaohuahua | 2019-08-08 11:42:04 | | 5622 | tomcat | xiaohuahua | 2019-08-08 11:42:06 | ##因爲08秒處出現鎖表,因此數據沒寫入成功 | 5623 | tomcat | xiaohuahua | 2019-08-08 11:42:13 | | 5624 | tomcat | xiaohuahua | 2019-08-08 11:42:13 | ##到13秒處,忽然一下插入2條數據 | 5625 | tomcat | xiaohuahua | 2019-08-08 11:42:14 | | 5626 | tomcat | xiaohuahua | 2019-08-08 11:42:16 |
今後處說明,xtrabackup 在備份innodb表時,仍是會鎖表的,鎖表會形成數據延遲寫入,和丟失數據的狀況
2.3 恢復的命令介紹:
這次演示的恢復在本機上再新開啓一個mysql 3308的實例來恢復。 把上面3306實例上備份的文件恢復到3308的實例上
xtrabackup 恢復演示:
對數據庫進行備份xtrabackup。 備份完了。而後採用下面的命令來恢復
innobackupex --apply-log /data/backup/db_3306_20190808/ 190808 10:31:56 completed OK! innobackupex --defaults-file=/data/mysql/mysql3308/my3308.cnf --copy-back /data/backup/db_3306_20190808/ 190808 10:41:38 completed OK!
提示:若是mysql實例中表存在多個引擎的話,下面的文件中的記錄的binlog 的位置點會不一樣的,可是要以位置點大的爲準.
正常的狀況下show master status\G的顯示的Gtid值和binglog文件,position和xtrabackup_binlog_info內容是一致的,因此要以xtrabackup_binlog_info的信息爲準。
下面的binlog位置點是相同的,緣由是mysql實例中全部的表都採用的是Innodb的引擎
[root@mgr01 db_3306_20190808]# cat /data/backup/db_3306_20190808/xtrabackup_binlog_info mysql-bin.000002 3199225 bde7b592-b966-11e9-8c64-000c294f3e61:1-7796 [root@mgr01 db_3306_20190808]# cat /data/backup/db_3306_20190808/xtrabackup_binlog_pos_innodb mysql-bin.000002 3199225
啓動mysql3308 實例報錯:
[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable 2019-08-08T10:46:55.705574+08:00 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
緣由是權限不對
給恢復的數據目錄data mysql的權限
chown -R mysql.mysql /data/mysql/mysql3308/data
再次啓動mysql 啓動成功:
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf &
數據成功恢復到3308實例:
[root@mgr01 mysql3308]# mysql -S /tmp/mysql3308.sock -e "select count(*) from testdb.test1_event;select user,host from mysql.user;" +----------+ | count(*) | +----------+ | 2631 | +----------+ +---------------+-----------+ | user | host | +---------------+-----------+ | backupuser | 127.0.0.1 | | backupuser | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+ [root@mgr01 mysql3308]#
2.4Tips:
若是備份不是用並行,恢復的時候能夠用並行麼 ??是能夠.
恢復時,想讓恢復的更快,能夠把 --use-memory= 這個內存的值調整的大點,這個參數只是針對在恢復數據庫採用--apply-log參數時使用--use-memory= 加大內存能夠加快恢復數據庫的時間
--use-memory The default value is 100MB, 官網介紹地址: https://www.percona.com/doc/percona-xtrabackup/2.3/xtrabackup_bin/xbk_option_reference.html#cmdoption-xtrabackup-use-memory
採用多線程恢復:
time innobackupex --defaults-file=/data/mysql/mysql3308/my3308.cnf --parallel=2 --use-memory=200M --copy-back /data/backup/db_3306_20190808/ 190808 11:14:26 completed OK! real 0m16.963s user 0m0.037s sys 0m2.270s
恢復使用的時間是16秒
採用單線程恢復:
time innobackupex --defaults-file=/data/mysql/mysql3308/my3308.cnf --use-memory=200M --copy-back /data/backup/db_3306_20190808/ 190808 11:16:11 completed OK! real 0m21.567s user 0m0.035s sys 0m2.905s
恢復使用的時間是21秒
2.5 xtrabackup 增量備份原理:
查找上次備份終止的LSN號
Copy redo
對於LSN號:
大於上次終止的LSN的Page頁都進行copy(每一個表一個單獨的文件)
小於上次終止的LSN的Page不copy
生產上不建議使用 xtrabackup 來進行增量備份數據庫
2.6 xtrabackup 恢復原理:
利用xtrabackup 實現crash recovery:
沒有binlog參與
找到checkpoint 的LSN號
掃描大於checkpoint 的LSN號 的redo,確認commit併合併到datafile,反之rollback
提示:
apply-log過程當中出現失敗的話是能夠屢次運行apply-log的
Tps:
xtrabackup 備份時,在cp .ibd文件的過程當中,此時是沒有鎖表的,可是是不容許修改表結構的
當前的版本中,在備份數據庫的過程當中時不容許進行DDL操做的,因此備份的過程當中是不容許 alter 表結構的
undo 文件是存放的歷史數據,方便數據庫庫故障進行恢復使用的,它是要持久化到磁盤的
提示:
無論什麼DML(create alter )操做都會造成undo
update insert delete,
select 操做是不會造成undo 的
MySQL8.0 的DDL操做也會造成undo
重要提示
MySQL5.5的選擇2.2xtrabackup備份
MySQL5.6的選擇2.3xtrabackup備份
MySQL5.7的選擇2.4xtrabackup 備份
具體備份命令能夠參考下面的文檔
https://blog.51cto.com/wujianwei/1934084
以上備份原理出自知書堂mysql課程內容總結。本博文總結於此處,方便本身工做和學習查閱,順便也貢獻給專一於MySQL領域的朋友們。有不妥之處請留言,一塊兒交流學習