【20180306】MySQL關於GTID的一些隨筆

關於MySQL GTID的一些信息

  1. GTID持久化介質有倆個,一個是TABLE mysql.gtid_executed 表,另一個是binlog日誌。
  2. TABLE mysql.gtid_executed表內的gtid信息並非實時更新的,只有在binlog二進制日誌進行切割的時候纔會記錄到表mysql.gtid_executed中。
  3. binlog二進制日誌中的gtid信息是在commit以後生成的,而且這個時候還會生成last commit和seqeue number(這倆個值和MySQL的group commit以及並行複製有關係)
  4. binlog_gtid_simple_recovery 在沒有開啓這個參數的時候,MySQL重啓或者恢復都會掃描所有的binlog獲取gtid_executed信息,這樣作耗時會很長。開啓這個參數以後MySQL只會掃描第一個binlog和最後一個binlog文件。還有一個須要注意的是在中途開啓GTID的時候,也會掃描前面全部的binlog直到獲取獲得
  5. sql_log_bin 支持session級別的動態修改,關閉這個參數以後,那麼在當前session並不會產生GTID。
  6. GTID主從複製。
    • 在主庫關閉binlog以後不會產生gtid;在從庫關閉binlog,那麼gtid_executed和gtid_purged和TABLE mysql.gtid_executed是實時更新的。
    • reset master 會清楚全部的binlog日誌,也會清楚全部的gtid_executed和gtid_purged信息。在set global gtid_purged信息的時候須要注意gtid_executed必須爲空,而且設置的時候完成以後gtid_purged和gtid_exectued的值是一致的。
  7. Previous gtid Event是包含在每個binlog的開頭用於描述全部之前binlog所包含的所有Gtid的一個集合(包括已經刪除的binlog)。在5.6中若是不開啓Gtid,那麼binlog是不會包含這個Previous gtid Event的,可是在5.7中不開啓Gtid也會包含這個Previous gtid Event,實際這一點的改變其意義也是很是巨大,簡單的說他爲快速掃描binlog(binlog_gtid_simple_recovery=ture)得到正確Gtid集合提供了基礎,不然將會掃描大量的binlog,從而浪費I/O性能,這是5.6中一個很是嚴重的問題。還有一個須要注意的問題就是,在沒有開啓GTID的時候,Previous gtid Event的值顯示的empty,這個時候中途開啓GTID的話,MySQL重啓讀取binlog獲取gtid_executed信息的話仍是會從新讀取舊的binlog直到Previous gtid Event和獲取GTID event.
  8. gtid_mode 的值每一次在線修改都會照成binlog的切割,若是發生binlog刪除也可以依託 Previous gtid Event快速準確的找到gtid_purged(Gtid_state.lost_gtids)
  9. show slave status 中的數據是從內存中讀取的。relay_log_info_repository 爲TABLE的時候show slave status和table的數據的可能不一致。主要是由於非事務引擎仍是會遵照Sync_relay_log_info寫到TABLE中的頻率。
  10. mysql.gtid_executed表示5.7.5纔開始的一個優化,在沒有這個表以前gtid持久化介質就只有binlog,可是針對於複製中的slave有時候並不須要設置級聯主從,因此沒有必要開啓log_slave_update參數,沒有開啓的這個參數的話就會減小了磁盤和IO。減輕了負擔,提升了性能。

問題:

  1. 重啓或者恢復gtid_executed和gtid_purged的值是從TABLE mysql.gtid_executed中獲取獲得仍是從binlog二進制中獲取獲得的。
    • 數據庫重啓會分別去讀取binlog和mysql.gtid_executed中信息,可是主要仍是以binlog爲主。
  2. mysqldump備份沒有設置--set-gtid-purged=OFF會備份的時候set @SESSION.SQL_LOG_\BIN=0,這個時候後續的全部操做都不會記錄在binlog當中去,而且也不會生成GTID;並且還會設置SET @@GLOBAL.GTID_PURGED的值。
    • 在這裏還須要注意的一點就是進行全量的備份的時候也會備份mysql.executed表的信息。這裏須要注意的有一點:在進行備份的時候並不會對binlog進行切割,可是因爲mysql.gtid_executed記錄的GTID信息並非實時的,因此致使備份恢復的時候恢復mysql.gtid_executed表內的值比實際上gtid_executed和gtid_purged值小於或者等於,這個時候有由於恢復的時候不會生成binlog,致使TABLE mysql.gtid_executed的值和實際上gtid_executed和gtid_purged的值不相同。
    • 這個時候能重啓從庫,從庫就會報錯1236錯誤。
相關文章
相關標籤/搜索