MySQL 啟動后隨即關閉或啟動失敗 [ innodb表空間損壞、innodb_force_recovery強制啟動 ]


OS: CentOs7

MySQL: 5.7.26-log

 

開發環境數據庫mysql運行一段時間了,突然出現了異常:啟動mysql后隨即就又關閉了,mysql服務啟動失敗!

查看mysql錯誤日志如下:

 

分析日志后發現,數據庫無法重啟的原因是因為ibdata1文件 (即共享表空間) 損壞,重啟后無法正常恢復。

 

解決辦法:


1. 需要跳過恢復步驟,修改my.cnf文件,在my.cnf中的[mysqld]中添加:

#innodb_force_recovery參數解釋:
#-------------------------------------------------------------------------------------------------------------
#innodb_force_recovery影響整個InnoDB存儲引擎的恢復狀況,默認值為0,表示當需要恢復時執行所有的恢復操作!!
#當不能進行有效的恢復操作時,Mysql有可能無法啟動,並記錄下錯誤日志。
# 
#innodb_force_recovery可以設置為1-6,大的數字包含前面所有數字的影響。
#當該參數的數值設置大於0后,可以對表進行select,create,drop操作,但insert,update或者delete這類操作是不允許的。
# 
#innodb_force_recovery=0   表示當需要恢復時執行所有的恢復操作;
#innodb_force_recovery=1   表示忽略檢查到的corrupt頁;
#innodb_force_recovery=2   表示阻止主線程的運行,如主線程需要執行full purge操作,會導致crash;
#innodb_force_recovery=3   表示不執行事務回滾操作;
#innodb_force_recovery=4   表示不執行插入緩沖的合並操作;
#innodb_force_recovery=5   表示不查看重做日志,InnoDB存儲引擎會將未提交的事務視為已提交;
#innodb_force_recovery=6   表示不執行前滾的操作,強制重啟!
#-------------------------------------------------------------------------------------------------------------

innodb_force_recovery = 6
innodb_purge_threads = 1

 

2. 重啟Mysql服務,發現可正常啟動。如果還是無法啟動,則就需要刪除mysql數據目錄下的 "ibdata1、ib_logfile*" 等文件 (刪除前,提前做好備份),然后再做Mysql服務啟動操作!

 

3. 啟動成功后,此時MySQL為只讀模式,把所有數據導出到新的目標服務。

建議采用如下腳本進行導出,mysqldump出的sql文件有語法格式問題。

#創建DB
mysql -h192.168.1.121 -u用戶名 -p密碼 -A -N -e "create database if not exists 數據庫名稱 CHARACTER SET utf8 COLLATE utf8_general_ci;"
#同步數據
mysqldump -h192.168.1.120 -u用戶名 -p密碼 --default-character-set=utf8 --opt 數據庫名稱 | mysql -h192.168.1.121 -u用戶名 -p密碼 --default-character-set=utf8 -C 數據庫名稱

 

4. 導入導出的數據至新的MySQL即可。

 

同步腳本:

#!/bin/bash

HOST="192.168.1.120"
USER="root1"
PASSWORD="密碼"

TARGET_HOST="192.168.1.121"
TARGET_USER="root2"
TARGET_PWD="密碼"


CURRENT_DIR=$(pwd)
CHARSET="--default-character-set=utf8"


#這里面有兩個參數,-A、-N,-A的含義是不去預讀全部數據表信息,這樣可以解決在數據表很多的時候卡死的問題
#-N,很簡單,Don't write column names in results,獲取的數據信息省去列名稱
SHOW_DB_MYSQL_CMD="mysql -h${HOST} -u${USER} -p${PASSWORD} ${CHARSET} -A -N -e \"show databases;\""

mysql_db_list="$(eval ${SHOW_DB_MYSQL_CMD})"

db_name_str=$(echo ${mysql_db_list} | sed 's/ /,/g' | sed 's/\n//g' | sed 's/-/@002d/g')

OLD_IFS="$IFS"
IFS=","
db_name_array=($db_name_str)
IFS="$OLD_IFS"


echo "Start MySql Sync......";
echo ""
echo ""



#同步數據
for db_name in ${db_name_array[@]}
do
    ###跳過的庫
    if [ "${db_name}"x = "mysql"x ] || [ "${db_name}"x = "information_schema"x ] || [ "${db_name}"x = "performance_schema"x ]; then
        continue
    fi
    
    echo ""
    echo "創建db: ${db_name}"
    create_db_cmd="mysql -h${TARGET_HOST} -u${USER} -p${PASSWORD} -e \"create database if not exists ${db_name} CHARACTER SET utf8 COLLATE utf8_general_ci;\""
    echo "${create_db_cmd}"
    #eval ${create_db_cmd}
    
    echo "開始同步db: ${db_name}"
    sync_data_cmd="mysqldump -h${HOST} -u${USER} -p${PASSWORD} ${CHARSET} --opt ${db_name} | mysql -h${TARGET_HOST} -u${TARGET_USER} -p${TARGET_PWD} ${CHARSET} -C ${db_name}";
    echo "${sync_data_cmd}"
    #eval ${sync_data_cmd}
done


#回到當前目錄
echo ""
echo "Return to source directory:${CURRENT_DIR}";
cd ${CURRENT_DIR}


echo ""
echo ""
echo "MySql Sync is Successfully !";

 

 

PS:

https://www.cnblogs.com/kevingrace/p/5892103.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM