目錄
1全局鎖—一致性數據備份
1.1全局鎖介紹
1.2語法
1.3 一致性備份案例
1.4 全局鎖特點
2表級鎖
2.1表鎖
2.1.1共享讀鎖
2.1.2獨占寫鎖
2.2元數據鎖
2.3元數據鎖
MySQL中的鎖,按照鎖的粒度分,分為以下三類:
(1)全局鎖:鎖定數據庫中的所有表。
(2)表級鎖:每次操作鎖住整張表。
(3)行級鎖:每次操作鎖住對應的行數據。
1全局鎖—一致性數據備份
1.1全局鎖介紹
全局鎖就是對整個數據庫實例加鎖,加鎖后整個實例就處于只讀狀態,后續的DML的寫語句,DDL語句,已經更新操作的事務提交語句都將被阻塞。
其典型的使用場景是做全庫的邏輯備份,對所有的表進行鎖定,從而獲取一致性視圖,保證數據的完整性。
對數據庫進行進行邏輯備份之前,先對整個數據庫加上全局鎖,一旦加了全局鎖之后,其他的DDL、 DML全部都處于阻塞狀態,但是可以執行DQL語句,也就是處于只讀狀態,而數據備份就是查詢操作。 那么數據在進行邏輯備份的過程中,數據庫中的數據就是不會發生變化的,這樣就保證了數據的一致性和完整性。
1.2語法
1.3 一致性備份案例
(這里試試在window上遠程訪問Linux系統中的數據庫)
(1)先查到Linux系統中的IP地址
學習:
ip addr命令一共輸出了4項:
1)ens33是物理網卡驅動程序創建的,
2)lo是內核啟動時自己創建的環回網絡接口
3)virbr0和virbr0-nic則是我們自己創建的veth peer虛擬網絡接口。
我們可以將每個網絡接口都視作一條管道,管道的一端連接到本機內核路由子系統,而另一端根據類型各有不同。物理網卡對應的網絡接口另一端通向設備驅動程序; veth peer類型的接口另一端通向對方;tun類型設備的另一端通向用戶應用程序。
另外,從上面的輸出內容中還可以注意到的是:網絡接口上并不是一定都有IP地址(本文提到的IP地址專指IPv4地址),比如virbr0和virbr0-nic后面都沒有IP地址。IP地址還是屬于主機的,而不是某個網絡接口。
(2)Windows本地遠程連接代碼:mysql -h192.168.145.128 -uroot -p
開3個,模擬三個客戶端:
(3)給一個客戶端加上全局鎖,相當于數據庫實例192.168.145.128已經被鎖住了,
加上全局鎖:flush tables with read lock;
加上之后,所有客戶端都只能讀了,不能進行修改了。堵塞狀態可以輸入Ctrl+C退出當前。
(4)備份數據
mysqldump -h192.168.145.128 -uroot -p1234 itheima > D:/itheima.sql
注意是在Windows下的命令(exit退出到Windows命令行執行),而不是在mysql中;
要加入遠程連接參數-h192.168.145.128,要訪問的是遠程的,而不是Windows上的;
最后沒有;分號!!!
D盤中成功有備份文件,里面創建表插入數據的SQL語句都有。
(5)釋放鎖并進行修改操作。
1.4 全局鎖特點
數據庫中加全局鎖,是一個比較重的操作,存在以下問題:
(1)如果在主庫上備份,那么在備份期間都不能執行更新,業務基本上就得停擺。
(2)如果在從庫上備份,那么在備份期間從庫不能執行主庫同步過來的二進制日志(binlog),會導致主從延遲。
此外:在InnoDB引擎中,我們可以在備份時加上參數 --single-transaction 參數來完成不加鎖的一致 性數據備份。
2表級鎖
2.1表鎖
對于表鎖,分為兩類:
表共享讀鎖(read lock)
表獨占寫鎖(write lock)
語法:
加鎖:lock tables 表名... read/write。
釋放鎖:unlock tables / 客戶端斷開連接 。
2.1.1共享讀鎖
測試:
2.1.2獨占寫鎖
測試:
結論:
讀鎖不會阻塞其他客戶端的讀,但是會阻塞寫。
寫鎖既會阻塞其他客戶端的讀,又會阻塞 其他客戶端的寫。
2.2元數據鎖
meta data lock , 元數據鎖,簡寫MDL。MDL加鎖過程是系統自動控制,無需顯式使用,在訪問一張表的時候會自動加上。MDL鎖主要作用是維護表元數據的數據一致性,在表上有活動事務的時候,不可以對元數據進行寫入操作。為了避免DML與DDL沖突,保證讀寫的正確性。
這里的元數據,大家可以簡單理解為就是一張表的表結構。 也就是說,某一張表涉及到未提交的事務時,是不能修改這張表的表結構的。在MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共享);當對表結構進行變更操作的時候,加MDL寫鎖(排他)。
常見的SQL操作時,所添加的元數據鎖
演示:新建兩個shell遠程連接窗口,Ctrl+L清除命令。
(1)當執行SELECT、INSERT、UPDATE、DELETE等語句時,添加的是元數據共享鎖(SHARED_READ / SHARED_WRITE),之間是兼容的。
(2)當執行alter語句時,添加的是元數據共享鎖(EXCLUSIVE),會阻塞元數據排他鎖,之間是互斥的。
只有當一個事務提交完之后,alter語句才能繼續。
查看元數據鎖的加鎖情況:
select object_type, object_schema, object_name, lock_type, lock_duration from performance_schema.metadata_locks ;
2.3元數據鎖
。。。。要開組會了