MySQL異常宕機(jī)無(wú)法啟動(dòng)的處理過(guò)程
環(huán)境
- oom異常關(guān)閉導(dǎo)致 MySQL5.7 啟動(dòng)失敗。
同事導(dǎo)入數(shù)據(jù)時(shí)異常關(guān)閉,應(yīng)該是數(shù)據(jù)量太大導(dǎo)致mysql崩潰,嘗試重啟失敗了提示如下:
Database was not shutdown normally! 2021-02-26T21:33:29.691452+08:00 0 [Note] InnoDB: Starting crash recovery. 2021-02-26T21:33:30.287496+08:00 0 [Note] InnoDB: Starting an apply batch of log records to the database... InnoDB: Progress in percent: 0 1 2 3 4 5 6 7 8 9 10 11 12 #進(jìn)度到這里自動(dòng)退出了
配置文件修改參數(shù) innodb_force_recovery = 1 ---->將0 修改為1 ---->沒(méi)有設(shè)置的可以在mysqld下添加參數(shù)
注解:
innodb_force_recovery可以是設(shè)置1-6,數(shù)字大的包含數(shù)字小的功能,所以我們要從1開(kāi)始設(shè)置來(lái)嘗試啟動(dòng)mysql innodb_force_recovery=0,關(guān)閉恢復(fù)功能 正常啟動(dòng) innodb_force_recovery=1,即使發(fā)現(xiàn)了損壞頁(yè)面也繼續(xù)讓服務(wù)器繼續(xù)運(yùn)行,這個(gè)選項(xiàng)對(duì)于備份或者轉(zhuǎn)存當(dāng)前數(shù)據(jù)尤為有用 innodb_force_recovery=2,阻止恢復(fù)主線(xiàn)程的運(yùn)行,如果清除操作會(huì)導(dǎo)致服務(wù)器掛掉 innodb_force_recovery=3,恢復(fù)后不回滾事務(wù) innodb_force_recovery=4,如果插入到緩沖區(qū)的合并操作會(huì)導(dǎo)致系統(tǒng)崩潰,將不會(huì)被執(zhí)行 innodb_force_recovery=5,啟動(dòng)數(shù)據(jù)庫(kù)時(shí),忽略撤消日志 innodb_force_recovery=6,啟動(dòng)數(shù)據(jù)庫(kù)時(shí),忽略與恢復(fù)相關(guān)的前滾日志
配置恢復(fù)
配置完成后重洗啟動(dòng)數(shù)據(jù)庫(kù)
#先打開(kāi)日志 [root@db02 ~]# tail -f /mydata/3306/log/mysql-error.log #啟動(dòng)了很久顯示失敗 [root@db02 ~]# /etc/init.d/mysqld restart ERROR! MySQL server PID file could not be found! Starting MySQL.................................................................................................................................... ERROR! The server quit without updating PID file (/mydata/3306/data/db02.pid). #查看日志顯示已經(jīng)恢復(fù)到百分之百了 2021-02-26T21:40:27.983238+08:00 0 [Note] InnoDB: Starting an apply batch of log records to the database... InnoDB: Progress in percent: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 2021-02-26T21:41:26.220425+08:00 0 [ERROR] InnoDB: Waited for 10 seconds for 256 pending reads 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 #再往下翻翻發(fā)現(xiàn)錯(cuò)誤點(diǎn)----->是因?yàn)閱⒂昧嘶謴?fù)時(shí)啟用了 innodb_force_recovery 參數(shù) 2021-02-26T21:42:11.303902+08:00 0 [ERROR] InnoDB: innodb_force_recovery is on. We do not allow database modifications by the user. Shut down mysqld and edit my.cnf to set innodb_force_recovery=0 mysqld: Operation not allowed when innodb_forced_recovery > 0. 2021-02-26T21:42:11.306255+08:00 0 [ERROR] Aborting
關(guān)閉此參數(shù)
#關(guān)閉innodb_force_recovery 參數(shù) [root@db02 ~]# vim /etc/my.cnf innodb_force_recovery = 0
啟動(dòng)數(shù)據(jù)庫(kù)
[root@db02 ~]# /etc/init.d/mysqld start Starting MySQL.. SUCCESS!
注:
到這里數(shù)據(jù)庫(kù)就起來(lái)了,如果配置為1無(wú)法啟動(dòng)數(shù)據(jù)庫(kù)可以在往后注意嘗試,直到可以啟動(dòng)為止。
檢查是否有損壞的表
配置跳過(guò)表和網(wǎng)絡(luò)啟動(dòng)
mysqld_safe --skip-grant-tables --skip-networking &
檢查是否啟動(dòng)
ps -ef|grep mysql
打開(kāi)日志觀(guān)察是否有損壞的表
tail -f /mydata/3306/log/err.log
檢查損壞的表并嘗試修復(fù)
mysqlcheck -A --auto-repair -uroot -p -A
如損壞的表過(guò)多則重新初始化數(shù)據(jù)庫(kù),初始化前先備份
沒(méi)有損壞的表可以繼續(xù)使用當(dāng)前實(shí)例運(yùn)行。
壞表處理
備份數(shù)據(jù)庫(kù)
mysqldump -uroot -p -A -R -E --triggers >/tmp/dump.sql
創(chuàng)建新的初始化目錄
mkdir /mydata/3306/data_new
授權(quán)
chown -R mysql:mysql /mydata/3306/data_new
修改my.cnf
vim /etc/my.cnf datadir=/mydata/3306/data_new # 改為新的 # skip_grant_tables # 注釋此選項(xiàng) # innodb_force_recovery # 注釋此選項(xiàng)
初始化mysql
mysqld --initialize-insecure --basedir=/mysql/mysql57 --datadir=/mydata/3306/data_new
關(guān)閉舊 mysql
pkill mysql
啟動(dòng)mysql
/etc/init.d/mysqld start # 這個(gè)文件里要改成新的數(shù)據(jù)目錄名去啟動(dòng)
注:如果報(bào)socket錯(cuò)誤可以做個(gè)軟連接或者改配置文件即可。
連接mysql
mysql -uroot -p
將備份導(dǎo)入到新庫(kù)
source /tmp/dump.sql 或者 mysql < /tmp/dump.sql
檢查數(shù)據(jù)
此時(shí)已經(jīng)恢復(fù)完成,可以將MySQL停止,將舊數(shù)據(jù)目錄和新數(shù)據(jù)目錄重命名回去,修改配置文件,以恢復(fù)原狀。
優(yōu)化系統(tǒng)和 MySQL 配置優(yōu)化
系統(tǒng)配置優(yōu)化
cat >/etc/sysctl.conf<<'EOF' vm.swappiness=0 # 減少 swap 分區(qū)使用 vm.overcommit_memory = 1 # 允許所有內(nèi)存分配 EOF # 生效 sysctl -p
MySQL 配置優(yōu)化
# 配置文件永久修改 vim /etc/my.cnf innodb_buffer_pool_size = 2G # 將緩沖池配置為系統(tǒng)當(dāng)前可用內(nèi)存的 3/4 # 命令行臨時(shí)修改 set global innodb_buffer_pool_size=(select 2*1024*1024*1024);
以上就是MySQL異常宕機(jī)無(wú)法啟動(dòng)的處理過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于MySQL宕機(jī)無(wú)法啟動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何解決mysql無(wú)法關(guān)閉的問(wèn)題
在本篇文章里小編給大家整理的是一篇關(guān)于解決mysql無(wú)法關(guān)閉的問(wèn)題的相關(guān)內(nèi)容,需要的朋友們可以參考下。2020-08-08Xtrabackup使用指南 InnoDB數(shù)據(jù)備份工具
Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線(xiàn)熱備份(備份時(shí)不影響數(shù)據(jù)讀寫(xiě)),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品2011-10-10完美轉(zhuǎn)換MySQL的字符集 解決查看utf8源文件中的亂碼問(wèn)題
本人轉(zhuǎn)換過(guò)好多數(shù)據(jù)了,也用過(guò)了好多的辦法,個(gè)人感覺(jué)最好用的就是使用MySQL命令導(dǎo)出導(dǎo)入中將字符集轉(zhuǎn)換過(guò)去2011-11-11MySQL中導(dǎo)出用戶(hù)權(quán)限設(shè)置的腳本分享
這篇文章主要介紹了MySQL中導(dǎo)出用戶(hù)權(quán)限設(shè)置的腳本分享,本文通過(guò)導(dǎo)出mysql.user表中數(shù)據(jù)實(shí)現(xiàn)導(dǎo)出權(quán)限設(shè)置,需要的朋友可以參考下2014-10-10MySQL全文索引在數(shù)據(jù)庫(kù)中的應(yīng)用和優(yōu)勢(shì)(模糊查詢(xún)不用like+%)
全文索引技術(shù)可以有效地從大量文本中檢索信息,適用于搜索引擎和電商平臺(tái)等場(chǎng)景,InnoDB從MySQL5.6開(kāi)始支持全文索引,使用倒排索引實(shí)現(xiàn),全文檢索分為自然語(yǔ)言搜索、布爾搜索和查詢(xún)擴(kuò)展搜索三種模式,全文索引提高了模糊查詢(xún)的效率,優(yōu)化了基于文本的搜索查詢(xún)2024-09-09MySQL存儲(chǔ)過(guò)程相互調(diào)用并獲得錯(cuò)誤碼示例
這篇文章主要介紹了MySQL存儲(chǔ)過(guò)程相互調(diào)用并獲得錯(cuò)誤碼,需要的朋友可以參考下2014-03-03