一、簡介
全局鎖;聽名字就知道,是對整個mysql庫加鎖。
Flush tables with read lock (FTWRL)
當你需要讓整個庫處于隻讀狀态的時候,可以使用這個指令,之後其他線程的以下語句會被阻塞:資料更新語句(資料的增删改)、資料定義語句(包括建表、修改表結構等)和更新類事務的送出語句。
那全局鎖有什麼用呢?
答案是:可以備份的時候加上全局鎖,那我們備份的時候是不是不希望新資料插進來或者表作出改動。當然我們可以通過業務暫停也能達到目的。但暫停業務似乎比較麻煩呀!那就整這個指令。
說到備份,如果要求的時候不能停擺業務。這個指令似乎不咋好用,因為加上全局鎖,這個庫就鎖了,除了能讀,其餘啥都幹不了咋辦呢?
那你有這個問題,别人也肯定有這個問題呀!官方為了解決這個問題,官方開發的的邏輯備份工具mysqldump。當 mysqldump 使用參數–single-transaction 的時候,導資料之前就會啟動一個事務,來確定拿到一緻性視圖。而由于 MVCC 的支援,這個過程中資料是可以正常更新的。
那我又想,已經有這個功能呢?你在整這個全局鎖有啥用?問題關鍵是這個mysqldump備份的時候,首先條件是庫裡所有表的引擎支援事務,好像引擎裡支援事務的沒幾個吧。這個問題也就想通了。
但是我又開始瞎想了,好像實作庫隻讀,設定set global readonly=true這個也可以呀。研究後發現,set global readonly=true這個指令在用戶端發生異常斷開後,他竟然依舊是鎖着的庫隻讀的。而是用全局鎖就不一樣了,使用全局鎖,除了可以用 unlock tables 主動釋放鎖,也可以在用戶端發生異常後斷開,全局鎖自動釋放,庫依舊能讀能寫。想想還是全局鎖要人性化點。