Mysql
在 MySQL 中,必須或推薦在 REPAIR TABLE 之前使用 LOCK TABLE
我需要知道是否有必要或建議在 REPAIR TABLE 之前嘗試 LOCK TABLE,因為有時我們需要在使用者處理應用程序時對錶進行 REPAIR。
正如我所測試的那樣,這是可能的(如果表沒有嚴重損壞,例如缺少 .MYI),但是,MySQL 的官方文件沒有說明這種情況(至少在https://dev.mysql. com/doc/refman/5.7/en/repair-table.html文件)。
展示:
螢幕一:
mysql> create table mytable (id int primary key) engine=myisam; mysql> insert into mytable values (1); mysql> select sleep(60) from mytable; (waits)
螢幕 2:
mysql> set lock_wait_timeout=1; Query OK, 0 rows affected (0.00 sec) mysql> repair table mytable; +---------------+--------+----------+--------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------+--------+----------+--------------------------------------------------------+ | test2.mytable | repair | Error | Lock wait timeout exceeded; try restarting transaction | | test2.mytable | repair | status | Operation failed | +---------------+--------+----------+--------------------------------------------------------+
這裡發生的事情是任何SQL 查詢都在引用的表上獲取共享元數據鎖。因此,在第一個視窗中由 SELECT 創建的表上隱含了一個共享表鎖。其他並發會話也可以獲取共享元數據鎖而不會相互阻塞。
與其他 DDL 語句一樣,REPAIR TABLE 需要獨占元數據鎖。另一個會話持有的任何元數據鎖都會阻止它。換句話說,DDL 語句將被阻塞,直到任何其他會話對錶沒有元數據鎖定。
所以不,您不需要明確使用 LOCK TABLES 。REPAIR TABLE 會自動等待自己的表鎖。
我同意 Rick James 的回答,即 MyISAM 表已過時。如果可以避免,我不會使用 MyISAM 表。