如果你同時執行表的檢查/修復程式時,你或許不想讓mysql伺服器和實用程式同時訪問乙個表。如果兩個程式都向表中寫資料顯然會造成很大的麻煩,甚至會有意外情況發生。如果表正由乙個程式寫入,同時進行讀取的另乙個程式也會產生混亂的結果。本文主要講述如何對mysql資料庫表進行鎖定。
鎖定表的方法
防止客戶機的請求互相干擾或者伺服器與維護程式相互干擾的方法主要有多種。如果你關閉資料庫,就可以保證伺服器和myisamchk和 isamchk之間沒有互動作用。但是停止伺服器的執行並不是乙個好注意,因為這樣做會使得沒有故障的資料庫和表也不可用。本節主要討論的過程,是避免伺服器和myisamchk或isamchk之間的互動作用。實現這種功能的方法是對錶進行鎖定。
伺服器由兩種表的鎖定方法:
1.內部鎖定
內部鎖定可以避免客戶機的請求相互干擾——例如,避免客戶機的select查詢被另乙個客戶機的update查詢所干擾。也可以利用內部鎖定機制防止伺服器在利用myisamchk或isamchk檢查或修復表時對錶的訪問。
語法:鎖定表:lock tables tbl_name ,[ tbl_name ,…]
解鎖表:unlock tables
lock tables為當前執行緒鎖定表。unlock tables釋放被當前執行緒持有的任何鎖。當執行緒發出另外乙個lock tables時,或當伺服器的連線被關閉時,當前執行緒鎖定的所有表自動被解鎖。
如果乙個執行緒獲得在乙個表上的乙個read鎖,該執行緒(和所有其他執行緒)只能從表中讀。如果乙個執行緒獲得乙個表上的乙個write鎖,那麼只有持鎖的執行緒read或write表,其他執行緒被阻止。
每個執行緒等待(沒有超時)直到它獲得它請求的所有鎖。
write鎖通常比read鎖有更高的優先順序,以確保更改盡快被處理。這意味著,如果乙個執行緒獲得read鎖,並且然後另外乙個執行緒請求乙個write鎖, 隨後的read鎖請求將等待直到write執行緒得到了鎖並且釋放了它。
顯然對於檢查,你只需要獲得讀鎖。再者鍾情跨下,只能讀取表,但不能修改它,因此他也允許其它客戶機讀取表。對於修復,你必須獲得些所以防止任何客戶機在你對錶進行操作時修改它。
2.外部鎖定
伺服器還可以使用外部鎖定(檔案級鎖)來防止其它程式在伺服器使用表時修改檔案。通常,在表的檢查操作中伺服器將外部鎖定與myisamchk或 isamchk作合使用。但是,外部鎖定在某些系統中是禁用的,因為他不能可靠的進行工作。對執行myisamchk或isamchk所選擇的過程取決於伺服器是否能使用外部鎖定。如果不使用,則必修使用內部鎖定協議。
如果伺服器用--skip-locking選項執行,則外部鎖定禁用。該選項在某些系統中是預設的,如linux。可以通過執行mysqladmin variables命令確定伺服器是否能夠使用外部鎖定。檢查skip_locking變數的值並按以下方法進行:
◆ 如果skip_locking為off,則外部鎖定有效您可以繼續並執行人和乙個實用程式來檢查表。伺服器和實用程式將合作對錶進行訪問。但是,執行任何乙個實用程式之前,應該使用mysqladmin flush-tables。為了修復表,應該使用表的修復鎖定協議。
◆ 如果skip_locaking為on,則禁用外部鎖定,所以在myisamchk或isamchk檢查修復表示伺服器並不知道,最好關閉伺服器。如果堅持是伺服器保持開啟狀態,月確保在您使用此表示沒有客戶機來訪問它。必須使用卡黨的鎖定協議告訴伺服器是該錶不被其他客戶機訪問。
檢查表的鎖定協議
本節只介紹如果使用表的內部鎖定。對於檢查表的鎖定協議,此過程只針對表的檢查,不針對表的修復。
1.呼叫mysql發布下列語句:
$mysql –u root –p db_namemysql>lock table tbl_name read;mysql>flush tables;
該鎖防止其它客戶機在檢查時寫入該錶和修改該錶。flush語句導致伺服器關閉表的檔案,它將重新整理仍在告訴快取中的任何為寫入的改變。
2.執行檢查過程
$myisamchk tbl_name$ isamchk tbl_name
3.釋放表鎖
mysql>unlock tables;
如果myisamchk或isamchk指出發現該錶的問題,將需要執行表的修復。
修復表的鎖定協議
這裡只介紹如果使用表的內部鎖定。修復表的鎖定過程類似於檢查表的鎖定過程,但有兩個區別。第一,你必須得到寫鎖而非讀鎖。由於你需要修改表,因此根本不允許客戶機對其進行訪問。第二,必須在執行修復之後發布flush table語句,因為myisamchk和isamchk建立的新的索引檔案,除非再次重新整理改表的快取記憶體,否則伺服器不會注意到這個改變。本例同樣適合優化表的過程。
1.呼叫mysql發布下列語句:
$mysql –u root –p db_namemysql>lock table tbl_name write;mysql>flush tables;
2.做資料表的拷貝,然後執行myisamchk和isamchk:
$cp tbl_name.* /some/other/dir$myisamchk --recover tbl_name$ isamchk --recover tbl_name
--recover選項只是針對安裝而設定的。這些特殊選項的選擇將取決與你執行修復的型別。
3.再次重新整理快取記憶體,並釋放表鎖:
mysql>flush tables;mysql>unlock tables;
資料引用:
如何用JMeter對MySQL資料庫進行壓測?
在jmeter中建立乙個jdbc request 測試計畫主要分兩步。1 設定jdbc連線池 在jdbc connection configuration 2 新增jdbc request 其他步驟就是設定引數化 斷言 監聽結果。第一步 新增 jdbc connection configuratio...
Mysql 資料庫表鎖 行鎖
偏向myisam,開銷小,加鎖快,無死鎖,鎖粒度大,發生鎖衝突的概率較高,併發度較低。測試表,用於表加鎖後的讀寫可能性驗證 create table if not exists table lock id int 10 primary key not null auto increment comm...
Mysql資料庫鎖 表級鎖分析
按操作的型別分 讀鎖 共享鎖 針對同乙份資料,多個讀操作可以同時進行而不會相互影響。寫鎖 排它鎖 當前寫操作沒有完成,會阻斷其它的寫鎖和讀鎖。按對資料操作的粒度分 表鎖 偏讀 整個表被鎖,偏向於myisam引擎,開銷小,加鎖快,無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行鎖 表級鎖分析 ...