從一臺服務器遷移至其餘服務器,如何選擇最短的停服時間方案mysql
方案1、凌晨3點的全備份+停服後一天的大概一天的增備sql
1. 拷貝前一天的全備份至新的服務器服務器
rsync -auzrP /Data/dbbak/db/2019-04-23/2019-04-23_03-10-11 root@172.16.1.80:/data/backup/full/架構
2. 解壓(備份方式:innobackupex --compress,因此須要提早解壓)app
innobackupex --decompress /data/backup/full/2019-04-23_03-10-11spa
3. 停服日誌
systemctl stop mysqldrem
5. 增備it
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /data/backup/incr --incremental-basedir=/data/backup/full/2019-04-02_16-42-43io
6. 恢復
--應用日誌
innobackupex --defaults-file=/usr/local/mysql/etc/my.cnf --apply-log --redo-only /data/2019-04-18_03-10-09/
innobackupex --defaults-file=/usr/local/mysql/etc/my.cnf --apply-log --redo-only /data/2019-04-18_03-10-09/ --incremental-dir=/root/2019-04-18_19-06-43
7. 拷貝至data目錄下,並受權
innobackupex --defaults-file=/usr/local/mysql/etc/my.cnf --copy-back /data/2019-04-18_03-10-09/
chown -R mysql:mysql /data/mysql-data/
chmod -R 755 /data/mysql-data/
8. 恢復完成,啓動mysql
mysqld_safe --user=mysql &
方案2、當前時間全備+binglog恢復
1. 全備份(熱備,物理備)
innobackupex --defaults-file=/etc/my.cnf --user=root --password='123456' --use-memory=12G --kill-long-queries-timeout=5 --ftwrl-wait-timeout=20 --compress --compress-threads=16 /data/bak/db/`date +%F`
2. 拷貝至新服務器,並恢復
rsync -auzrP /Data/dbbak/db/2019-04-23/2019-04-23_03-10-11 root@172.16.1.80:/data/backup/full/
innobackupex --decompress /data/backup/full/2019-04-23_03-10-11
innobackupex --apply-log /data/backup/full/2019-04-23_03-10-11
innobackupex --copy-back /data/backup/full/2019-04-23_03-10-11
3. 停服保證數據一致性,再將期間產生的binlog拷貝至新的服務器並執行
mysqlbinlog --start-position=1108 mysql-bin.000007 |mysql -uroot -p123456 -v
方案3、主從架構複製的方式
1.用全備份恢復
rsync -auzrP /Data/dbbak/db/2019-04-23/2019-04-23_03-10-11 root@172.16.1.80:/data/backup/full/
innobackupex --decompress /data/backup/full/2019-04-23_03-10-11
innobackupex --apply-log /data/backup/full/2019-04-23_03-10-11
innobackupex --copy-back /data/backup/full/2019-04-23_03-10-11
2. 受權新服務器複製權限
GRANT REPLICATION SLAVE ON *.* TO 'rep20'@'10.8.9.20' IDENTIFIED BY '123456';
3. 給全部表加上只讀鎖
flush tables with read lock;
4. 配置主從
stop slave;
change master to master_host='172.16.1.88', master_user='rep20', master_password=' 123456', master_log_file='mysql-bin.000614', master_log_pos=296235077;
start slave;
5. 查看主從狀態
Master_Log_File和Relay_Master_Log_File所指向的文件必須一致
Relay_Log_Pos和Exec_Master_Log_Pos的爲止也要一致才行
Slave_SQL_Running_State:顯示爲wait 意思是中繼日誌的sql語句已經所有執行完畢
6. 驗證部分表的記錄條數,和最後一條數據的內容
select count(*) from student;
select * from student order by create_time desc limit 1;
7. 解鎖
UNLOCK TABLES;
總結: 方案一是增備的方式,步驟複雜了一些,操做失誤就得從新恢復,停服的時間也須要更長,出錯的機率也相對大;
方案二 停服前全備份(仍是熱備),真正停服的時間是拷貝binlog和恢復binlog的時間,速度快,2步驟,出錯機率低;(推薦)
方案三 停服時間最短,可是相對更難校驗數據的一致性,一旦數據不一致還有寫入,會形成很大的麻煩。