程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql雙機異常及解決方案

Mysql雙機異常及解決方案

編輯:MySQL綜合教程

Mysql雙機異常及解決方案   今天Mysql雙機遇到兩個問題,從網上整理下解決方案,記錄下來:   通過以下命令行可查看異常信息   Sql代碼   mysql> show slave status\G;    具體細節可查看Mysql日志。   問題一:  命令行報錯如下  Slave_IO_Running: No  Slave_SQL_Running: Yes Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin.000073' at 662720845, the last event read from './mysql-bin.000073' at 4, the last byte read from './mysql-bin.000073' at 4.' 從字面理解就是,從服務器請求了主服務器的一個錯誤的復制位置。比如主服務器上的BLIN_LOG裡沒有這個POSITION. 解決辦法: 首先查看主服務器的日志文件中是否有此行,使用命令   Java代碼   mysqlbinlog  /LogPath/mysql-bin.000073 >> log    在log文件裡查找662720845對應的行或者和這個數字接近的行(先從小的試試,無法恢復再從大的試),     log文件內容類似: Java代碼   # at 662720839      #130614  8:36:01 server id 1  end_log_pos 662720860 Query   thread_id=207498    exec_time=0 error_code=0   SET TIMESTAMP=1371170161/*!*/;   COMMIT   /*!*/;   DELIMITER ;        然後重新設置復制位置,如下  Java代碼   mysql>stop slave;   mysql> change master to       -> master_log_file='mysql-bin.000073',       -> master_log_pos=662720860;   mysql> start slave;   如果找不到,可用如下命令查看mysql-bin.000073的最大位置 Java代碼   ls -la mysql-bin.000073    如果大小遠小於662720845,則可以跳過這個日志,從下個日志開始復制。 Java代碼   mysql>stop slave;   mysql> change master to       -> master_log_file='mysql-bin.000074',       -> master_log_pos=4;   mysql> start slave;     問題二:   錯誤代碼如下   mysql slave Error_code: 1062  1054   如果日志中出現了這樣代碼,可能是錯誤的select,或update操作,master是跳過這些操作,但是被記錄到了二進制日志中,slave會依據二進制中的語句做相同的動作,就會報錯,知道原理了要做的操作就很簡單了。   解決方法 Java代碼   stop slave;     set gloable  sql_slave_skip_counter=n;    //n為你想跳過錯誤語句的個數     start slave;     如果你不想再遇到這種錯誤,可以寫到slave配置文件中格式如下:   slave_skip_errors = 1062    slave_skip_errors = all   //跳過所有類型的錯誤碼        問題三:  錯誤代碼如下   Slave_IO_Running: Yes   Slave_SQL_Running: No   Last_SQL_Errno: 1594   Last_SQL_Error: Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.   以上異常可能由內存溢出或者硬盤空間不足導致。  解決辦法 從最近一次復制結束的位置復制即可 Java代碼   show slave status \G;      Master_Log_File: mysql_master-bin.000164   Read_Master_Log_Pos: 980240603  Relay_Log_File: slave2-relay-bin.000001  Relay_Log_Pos: 251111   Relay_Master_Log_File: mysql_master-bin.000164    Exec_Master_Log_Pos: 980240603 Java代碼   stop slave;   CHANGE MASTER TO  MASTER_LOG_FILE = 'mysql_master-bin.000164',MASTER_LOG_POS =980240603;   start slave ;     備注:            mysql replication 中slave機器上有兩個關鍵的進程,死一個都不行,一個是slave_sql_running,一個是Slave_IO_Running,一個負責自己的slave mysql進程,一個負責與主機的io通信。          如果是slave_io_running no了,可能有三種情況,一個是網絡有問題,第二個是有可能my.cnf有問題,最後一個是授權的問題,replication slave和file權限是必須的。          一旦io為no了先看err日志,看看報什麼錯,很可能是網絡,也有可能是包太大收不了,這個時候主備上改max_allowed_packet這個參數。         如果是slave_sql_running no了,那麼也有兩種可能,一種是slave機器上這個表中出現了其他的寫操作,就是程序寫了,這個是會有問題的,還有一種占絕大多數可能的是slave進程重啟,事務回滾造成的,這也是mysql的一種自我保護的措施,像關鍵時候只讀一樣。 這個時候想恢復的話,只要停掉slave,set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;(參考問題二解決方法),再開一下slave就可以了  

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