2016-10-15 114 views
0

我在AWS RDS上運行MySQL。從屬​​複製因以下錯誤而陷入停滯狀態。它說它無法在從屬服務器的表中找到記錄......有沒有辦法知道哪個記錄?或者失敗的SQL!MySQL從屬複製失敗:如何識別導致它失敗的SQL語句

Read Replica Replication Error - SQLError: 1032, reason: Could not execute Update_rows_v1 event on table customers.visitor; Can't find record in 'visitor', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin-changelog.206572, end_log_pos 12627388

回答

1

使用mysqlbinlog來讀取日誌。

mysqlbinlog --verbose --base64-output=decode-rows mysql-bin-changelog.206572 \ 
| awk '/end_log_pos/{flag=0}/end_log_pos\ 12627388\ /{flag=1}flag' 

從錯誤信息,這看起來就像是在行格式記錄的事件,所以mysqlbinlog將其解碼爲僞SQL,顯示了它的順序位置,這樣的事情每一列:

### UPDATE `my_db_name`.`my_table_name` 
### WHERE 
### @1=70 
### @2=1476602910 
### @3=NULL 
### @4=NULL 
### @5=NULL 
### @6=NULL 
### @7=NULL 
### SET 
### @1=70 
### @2=1476602910 
### @3=1476602926 
### @4=000000016.283000000 
### @5=NULL 
### @6='0' 
### @7=NULL 

@1@2等,在輸出爲第1列,第2列,等。二進制日誌不包含的列的實際名稱,因爲它們被認爲是在主機和從機並且它們相同因此是多餘的...所以mysqlbinlog創建這個僞sql來說明它是如何解釋記錄的更改事件。 WHERE是更新之前在主服務器上顯示的行的版本(這將成爲從服務器上未找到的行),SET是主服務器上更新後的行的值(什麼是奴隸應該改變行看起來像,如果它存在)。

這不會標識您的原始查詢,但會顯示出現在主服務器上的實際行,但在從服務器上缺失。

如果您還沒有日誌,你可以從主取水的時候,首先,與此:

mysqlbinlog --host=xxxx.rds.aws-regi-on.amazonaws.com --user 'rds-master-user' \ 
--password='rds-master-password' --read-from-remote-server \ 
--raw mysql-bin-changelog.206572 

日誌必須從主進賬。在這種情況下,它不能從從站讀取。 (如果這不是RDS,可以通過SSH登錄到外殼並直接讀取中繼日誌,但這些外部訪問是不可訪問的,這就是爲什麼您必須到主服務器進行日誌訪問的原因, )

除非您已經配置RDS以使您的二進制日誌保留的時間長於技術上需要的時間,否則該日誌可能不再在主服務器上可用,因此您下次可能會有些失態。您可以在RDS上配置二進制日誌記錄保留,包括MySQL 5.6和更高版本的所有RDS實例上的自定義過程。要將日誌保留設置爲24小時,例如:

CALL mysql.rds_set_configuration('binlog retention hours', 24); 

又見http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html


信用的靈感source使用awk找到兩個模式之間的線路。

請注意,在上述命令匹配並打印出發生錯誤的事件後,它可能會掛起,因爲awk會繼續掃描到文件末尾。 Control-C終止。