2012-07-30 108 views
1

我有一些遊戲用戶健康和其他屬性使用MySQL事件更新幾分鐘。我遇到了一個問題,最終事件不再運行,事件中的SQL沒有執行。MySQL事件在一段時間後停止工作

我不知道該如何解決它,所以我嘗試重新啓動MySQL並修復了一段時間。我設置MySQL在cron中每晚重新啓動,但這不是一個很好的解決方案。有時MySQL無法重新啓動並掛起。

編輯:我使用事件的數據庫中的所有表都是InnoDB。

+1

當它卡住時,嘗試運行一個SHOW PROCESSLIST查詢來查看是否有一個事件觸發查詢被阻塞。 – cdhowie 2012-07-30 21:50:09

+0

當它卡住了,我做SHOW PROCESSLIST;沒有查詢正在運行。 – Andy 2013-05-21 18:10:24

回答

2

這可能是因爲你有沒有完成並持有許多鎖的事件。最終,額外的工作會「疊加」,每個人都試圖獲得鎖,但似乎沒有工作。如果您使用MyISAM表,因爲它們具有表級別,而不是行級鎖定,這可能尤其如此。

考慮配置pt-stalk(Percona Toolkit的一部分)來捕獲'show processlist'的常規快照和其他重要細節。然後你可以追蹤什麼時候事情「停止工作」並且在問題開始的時候工作。

以防止作業「堆放」使用GET_LOCK函數:

SELECT GET_LOCK('THIS_IS_A_NAMED_LOCK', 0) INTO @got_lock; 
IF @got_lock = 1 THEN 
    select 'do something here'; 
    SELECT RELEASE_LOCK('THIS_IS_A_NAMED_LOCK') INTO @discard; 
END IF; 

如果你正使用InnoDB,確保你發出START TRANSACTION和在事件提交命令,以確保沒有創建長時間運行交易。

+0

我正在使用InnoDB。我的任何事件查詢都沒有START TRANSACTION和COMMIT,所以我會努力添加。是否有必要使用GET_LOCK插入和更新以及選擇? – Andy 2013-05-16 18:51:32

+0

將get_lock()放在事件的第一個語句之前,並在最後一個語句之後放置釋放鎖。把工作放在一個IF之間,所以只有實際獲得鎖定的事件才能完成工作。 – 2013-05-17 03:05:51

0

最近我因爲這個問題離線了我的iOS遊戲。我無法弄清楚如何實施Justin Swanhart的答案。如果任何人有興趣,我可以讓我的PHP/MySQL代碼可用,看看你是否可以解決這個問題。請讓我知道。 [email protected]

相關問題