【Mysql】Slave 延遲很大並且不動了
問題描述
收到SLAVE延遲時間一直很大的報警,於是檢查一下SLAVE狀態(無關狀態我給隱去了):
- Slave_IO_State: Waiting for master to send event Master_Log_File: mysql-bin.000605 ---當前master的binlog
- Read_Master_Log_Pos: 305864 ---master binlog位置
- Relay_Log_File: mysql-relay-bin.003224 Relay_Log_Pos: 295105 Relay_Master_Log_File: mysql-bin.000604 ----當前salve同步到的master的binlog日誌
- Slave_IO_Running: Yes Slave_SQL_Running: Yes Last_Errno: 0 Last_Error: Exec_Master_Log_Pos: 294959 -----當前slave執行到的master的binlog 的pos
-
Relay_Log_Space: 4139172581
Seconds_Behind_Master: 10905 ---延遲 一般是Read_Master_Log_Pos-Exec_Master_Log_Pos
可以看到,延遲確實很大,而且從多次show slave status的結果來看,發現binlog的position一直不動。
點選(此處)摺疊或開啟
-
Relay_Master_Log_File: mysql-bin.000604
-
Exec_Master_Log_Pos: 294959
- Relay_Log_Space: 4139172581
檢查processlist 也沒發現異常sql語句
在master上檢視相應binlog,確認都在幹神馬事:
- [yejr@imysql.com]# mysqlbinlog -vvv --base64-output=decode-rows -j 294959 mysql-bin.000604 | more
- --base64-output=decode-rows --去除一些不必要的二進位制日誌展示 /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; **# at 294959** #160204 6:16:30 server id 1 end_log_pos 295029 **Query thread_id=461151** **exec_time=2144** error_code=0 SET TIMESTAMP=1454537790/*!*/; SET @@session.pseudo_thread_id=461151/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C latin1 *//*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 295029 # at 295085 # at 296040 # at 297047 # at 298056 # at 299068 # at 300104
- 上面這段內容的幾個關鍵資訊:
-
# at 294959 — binlog起點
thread_id=461151 — master上執行的執行緒ID
exec_time=2144 — 該事務執行總耗時
再往下看都是一堆的binlog position資訊,透過這種方式可讀性不強,我們換一種姿勢看看
-
[yejr@imysql.com (test)]> show binlog events in 'mysql-bin.000604' from 294959 limit 10; +------------------+--------+-------------+-----------+-------------+----------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+--------+-------------+-----------+-------------+----------------------------+
| mysql-bin.000604 | 294959 | Query | 1 | 295029 | BEGIN |
| mysql-bin.000604 | 295029 | Table_map | 1 | 295085 | table_id: 84 (bacula.File) |
| mysql-bin.000604 | 295085 | Delete_rows | 1 | 296040 | table_id: 84 |
| mysql-bin.000604 | 296040 | Delete_rows | 1 | 297047 | table_id: 84 |
| mysql-bin.000604 | 297047 | Delete_rows | 1 | 298056 | table_id: 84 |
| mysql-bin.000604 | 298056 | Delete_rows | 1 | 299068 | table_id: 84 |
| mysql-bin.000604 | 299068 | Delete_rows | 1 | 300104 | table_id: 84 |
| mysql-bin.000604 | 300104 | Delete_rows | 1 | 301116 | table_id: 84 |
| mysql-bin.000604 | 301116 | Delete_rows | 1 | 302147 | table_id: 84 |
| mysql-bin.000604 | 302147 | Delete_rows | 1 | 303138 | table_id: 84 |
可以看到,這個事務不幹別的,一直在刪除資料。
這是一個Bacula備份系統,會每天自動刪除一個月前的過期資料。
事實上,這個事務確實非常大,從binlog的294959開始,一直到這個binlog結束4139169218,一直都是在幹這事,總共大概有3.85G的binlog要等著apply。
-
-rw-rw---- 1 mysql mysql 1.1G Feb 3 03:07 mysql-bin.000597
-
-rw-rw---- 1 mysql mysql 1.1G Feb 3 03:19 mysql-bin.000598
-
-rw-rw---- 1 mysql mysql 2.1G Feb 3 03:33 mysql-bin.000599
-
-rw-rw---- 1 mysql mysql 1.4G Feb 3 03:45 mysql-bin.000600
-
-rw-rw---- 1 mysql mysql 1.8G Feb 3 04:15 mysql-bin.000601
-
-rw-rw---- 1 mysql mysql 1.3G Feb 3 04:53 mysql-bin.000602
-
-rw-rw---- 1 mysql mysql 4.5G Feb 4 06:16 mysql-bin.000603
-
-rw-rw---- 1 mysql mysql 3.9G Feb 4 06:52 mysql-bin.000604
- -rw-rw---- 1 mysql mysql 1.2K Feb 4 06:52 mysql-bin.000605
怎麼解決
由於這是Bacula備份系統內建生成的大事務,除非去修改它的原始碼,否則沒有太好的辦法。
對於我們一般的應用而言,最好是攢夠一定操作後,就先提交一下事務,比如刪除幾千條記錄後提交一次,而不是像本例這樣,一個刪除事務消耗了將近3.9G的binlog日質量,這種就非常可怕了。
除了會導致SLAVE看起來一直不動以外,還可能會導致某些資料行(data rows)被長時間鎖定不釋放,而導致大量行鎖等待發生。
參考文件
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2055014/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql同步問題之Slave延遲很大最佳化方法MySql
- 從Mysql slave system lock延遲說開去MySql
- MySQL中slave監控的延遲情況分析MySql
- 【MySQL】六、常見slave 延遲原因以及解決方法MySql
- Mysql 建立心跳錶來監控Replication的Slave是否延遲MySql
- MySQL:slave 延遲一列 外來鍵檢查和自增加鎖MySql
- MySQL 延遲從庫介紹MySql
- mysql主從延遲複製MySql
- 喜訊!延遲退休來了🙃
- 級聯slave的延遲計算和query event exe time獲取方法
- 教你如何解決MySQL資料延遲跳動的問題MySql
- MySQL 中讀寫分離資料延遲MySql
- MySQL主從複製延遲解決方案MySql
- MySQL之 從複製延遲問題排查MySql
- Golang研學:defer!如何掌握並用好(延遲執行)Golang
- MYSQL Slave開機啟動指令碼MySql指令碼
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- 下面是一個基於PowerShell的示例指令碼,定期檢測網路延遲並根據延遲的變化手動更新路由表。此示例透過使用 Test-Connection 命令檢測網路延遲,並根據延遲值來決定是否更新路由表。指令碼路由
- UE4 ProjectileMovement Component 延遲啟動Project
- 打造低延遲互動音訊: Oboe音訊
- mysql的主從複製延遲問題--看這一篇就夠了MySql
- 延遲繫結
- Java物件重用如何降低延遲並提高效能 - MinborgJava物件
- mysql同步(複製)延遲的原因及解決方案MySql
- MySQL主從複製延遲原因及處理思路MySql
- 移動端點選300ms延遲
- 啟動優化之動態庫延遲載入優化
- Tomcat啟動時Initializing Spring FrameworkServlet 'springmvc'卡住,並且不報錯TomcatFrameworkServletSpringMVC
- 疫情延遲 題解
- redis 延遲佇列Redis佇列
- Mybatis延遲查詢MyBatis
- WebGL之延遲著色Web
- Laravel 延遲佇列Laravel佇列
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 在Linux中,mysql 如何減少主從複製延遲?LinuxMySql
- MySQL 8 複製(三)——延遲複製與部分複製MySql
- Mysql 非同步複製延遲的原因及解決方案MySql非同步
- 延遲退休來了,普通人該怎樣應對?