XtraBackup不停機不鎖表搭建MySQL主從同步實踐

前言

Percona XtraBackup可以說是一個相對完美的免費開源數(shù)據(jù)備份工具悦析,支持在線無鎖表同步復(fù)制和可并行高效率的安全備份恢復(fù)機制相比mysqldump來說確實讓人眼前一亮瓣戚,與MySQL Enterprise Backup(InnoDB Hot Backup)的功能對比可以參考擴展閱讀。當然我們在實際運維過程中都應(yīng)針對不同的業(yè)務(wù)需求分析和選擇合適的備份恢復(fù)方案畜埋,這篇文章就是針對MySQL多實例且一個實例對應(yīng)多個database的情況隅津,實現(xiàn)MySQL在線不停機不鎖表的主從同步辩撑,日后再繼續(xù)更新分享基于XtraBackup的其它實用技能蛹屿。

XtraBackup是目前首選的備份方案之一


更新歷史

2015年08月07日 - 初稿

閱讀原文 - http://wsgzao.github.io/post/xtrabackup/

擴展閱讀

Percona XtraBackup - https://www.percona.com/software/mysql-database/percona-xtrabackup
MySQL 5.6 Reference Manual :: 17 Replication - http://dev.mysql.com/doc/refman/5.6/en/replication.html
基于Xtrabackup的物理備份解決方案預(yù)研 - http://tencentdba.com/blog/pre-research-on-physical-backup-using-xtrabakcup/
xtrabackup 詳解 - http://www.cnblogs.com/gomysql/p/3650645.html
LTMP索引 - http://wsgzao.github.io/index/#LTMP


原理

MySQL主從同步原理

MySQL主從同步是在MySQL主從復(fù)制(Master-Slave Replication)基礎(chǔ)上實現(xiàn)的,通過設(shè)置在Master MySQL上的binlog(使其處于打開狀態(tài))放钦,Slave MySQL上通過一個I/O線程從Master MySQL上讀取binlog色徘,然后傳輸?shù)絊lave MySQL的中繼日志中,然后Slave MySQL的SQL線程從中繼日志中讀取中繼日志操禀,然后應(yīng)用到Slave MySQL的數(shù)據(jù)庫中褂策。這樣實現(xiàn)了主從數(shù)據(jù)同步功能。

XtraBackup備份原理

innobackupex在后臺線程不斷追蹤InnoDB的日志文件颓屑,然后復(fù)制InnoDB的數(shù)據(jù)文件斤寂。數(shù)據(jù)文件復(fù)制完成之后,日志的復(fù)制線程也會結(jié)束揪惦。這樣就得到了不在同一時間點的數(shù)據(jù)副本和開始備份以后的事務(wù)日志遍搞。完成上面的步驟之后,就可以使用InnoDB崩潰恢復(fù)代碼執(zhí)行事務(wù)日志(redo log)器腋,以達到數(shù)據(jù)的一致性溪猿。
備份分為兩個過程:

  1. backup,備份階段蒂培,追蹤事務(wù)日志和復(fù)制數(shù)據(jù)文件(物理備份)再愈。
  2. preparing,重放事務(wù)日志护戳,使所有的數(shù)據(jù)處于同一個時間點,達到一致性狀態(tài)垂睬。

XtraBackup的優(yōu)點

  1. 可以快速可靠的完成數(shù)據(jù)備份(復(fù)制數(shù)據(jù)文件和追蹤事務(wù)日志)
  2. 數(shù)據(jù)備份過程中不會中斷事務(wù)的處理(熱備份)
  3. 節(jié)約磁盤空間和網(wǎng)絡(luò)帶寬
  4. 自動完成備份鑒定
  5. 因更快的恢復(fù)時間而提高在線時間

配置

準備工作

MySQL步驟和my.cnf配置參考LTMP - http://wsgzao.github.io/post/ltmp/


#原有主數(shù)據(jù)庫版本
mysql -V
mysql  Ver 14.14 Distrib 5.5.31, for Linux (x86_64) using readline 5.1

#遷移從數(shù)據(jù)庫版本
mysql -V
mysql  Ver 14.14 Distrib 5.6.25, for linux-glibc2.5 (x86_64) using  EditLine wrapper

#檢查數(shù)據(jù)庫引擎
show engines;

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

#主從數(shù)據(jù)庫同步注意點
[mysqld]
#主從之間的id不能相同
server-id
#啟用二進制日志
log-bin
#一般在從庫開啟(可選)
read_only
#推薦使用InnoDB并做好相關(guān)配置

#檢查主從數(shù)據(jù)庫狀態(tài)
mysql -S /tmp/mysql.sock -e "show global variables like 'server_id';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+

mysql -S /tmp/mysql.sock -e "show global variables like 'log_bin';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

安裝percona-xtrabackup

一般推薦rpm安裝 - https://www.percona.com/downloads/XtraBackup/LATEST/

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
#rpm -ivh percona-xtrabackup-2.2.12-1.el6.x86_64.rpm 
rpm -Uvh percona-xtrabackup-2.2.12-1.el6.x86_64.rpm 

備份和恢復(fù)

通常一般都直接使用innobackupex媳荒,因為它能同時備份InnoDB和MyISAM引擎的表
重點關(guān)注Slave_IO_Running和Slave_SQL_Runningd的狀態(tài)是否為YES


#備份
innobackupex --socket=/usr/local/var/mysql2/mysql2.sock --user=root --password --defaults-file=/etc/mysqld_multi.cnf --parallel=4 --database=passport /tmp/backup
#保持事務(wù)一致性
innobackupex --socket=/usr/local/var/mysql2/mysql2.sock --user=root --password --defaults-file=/etc/mysqld_multi.cnf --database=passport --apply-log /tmp/backup/2015-08-05_16-08-14
#傳輸
scp -r /tmp/backup/2015-08-05_16-08-14 10.10.16.24:/tmp/backup/ 
#恢復(fù)
innobackupex --socket=/tmp/mysql.sock --user=root --password --defaults-file=/app/local/mysql/my.cnf --copy-back /tmp/backup/2015-08-05_16-08-14/
#還原權(quán)限
chown -R mysql:mysql /app/data/mysql/data
service mysqld start
/app/local/mysql/scripts/mysql_install_db --basedir=/app/local/mysql --datadir=/app/data/mysql/data --no-defaults --skip-name-resolve --user=mysql

#主庫授權(quán)同步帳號
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
GRANT REPLICATION SLAVE ON *.* TO 'slave_passport'@'10.10.16.24' IDENTIFIED BY 'slave_passport';
FLUSH PRIVILEGES;

#從庫開啟同步
cat /tmp/backup/2015-08-05_16-08-14/xtrabackup_binlog_info 
mysql-bin.002599    804497686

CHANGE MASTER TO
MASTER_HOST='10.10.16.51',
MASTER_USER='slave_passport',
MASTER_PASSWORD='slave_passport',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.002599',
MASTER_LOG_POS=804497686;

#開啟主從同步
start slave;
#查看從庫狀態(tài)
show slave status\ G
#從庫的檢查參數(shù)
Slave_IO_Running=Yes
Slave_SQL_Running=Yes

#主庫的檢查參數(shù)
show master status \G

+------------------+-----------+--------------+------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.002600 | 454769337 |              |                  |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)

show processlist;

Master has sent all binlog to slave; waiting for binlog to be updated

MySQL主從切換

切換前斷開主庫訪問連接觀察進程狀態(tài)抗悍,無寫操作后再停止從庫IO_THREAD進行切換


#查看主庫狀態(tài)
show processlist;
Master has sent all binlog to slave; waiting for binlog to be updated
show master status \G

#從庫停止 IO_THREAD 線程
stop slave IO_THREAD;
show processlist;
Slave has read all relay log; waiting for the slave I/O thread to update it
show slave status \G

#從庫切換為主庫
stop slave;
reset master;
reset slave all;
show master status \G

#激活帳戶
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
GRANT REPLICATION SLAVE ON *.* TO 'slave_passport'@'10.10.16.51' IDENTIFIED BY 'slave_passport';
FLUSH PRIVILEGES;

#切換原有主庫為從庫
reset master;
reset slave all;

CHANGE MASTER TO
MASTER_HOST='10.10.16.24',
MASTER_USER='slave_passport',
MASTER_PASSWORD='slave_passport',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=804497686;

#檢查主庫
SHOW PROCESSLIST;
show master status \G

#啟動從庫
SHOW PROCESSLIST;
start slave;
show slave status \G

常見問題

Slave_SQL_Running:No

#一般是事務(wù)回滾造成的
stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钳枕,隨后出現(xiàn)的幾起案子缴渊,更是在濱河造成了極大的恐慌,老刑警劉巖鱼炒,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衔沼,死亡現(xiàn)場離奇詭異,居然都是意外死亡昔瞧,警方通過查閱死者的電腦和手機指蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來自晰,“玉大人凝化,你說我怎么就攤上這事〕贶瘢” “怎么了搓劫?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長混巧。 經(jīng)常有香客問我枪向,道長,這世上最難降的妖魔是什么咧党? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任秘蛔,我火速辦了婚禮,結(jié)果婚禮上凿傅,老公的妹妹穿的比我還像新娘缠犀。我一直安慰自己,他們只是感情好聪舒,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布辨液。 她就那樣靜靜地躺著,像睡著了一般箱残。 火紅的嫁衣襯著肌膚如雪滔迈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天被辑,我揣著相機與錄音燎悍,去河邊找鬼。 笑死盼理,一個胖子當著我的面吹牛谈山,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宏怔,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奏路,長吁一口氣:“原來是場噩夢啊……” “哼畴椰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸽粉,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斜脂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后触机,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帚戳,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年儡首,在試婚紗的時候發(fā)現(xiàn)自己被綠了片任。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡椒舵,死狀恐怖蚂踊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笔宿,我是刑警寧澤犁钟,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站泼橘,受9級特大地震影響涝动,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炬灭,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一醋粟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧重归,春花似錦米愿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椎木,卻和暖如春违柏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背香椎。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工漱竖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畜伐。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓馍惹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讼积,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容