记一次阿里云RDS与自建数据库同步中断的补救过程
背景
2018年4月24日上午9點(diǎn)左右,小編在即將托管的服務(wù)器上建立數(shù)據(jù)庫,并通過openvpn建立加密隧道,從而實(shí)現(xiàn)阿里云RDS和本地自建數(shù)據(jù)庫之間同步。在托管服務(wù)器上配置openvpn后,重啟openvpn客戶端時,一直獲取不到ip,后面重啟了一下openvpn服務(wù)端,本地托管服務(wù)器獲取到了IP,之后小編很開心的配置著MySQL主從同步。但是到11:00左右,有同事反應(yīng)線上自建數(shù)據(jù)庫無法訪問,小編通過查看,發(fā)現(xiàn)在阿里云虛擬機(jī)上的自建MySQL同步中斷,從而導(dǎo)致本地同步也中斷,并且已經(jīng)同步停止了2個小時。為了保證業(yè)務(wù)的正常運(yùn)行,小編做了如下操作。
當(dāng)前數(shù)據(jù)庫同步架構(gòu)圖
補(bǔ)救策略
- 在RDS上獲取gtid點(diǎn),在從庫上從新設(shè)置同步點(diǎn),使從庫正常運(yùn)行起來,保證業(yè)務(wù)的流暢
- 通過解析RDS binlog,把binlog轉(zhuǎn)換成SQL語句,然后把SQL語句插入到從庫中
- 重新做RDS到自建庫的數(shù)據(jù)同步
- 數(shù)據(jù)庫同步架構(gòu)改進(jìn),解決單點(diǎn)問題。
補(bǔ)救過程
1. 先讓同步正常運(yùn)行,保證業(yè)務(wù)不中斷
1. 在RDS上獲取gtid節(jié)點(diǎn)?
- 命令 :
show master status\G - 結(jié)果 :?
*************************** 1. row *************************** File: mysql-bin.000886 Position: 324398134 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 005304be-d260-11e7-b402-6c92bf475505:1-219538493, 759ccfb9-70d0-11e7-b7d5-6c92bf47591d:1-2572999, 936b4aea-70d0-11e7-b7d6-6c92bf4757fb:1-132842752, df8f8121-d25f-11e7-b401-6c92bf4757d1:1-44768267 共返回 1 行記錄,花費(fèi) 5 ms. 2. 配置從節(jié)點(diǎn)過濾主鍵不存在的錯誤?編輯 從庫配置文件(小編的配置文件為/etc/my.cnf)
slave-skip-errors = 1062,1053,1032 3. 重啟數(shù)據(jù)庫?
service mysqld restart 4. 在從節(jié)點(diǎn)重新設(shè)置同步點(diǎn)?
- 停止同步
stop slave - reset 同步
reset slave all; reset master; - 重新設(shè)置同步點(diǎn)
set global gtid_purged='005304be-d260-11e7-b402-6c92bf475505:1-219538493, 759ccfb9-70d0-11e7-b7d5-6c92bf47591d:1-2572999, 936b4aea-70d0-11e7-b7d6-6c92bf4757fb:1-132842752, df8f8121-d25f-11e7-b401-6c92bf4757d1:1-44768267'; CHANGE MASTER TO MASTER_HOST='xxxxxxxx', MASTER_USER='xxxxx', MASTER_PASSWORD='xxxxxxxx', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_CONNECT_RETRY=10; 5. 啟動同步?
start slave 6. 查看同步是否正常?
show slave status\G 2. 彌補(bǔ)數(shù)據(jù)
由于從庫無法通過運(yùn)行RDS的binlog來修復(fù)數(shù)據(jù),所以需要解析RDS的binlog,讓其轉(zhuǎn)換成SQL語句,然后再在各個從庫上執(zhí)行解析出來的SQL語句,具體流程如下:
1. 下載binlog在阿里云控制臺,選擇RDS的日志備份,并獲取下載地址,在服務(wù)器上通過如下命令下載
wget -c '日志地址' -O xxx.tar.gz 2. 獲取某一時間段的binlog并轉(zhuǎn)換成可識別語句
mysqlbinlog --no-defaults --base64-output=decode-rows -v -v --start-datetime='2018-04-27 08:58:38' --stop-datetime='2018-04-27 11:58:37' mysql-bin.000797 > 797_10_11.txt 3. 使用下列腳本把上面轉(zhuǎn)換后的binlog解析成SQL語句?
- 腳本binlog_parse_to_sql.py
小編千辛萬苦終于找到了一可以把binlog轉(zhuǎn)換成SQL語句的腳本,github地址為:https://github.com/yy1117/binlog_parse_to_sql。但是該腳本直接使用不適合小編的需求,所以小編對代碼進(jìn)行了更改,滿足了自己的需求。
#!/usr/bin/python
# -*- coding:utf8 -*- #version_1.2 #######Comment:#################################################################### ## ?Author:GuiJiaoQi&XuYou ?MAIL:yinyi1117@126.com;QQ:85531861 ? ? ? ## ###### ?set global group_concat_max_len =1024000;避免group_concat ?默認(rèn)長度不夠 ? ## ###### ?如果binlog文件的表在后面發(fā)生表結(jié)果變化,這個解析會報(bào)錯 ? ? ? ? ? ## ###### ?如果columns是二進(jìn)制的解析會報(bào)錯,如果有二進(jìn)制的還請換工具,抱歉 ? ? ? ? ? ? ? ## ################################################################################### import os,sys import re import MySQLdb import optparse def main(): p = optparse.OptionParser() p.add_option('-u','--user',type='string',dest='user',default='root', help='User for login ') p.add_option('-p','--password',type='string',dest='password', help='Password to use when connecting') p.add_option('-s','--socket',type='string',dest='socket', help='The socket file to use for connection.') p.add_option('-f','--file',type="string",dest='filename',
轉(zhuǎn)載于:https://www.cnblogs.com/syncnavigator/p/10189638.html
總結(jié)
以上是生活随笔為你收集整理的记一次阿里云RDS与自建数据库同步中断的补救过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洱海自驾一圈多少时间
- 下一篇: 无精症占不孕不育的比例多少