使用django+celery出現(xiàn)OperationalError: (2006, 'MySQL server has gone away')錯(cuò)誤時(shí)瞄桨,經(jīng)過(guò)排查是數(shù)據(jù)庫(kù)連接超時(shí)了介评。
排查出錯(cuò)原因及解決方法:
1.檢查MySQL 服務(wù)是否宕了
進(jìn)入數(shù)據(jù)庫(kù)進(jìn)入mysql控制臺(tái),查看mysql的運(yùn)行時(shí)長(zhǎng)
mysql> show global status like 'uptime'霍弹;
如果uptime的值比較大肮韧,說(shuō)明服務(wù)正常
2.檢查是否執(zhí)行的sql語(yǔ)句過(guò)長(zhǎng)
查看是否程序中有執(zhí)行sql饱普,查詢的結(jié)果集超過(guò) max_allowed_packet孝常,可以將結(jié)果集導(dǎo)出成文件和max_allowed_packet進(jìn)行比較,一般用select * into outfile 的方式導(dǎo)出到文件
查看max_allowed_packet
mysql> show global variables like 'max_allowed_packet';
如果結(jié)果集超過(guò)?max_allowed_packet的大小可以修改max_allowed_packet:
mysql> set global max_allowed_packet=1024*1024*16;
也可以在msql的配置文件my.cnf文件中添加或者修改以下變量:
max_allowed_packet = 20M(自己設(shè)置大型⒍弧)
3.mysql連接超時(shí)
程序一直開著蔓涧,但是長(zhǎng)時(shí)間不從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)(超過(guò)8小時(shí))數(shù)據(jù)庫(kù)的默認(rèn)超時(shí)時(shí)間為8小時(shí),數(shù)據(jù)庫(kù)會(huì)斷開連接笋额,再次操作數(shù)據(jù)時(shí)會(huì)出現(xiàn)MySQL server has gone away的錯(cuò)誤元暴,出現(xiàn)此種情況可以嘗試以下方式進(jìn)行解決:
1.增大wait_timeout的值:
mysql> show global variables like '%timeout';
mysql> set global wait_timeout=60*60*30;(自己設(shè)置)
此種做法立即生效,但是重啟mysql會(huì)恢復(fù)原來(lái)的值兄猩,可以修改msql的配置文件my.cnf:
修改 wait_timeout = 108000(自己設(shè)置)茉盏,需重啟mysql
2.修改程序,每次調(diào)用完 Model 后枢冤,手動(dòng)關(guān)閉 connection
如果項(xiàng)目沒有配置主從數(shù)據(jù)庫(kù)鸠姨,可以直接使用
from django.db import connection
connection.close()
如果配置主從數(shù)據(jù)庫(kù),需要仿照?django.db.__init__.py中的close_old_connections函數(shù)淹真,自己定義函數(shù)讶迁,每次操作model得時(shí)候執(zhí)行函數(shù):
from django.db import connections
def close_old_connections():
????for conn in? connections.all():
? ? ? ? conn.close_if_unusable_or_obsolete()
3.自己寫個(gè)腳本每隔一定時(shí)間請(qǐng)求下項(xiàng)目接口,操作下數(shù)據(jù)庫(kù)核蘸,保持?jǐn)?shù)據(jù)庫(kù)連接