pt-slave-delay主動使mysql slave落後於master一段時間
root@debian:~# DATE
Mon Sep 10 12:40:28 CEST 2012
root@debian:~# pt-slave-delay --delay=10m u=root,p=msandbox,h=127.0.0.1,P=21983
2012-09-10T12:40:31 Reconnected TO slave
2012-09-10T12:40:31 slave running 83 seconds behind
2012-09-10T12:40:31 STOP SLAVE until 2012-09-10T12:49:08 at master POSITION mysql-bin.000001/83915317
2012-09-10T12:41:31 Reconnected TO slave
2012-09-10T12:41:31 slave stopped at master POSITION mysql-bin.000001/100072820
[...]
2012-09-10T12:49:31 START SLAVE until master 2012-09-10T12:39:08 mysql-bin.000001/83915317
2012-09-10T12:50:31 Reconnected TO slave
2012-09-10T12:50:31 slave running 672 seconds behind
2012-09-10T12:50:31 slave running 672 seconds behind at master POSITION mysql-bin.000001/233713063
slave1 [localhost] {msandbox} ((NONE)) > SHOW slave STATUS\G
*************************** 1. ROW ***************************
[...]
Slave_IO_Running: Yes
Slave_SQL_Running: No
[...]
只要這個命令不結束,從服務器就至少會落後主服務器10分鐘。
在此過程中,
SLAVE_IO 線程並沒有停止,一直在從主服務器抓取數據,
SLAVE_SQL 線程周期性地停止,然後打開,然後停止。
這樣有什麼用?
1)
比如說有人在主服務器上面操作失誤了(drop table ,truncate table, drop database, update/delete沒有寫where語句。。),
由於這台從服務器的SQL執行落後於主服務器10分鐘,
SA就有充足的時間去阻止這事在此從服務器上發生。。。
從而使得數據恢復成為可能。
怎樣阻止呢?stop slave; 然後 start slave until。。出錯的SQL語句 binlog文件和坐標可以使用mysqlbinlog命令來獲取到。
2)
測試一下你的網站程序在落後的從服務器上是否正常~~
————————
下面再YY一下這個過程是如何實現的。
pt-slave-delay –delay=10m 開始運行
(a) 連接到從服務器,
檢測從服務器落後主服務器多少秒$behind,並輸出。
然後記錄當前時間,以及Slave_IO_Thread獲取到的master_log_file與read_master_log_pos做為一個對象,保存到某數組@positions中。
情況一:
如果從服務器的Slave_SQL_Thread正在運行,
並且$behind小於10分鐘, STOP SLAVE SQL_THREAD,並計算出多長時間之後(now()-$behind+10分鐘),才需要再次START SLAVE。
再次START的時間點稱為$next_start。
等待一分鐘,再goto(a)
情況二:
如果從服務器的Slave_SQL_Thread正在運行,
並且$behind超出10分鐘, 那就什麼也不做。
情況三:
如果從服務器的Slave_SQL_Thread已經被STOP了,並且當前時間沒有達到$next_start, 那就等待一分鐘,再goto(a)
情況四:
如果從服務器的Slave_SQL_Thread已經被STOP了,並且當前時間達到$next_start,
說明從服務器已經休息夠了,就從數組@positions中挑選一個合適的對象出來,此對象記錄的時間要比較接近當前時間的10分鐘之前。
然後START SLAVE SQL_THREAD UNTIL 此對象的master_log_file與read_master_log_pos。
等待一分鐘,goto(a)
—————————–
http://dev.mysql.com/doc/refman/5.6/en/replication-delayed.html
mysql 5.6 就有這種功能了。。。