溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Mysql中怎么實(shí)現(xiàn)延時復(fù)制

發(fā)布時間:2021-08-06 14:18:50 來源:億速云 閱讀:109 作者:Leah 欄目:MySQL數(shù)據(jù)庫

今天就跟大家聊聊有關(guān)Mysql中怎么實(shí)現(xiàn)延時復(fù)制,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

首先研究下mysql的復(fù)制結(jié)構(gòu),4.0以上開始,復(fù)制分為2個進(jìn)程,io進(jìn)程和sql進(jìn)程。其中io進(jìn)程連接到master讀取binlog,寫入relaylog,而sql進(jìn)程讀取relaylog后apply到slave上。

binlog和relaylog格式dump出來是這樣的:

#090108 20:24:17 server id 1 log_pos 9466422 Query thread_id=34456 exec_time=0 error_code=0
SET TIMESTAMP=1231417457;
insert into xxxx (UDusedo,UDdirect,UDuserid,UDusername,UDgetuserid,UDgetusername,UDcoins,UDtype,UDzone1,UDtargetvalue,UDdate,UD
ip,UDstatus) values ('33','n','7495715','LWGZOY','7495715','LWGZOY','1000','prop','3','56009376',now(),'116.53.1.144','00');

log中有SET TIMESTAMP=1231417457是為了防止slave和master之間時間不同造成某些時間字段值不一致的情況。其實(shí)也等同于這句sql在master上運(yùn)行的時間,那么我們只要獲取到它再和當(dāng)前slave上的時間比較,如果少于我們需要的延時就讓復(fù)制停下,這不就實(shí)現(xiàn)了延時復(fù)制么.

在mysql中可以通過函數(shù)UNIX_TIMESTAMP獲取到和上面的TIMESTAMP同樣的結(jié)果。

mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
| 1231750815 |
+------------------+
1 row in set (0.00 sec)

如何挖relaylog的尾部是個問題,因?yàn)槿罩究赡芎艽?,所以我們要借助下面的命令?/p>

[root@HB-150-189 data]# mysql -e "show slave statusG"
*************************** 1. row ***************************
Master_Host: 192.168.1.104
Master_User: rep
Master_Port: 3306
Connect_retry: 60
Master_Log_File: HBDB104-bin.104
Read_Master_Log_Pos: 534427423
Relay_Log_File: HB-150-189-relay-bin.070
Relay_Log_Pos: 20200284
Relay_Master_Log_File: HBDB104-bin.104
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_do_db: aushop,auhj
Replicate_ignore_db:
Last_errno: 0
Last_error:
Skip_counter: 0
Exec_master_log_pos: 534427423
Relay_log_space: 20200284

其中得到Relay_Log_File的名字,Relay_Log_Pos: 20200284,通過這個可以得到一個offset,以此來挖掘relaylog來獲取到最近的TIMESTAMP,然后使用:

mysqlbinlog -j 20200284./HB-150-189-relay-bin.070|grep "SET TIMESTAMP"|sed -n '1p'

在加上shell的處理就可以輕松獲取最近的TIMESTAMP了

再看下show slave status的輸出,版本為4.0.26:

mysql> show slave statusG
*************************** 1. row ***************************
Master_Host: 192.168.1.184
Master_User: rep
Master_Port: 3306
Connect_retry: 60
Master_Log_File: HBDB184-bin.072
Read_Master_Log_Pos: 358310392
Relay_Log_File: HB150-130-relay-bin.076
Relay_Log_Pos: 348847513
Relay_Master_Log_File: HBDB184-bin.072
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_do_db: money
Replicate_ignore_db:
Last_errno: 0
Last_error:
Skip_counter: 0
Exec_master_log_pos: 358310392
Relay_log_space: 348847513
1 row in set (0.00 sec)

輸出信息包括了Slave_IO_Running, Slave_SQL_Running的狀態(tài)。

mysql 4以后,可以通過STOP SLAVE IO_THREAD來停止io進(jìn)程的活動,STOP SLAVE SQL_THREAD來停止sql進(jìn)程的活動,大家只要使用shell結(jié)合crontab和nohup,加上對

[root@HB-150-189 data]# mysqladmin extended-status|grep Slave_running

看完上述內(nèi)容,你們對Mysql中怎么實(shí)現(xiàn)延時復(fù)制有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI