Xtrabackup中主要包含兩個工具:
xtrabackup:是用於熱備innodb,xtradb表中數據的工具,不能備份其餘類型的表,也不能備份數據表結構;
innobackupex:是將xtrabackup進行封裝的perl腳本,提供了備份myisam表的能力。mysql
[root@db01 ~]# cat /etc/redhat-release CentOS release 6.8 (Final)
mysql版本linux
[root@db01 ~]# mysql -V mysql Ver 14.14 Distrib 5.6.35, for linux-glibc2.5 (x86_64) using EditLine wrapper
1,安裝包sql
yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
2,查看軟件包是否存在數據庫
[root@db01 ~]# yum list|grep percona
3,更新軟件包服務器
yum install percona-xtrabackup-22
4,添加mysql選項,開啓相關功能(錯誤日誌、binlog二進制日誌,datadir指向,等等)app
log-bin=mysql-bin datadir=/application/mysql/data log-error=/application/mysql/data/db01.err
3.1 基本語法:socket
[root@db01 mysql]# innobackupex --user=root --password=123456 --socket=/tmp/mysql.sock --defaults-file=/etc/my.cnf /tmp/ 語法解釋: --user=數據庫用戶 --password=數據庫密碼 --socket=指定socket --default-file=指定配置文件 /tmp/ 最後面是存放位置
顯示以下內容,基本上算是備份成功了tcp
innobackupex: Backup created in directory '/tmp/2017-12-13_12-06-55' innobackupex: MySQL binlog position: filename 'mysql-bin.000004', position 120 171213 12:07:07 innobackupex: Connection to database server closed 171213 12:07:07 innobackupex: completed OK!
3.2 查看備份文件ide
[root@db01 mysql]# ll /tmp/2017-12-13_12-06-55/
各文件說明:工具
(1)xtrabackup_checkpoints ----備份類型(如徹底或增量)、備份狀態(如是否已經沒prepare狀態)和LSN(日誌序列號)範圍信息 每一個InnoDB頁(一般大小爲16K)都會包含一個日誌序列號,即LSN,LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以表名此頁面最近是如何發生改變的。 backup_type = full-backuped from_lsn = 0 to_lsn = 2097320 last_lsn = 2097320 compact = 0 (2)xtrabackup_binlog_info ----mysql服務器當前正在使用的二進制日誌及備份這一刻爲二進制日誌事件的位置 (3)xtrabackup_pos_innodb ----二進制日誌及用於InnoDB或XtraDB表的二進制日誌的當前posistion。 (4)xtrabackup_binary ----備份中用到的xtrabackup的可執行文件 (5)backup-my.cnf ---- 備份命令用到的配置選項信息;
3.3 注意:
在使用innobackupex命令備份時嗎還可使用--no-timestamp選項來阻止命令自動建立一個以時間命名的目錄
innobackupex命令將會建立一個BACKUP-DIR目錄來存儲備份數據
還須要注意,備份數據庫的用戶須要具備相對應的權限,若是要使用一個最小權限的用戶進行備份可使用如下參數:
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘bkpuser’@’localhost’; mysql> FLUSH PRIVILEGES;
一、模擬數據
use oldboy insert into test values(1,'full01'); insert into test values(2,'full02'); insert into test values(3,'full03'); insert into test values(4,'full04'); insert into test values(5,'full05'); select * from test; mysql> select * from test; +----+--------+ | id | name | +----+--------+ | 1 | full01 | | 2 | full02 | | 3 | full03 | | 4 | full04 | | 5 | full05 | +----+--------+ 5 rows in set (0.00 sec)
二、2018/03/21 0點全量備份
date -s "2018/03/21" innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp /server/backup/new_base_full
三、2018/03/22 0點增量備份
mysql -e "use oldboy;insert into test values(6,'new_inc_one_1');" mysql -e "use oldboy;insert into test values(7,'new_inc_one_2');" mysql -e "select * from oldboy.test;" +----+---------------+ | id | name | +----+---------------+ | 1 | full01 | | 2 | full02 | | 3 | full03 | | 4 | full04 | | 5 | full05 | | 6 | new_inc_one_1 | | 7 | new_inc_one_2 | +----+---------------+
第一次增量備份
date -s "2018/03/22" innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --incremental-basedir=/server/backup/new_base_full --incremental /server/backup/new_one_inc
四、2018/03/23 0點增量備份
mysql -e "use oldboy;insert into test values(8,'new_inc_two1');" mysql -e "use oldboy;insert into test values(9,'new_inc_two2');" mysql -e "select * from oldboy.test;"
第二次增量備份
date -s "2018/03/23" innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --incremental-basedir=/server/backup/new_one_inc --incremental /server/backup/new_two_inc
五、2018/03/23 0點之後-10點更新數據
mysql -e "use oldboy;insert into test values(10,'realbinlog_data_3');" mysql -e "use oldboy;insert into test values(11,'realbinlog_data_4');" mysql -e "select * from oldboy.test;"
六、2018/03/23上午10點出故障了
mysql -e "use oldboy;update test set name='oldboy';" mysql> select * from test; +----+--------+ | id | name | +----+--------+ | 1 | oldboy | | 2 | oldboy | | 3 | oldboy | | 4 | oldboy | | 5 | oldboy | | 6 | oldboy | | 7 | oldboy | | 8 | oldboy | | 9 | oldboy | | 10 | oldboy | | 11 | oldboy | +----+--------+ 11 rows in set (0.00 sec)
建議停庫:/etc/init.d/mysqld stop
恢復數據庫:
七、合併數據文件
innobackupex --apply-log --use-memory=32M --redo-only /server/backup/new_base_full/ innobackupex --apply-log --use-memory=32M --redo-only --incremental-dir=/server/backup/new_one_inc /server/backup/new_base_full/ innobackupex --apply-log --use-memory=32M --incremental-dir=/server/backup/new_two_inc /server/backup/new_base_full/
八、開始恢復
cd /application/mysql mv data data.11 cp -a /server/backup/new_base_full data chown -R mysql.mysql data
九、處理binlog
[root@db02 mysql]# cat /server/backup/new_two_inc/xtrabackup_binlog_info oldboy-bin.000006 2286 mysqlbinlog -d oldboy --start-position=2286 oldboy-bin.000006 -r bin.sql mysqlbinlog -d oldboy oldboy-bin.000003 oldboy-bin.000004 oldboy-bin.000005 >>bin.sql cd /application/mysql/logs/ mysqlbinlog -d oldboy --start-position=2286 oldboy-bin.000006 -r /server/backup/new_bin.sql 刪除update一行。update test set name='oldboy'
十、開啓防火牆iptables
iptables -I INPUT ! -s $服務器IP -p tcp -j DROP
十一、恢復增量sql到數據庫
[root@db02 tools]# mysql oldboy </server/backup/new_bin.sql [root@db02 tools]# mysql -e "select * from oldboy.test;" +----+-------------------+ | id | name | +----+-------------------+ | 1 | full01 | | 2 | full02 | | 3 | full03 | | 4 | full04 | | 5 | full05 | | 6 | new_inc_one_1 | | 7 | new_inc_one_2 | | 8 | new_inc_two1 | | 9 | new_inc_two2 | | 10 | realbinlog_data_3 | | 11 | realbinlog_data_4 | +----+-------------------+
停庫
610 Dec 13 16:04 xtrabackup_info
[root@db01 data]# \rm -rf *
1,恢復數據庫
innobackupex --user=root --password=123456 --socket=/tmp/mysql.sock --defaults-file=/etc/my.cnf --copy-back /tmp/2017-12-13_15-23-04/
2.刪除data下文件內容
cd /application/mysql cd data/ \rm -rf *
3,恢復以後,要賦予data目錄權限
[root@db01 mysql]# chown -R mysql.mysql /application/mysql/data//etc/init.d/mysqld start