Mysql
如何在 Mysql 5.6 中使事務原子化
我們如何使以下事務原子化?
conn - 與舊主節點的連接,現在正在重置為副本。
Python程式碼
conn.execute('unlock tables') conn.cursor().execute('stop slave') conn.cursor().execute('reset master')
conn.autocommit = True
在conn
聲明期間設置在執行這些命令時。一旦我
unlock tables
在舊主數據庫上執行,由於連接陳舊,可能會有一些事務寫入舊主數據庫。當我們執行時,它們正在被清除reset master
。這些是審計交易,意義不大。但是,在將主節點降級為從節點之前,我們需要確保絕對沒有寫入任何事務,即使存在陳舊連接或 DNS 記憶體解析為舊主節點也是如此。有沒有辦法以原子方式執行這些命令?例如
conn.cursor().execute("unlock tables; stop slave; reset master", multi=True)
這會確保在我們打開數據庫以執行停止從屬和重置主控的命令時沒有寫入任何事務嗎?
要完全鎖定數據庫,我們需要執行“Flush tables with read lock”(FTWRL)。但是,如果我們有 FTWRL,我們就不能執行像 stop slave 這樣的寫命令。
通過檢查 bin 日誌和事務,我知道 multi=True 會在不同的 GTID 下執行事務。
要在單個事務中執行,我們需要使用 begin_transaction
例子
conn.start_transaction() sql1 = "update ***" sql2 = "insert ***" cursor.execute(sql1) cursor.execute(sql2) db.commit()
DDL 不能在事務中;他們有效地終止了任何未結交易。8.0 修復了其中的一些問題。
我從來沒有發現需要
RESET SLAVE
;你這樣做的目的是什麼?在切換 Primary 或執行某些其他操作時,請考慮
readonly
在可寫 Primary 上進行設置。