深圳做網站的公司排名黃岡網站推廣廠家
鎖
全局鎖
全局鎖就是對整個數據庫實例加鎖,加鎖后整個實例就處于只讀狀態(tài),后續(xù)的DML的寫語句,DDL語 句,已經更新操作的事務提交語句都將被阻塞。
其典型的使用場景是做全庫的邏輯備份,對所有的表進行鎖定,從而獲取一致性視圖,保證數據的完整 性。
-
先來分析一下不加全局鎖,可能存在的問題。
假設在數據庫中存在這樣三張表: tb_stock 庫存表,tb_order 訂單表,tb_orderlog 訂單日 志表。
?
?
-
在進行數據備份時,先備份了tb_stock庫存表。
-
然后接下來,在業(yè)務系統(tǒng)中,執(zhí)行了下單操作,扣減庫存,生成訂單(更新tb_stock表,插入 tb_order表)。
-
然后再執(zhí)行備份 tb_order表的邏輯。
-
業(yè)務中執(zhí)行插入訂單日志操作。
-
最后,又備份了tb_orderlog表。
此時備份出來的數據,是存在問題的。因為備份出來的數據,tb_stock表與tb_order表的數據不一 致(有最新操作的訂單信息,但是庫存數沒減)。
-
再來分析一下加了全局鎖后的情況
?
?
對數據庫進行進行邏輯備份之前,先對整個數據庫加上全局鎖,一旦加了全局鎖之后,其他的DDL、 DML全部都處于阻塞狀態(tài),但是可以執(zhí)行DQL語句,也就是處于只讀狀態(tài),而數據備份就是查詢操作。 那么數據在進行邏輯備份的過程中,數據庫中的數據就是不會發(fā)生變化的,這樣就保證了數據的一致性 和完整性。
語法:
加全局鎖:
flush tables with read lock ;數據備份:
mysqldump -uroot –p1234 itcast > itcast.sql釋放鎖:
unlock tables ;
注意:
如果出現報錯mysqldump: Got error: 1045: Access denied for user 'root'@'server' (using password: YES) when trying to connect
這個錯誤是由于mysqldump命令在嘗試連接到MySQL數據庫時,使用的用戶名和密碼不正確導致的。解決方案如下:
-
確保你輸入的用戶名和密碼是正確的,特別是密碼是否正確??梢試L試重新輸入密碼,確保沒有輸入錯誤。
-
確保你有足夠的權限來執(zhí)行mysqldump命令。如果你是使用root用戶執(zhí)行該命令,可以嘗試使用sudo命令來提升權限。
-
如果你使用的是遠程連接MySQL數據庫,確保了遠程連接權限??梢詸z查MySQL服務器的配置文件,確認是否允許遠程連接。
-
如果你使用的是localhost連接,可以嘗試使用127.0.0.1代替localhost來連接MySQL數據庫。有時候這個問題是由于DNS解析問題導致的。
-
如果以上方法都沒有解決問題,可以嘗試重置MySQL的root密碼。具體方法可以參考MySQL官方文檔或者相關教程。
?
?
特點
數據庫中加全局鎖,是一個比較重的操作,存在以下問題:
-
如果在主庫上備份,那么在備份期間都不能執(zhí)行更新,業(yè)務基本上就得停擺。
-
如果在從庫上備份,那么在備份期間從庫不能執(zhí)行主庫同步過來的二進制日志(binlog),會導 致主從延遲。
在InnoDB引擎中,我們可以在備份時加上參數 --single-transaction 參數來完成不加鎖的一致 性數據備份。
?
?