新聞中心
MySQL數(shù)據(jù)庫連接8小時(shí)問題怎么解決
關(guān)于mysql自動(dòng)斷開的問題研究結(jié)果如下,在mysql中有相關(guān)參數(shù)設(shè)定,當(dāng)數(shù)據(jù)庫連接空閑一定時(shí)間后,服務(wù)器就
10余年的寶應(yīng)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整寶應(yīng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“寶應(yīng)網(wǎng)站設(shè)計(jì)”,“寶應(yīng)網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
會(huì)斷開等待超時(shí)的連接:
同一時(shí)間,這兩個(gè)參數(shù)只有一個(gè)起作用。到底是哪個(gè)參數(shù)起作用,和用戶連接時(shí)指定的連接參數(shù)相關(guān),缺省情況下是使用
wait_timeout。我建議是將這兩個(gè)參數(shù)都修改,以免引起不必要的麻煩。
2、修改參數(shù)
這兩個(gè)參數(shù)的默認(rèn)值是8小時(shí)。我測(cè)試過將這兩個(gè)參數(shù)改為0,結(jié)果出人意料,系統(tǒng)自動(dòng)將這個(gè)值設(shè)置為1。換句話說,不能將該值設(shè)置為永久。我建議為參數(shù)值加三個(gè)0,這樣肯定可以滿足我們的應(yīng)用要求。
修改操作:打開/etc/my.cnf,在屬性組mysqld下面添加參數(shù)如下:
[mysqld]
interactive_timeout=28800000
wait_timeout=28800000
windows下在my.ini文中增加:
interactive_timeout=28800000
wait_timeout=28800000
mysql連接超時(shí)怎么處理
查看mysql server超時(shí)時(shí)間:
msyql show global variables like '%timeout%';
設(shè)置mysql server超時(shí)時(shí)間(以秒為單位):
msyql set global wait_timeout=10;
msyql set global interactive_timeout=10;
MySQL 鎖等待超時(shí)(Lock wait timeout exceeded)
問題:Lock wait timeout exceeded; try restarting transaction
MySQL版本:5.6.44
官方文檔
意思是:InnoDB在鎖等待超時(shí)過期時(shí)報(bào)告此錯(cuò)誤。等待時(shí)間過長(zhǎng)的語句被回滾(而不是整個(gè)事務(wù))。如果SQL語句需要等待其他事務(wù)完成的時(shí)間更長(zhǎng),則可以增加 innodb_lock_wait_timeout 配置選項(xiàng)的值;如果太多長(zhǎng)時(shí)間運(yùn)行的事務(wù)導(dǎo)致鎖定問題并降低繁忙系統(tǒng)上的并發(fā)性,則可以減少該選項(xiàng)的值。
鎖等待超時(shí),可能是出現(xiàn)了死鎖,也可能有事務(wù)長(zhǎng)時(shí)間未提交
庫:information_schema
表:
查看各表信息
innodb_trx 表
innodb_locks 表
innodb_lock_waits 表
processlist 表
模擬出現(xiàn)死鎖
準(zhǔn)備一張只有主鍵的表:t_test (id)
Navicat 新建查詢1
Navicat 新建查詢2
檢查是否鎖表
查詢當(dāng)前正在執(zhí)行的事務(wù)
查詢當(dāng)前出現(xiàn)的鎖
查詢鎖等待對(duì)應(yīng)的關(guān)系
查詢等待鎖的事務(wù)所執(zhí)行的SQL
最后,事務(wù)2 等待鎖超時(shí)報(bào)錯(cuò): Lock wait timeout exceeded; try restarting transaction;
通過事務(wù)線程ID查找進(jìn)程信息
win10 查看端口信息
mysql數(shù)據(jù)庫表鎖等待超時(shí)怎么解決
當(dāng)你開始執(zhí)行一個(gè) ALTER ,而你遇到了可怕的“元數(shù)據(jù)鎖定等待”,我敢肯定你一定遇見過。我最近遇到了一個(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ù)鎖。
我們來看看如何根據(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ù)必注意鎖定順序是序列化的:語句逐個(gè)獲取元數(shù)據(jù)鎖,而不是同時(shí)獲取,并在此過程中執(zhí)行死鎖檢測(cè)。
通常在考慮隊(duì)列時(shí)考慮先進(jìn)先出。如果我發(fā)出以下三個(gè)語句(按此順序),它們將按以下順序完成:
1. INSERT INTO parent2. ALTER TABLE child3. INSERT INTO parent
但是當(dāng)子 ALTER 語句請(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ì)完成。更糟糕的是,由于子表上的寫鎖定成功(但是完整語句正在等待獲取父讀鎖定),所以針對(duì)子表的所有傳入讀取請(qǐng)求都將被阻止!
另外,請(qǐng)考慮一下您通常如何對(duì)無法完成的語句進(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 語句并結(jié)合負(fù)載測(cè)試(一種非常好的做法?。┮源_保順利發(fā)布。問題是負(fù)載測(cè)試保持對(duì)父表打開一個(gè)活動(dòng)的寫事務(wù)。這并不是說它只是一直在寫,而是有多個(gè)線程,一個(gè)總是活躍的。 這阻止了 ALTER 完成并阻止對(duì)相對(duì)靜態(tài)的子表的隨后的讀請(qǐng)求。
幸運(yùn)的是,這個(gè)問題有一個(gè)解決方案(除了從設(shè)計(jì)模式中驅(qū)逐外鍵)。變量?max_write_lock_count[2]?可用于允許在寫入鎖定之后在讀取鎖定之前授予讀取鎖定連續(xù)寫鎖。默認(rèn)情況下,此變量設(shè)置為 18446744073709551615,如果你對(duì)該表發(fā)出 10,000 次寫入/秒,那么你的讀將被鎖定 5800 萬年……
mysql默認(rèn)超時(shí)時(shí)間問題怎么處理
第一種途徑使用命令行set
@@GLOBAL.wait_timeout=1814400
這種方式是一種臨時(shí)方法,重啟服務(wù)就會(huì)返回默認(rèn)值了。
第二種途徑修改my.ini配置文件
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
在mysqld下面添加以上兩行,后面的數(shù)字是時(shí)間
首先服務(wù)中找到mysql,然后右鍵屬性,在可執(zhí)行文件的路徑中,使勁向后拖動(dòng)鼠標(biāo)就可以看到my.ini的文件了
新聞名稱:mysql等待超時(shí)怎么辦,mysql 超時(shí)時(shí)間
文章出自:http://biofuelwatch.net/article/hdcigi.html