免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

怎么看mysql是否死鎖 mysql檢查死鎖

MySQL數(shù)據(jù)庫(kù)中查詢表是否被鎖以及解鎖

1.查看表被鎖狀態(tài)

創(chuàng)新互聯(lián)一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶多一個(gè)朋友!為您提供網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)頁(yè)設(shè)計(jì)、成都小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、手機(jī)APP定制開發(fā)是成都本地專業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來(lái)見證!

2.查看造成死鎖的sql語(yǔ)句

3.查詢進(jìn)程

4.解鎖(刪除進(jìn)程)

5.查看正在鎖的事物? (8.0以下版本)

6.查看等待鎖的事物?(8.0以下版本)

如何查看MySQL數(shù)據(jù)庫(kù)的死鎖信息

使用終端或命令提示符登錄到MySQL,輸入命令:

mysql -h xxxx.xxx.xxx -P 3306 -u username -p password

在MySQL客戶端下輸入命令:

show engine innodb status \G;

在打印出來(lái)的信息中找到“LATEST DETECTED DEADLOCK”一節(jié)內(nèi)容,分析其中的內(nèi)容,我們就可以知道最近導(dǎo)致死鎖的事務(wù)有哪些。

怎么查看mysql表是否被鎖定

當(dāng)你開始執(zhí)行一個(gè) ALTER ,而你遇到了可怕的“元數(shù)據(jù)鎖定等待”,我敢肯定你一定遇見過(guò)。我最近遇到了一個(gè)案例,其中被更改的表要執(zhí)行一個(gè)很小范圍的更新(100行)。ALTER 在負(fù)載測(cè)試期間一直等待了幾個(gè)小時(shí)。在停止負(fù)載測(cè)試后,ALTER 按預(yù)期在不到一秒的時(shí)間內(nèi)就完成了。那么這里發(fā)生了什么?

檢查外鍵

每當(dāng)有奇數(shù)次鎖定時(shí),我的第一直覺就是檢查外鍵。當(dāng)然這張表有一些外鍵引用了一個(gè)更繁忙的表。但是這種行為似乎仍然很奇怪。對(duì)表運(yùn)行 ALTER 時(shí),會(huì)針對(duì)子表請(qǐng)求一個(gè) SHARED_UPGRADEABLE 元數(shù)據(jù)鎖。還有針對(duì)父級(jí)的 SHARED_READ_ONLY 元數(shù)據(jù)鎖。

我們來(lái)看看如何根據(jù)文檔獲取元數(shù)據(jù)鎖定[1]:

如果給定鎖定有多個(gè)服務(wù)器,則首先滿足最高優(yōu)先級(jí)鎖定請(qǐng)求,并且與 max_write_lock_count系統(tǒng)變量有關(guān)。寫鎖定請(qǐng)求的優(yōu)先級(jí)高于讀取鎖定請(qǐng)求。

[1]:

請(qǐng)務(wù)必注意鎖定順序是序列化的:語(yǔ)句逐個(gè)獲取元數(shù)據(jù)鎖,而不是同時(shí)獲取,并在此過(guò)程中執(zhí)行死鎖檢測(cè)。

通常在考慮隊(duì)列時(shí)考慮先進(jìn)先出。如果我發(fā)出以下三個(gè)語(yǔ)句(按此順序),它們將按以下順序完成:

1. INSERT INTO parent2. ALTER TABLE child3. INSERT INTO parent

但是當(dāng)子 ALTER 語(yǔ)句請(qǐng)求對(duì)父進(jìn)行讀取鎖定時(shí),盡管排序,但兩個(gè)插入將在 ALTER 之前完成。以下是可以演示此示例的示例場(chǎng)景:

數(shù)據(jù)初始化:

CREATE TABLE `parent` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`val` varchar(10) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;

CREATE TABLE `child` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`parent_id` int(11) DEFAULT NULL,

`val` varchar(10) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `idx_parent` (`parent_id`),

CONSTRAINT `fk_parent` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION

) ENGINE=InnoDB;

INSERT INTO `parent` VALUES (1, "one"), (2, "two"), (3, "three"), (4, "four");

Session 1:

start transaction;update parent set val = "four-new" where id = 4;

Session 2:

alter table child add index `idx_new` (val);

Session 3:

start transaction;update parent set val = "three-new" where id = 3;

此時(shí),會(huì)話 1 具有打開的事務(wù),并且處于休眠狀態(tài),并在父級(jí)上授予寫入元數(shù)據(jù)鎖定。 會(huì)話 2 具有在子級(jí)上授予的可升級(jí)(寫入)鎖定,并且正在等待父級(jí)的讀取鎖定。最后會(huì)話 3 具有針對(duì)父級(jí)的授權(quán)寫入鎖定:

mysql select * from performance_schema.metadata_locks;+-------------+-------------+-------------------+---------------+-------------+| OBJECT_TYPE | OBJECT_NAME | LOCK_TYPE ? ? ? ? | LOCK_DURATION | LOCK_STATUS |+-------------+-------------+-------------------+---------------+-------------+| TABLE ? ? ? | child ? ? ? | SHARED_UPGRADABLE | TRANSACTION ? | GRANTED ? ? | - ALTER (S2)| TABLE ? ? ? | parent ? ? ?| SHARED_WRITE ? ? ?| TRANSACTION ? | GRANTED ? ? | - UPDATE (S1)| TABLE ? ? ? | parent ? ? ?| SHARED_WRITE ? ? ?| TRANSACTION ? | GRANTED ? ? | - UPDATE (S3)| TABLE ? ? ? | parent ? ? ?| SHARED_READ_ONLY ?| STATEMENT ? ? | PENDING ? ? | - ALTER (S2)+-------------+-------------+-------------------+---------------+-------------+

請(qǐng)注意,具有掛起鎖定狀態(tài)的唯一會(huì)話是會(huì)話 2(ALTER)。會(huì)話 1 和會(huì)話 3 (分別在 ALTER 之前和之后發(fā)布)都被授予了寫鎖。排序失敗的地方是在會(huì)話 1 上發(fā)生提交的時(shí)候。在考慮有序隊(duì)列時(shí),人們會(huì)期望會(huì)話 2 獲得鎖定,事情就會(huì)繼續(xù)進(jìn)行。但是,由于元數(shù)據(jù)鎖定系統(tǒng)的優(yōu)先級(jí)性質(zhì),會(huì)話 3 具有鎖定,會(huì)話 2 仍然等待。

如果另一個(gè)寫入會(huì)話進(jìn)入并啟動(dòng)新事務(wù)并獲取針對(duì)父表的寫鎖定,則即使會(huì)話 3 完成,ALTER 仍將被阻止。

只要我保持一個(gè)對(duì)父表打開元數(shù)據(jù)鎖定的活動(dòng)事務(wù),子表上的 ALTER 將永遠(yuǎn)不會(huì)完成。更糟糕的是,由于子表上的寫鎖定成功(但是完整語(yǔ)句正在等待獲取父讀鎖定),所以針對(duì)子表的所有傳入讀取請(qǐng)求都將被阻止!

另外,請(qǐng)考慮一下您通常如何對(duì)無(wú)法完成的語(yǔ)句進(jìn)行故障排除。您查看已經(jīng)打開較長(zhǎng)時(shí)間的事務(wù)(在進(jìn)程列表和 InnoDB 狀態(tài)中)。但由于阻塞線程現(xiàn)在比 ALTER 線程更年輕,因此您將看到的最舊的事務(wù)/線程是 ALTER 。

這正是這種情況下發(fā)生的情況。在準(zhǔn)備發(fā)布時(shí),我們的客戶端正在運(yùn)行 ALTER 語(yǔ)句并結(jié)合負(fù)載測(cè)試(一種非常好的做法!)以確保順利發(fā)布。問(wèn)題是負(fù)載測(cè)試保持對(duì)父表打開一個(gè)活動(dòng)的寫事務(wù)。這并不是說(shuō)它只是一直在寫,而是有多個(gè)線程,一個(gè)總是活躍的。 這阻止了 ALTER 完成并阻止對(duì)相對(duì)靜態(tài)的子表的隨后的讀請(qǐng)求。

幸運(yùn)的是,這個(gè)問(wèn)題有一個(gè)解決方案(除了從設(shè)計(jì)模式中驅(qū)逐外鍵)。變量?max_write_lock_count[2]?可用于允許在寫入鎖定之后在讀取鎖定之前授予讀取鎖定連續(xù)寫鎖。默認(rèn)情況下,此變量設(shè)置為 18446744073709551615,如果你對(duì)該表發(fā)出 10,000 次寫入/秒,那么你的讀將被鎖定 5800 萬(wàn)年……

詳解MySQL(InnoDB)如何處理死鎖

鎖是需要事務(wù)結(jié)束后才釋放的。

一個(gè)是 MVCC,一個(gè)是兩階段鎖協(xié)議。

為什么要并發(fā)控制呢?是因?yàn)槎鄠€(gè)用戶同時(shí)操作 MySQL 的時(shí)候,為了提高并發(fā)性能并且要求如同多個(gè)用戶的請(qǐng)求過(guò)來(lái)之后如同串行執(zhí)行的一樣(為了解決臟讀、不可重復(fù)讀、幻讀)

官方定義:

兩階段鎖協(xié)議是指所有事務(wù)必須分兩個(gè)階段對(duì)數(shù)據(jù)加鎖和解鎖,在對(duì)任何數(shù)據(jù)進(jìn)行讀、寫操作之前,事務(wù)首先要獲得對(duì)該數(shù)據(jù)的封鎖;在釋放一個(gè)封鎖之后,事務(wù)不再申請(qǐng)和獲得任何其他封鎖。

對(duì)應(yīng)到 MySQL 上分為兩個(gè)階段:

但是兩階段鎖協(xié)議不要求事務(wù)必須一次將所有需要使用的數(shù)據(jù)加鎖(innodb在需要的索引列數(shù)據(jù)才鎖行),并且在加鎖階段沒有順序要求,所以這種并發(fā)控制方式會(huì)形成死鎖。

MySQL有兩種死鎖處理方式:

死鎖檢測(cè) (默認(rèn)開啟)

死鎖檢測(cè)的原理是構(gòu)建一個(gè)以事務(wù)為頂點(diǎn)、鎖為邊的有向圖,判斷有向圖是否存在環(huán),存在即有死鎖。

回滾

檢測(cè)到死鎖之后,選擇插入更新或者刪除的行數(shù)最少的事務(wù)回滾,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段來(lái)判斷。

收集死鎖信息:

減少死鎖:

死鎖解決:

mysql 查看死鎖

第一步,查出已鎖的進(jìn)程

查看正在鎖的事務(wù)

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

``

查看等待鎖的事務(wù)

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

``

INNODB_TRX表主要是包含了正在InnoDB引擎中執(zhí)行的所有事務(wù)的信息,包括waiting for a lock和running的事務(wù)

select * from information_schema.innodb_trx

``

第二步,kill進(jìn)程

show engin innodb status; //最后一次死鎖信息及sql

show open tables where in_use 0 //查看鎖表

本文名稱:怎么看mysql是否死鎖 mysql檢查死鎖
網(wǎng)站路徑:http://m.newbst.com/article14/hjphde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google企業(yè)建站App設(shè)計(jì)外貿(mào)建站定制開發(fā)靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)