解決Flask-SQLAlchemy 2006 MySQL server has gone away 問題

配置信息

  • python3 3.6
  • Flask-SQLAlchemy 2.3.2
  • win10

報錯:

-----> [2018-07-16 17:22:42,041] [ERROR] [base.py<131>-base.run_job]: Job "auto_rollback.<locals>.wrapper (trigger: interval[0:30:00], next run at: 2018-07-16 17:52:42 CST)" raised an exception
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 507, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 374, in _do_query
    db.query(q)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 277, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/apscheduler/executors/base.py", line 125, in run_job
    retval = job.func(*job.args, **job.kwargs)
  File "/home/zza/eth_crawler/crawler_script/utils.py", line 28, in wrapper
    raise err
  File "/home/zza/eth_crawler/crawler_script/utils.py", line 24, in wrapper
    return func(*args, **kwargs)
  File "/home/zza/eth_crawler/crawler_script/token_tracker.py", line 240, in update
    db_address = db.session.query(Token.contract_address).filter(None == Token.total_supply).all()
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2773, in all
    return list(self)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2925, in __iter__
    return self._execute_and_instances(context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2948, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 948, in execute
    return meth(self, multiparams, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
    exc_info
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 203, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 186, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 507, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 247, in execute
    res = self._query(query)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/cursors.py", line 374, in _do_query
    db.query(q)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 277, in query
    _mysql.connection.query(self, query)
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away') [SQL: 'SELECT token.contract_address AS token_contract_address \nFROM token \nWHERE token.total_supply IS NULL'] (Background on this error at: http://sqlalche.me/e/e3q8)

已使用解決方案

  • 出錯后需要rollback奶栖,為了后續(xù)程序能運行茄袖,給每個涉及sql語句的函數(shù)用了裝飾器愿汰。
def auto_rollback(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as err:
            db.session.rollback()
            log.error(err)
            raise err

    return wrapper

治標不治本系列

  • 把SQLALCHEMY_POOL_RECYCLE設(shè)成一個較小的數(shù)
app.config['SQLALCHEMY_POOL_SIZE'] = 128  # 線程池大小
app.config['SQLALCHEMY_POOL_TIMEOUT'] = 90  # 超時時間
app.config['SQLALCHEMY_POOL_RECYCLE'] = 3  # 空閑連接自動回收時間
app.config['SQLALCHEMY_MAX_OVERFLOW'] = 128  # 控制在連接池達到最大值后可以創(chuàng)建的連接數(shù)坑鱼。
  • 根據(jù)錯誤日志 在需要用數(shù)據(jù)庫的地方先斷開連接
db.session.remove()

失敗

  • 將單獨的sql語句改成nopool連接方式
class nullpool_SQLAlchemy(SQLAlchemy):
    def apply_driver_hacks(self, app, info, options):
        super(nullpool_SQLAlchemy, self).apply_driver_hacks(app, info, options)
        from sqlalchemy.pool import NullPool
        options['poolclass'] = NullPool
        del options['pool_size']

解決后又會出現(xiàn)

sqlalchemy.exc.InvalidRequestError: Can't reconnect until invalid transaction is rolled back

失敗

  • 每次訪問數(shù)據(jù)庫重新生成sqlalchemy連接 ?
    from xxx import SQLAlchemy
    from xxx import app
    db = SQLAlchemy(app)

最粗暴但是最有效的解決方式枷遂,這個問題困擾了將近3周湿蛔,emmm


image.png

解決參考

flask-alchemy mysql gone away問題 連接重連 程序方向
MySQL server has gone away 問題的解決方法 mysql反向
nullpool_SQLAlchemy代碼
數(shù)據(jù)庫方向解決問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抵知,隨后出現(xiàn)的幾起案子墙基,更是在濱河造成了極大的恐慌,老刑警劉巖刷喜,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件残制,死亡現(xiàn)場離奇詭異,居然都是意外死亡掖疮,警方通過查閱死者的電腦和手機初茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浊闪,“玉大人恼布,你說我怎么就攤上這事「楸觯” “怎么了折汞?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盖腿。 經(jīng)常有香客問我爽待,道長,這世上最難降的妖魔是什么翩腐? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任鸟款,我火速辦了婚禮,結(jié)果婚禮上茂卦,老公的妹妹穿的比我還像新娘何什。我一直安慰自己,他們只是感情好疙筹,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布富俄。 她就那樣靜靜地躺著禁炒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霍比。 梳的紋絲不亂的頭發(fā)上幕袱,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音悠瞬,去河邊找鬼们豌。 笑死,一個胖子當著我的面吹牛浅妆,可吹牛的內(nèi)容都是我干的望迎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼凌外,長吁一口氣:“原來是場噩夢啊……” “哼辩尊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起康辑,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摄欲,失蹤者是張志新(化名)和其女友劉穎左刽,沒想到半個月后喧笔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡捆憎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年按咒,在試婚紗的時候發(fā)現(xiàn)自己被綠了迟隅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡励七,死狀恐怖智袭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呀伙,我是刑警寧澤补履,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布添坊,位于F島的核電站剿另,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贬蛙。R本人自食惡果不足惜雨女,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阳准。 院中可真熱鬧氛堕,春花似錦、人聲如沸野蝇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锐想,卻和暖如春帮寻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赠摇。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工固逗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藕帜。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓烫罩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洽故。 傳聞我的和親對象是個殘疾皇子贝攒,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容