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