一、背景
工作中有需求數據庫需要遷移,但是不能停服,不能鎖庫鎖表影響業務的正常運行,所以使用XtraBackup
二、環境:
操作系統:CentOS Linux release 7.4.1708 (Core)
mysql:5.6.35
IP:192.168.0.131
xtrabackup版本:percona-xtrabackup-24-2.4.2-1.el7.x86_64.rpm
xtrabackup下載地址:https://www.percona.com/downloads/XtraBackup/LATEST/
根據linux系統選擇不同版本!
三、安裝xtrabackup
[root@host1 ~]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev numactl [root@host1 ~]# rpm -Uvh percona-xtrabackup-24-2.4.2-1.el7.x86_64.rpm
【優缺點比較】
Xtrabackup備份的優勢
- 備份和恢復非常快
- 增量備份
- 流式備份
- (解)壓縮算法相比邏輯備份的zlib庫更快
- 自身多線程支持
Xtrabackup備份的劣勢
- 不夠靈活,無法單獨備份指定表、指定庫
- 無法同邏輯備份那樣grep特定業務存在的字符串
- 空間損耗,且不支持邏輯備份恢復時的碎片整理功能
- 依賴於備份過程中生成的redo log大小,若過大會極大的影響備份和恢復速度
- 邏輯備份在不同mysql版本中,兼容性較好;而Xtrabackup作為物理備份方案,對mysql server的版本依賴性較強,擴展性較差
四、備份和恢復
1、使用環境:本人測試使用的是為環境新搭建的mysql_multi多實例方式,具體安裝步驟見:https://www.cnblogs.com/01-single/p/9051412.html
my.cnf配置:
[root@host1 ~]# cat /usr/local/mysql/my.cnf [client] [mysqld] [mysqld_multi] user=mysql password=mysql mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin [mysqld3307] socket = /tmp/mysql3307.sock port = 3307 user=mysql pid-file = /alidata1/mysql_multi/mysql3307/mysqld.pid datadir = /alidata1/mysql_multi/mysql3307/mydata log-bin= /alidata1/mysql_multi/mysql3307/log/binlog server-id = 3307001 innodb_buffer_pool_size = 256M auto_increment_increment=2 auto_increment_offset=1 log_error = /alidata1/mysql_multi/mysql3307/log/log-err expire_logs_days = 5 bind-address = 192.168.0.131 skip-name-resolve [mysqld3308] socket = /tmp/mysql3308.sock port = 3308 user=mysql pid-file = /alidata1/mysql_multi/mysql3308/mysqld.pid datadir = /alidata1/mysql_multi/mysql3308/mydata log-bin= /alidata1/mysql_multi/mysql3308/log/binlog server-id = 3308001 innodb_buffer_pool_size = 256M auto_increment_increment=2 auto_increment_offset=2 log_error = /alidata1/mysql_multi/mysql3308/log/log-err expire_logs_days = 5 bind-address = 192.168.0.131 skip-name-resolve
一定注意需要做主從的server-id不能是一樣的,否則會報錯,
在主主同步配置時,需要將兩台服務器的auto_increment_increment增長量都配置為2,而要把auto_increment_offset分別配置為1和2,
這樣才可以避免兩台服務器同時做更新時自增長字段的值之間發生沖突。
通常一般都直接使用innobackupex,因為它能同時備份InnoDB和MyISAM引擎的表
重點關注Slave_IO_Running和Slave_SQL_Runningd的狀態是否為YES
2、備份:
[root@host1 ~]# innobackupex --socket=/tmp/mysql3307.sock --user=root --password=123456 --defaults-file=/usr/local/mysql/my.cnf /mysqlbackup [root@host1 ~]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --socket=/tmp/mysql3307.sock --user=root --password=123456 --apply-log /mysqlbackup/2018-06-21_10-35-09/ #保持事務一致性
一般情況下,在備份完成后,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態;
“准備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態;
innobakupex命令的–apply-log選項可用於實現上述功能。
如果使用另外一台服務器做主從,需要傳輸備份的數據:
[root@host2 ~]# scp -r 192.168.0.131:/mysqlbackup/2018-06-21_10-35-09 /tmp/backup
3、恢復:
[root@host1 mysql3308]# pwd /alidata1/mysql_multi/mysql3308 [root@host1 mysql3308]# mv mydata mydatabak #備份原有的數據庫 [root@host1 mysql3308]# mkdir mydata #新建數據庫目錄
#恢復數據庫:
[root@host1 mysql3308]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --datadir=/alidata1/mysql_multi/mysql3308/mydata/ --socket=/tmp/mysql3308.sock --user=root --password=123456 --copy-back /mysqlbackup/2018-06-21_10-35-09/ [root@host1 mysql3308]# chown -R mysql:mysql mydata #還原權限 [root@host1 mysql3308]# cd /usr/local/mysql/bin/
#重新啟動3308數據庫 [root@host1 bin]# ./mysqld_multi --defaults-file=../my.cnf stop 3308 --user=root --password=123456 [root@host1 bin]# ./mysqld_multi --defaults-file=/usr/local/mysql/my.cnf start 3308 [root@host1 bin]# netstat -nlpt | grep mysql tcp 0 0 192.168.0.131:3307 0.0.0.0:* LISTEN 35205/mysqld tcp 0 0 192.168.0.131:3308 0.0.0.0:* LISTEN 37161/mysqld
五、開啟主從同步:
一、 #主:192.168.0.131 3307 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%' IDENTIFIED BY 'slave123'; mysql> show master status \G #從:192.168.0.131 3308 [root@host1 ~]# cat /mysqlbackup/2018-06-21_10-35-09/xtrabackup_binlog_info binlog.000001 32399093 mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.131', MASTER_USER='slaveuser', MASTER_PASSWORD='slave123', MASTER_PORT=3307, MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=32399093; mysql> start slave; mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.131 Master_User: slaveuser Master_Port: 3307 ………… ………… Slave_IO_Running: Yes Slave_SQL_Running: Yes ………… ………… 1 row in set (0.00 sec) 二、 #主:192.168.0.131 3308 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%' IDENTIFIED BY 'slave123'; mysql> show master status \G *************************** 1. row *************************** File: binlog.000003 Position: 592 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec) #從:192.168.0.131 3307 mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.131', MASTER_USER='slaveuser', MASTER_PASSWORD='slave123', MASTER_PORT=3308, MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=592; mysql> start slave; mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.131 Master_User: slaveuser Master_Port: 3308 ………… ………… Slave_IO_Running: Yes Slave_SQL_Running: Yes ………… ………… 1 row in set (0.00 sec)
至此互為主從已配置好,兩個庫均可執行讀寫操作,且互相同步
如果是兩個不同IP的服務器做主從,只需改下IP就行,操作方式一樣
PS:innobackupex備份數據庫的各文件說明:
(1) backup-my.cnf —— 備份命令用到的配置選項信息;
(2) ibdata —— 備份的表空間文件;
(3) xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;
(4) xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止
(5) xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;
(6) xtrabackup_logfile —— 備份的重做日志文件。
在使用innobackupex進行備份時,還可以使用–no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。
參考文檔:
