MySQL不停地自動重啟怎麼辦

来源:https://www.cnblogs.com/gjc592/archive/2019/07/27/11254061.html
-Advertisement-
Play Games

近期,測試環境出現了一次MySQL資料庫不斷自動重啟的問題,導致的原因是強行kill -9 殺掉資料庫進程導致,報錯信息如下: 1. 初探過程 之前出現過類似的情況時,是因為記憶體不足,因日誌中也有對應的提示: 此測試環境物理記憶體確實不大,且剩餘記憶體也不足,而且是作為另一個測試環境的從庫,記憶體分配的也 ...


 近期,測試環境出現了一次MySQL資料庫不斷自動重啟的問題,導致的原因是強行kill -9 殺掉資料庫進程導致,報錯信息如下:

2019-07-24T01:14:53.769512Z 0 [Note] Executing 'SELECT * FROM INFORMATION_SCHEMA.TABLES;' to get a list of tables using the deprecated partition engine. You may use the startup option '--disable-partition-engine-check' to skip this check.
2019-07-24T01:14:53.769516Z 0 [Note] Beginning of list of non-natively partitioned tables
01:14:53 UTC - mysqld got signal 11 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
Attempting to collect some information that could help diagnose the problem.
As this is a crash and something is definitely wrong, the information
collection process might fail.
Please help us make Percona Server better by reporting any
bugs at http://bugs.percona.com/

key_buffer_size=33554432
read_buffer_size=8388608
max_used_connections=0
max_threads=501
thread_count=4
connection_count=0
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 4478400 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

Thread pointer: 0x7f486900e000
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 7f4846172820 thread_stack 0x80000
/usr/local/mysql5.7/bin/mysqld(my_print_stacktrace+0x2c)[0xed481c]
/usr/local/mysql5.7/bin/mysqld(handle_fatal_signal+0x461)[0x7a15a1]
/lib64/libpthread.so.0(+0xf7e0)[0x7f498697c7e0]
/usr/local/mysql5.7/bin/mysqld(_ZN12ha_federated7rnd_posEPhS0_+0x2f)[0x12bcc3f]
/usr/local/mysql5.7/bin/mysqld(_ZN7handler10ha_rnd_posEPhS0_+0x172)[0x804a12]
/usr/local/mysql5.7/bin/mysqld(_ZN14Rows_log_event24do_index_scan_and_updateEPK14Relay_log_info+0x1e3)[0xe50e23]
/usr/local/mysql5.7/bin/mysqld(_ZN14Rows_log_event14do_apply_eventEPK14Relay_log_info+0x716)[0xe50196]
/usr/local/mysql5.7/bin/mysqld(_ZN9Log_event11apply_eventEP14Relay_log_info+0x6e)[0xe48fde]
/usr/local/mysql5.7/bin/mysqld(_Z26apply_event_and_update_posPP9Log_eventP3THDP14Relay_log_info+0x1f0)[0xe8d6f0]
/usr/local/mysql5.7/bin/mysqld(handle_slave_sql+0x163d)[0xe9a0fd]
/usr/local/mysql5.7/bin/mysqld(pfs_spawn_thread+0x1b4)[0x1209414]
/lib64/libpthread.so.0(+0x7aa1)[0x7f4986974aa1]
/lib64/libc.so.6(clone+0x6d)[0x7f4984c6bc4d]

Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (0): is an invalid pointer
Connection ID (thread ID): 2
Status: NOT_KILLED

You may download the Percona Server operations manual by visiting
http://www.percona.com/software/percona-server/. You may find information
in the manual which will help you identify the cause of the crash.

1. 初探過程

之前出現過類似的情況時,是因為記憶體不足,因日誌中也有對應的提示:

key_buffer_size=33554432
read_buffer_size=8388608
max_used_connections=0
max_threads=501
thread_count=4
connection_count=0
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 4478400 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

此測試環境物理記憶體確實不大,且剩餘記憶體也不足,而且是作為另一個測試環境的從庫,記憶體分配的也少。

之前一些環境也出現過類似的情況,通過調整參數及釋放記憶體的等處理後可以正常啟動,於是嘗試著關閉一些臨時程式並調整MySQL上述幾個參數的值,如:

[mysqld]
max_connections = 50

然後重新啟動MySQL,結果依舊不斷重啟。

初步處理未果。

 

2.   添加innodb_force_recovery 解決不斷重啟

在配置文件my.cnf添加innodb_force_recovery 先處理不斷重啟的問題

[mysqld]
innodb_force_recovery = 4

添加後,再次啟動MySQL,此時不再出現反覆重啟。

查看資料庫日誌,有提示 [Note] InnoDB: !!! innodb_force_recovery is set to 4 !!!如下:

因為此時可以打開資料庫,於是嘗試啟動從庫,但是此時報錯,提示Table 'mysql.slave_relay_log_info' is read only.

此時再看錯誤日誌,如下

因此,本次啟動時,innodb_force_recovery 設置為 4,在MySQL 5.6.15 以後,當 innodb_force_recovery 的值大於等於 4 的時候,InnoDB 表處於只讀模式,因啟動複製時需要將信息寫入表中,所以此時報錯。

註: 因設置為1-3 時,依舊未生效,因此我在處理時設置的為4(4 以上的值可能永久導致數據文件損壞。如果生產環境出現類似問題務必先拷貝一份測試,在測試通過後再在生產環境處理)。此時可以將所有數據dump出,之後再恢復即可。

 

3.  innodb_force_recovery 參數

innodb_force_recovery 可以設置為 1-6,大的值包含前面所有小於它的值的影響。

1 (SRV_FORCE_IGNORE_CORRUPT): 忽略檢查到的 corrupt 頁。儘管檢測到了損壞的 page 仍強制服務運行。一般設置為該值即可,然後 dump 出庫表進行重建。

2 (SRV_FORCE_NO_BACKGROUND): 阻止主線程的運行,如主線程需要執行 full purge 操作,會導致 crash。 阻止 master thread 和任何 purge thread 運行。若 crash 發生在 purge 環節則使用該值。

3 (SRV_FORCE_NO_TRX_UNDO): 不執行事務回滾操作。

4 (SRV_FORCE_NO_IBUF_MERGE): 不執行插入緩衝的合併操作。如果可能導致崩潰則不要做這些操作。不要進行統計操作。該值可能永久損壞數據文件。若使用了該值,則將來要刪除和重建輔助索引。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做日誌,InnoDB 存儲引擎會將未提交的事務視為已提交。此時 InnoDB 甚至把未完成的事務按照提交處理。該值可能永久性的損壞數據文件。

6 (SRV_FORCE_NO_LOG_REDO): 不執行前滾的操作。恢復時不做 redo log roll-forward。使資料庫頁處於廢止狀態,繼而可能引起 B 樹或者其他資料庫結構更多的損壞。

 

註意:

  • 為了安全,當設置參數值大於 0 後,可以對錶進行 select, create, drop 操作,但 insert, update 或者 delete 這類操作是不允許的。
  • MySQL 5.6.15 以後,當 innodb_force_recovery 的值大於等於 4 的時候,InnoDB 表處於只讀模式。
  • 在值小於等於 3 時可以通過 select 來 dump 表,可以 drop 或者 create 表。
  • MySQL 5.6.27 後大於 3 的值也支持 DROP TABLE; 如果事先知道哪個表導致了崩潰則可 drop 掉這個表。
  • 如果碰到了由失敗的大規模導入或大量 ALTER TABLE 操作引起的 runaway rollback,則可 kill 掉 mysqld 線程然後設置 innodb_force_recovery = 3 使資料庫重啟後不進行 rollback。然後刪除導致 runaway rollback 的表; 如果表內的數據損壞導致不能 dump 整個表內容。那麼附帶 order by primary_key desc 從句的查詢或許能夠 dump 出損壞部分之後的部分數據;

 

耿小廚已開通個人微信公眾號,想進一步溝通或想瞭解其他文章的同學可以關註我

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用CentOS7搭建OwnCloud私有雲(LAMP環境),不關閉SELinux。 ...
  • 1. linux 目錄解釋系統啟動必須: /boot:存放的啟動 Linux 時使用的內核文件,包括連接文件以及鏡像文件。 /etc:存放所有的系統需要的配置文件和子目錄列表,更改目錄下的文件可能會導致系統不能啟動。 /lib:存放基本的動態連接共用庫(比如c++庫),其作用類似於Windows里的 ...
  • 大概在一周前看了燕十八老師講解的mysql資料庫視頻,也跟著學了一周,我就想把我這一周所學的知識跟大家分享一下;因為是第一次寫博客,所以可能會寫的很爛,請大家多多包涵。文章中有不對的地方還請大家指出來,我會加以改正。 我們先來學習對資料庫進行連接並且對錶進行最基本的增刪改查: 先來進行對資料庫伺服器 ...
  • [學習筆記] parallelize並行化集合是根據一個已經存在的Scala集合創建的RDD對象。集合的裡面的元素將會被拷貝進入新創建出的一個可被並行操作的分散式數據集。例如:val rdd03 = sc.parallelize(List(1, 4, 3, 7, 5)) 根據系統環境來進行切分多個s ...
  • 資料庫 創建資料庫: 指定用戶名創建資料庫: 刪除資料庫: 訪問資料庫: 互動式環境下資料庫內執行 會進入到一個新頁面,要返回按 退出資料庫: 、`exit quit` 表 創建表: 查看表結構: 創建表時 表示註釋, 到行尾的東西都會被忽略 刪除表: 表中增加行: 命令可以一次性向表中裝填大量數據 ...
  • 使用數據泵(expdp)導數時遇到了ORA-31626 & ORA-00942 錯誤,資料庫版本為Oracle Database 10g Release 10.2.0.5.0,具體錯誤如下所示: $ expdp system/xxx tables=xxx.xxx directory=DUMPDIR ... ...
  • --建表CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40 ...
  • 使用HABSE之前,要先安裝一個zookeeper zookeeper是幹嘛的呢 Zookeeper的作用1.可以為客戶端管理少量的數據kvkey:是以路徑的形式表示的,那就意味著,各key之間有父子關係,比如/ 是頂層key用戶建的key只能在/ 下作為子節點,比如建一個key: /aa 這個ke ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...