程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> FLUSH TABLES WITH READ LOCK,flushtables

FLUSH TABLES WITH READ LOCK,flushtables

編輯:MySQL綜合教程

FLUSH TABLES WITH READ LOCK,flushtables


最近在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。也就是如果要讓表鎖定生效就必須一直保持對話。

這點要注意

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved