最近在mysql主從複製中用到鎖,翻了資料回憶一下。一下內容參考於:http://blog.csdn.net/arkblue/article/details/27376991 1.FLUSH TABLES WITH READ LOCK 這個命令是全局讀鎖定,執行了命令之後所有庫所有表都被鎖定只讀。一 ...
最近在mysql主從複製中用到鎖,翻了資料回憶一下。一下內容參考於:http://blog.csdn.net/arkblue/article/details/27376991
1.FLUSH TABLES WITH READ LOCK
這個命令是全局讀鎖定,執行了命令之後所有庫所有表都被鎖定只讀。一般都是用在資料庫聯機備份,這個時候資料庫的寫操作將被阻塞,讀操作順利進行。
解鎖的語句也是unlock tables。
2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
這個命令是表級別的鎖定,可以定製鎖定某一個表。例如: lock tables test read; 不影響其他表的寫操作。
解鎖語句也是unlock tables。
刷新表
flush tables with read lock,也就是將所有的臟頁都要刷新到磁碟,然後對所有的表加上了讀鎖,於是這時候直接拷貝數據文件也就是安全的。但是如果你發出命令flush tables with read lock時,還有其他的操作,而起是很耗時的操作呢?先說寫操作,這個FTWRL肯定是得等的,等寫操作完成才能執行FTWRL,這個很好理解。那麼對於 其他的讀操作呢?比如說在FLWRL發出之前有一個query:select count(*) from tb,那麼FTWRL也得等待(show processlist可以看到 waiting for table flush)。你可能會說在mysql中讀與讀不是不會排斥的嗎,為什麼需要等待呢?因為FTWRL是要flush臟頁的,只有這樣才真的能保證數據一致 性(比如說在xtrabackup備份myisam表的時候),而在select count(*) from tb執行的時候,因為所有的操作都是在記憶體中操作,所以此時還不能完全flush,因此FTWRL就得等待。或許你還會有疑問,select的頁不是臟 頁,為什麼FTWRL還要等待呢?難道mysql不能做得更完善點嗎?我覺得mysql還不是不會做的這麼簡單吧,等待的原因是因為這個表很大,無法一次 性將所有的頁都讀到記憶體中來,而query具有原子性,總不可能執行一般被堵塞吧,所以說還是得乖乖的讓它執行然,所以FTWRL就得等待了
這兩個語句在執行的時候都需要註意個特點,就是 隱式提交的語句。在退出MySQL終端的時候都會隱式的執行unlock tables。也就是如果要讓表鎖定生效就必須一直保持對話。
這點要註意