Mysql 學習(五)MySQL的全域性鎖和表鎖

2021-10-23 19:19:49 字數 1900 閱讀 4886

1.全域性鎖就是對整個資料庫例項加鎖

2.mysql 提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock (ftwrl)

3.當你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞:資料更新語句(資料的增刪改)、資料定義語句(包括建表、修改表結構等)和更新類事務的提交語句

4.全域性鎖的典型使用場景是,做全庫邏輯備份

5.通過 ftwrl 確保不會有其他執行緒對資料庫做更新,然後對整個庫做備份。注意,在備份過程中整個庫完全處於唯讀狀態

6.官方自帶的邏輯備份工具是 mysqldump,innodb支援事務,可以使用引數–single-transaction 的時候,導資料之前就會啟動乙個事務,來確保拿到一致性檢視。而由於 mvcc 的支援,這個過程中資料是可以正常更新的,single-transaction 方法只適用於所有的表使用事務引擎的庫

7.一致性讀是好,但前提是引擎要支援這個隔離級別。對於 myisam 這種不支援事務的引擎,如果備份過程中有更新,總是只能取到最新的資料,那麼就破壞了備份的一致性。這時,就需要使用 ftwrl 命令了

1.set global readonly=true,也可以讓全庫進入唯讀狀態,但還是建議用 ftwrl 方式

業務的更新不只是增刪改資料(dml),還有可能是加字段等修改表結構的操作(ddl)。不論是哪種方法,乙個庫被全域性鎖上以後,你要對裡面任何乙個表做加欄位操作,都是會被鎖住的。

1.表鎖的語法是 lock tables … read/write,與 ftwrl 類似,可以用 unlock tables 主動釋放鎖,也可以在客戶端斷開的時候自動釋放

2.lock tables 語法除了會限制別的執行緒的讀寫外,也限定了本執行緒接下來的操作物件

3.舉個例子, 如果在某個執行緒 a 中執行 lock tables t1 read, t2 write; 這個語句,則其他執行緒寫 t1、讀寫 t2 的語句都會被阻塞。同時,執行緒 a 在執行 unlock tables 之前,也只能執行讀 t1、讀寫 t2 的操作。連寫 t1 都不允許,自然也不能訪問其他表

4.表鎖是最常用的處理併發的方式。而對於 innodb 這種支援行鎖的引擎,一般不使用 lock tables 命令來控制併發,畢竟鎖住整個表的影響面還是太大

1.mdl 不需要顯式使用,在訪問乙個表的時候會被自動加上

2.mdl 的作用是,保證讀寫的正確性

3.mysql 5.5 版本中引入了 mdl,當對乙個表做增刪改查操作的時候,加 mdl 讀鎖;當要對錶做結構變更操作的時候,加 mdl 寫鎖

1.首先要解決長事務,事務不提交,就會一直佔著 mdl 鎖

2.mysql 的 information_schema 庫的 innodb_trx 表中,你可以查到當前執行中的事務

3.如果要做 ddl 變更的表剛好有長事務在執行,要考慮先暫停 ddl,或者 kill 掉這個長事務

4.如果要變更的表是乙個熱點表,雖然資料量不大,但是上面的請求很頻繁,而你不得不加個字段,你該怎麼做,這時候 kill 可能未必管用,因為新的請求馬上就來了。比較理想的機制是,在 alter table 語句裡面設定等待時間,如果在這個指定的等待時間裡面能夠拿到 mdl 寫鎖最好,拿不到也不要阻塞後面的業務語句,先放棄,之後開發人員或者 dba 再通過重試命令重複這個過程

5.mariadb 已經合併了 alisql 的這個功能,所以這兩個開源分支目前都支援 ddl nowait/wait n 這個語法

alter

table tbl_name nowait add

column..

.alter

table tbl_name wait n add

column..

.//n 代表時間

MySQL入門學習(五)

多表操作 前面我們熟悉了資料庫和資料庫表的基本操作,現在我們再來看看如何操作多個表。在乙個資料庫中,可能存在多個表,這些表都是相互關聯的。我們繼續使用前面的例子。前面建立的表中包含了員工的一些基本資訊,如姓名 性別 出生日期 出生地。我們再建立乙個表,該錶用於描述員工所發表的文章,內容包括作者姓名 ...

MySQL入門學習 五

mysql入門學習 五 多表操作 abccs 多表操作 前面我們熟悉了資料庫和資料庫表的基本操作,現在我們再來看看如何操作多個表。在乙個資料庫中,可能存在多個表,這些表都是相互關聯的。我們繼續使用前面的例子。前面建立的表中包含了員工的一些基本資訊,如姓名 性別 出生日期 出生地。我們再建立乙個表,該...

mysql 全表掃瞄 mysql的全表掃瞄

在mysql查詢中,如果表沒有索引的話,當查詢執行時,需要從第一行資料到最後一行資料進行全表掃瞄。索引的目的就是輔助查詢能快速定位到目標資料,然後獲取查詢結果。那麼表是否有了索引就一定能加以應用,而不會進行全表掃面了呢?現實肯定不是這樣的 1 全表掃瞄的場景 使用explain分析sql時,當列出執...