xtrabackup在線遷移mysql並搭建爲主主同步

1、背景html

工做中有需求數據庫須要遷移,可是不能停服,不能鎖庫鎖表影響業務的正常運行,因此使用XtraBackupmysql

2、環境:linux

操做系統:CentOS Linux release 7.4.1708 (Core)算法

mysql:5.6.35sql

IP:192.168.0.131數據庫

xtrabackup版本:percona-xtrabackup-24-2.4.2-1.el7.x86_64.rpmsegmentfault

xtrabackup下載地址:https://www.percona.com/downloads/XtraBackup/LATEST/服務器

根據linux系統選擇不一樣版本!多線程

3、安裝xtrabackupapp

[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備份的優點

  1. 備份和恢復很是快
  2. 增量備份
  3. 流式備份
  4. (解)壓縮算法相比邏輯備份的zlib庫更快
  5. 自身多線程支持

Xtrabackup備份的劣勢

  1. 不夠靈活,沒法單獨備份指定表、指定庫
  2. 沒法同邏輯備份那樣grep特定業務存在的字符串
  3. 空間損耗,且不支持邏輯備份恢復時的碎片整理功能
  4. 依賴於備份過程當中生成的redo log大小,若過大會極大的影響備份和恢復速度
  5. 邏輯備份在不一樣mysql版本中,兼容性較好;而Xtrabackup做爲物理備份方案,對mysql server的版本依賴性較強,擴展性較差

4、備份和恢復

一、使用環境:本人測試使用的是爲環境新搭建的mysql_multi多實例方式,具體安裝步驟見:http://www.javashuo.com/article/p-qbegbxba-bz.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

二、備份:

[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

三、恢復:

[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

5、開啓主從同步:

1、
#主: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)

2、
#主: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目錄來存儲備份數據。

參考文檔:

https://segmentfault.com/a/1190000003063874

https://yq.aliyun.com/product/999?utm_content=se_369232

相關文章
相關標籤/搜索