程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> pt-slave-delay主動使mysql slave落後於master一段時間

pt-slave-delay主動使mysql slave落後於master一段時間

編輯:PHP基礎知識
 

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 就有這種功能了。。。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved