最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql日常鎖表之flush_tables詳解

 更新時(shí)間:2024年11月13日 11:14:58   作者:code小魚(yú)  
Flushtables和Flushtableswithreadlock是MySQL中的兩個(gè)命令,用于關(guān)閉表對(duì)象和清空查詢(xún)緩存,它們會(huì)等待所有正在運(yùn)行的SQL請(qǐng)求執(zhí)行結(jié)束,如果請(qǐng)求操作的表集合為{tables},則會(huì)阻塞其他會(huì)話對(duì){tables}表上的所有操作,包括查詢(xún)和寫(xiě)操作

1. Flush tables簡(jiǎn)介

官方手冊(cè)中關(guān)于Flush tables的介紹

Closes all open tables, forces all tables in use to be closed, and flushes the query cache.

FLUSH TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement.

其解析就是關(guān)閉所有已打開(kāi)的表對(duì)象,同時(shí)將查詢(xún)緩存中的結(jié)果清空。就是說(shuō)Flush tables的一個(gè)效果就是會(huì)等待所有正在運(yùn)行的SQL請(qǐng)求結(jié)束。

因?yàn)椋Z(yǔ)句在執(zhí)行前,都會(huì)打開(kāi)相應(yīng)的表對(duì)象,如select * from t1語(yǔ)句,會(huì)找到t1表的frm文件,并打開(kāi)表內(nèi)存對(duì)象。

為了控制表對(duì)象使用的內(nèi)存空間和其他資源,MySQL會(huì)隱式(后臺(tái)表對(duì)象管理線程)或顯式(flush tables等)來(lái)關(guān)閉已打開(kāi)但并沒(méi)有使用的表對(duì)象。

然而,正在使用的表對(duì)象是不能關(guān)閉的(如SQL請(qǐng)求仍在運(yùn)行),因此,F(xiàn)lush Tables操作會(huì)被正在運(yùn)行的SQL請(qǐng)求阻塞。

2. Flush tables的影響

2.1 Flush tables

由于Flush tables會(huì)等待所有正在運(yùn)行的SQL請(qǐng)求,那么,該操作會(huì)阻塞其他會(huì)話嗎?

下面,我們通過(guò)一個(gè)例子來(lái)說(shuō)明。

  • 會(huì)話1:
Select sleep(50) from t1 limit 1;
--阻塞,執(zhí)行時(shí)間是50s
+-----------+
| sleep(50) |
+-----------+
| 0 |
+-----------+
1 row in set (50.13 sec)
  • 會(huì)話2:
Flush tables;
--阻塞,直到會(huì)話1結(jié)束
Query OK, 0 rows affected (48.27 sec)
  • 會(huì)話3:
Select c1 from t1 limit 1;
--阻塞,直到會(huì)話1和會(huì)話2結(jié)束
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (47.23 sec)
  • 會(huì)話4:
Select c1 from t2 limit 1;
--無(wú)阻塞
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

執(zhí)行4個(gè)會(huì)話的并發(fā)測(cè)試,并且4會(huì)話語(yǔ)句依次執(zhí)行。

  • 1 會(huì)話1通過(guò)sleep(50)構(gòu)造一個(gè)執(zhí)行時(shí)間為50秒的SQL請(qǐng)求,操作表是t1
  • 2 會(huì)話2執(zhí)行flush tables
  • 3 會(huì)話3同樣對(duì)t1執(zhí)行一個(gè)普通查詢(xún)
  • 4 會(huì)話4對(duì)t2執(zhí)行一個(gè)普通查詢(xún)

由測(cè)試現(xiàn)象知,會(huì)話4無(wú)阻塞,會(huì)話2和會(huì)話3等待會(huì)話1的完成,因此,

1)flush tables會(huì)等待正在運(yùn)行的所有語(yǔ)句執(zhí)行結(jié)束,即使運(yùn)行的是查詢(xún)請(qǐng)求;

2)如果flush tables等待SQL請(qǐng)求操作的表集合為{tables},這里的tables組合應(yīng)該是當(dāng)前正在有sql在運(yùn)行的,已經(jīng)打開(kāi)的表,同一個(gè)庫(kù)中,沒(méi)有sql運(yùn)行的表是不計(jì)算在內(nèi),因此 若 庫(kù)star中有3張表,tx1和tx2被打開(kāi)了,,的若有新請(qǐng)求操作{tables}中的任意一表,這些請(qǐng)求都會(huì)阻塞(即使是普通查詢(xún)),如會(huì)話3;

3)如果其他會(huì)話新請(qǐng)求操作{tables}外的其他表,不會(huì)被阻塞,如會(huì)話4。

從此可知,flush tables操作可認(rèn)為是{tables}所有表的表級(jí)排他鎖,會(huì)阻塞其他會(huì)話關(guān)于{tables}表上的所有操作。假設(shè)一個(gè)大查詢(xún)或長(zhǎng)事務(wù)過(guò)程中(如會(huì)話1)執(zhí)行flush tables操作,那么flush tables會(huì)等待長(zhǎng)事務(wù)的結(jié)束(如會(huì)話1),同時(shí)阻塞關(guān)于{tables}的新請(qǐng)求。

2.2 Flush tables with read lock

Flush tables with read lock是另一個(gè)常見(jiàn)的操作,與Flush tables的作用是一樣的,同樣會(huì)等待所有正在運(yùn)行的SQL請(qǐng)求結(jié)束,只是增加了一個(gè)全局讀鎖,即阻塞所有庫(kù)所有表的寫(xiě)操作,直到unlock tables操作完成。

通過(guò)一個(gè)例子來(lái)說(shuō)明它們的區(qū)別:

  • 會(huì)話1:
Select sleep(50) from t1 limit 1;
--阻塞,執(zhí)行時(shí)間是50s
+-----------+
| sleep(50) |
+-----------+
| 0 |
+-----------+
1 row in set (50.13 sec)
  • 會(huì)話2:
Flush tables with read lock;
--阻塞,直到會(huì)話1結(jié)束
Query OK, 0 rows affected (48.27 sec)

Unlock tables;
Query OK, 0 rows affected (0.01 sec)

會(huì)話3:

Select c1 from t1 limit 1;
--阻塞,直到會(huì)話1和會(huì)話2結(jié)束
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (47.23 sec)
  • 會(huì)話4:
Select c1 from t2 limit 1;
--無(wú)阻塞
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
  • 會(huì)話5:
Insert into t2(c1) values(10);
--阻塞,直到會(huì)話2中執(zhí)行unlock tables
Query OK, 1 row affected (50.23 sec)

與第一個(gè)例子類(lèi)似,依次執(zhí)行多個(gè)會(huì)話。不同的是會(huì)話2執(zhí)行Flush tables with read lock,同時(shí)增加會(huì)話5對(duì)t2表插入記錄。

由測(cè)試現(xiàn)象知,該操作有以下特點(diǎn):

1)與flush tables一樣,flush tables with read lock會(huì)等待正在運(yùn)行的所有語(yǔ)句執(zhí)行結(jié)束(如會(huì)話1);

2)如果flush tables with read lock等待SQL請(qǐng)求操作的表集合為{tables},若有新請(qǐng)求操作{tables}中的任意一表,這些請(qǐng)求都會(huì)阻塞

  • a) 如果是查詢(xún)請(qǐng)求,在flush tables with read lock結(jié)束后就可執(zhí)行,如會(huì)話3;
  • b) 如果是插入、更新等寫(xiě)請(qǐng)求,必須等待unlock tables釋放讀鎖,跟會(huì)話5類(lèi)似
  • 3) 如果其他會(huì)話新請(qǐng)求操作{tables}外的其他表,則
  • a) 如果是查詢(xún)請(qǐng)求,不會(huì)被阻塞,如會(huì)話4;
  • b) 如果是寫(xiě)請(qǐng)求,必須等待unlock tables釋放讀鎖,如會(huì)話5

因此,flush tables with read lock操作是{tables}所有表的表級(jí)排他鎖,同時(shí)是庫(kù)級(jí)讀鎖,會(huì)阻塞庫(kù)上所有寫(xiě)操作,直到執(zhí)行unlock tables。其影響面比f(wàn)lush tables更大。

也就是比f(wàn)lush tables多一點(diǎn)影響,阻塞了{tables}之外的表的寫(xiě)操作,不影響其讀操作,只有unlock tables之后,釋放了這個(gè)對(duì)庫(kù)的全局讀鎖之后,才可以寫(xiě)

3. 一致性備份的問(wèn)題

一般情況下,很少會(huì)主動(dòng)使用flush tables和flush tables with read lock操作。

更多使用這兩個(gè)命令是mysqldump進(jìn)行數(shù)據(jù)備份的時(shí)候。

如果使用mysqldump進(jìn)行一致性備份時(shí),一般指定了--master-data和--single-transaction這兩個(gè)參數(shù),那么在備份操作執(zhí)行前,先執(zhí)行flush tables和flush tables with read lock這兩個(gè)命令,以獲得此一致性讀的binlog位置。

獲得binlog位置的過(guò)程為:

  • 1) flush tables操作是等待正在運(yùn)行的所有操作結(jié)束;
  • 2) flush tables with read locks是為了加 庫(kù)級(jí)全局讀鎖,禁止寫(xiě)操作;
  • 3) 通過(guò)show master status獲得此時(shí)binlog位置;
  • 4) unlock tables釋放全局讀鎖,允許寫(xiě)請(qǐng)求。

先執(zhí)行flush tables而不是直接執(zhí)行flush tables with read locks的原因是,flush tables阻塞其他請(qǐng)求的可能性更少。假設(shè)flush tables的過(guò)程中出現(xiàn)大查詢(xún),從前面的分析知道,僅影響其他會(huì)話關(guān)于{tables}表的請(qǐng)求,而不像flush tables with read locks會(huì)阻塞所有寫(xiě)操作。

然而,以上操作只是大大減少了全局讀鎖的影響范圍,如果在flush tables和flush tables with read locks之間出現(xiàn)大事務(wù),還是有可能會(huì)出現(xiàn)所有寫(xiě)操作hang住的情況。因此,必須謹(jǐn)慎使用一致性備份的功能。

另外,經(jīng)測(cè)試,如果出現(xiàn)flush tables阻塞其他會(huì)話的情況,如會(huì)話3、會(huì)話5的操作,是不會(huì)記錄慢查詢(xún)?nèi)罩镜?,但事?shí)上,應(yīng)用程序可能是得不到迅速的響應(yīng)了。

解決

1:show open tables where in_use >=1;

2:找到阻塞該表的查詢(xún)語(yǔ)句

SELECT * FROM information_schema.`PROCESSLIST`
WHERE info IS NOT NULL
AND state NOT LIKE 'Waiting for table flush'
AND info NOT LIKE 'SELECT * FROM information_schema.`PROCESSLIST`%'
AND INFO LIKE '%處于打開(kāi)狀態(tài)的表名%'
ORDER BY TIME DESC

3:kill id 殺死該sql進(jìn)程

備注:還可以殺死flush tables的進(jìn)程,該操作慎用,可能在執(zhí)行一致性備份

SELECT * FROM information_schema.`PROCESSLIST`
WHERE info LIKE '%flush tables%'
AND info NOT LIKE 'SELECT * FROM information_schema.`PROCESSLIST`%'

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql中inner join和left join使用詳解

    mysql中inner join和left join使用詳解

    本文主要介紹了mysql中inner join和left join使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 將MySQL去重操作優(yōu)化到極致的操作方法

    將MySQL去重操作優(yōu)化到極致的操作方法

    這篇文章主要介紹了如何將MySQL去重操作優(yōu)化到極致,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 30個(gè)mysql千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢(xún)優(yōu)化技巧詳解

    30個(gè)mysql千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢(xún)優(yōu)化技巧詳解

    本文總結(jié)了30個(gè)mysql千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢(xún)優(yōu)化技巧,特別適合大數(shù)據(jù)里的MYSQL使用
    2018-03-03
  • Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程

    Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程

    在應(yīng)用中為了從不同的視圖去分析數(shù)據(jù),會(huì)使用不同的方案去查詢(xún)數(shù)據(jù)庫(kù),橫表和縱表的相互轉(zhuǎn)換就是其中一個(gè)常見(jiàn)的情景,這篇文章主要給大家介紹了關(guān)于Mysql縱表轉(zhuǎn)換為橫表的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • MySQL的常見(jiàn)存儲(chǔ)引擎介紹與參數(shù)設(shè)置調(diào)優(yōu)

    MySQL的常見(jiàn)存儲(chǔ)引擎介紹與參數(shù)設(shè)置調(diào)優(yōu)

    這篇文章主要介紹了MySQL的常見(jiàn)存儲(chǔ)引擎介紹與參數(shù)設(shè)置調(diào)優(yōu),需要的朋友可以參考下
    2018-03-03
  • MySQL數(shù)據(jù)庫(kù)中ENUM的用法是什么詳解

    MySQL數(shù)據(jù)庫(kù)中ENUM的用法是什么詳解

    ENUM是一個(gè)字符串對(duì)象,用于指定一組預(yù)定義的值,并可在創(chuàng)建表時(shí)使用,下面這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)中ENUM的用法是什么的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • MYSQL數(shù)據(jù)庫(kù)主從同步設(shè)置的實(shí)現(xiàn)步驟

    MYSQL數(shù)據(jù)庫(kù)主從同步設(shè)置的實(shí)現(xiàn)步驟

    本文主要介紹了MYSQL數(shù)據(jù)庫(kù)主從同步設(shè)置的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • MySQL 常用命令示例詳解(使用mysql)

    MySQL 常用命令示例詳解(使用mysql)

    本文系統(tǒng)介紹了MySQL常用命令,涵蓋數(shù)據(jù)庫(kù)管理、數(shù)據(jù)操作、備份恢復(fù)及查詢(xún)優(yōu)化,包括啟停服務(wù)、連接操作、表結(jié)構(gòu)管理、數(shù)據(jù)增刪改查、文件導(dǎo)入導(dǎo)出和性能分析等實(shí)用腳本示例
    2025-07-07
  • 解析mysql不重復(fù)字段值求和

    解析mysql不重復(fù)字段值求和

    本篇文章是對(duì)關(guān)于mysql不重復(fù)字段值求和進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • linux采用binary方式安裝mysql

    linux采用binary方式安裝mysql

    這篇文章主要為大家詳細(xì)介紹了linux采用binary方式安裝mysql步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論

兴安县| 资溪县| 通辽市| 北川| 湘潭县| 武强县| 巫溪县| 大宁县| 开鲁县| 鹿泉市| 辰溪县| 固镇县| 资溪县| 黄浦区| 攀枝花市| 始兴县| 宜春市| 衡南县| 兰州市| 松溪县| 萍乡市| 磐安县| 宝鸡市| 珲春市| 崇礼县| 双鸭山市| 右玉县| 江阴市| 海林市| 金堂县| 石河子市| 沛县| 洱源县| 信丰县| 广汉市| 巴林右旗| 报价| 鄂托克旗| 巴彦县| 景宁| 樟树市|