常見原因以及解決方案:
1、表無主鍵或者二級索引:
原因: 若binlog 為row格式且表無主鍵或者二級索引,當對大表進行dml操作(update、insert、delete),從庫在對binlog日志應用時會根據主鍵或者二級索引檢索需要更改的行,如對應的表無主鍵索引或者二級索引,就會產生大量的全表掃描降低了日志應用速度,從而產生數據延遲
解決方案:為所有表創建主鍵,若表不能創建主鍵,建議在選擇性高的列上創建二級索引
2、大事務:
原因:當主實例執行大數據量的 DML 操作,大量的 binlog 日志傳送到從庫時,從庫需要花費與主實例相同的時間來完成相應事務,進而導致從庫出現數據延遲。
解決方案:建議將大事務拆分為小事務,通過 where 條件限制每次要處理的數據量,有助於從庫迅速完成事務的執行,從而避免出現從庫數據的延遲。
3、ddl操作:
原因:與大事務原理類似,若 DDL 操作在主實例的執行時間很長,在從庫也會花費相同甚至更長時間來執行該操作,從而阻塞了 DDL 操作。
解決方案:建議在業務低峰期執行 DDL 操作。若因災備實例、只讀實例的查詢業務而阻塞了 DDL 操作,建議直接 KILL 掉引起阻塞的會話來恢復主從數據的同步。
4、實例主機配置太低:
原因:只讀實例、災備實例的規格小於主實例且負載較高,會導致只讀實例、災備實例的數據延遲。
解決方案:建議只讀實例、災備實例規格大於等於主實例,如果只讀實例、災備實例承載了大量的分析類業務導致實例負載過高,需將其實例規格升級至合適的配置或 者對其性能低效的 SQL 進行優化。
5、waiting for table metadata lock:
原因:長事物運行,阻塞 DDL,繼而阻塞所有同表的后續操作;未提交事物,阻塞 DDL,繼而阻塞所有同表的后續操作。
解決方案:建議對實際業務和實例進行診斷,排查慢查詢等指標,來定位耗時的長事務
6、表統計信息缺失或者失效:
原因:sql執行計划的產生依賴於統計信息,若表上統計信息缺失或者無效,優化器有可能產生低效率的執行計划,從庫在解析binlog執行sql語句時由於效率不佳的執 行計划導致執行速度變慢,從而產生數據延遲。
解決方案:重新收集表的統計信息