一、問題:
線上一個主庫壓力比較大,所以增加一個從庫,但是不能重啟或者停止主庫的正常運行,不能鎖庫鎖表影響業務的正常運行。所以這里想到了XtraBackup
二、XtraBackup介紹:
? ? ? ?Xtrabackup的優點:
1、備份完成快速、可靠
2、備份期間不間斷的事務處理
3、節省磁盤空間和網絡帶寬
4、自動備份驗證
5、提高正常運行時間由于更快的恢復時間
備份INNODB引擎的數據庫不會鎖庫鎖表,但是備份MyISAM的表還是會鎖的,還支持增量備份。
三、環境說明
系統版本:CentOS Linux release 7.3.1611 (Core)
內核版本:3.10.0-514.16.1.el7.x86_64
?mysql版本:mysql? Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using? EditLine wrapper
xtrabackup版本:percona-xtrabackup-24-2.4.4-1.el7.x86_64?:注:較低版本的xtrabackup不支持 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? centos7.3
四、xtrabackup軟件安裝:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
wget -O /etc/yum.repos.d/epel.repo? http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
yum install -y percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
注意:
my.cnf修改:
innodb_file_per_table = 1
binlog_format='row'
在線改:
set global innodb_file_per_table=1;
set global binlog_format='row';
錯誤故障:
rm -f /etc/my.cnf
否則全備時報如下錯誤:
InnoDB: Number of pools: 1
InnoDB: Error: log file ./ib_logfile0 is ofdifferent size 50331648 bytes
InnoDB: than specified in the .cnf file268435456 bytes!
f pools: 1
五、主庫主從配置
1.主庫配置/etc/my.cnf
增加server-id 和 bin-log
#vim /etc/my.cnfserver-id = 128
? log-bin = mysql-bin
2.主庫配置授權賬號
mysql>ALTERUSER'root'@'localhost'IDENTIFIEDBY'new_password';
mysql>alter user root@localhost identified by'Admin123!';
mysql>grant replication slave on *.* to'slave'@'10.130.21.53' identified by 'password';
mysql> flush privileges;
3.手動設置主庫server-id和log-bin 參數
setglobalserver_id=128
因為這兩個參數是動態參數,不用重啟主庫也可以生效
如果你的主庫已經設置這兩個參數,請忽略這一步操作
4.從庫配置/etc/my.cnf
增加server-id 和 bin-log#vim /etc/my.cnfserver-id = 129
#如果需要在從庫上做bin-log備份可以添加如下參數
log-bin = mysql-bin
log-slave-updates = 1
expire-logs-days=10
mysql -uroot -poldboy123 -S /data/3306/mysql.sock
六、備份主庫數據
1.主庫機器上創建備份目錄
#mkdir -p /home/data/backup33061
2.執行全庫備份
2.1.備份
innobackupex --defaults-file=/home/data/mysql33061/my.cnf --user=root ?--password=admin123 --socket=/home/data/mysql33061/mysql.sock ?/home/data/backup33061
>>> xtrabackup: Transaction log oflsn (549646200) to (549646758) was copied.
170724 15:19:39 completed OK!
PS:備份完成后,會在/home/data/backup33061目錄下生成一個時間點的目錄,這里是2017-07-24_15-19-04。你也可以加一個--no-timestamp參數不產生這個目錄,直備份到/home/data/backup33061目錄下
2.2.重放redo log
#下面preparing,undo撤銷未提交的事務,重放redo log
innobackupex--defaults-file=/home/data/mysql33061/my.cnf--user=root--password=oldboy123--apply-log--socket=/home/data/mysql33061/mysql.sock/home/data/backup33061/2017-07-24_15-19-04
>>> InnoDB: Shutdown completed;log sequence number 549647400
170724 15:24:19 completed OK!
經過預處理或是redo log后的文件才能替換掉從庫的數據目錄
ps:1、ls -l/data/backup/full_data/2016-07-14_05-19-52/查看,你發現xtrabackup會把你數據庫datadir下的所有數據 文件都復制過來還新增了5個xtrabackup_開頭的文件,我們關心的是xtrabackup_binlog_info這個文件,因為這個文件里面記 錄了你做從庫需要change到主庫的binlog的位置和pos點
? ? ? 2、如果只想備份一個庫,加“--include=navy”指定庫名即可, “--databases=navy”不好使。
七、恢復數據到從庫
1.停止從庫
#/etc/init.d/mysqld stop
2.把主庫備份文件拷貝到從庫機器
#scp -rp /data/backup/full_data//2017-07-24_15-19-04? root@10.130.21.53:/mysql/data/
3.修改恢復文件權限
#chown -R mysql:mysql? /mysql/data
4.啟動數據庫
#/etc/init.d/mysqld start
5.確認數據是否恢復成功
登錄從庫,執行show databases;
6.確認同步的位置點
在從庫上或者主庫上都可以查看該信息,我們是在從庫上查看
#cat /mysql/data/xtrabackup_binlog_info? ? ? mysql33061-bin.000001? ? 476764
九、開始主從同步
1.配置從庫 主從配置
#登錄從庫并執行
mysql > CHANGEMASTER TOMASTER_HOST='10.130.21.52',MASTER_USER='rep',MASTER_PASSWORD='oldboy123',MASTER_LOG_FILE='mysql33061-bin.000001', MASTER_LOG_POS=476764;
2.開始同步
mysql> start slave;
3.查看同步狀態
mysql> show slave status\G
Slave_IO_Running: Yes? ? Slave_SQL_Running: Yes? Seconds_Behind_Master: 0
centos6.5 + mysql5.6
備份與主從同步:
注意:
若是mysql編譯安裝等,提示找不到socket路徑,可以用--socket=/var/lib/mysql/mysql.sock參數執行socket路徑
1 備份
在主庫上運行備份命令,后面跟備份文件放在哪個目錄下;
innobackupex --defaults-file="/etc/my.cnf" --user=root --passwor=123456 /opt/
2.scp到從庫
經備份后的文件夾整體scp到從庫的某個目錄,如opt目錄下
scp -rp 備份目錄 遠程用戶@遠程主機:/遠程目錄
3.預處理
內存較大的主機,可以適當加大use-memory,提高處理速度。
innobackupex --defaults-file="/etc/my.cnf" \
--user=root \
--apply-log \
--use-memory=4G /opt/2016-05-07_16-50-33/
4.關閉從庫
/etc/init.d/mysqld stop
5.copy數據
注意:(拷貝前需要將之前的mysql數據目錄清空)
innobackupex --defaults-file="/etc/my.cnf" \
--user=root \
--move-back /opt/2016-05-07_16-50-33/
6.查看master位置
[root@linux-node2 data]# cat xtrabackup_binlog_pos_innodb
mysql-bin.000008? ? 3037723
7.修改權限
將mysql的數據目錄授予mysql用戶權限
chown -R mysql:mysql /data01/mysql/
8.啟動從庫
/etc/init.d/mysqld start
9.設置主從
mysql> change master to \
master_host='192.168.56.11', \
master_user='slave', \
master_password='123456', \
master_log_file='mysql-bin.000008', \
master_log_pos=3037723;
相關經驗:
生產環境212G的數據:
備份時間約25分
內網scp時間:5分鐘(千兆網卡)
預處理時間:5分種
拷貝(恢復)數據:21分鐘
延遲復制:
1.誤刪除恢復。
2.延遲測試。
3.歷史查詢。
mysql> stop slave;
mysql> change master to master_delay = 600;
mysql> start slave;
半同步復制:
master:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> stop slave io_thread;start slave io_thread;
高可用解決方案:? ?MHA
架構擴展方案:
1.基于復制的擴展
2.客戶端分庫分表
3.mysql cluster
4.Percona XtraDB Cluster
5.MySQL的Proxy中間件(mysql proxy,mycat)
MySQL? -> Percona Server? -> MariaDB
基于復制的擴展? -> 客戶端分庫分表 -> MySQL PXC -> mysql 中間件? -> mysql cluster
從庫:一定要設置只讀
MySQL Proxy部署? ?PXC部署(技術儲備)