Mysql資料庫意外崩潰導致表數據文件損壞無法啟動的問題解決

来源:https://www.cnblogs.com/liucx/archive/2020/07/20/13343790.html
-Advertisement-
Play Games

問題故障:Mysql資料庫意外崩潰,一直無法啟動資料庫。報錯日誌: 啟動報錯:service mysqld restartERROR! MySQL server PID file could not be found!Starting MySQL. ERROR! The server quit wi ...


問題故障:
Mysql資料庫意外崩潰,一直無法啟動資料庫。
報錯日誌:

啟動報錯:service mysqld restart
ERROR! MySQL server PID file could not be found!
Starting MySQL. ERROR! The server quit without updating PID file (/www/wdlinux/mysql/var/iZ2358oz5deZ.pid).

資料庫error日誌:
200719 22:07:43 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Error: trying to add tablespace 840 of name './ob_wp/ob_termmeta.ibd'
InnoDB: to the tablespace memory cache, but tablespace
InnoDB: 840 of name './dev_nss/dg_queue.ibd' already exists in the tablespace
InnoDB: memory cache!
200719 22:07:43 mysqld_safe mysqld from pid file /www/wdlinux/mysql/var/iZ2358oz5deZ.pid ended

提示:資料庫啟動時讀取表空間信息時,ob-wp庫中的表ob_users.ibd表數據文件已存在於表空間中。

拓展:
存儲引擎是myisam, 在資料庫目錄下會看到3類文件:.frm、.myi、.myd
      (a) *.frm--表定義,是描述表結構的文件。
      (b) *.MYD--"D"數據信息文件,是表的數據文件。
      (c) *.MYI--"I"索引信息文件,是表數據文件中任何索引的數據樹
存儲引擎是InnoDB, 在data目錄下會看到2類文件:.frm、.ibd
     (a) *.frm--表結構的文件。
     (b) *.ibd--表數據文件

出處:https://www.cnblogs.com/liucx/

方法一:
根據提示信息判定該InnoDB表損壞,於是嘗試將dev_nss庫目錄中的表結構和表數據文件備份
mv ob_termmeta.ibd ob_termmeta.ibd,bak
mv ob_termmeta.frm ob_termmeta.frm.bak
然後重啟了下mysql,發現還是無法啟動,提示其他表數據文件已存在,連續3次將已損壞的文件備份,還是無法啟動。故放棄此方法。


方法二:
1.查閱官網文檔,在mysql配置文件中/etc/my.cnf添加配置,成功啟動
[mysqld]
innodb_force_recovery = 1

2.備份資料庫
mysqldump -h172.168.2.100 -uroot -p -A > mysql_all_bak.sql
如遇報表不存在,mysqldump可以添加參數:--force ,跳過錯誤

3.刪除資料庫
drop database hxdb; 或者將資料庫資料庫目錄 mv hxdb hxdb_bak (保險)

4.去掉參數 innodb_force_recovery
將之前設置的參數去掉後,重新啟動資料庫

5.導入數據
mysql -uroot -p < mysql_all_bak.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1050 (42S01) at line 25: Table '`hxdb`.`tb_info`' already exists

如果提示表已經存在,這是因為將innodb_force_recovery參數去掉後,資料庫會進行回滾操作,會生成相應的ibd文件,所以需要將該文件刪除掉,刪除後重新導入
mysql -uroot -p < mysql_all_bak.sql


註:
innodb_force_recovery參數解釋:崩潰恢復模式,通常只有在嚴重故障排除情況下才會改變。可以的值是從0到6。

只有在緊急情況下才將這個變數設置為大於0的值,這樣你才能啟動InnoDB並轉儲你的表。作為一種安全措施,當innodb_force_recovery大於0時,InnoDB可以防止插入、更新或刪除操作。
在5.6.15,innodb_force_recovery設置為4或更大,將InnoDB設置為只讀模式。由於relay_log_info_repository=TABLE和master_info_repository=TABLE在InnoDB表中存儲信息,這些限制可能導致複製管理命令失敗並出現錯誤。

innodb_force_recovery預設情況下為0(正常啟動而不強制恢復)。允許的非零值 innodb_force_recovery是1到6。較大的值包括較小值的功能。例如,值3包含值1和2的所有功能。
如果能夠轉儲 innodb_force_recovery值為3或更小的表,則相對安全的是,僅丟失損壞的單個頁面上的某些數據。4或更大的值被認為是危險的,因為數據文件可能會永久損壞。值6被認為是過分的,因為資料庫頁面處於過時狀態,這反過來可能會使B樹 和其他資料庫結構遭受更多破壞。

為了安全起見,請InnoDB防止 INSERT, UPDATE或 DELETE在innodb_force_recovery大於0 時進行操作 。從MySQL 5.6.15開始, 在只讀模式下innodb_force_recovery設置4個或更多位置InnoDB。
1 (SRV_FORCE_IGNORE_CORRUPT)
讓伺服器運行,即使它檢測到一個損壞的頁面。嘗試讓SELECT * FROM tbl_name跳過損壞的索引記錄和頁面,這有助於轉儲表。
2 (SRV_FORCE_NO_BACKGROUND)
阻止主線程和任何清除線程運行。如果在清除操作期間發生崩潰,則此恢復值將防止崩潰。
3 (SRV_FORCE_NO_TRX_UNDO)
在崩潰恢復後不運行事務回滾。
4 (SRV_FORCE_NO_IBUF_MERGE)
防止插入緩衝區合併操作。如果它們會導致崩潰,就不要做。不計算表統計信息。此值可能永久損壞數據文件。使用此值後,準備刪除並重新創建所有二級索引。在MySQL 5.6.15中,將InnoDB設置為只讀。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
啟動資料庫時不要查看撤銷日誌:InnoDB甚至會將未完成的事務視為已提交。此值可能永久損壞數據文件。在MySQL 5.6.15中,將InnoDB設置為只讀。
6 (SRV_FORCE_NO_LOG_REDO)
在恢復時不執行重做日誌前滾。此值可能永久損壞數據文件。使資料庫頁面處於過時狀態,這反過來可能會給b -樹和其他資料庫結構帶來更多損壞。在MySQL 5.6.15中,將InnoDB設置為只讀。

出處:https://www.cnblogs.com/liucx/

參閱官網:
https://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_force_load_corrupted

希望能幫到你


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

-Advertisement-
Play Games
更多相關文章
  • Java整個堆大小設置 Xmx 和 Xms設置為老年代存活對象的3-4倍,即FullGC之後的老年代記憶體占用的3-4倍 永久代PermSize和MaxPermSize設置為老年代存活對象的1.2-1.5倍。 永久區並不是老年代的1.2到1.5倍,而是FullGC後永久區的1.2到1.5倍 1.2x ...
  • swap交換記憶體主要是指當物理記憶體不夠用時,系統會啟用硬碟的一部分空間來充當伺服器記憶體,而預設情況下swap記憶體會有一些設置標準,它與物理記憶體的大小也是有關係的,具體標準如下: Ram大小 Swap大小 激活Swap後合計大小 256MB 256MB 512MB 512MB 512MB 1GB 1G ...
  • 一 跨域概述 1.1 同源策略 同源策略是一個安全策略。同源,指的是協議,功能變數名稱,埠相同。瀏覽器處於安全方面的考慮,只允許本功能變數名稱下的介面交互,不同源的客戶端腳本,在沒有明確授權的情況下,不能讀寫對方的資源。 同源策略主要是基於如下可能的安全隱患: 用戶訪問www.mybank.com,登錄併進行網銀 ...
  • 本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。 使用符號連接分佈IO 利用操作系統的符號連接,將不同的資料庫、表、索引指向不同的物理磁碟,從而達到分佈磁碟IO的目的。 禁止操作系統更新文件的atime屬性 對於讀寫頻繁的資料庫文件來說,記錄文件的訪問時間一 ...
  • Linux(Centos 7) 安裝配置 redis 1.下載reids ( 官網:redis.io,中文網:www.redis.cn) 我下載的是5.0.8版本的 第二步:安裝 解壓(到opt目錄) tar -zxvf redis-5.0.8.tar.gz -C /opt 2.檢查環境(安裝red ...
  • 項目里客戶端突然報錯,原因是SQL Server中某個Function返回值有問題,拿來代碼看還是比較簡單的Function,雖然寫法很不好,但是select dbo.fn_xxxfunction(0)返回值是空就有點奇怪。 IF OBJECT_ID('fn_xxxfunction', 'FN') ...
  • 接上一篇《PG-跨庫操作-dblink》;講下postgres_fdw的使用;postgres_fdw工作原理詳細介紹可以去看下《PostgreSQL指南》第4章; 對FDW特性;還支持在PostgreSQL異構資料庫的同步、遷移的場景。FDW隨著Postgres版本而升級、優化,對分散式架構也是支 ...
  • 墨天輪資料庫周刊第33期發佈啦,每周1次推送本周資料庫相關熱門資訊、精選文章、乾貨文檔。 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...