天天看點

MySQL5.7 GTID 運維實戰

start slave 文法

如何從multi-threaded slave 轉化成 single-threaded mode

gtid_mode = (on|on_permissive), bin_log = off

gtid_mode = (on|on_permissive), bin_log = on

<a href="http://dev.mysql.com/doc/refman/5.7/en/replication-options-gtids.html#sysvar_gtid_next">http://dev.mysql.com/doc/refman/5.7/en/replication-options-gtids.html#sysvar_gtid_next</a>

三種取值

qa: gtid 0923e916-3c36-11e6-82a5-ecf4bbf1f518:1-50 對應的事務順序,從小到大,一定是順序執行的嗎?

答案:錯,一般情況下事務是從小到大,順序執行的。 但是如果再mts場景,或者是人工設定gtid_next的情況下,就可能不是順序執行了

gtid模式下,需要relay-log嗎?purge_relay_log設定為on可以嗎?

實體備份:xtrabackup,其他等 邏輯備份:mysqldump,mydumper,mysqlpump等

實體備份

邏輯備份

slave relay log 不完整怎麼辦?(relay-log-recover=0) relay-log-recover=1 不考慮,因為它會舍棄掉relay log

為何要讨論這個

模拟relay log不完整的情況

從上面可以知道,relay log的記錄非常重要,那麼relay log 不完整,會怎麼樣呢?

總結: relay log不完整,mysql起來後,會重新擷取不完整的這個events,sql_thread在回放的時候,如果發現events不完整,會跳過,不會影響到同步。

mts_gaps

如果mts遇到gap transction怎麼辦?

migration to gtid replication non transactionally safe statement will raise errors now mysql performance in gtid mysql_upgrade script errant transactions filtration on the slave injecting empty transactions
online更新丢資料? online更新會報錯嗎?

故障案例一

last_io_error: got fatal error 1236 from master when reading data from binary log: 'cannot replicate anonymous transaction when @@global.gtid_mode = on ...'

故障案例二

last_io_error: the replication receiver thread cannot start because the master has gtid_mode = on and this server has gtid_mode = off.

mysqlbinlog 參數:

gtid_set 用引号擴起來

name

description

gtid_subset(subset,set)

returns true (1) if all gtids in subset are also in set

gtid_subtract(set,subset)

returns only those gtids from set that are not in subset

wait_for_executed_gtid_set(gtid_set[, timeout])

wait until the given gtids have executed on slave.

wait_until_sql_thread_after_gtids(gtid_set, timeout)

wait until the given gtids have executed on slave

subset 是否是 set 的子集,如果是傳回1,不是傳回0
哪些gtids僅僅是set獨有的,subset沒有的

以上兩個函數可以用來幹嘛呢?

通過gtid_subset,master可以知道slave是否是自己的子集,可以很友善的檢查資料一緻性

通過gtid_subtract,假設slave是master的子集,那麼可以很輕松的将slave沒有,master有的gtid發送給slave,以便達到最終一緻性

timeout 預設為0,表示無限等待slave gtid_set全部執行完畢 如果全部執行完畢,會傳回執行的gtid的數量。如果沒有執行完,會等待timeout秒。如果slave沒有起來,或者沒有開啟gtid,會傳回null
含義跟wait_until_sql_thread_after_gtids一樣,唯一一個差別就是:如果slave 的replication 線程沒有起來,不會傳回null。

同僚更新nontransactional和transactional的表,會導緻gtid問題

create table ... select statements 文法對gtid來說是不安全的

create temporary table and drop temporary table 對gtid也是不安全的

enforce-gtid-consistency 必須設定on,可以避免以上2,3 不安全的statement

sql_slave_skip_counter 不允許執行,可以通過 injecting empty transactions 來解決

gtid 和 mysqldump的問題,mysqldump 中 sql_log_bin 預設是關閉的.會導緻導入master後,不會寫入gtid到binlog. ( 可以通過 --set-gtid-purged=off 避免 )

gtid and mysql_upgrade, 因為部分系統表是myisam引擎的,會有問題。 (可以通過--write-binlog=off來避免 )

官方資料:

第三方資料

繼續閱讀