Mysql

在 MySQL 中,必須或推薦在 REPAIR TABLE 之前使用 LOCK TABLE

  • January 6, 2022

我需要知道是否有必要或建議在 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 表。

引用自:https://dba.stackexchange.com/questions/305721