用mysqldump主要資料庫到檔案中,資料庫中表的資料比較大,後在備庫上用source命令進行恢複,
mysqldump -u root -p dlsp >/DATA/mysql/dump/dump_dlsp.sql
source </DATA/mysql/dump/dump_dlsp.sql
在恢複資料過程中,對要恢複的表進行select操作,該操作就hang了。
用show processlist\G查看了一下;
*************************** 4. row *************************** Id: 11 User: root Host: localhost db: dlspCommand: Query Time: 334 State: Waiting for table metadata lock Info: select count(1) from LSMP_LOTTERY
select操作在等待表的meta lock
那麼是什麼導致table meta lock了,原來dump出的檔案中會先把要操作的表lock住,直到insert表中的資料都操作完成才釋放鎖。
dump_dlsp.sql中在insert資料之前,有這樣一個操作,LOCK TABLES `LSMP_LOTTERY` WRITE,表的寫鎖,在釋放之前,該表一直處於開啟狀態,對該表的中繼資料鎖一直會佔用。
mysql> show open tables\G;
*************************** 21. row ***************************
Database: dlsp
Table: LSMP_LOTTERY
In_use: 1
Name_locked: 0
這樣對錶的任何操作(包括DML),都會被鎖住。
附mysql的鎖的分類:
- Meta-data中繼資料鎖:在table cache緩衝裡實現的,為DDL(Data Definition Language)提供隔離操作。一種特別的meta-data中繼資料類型,叫Name Lock。(SQL層)
- 表級table-level資料鎖(SQL層) lock table xxxx write(read)
- 儲存引擎特有機制 — row locks行鎖,page locks頁鎖,table locks表級,版本控制(在引擎中實現)
- 全域讀鎖 — FLUSH TABLES WITH READ LOCK(SQL層)
mysql鎖的執行流程