MySQL 异常断电恢复方法,如果这个时候服务突然
MySQL异常断电无法启动原因
现在MySQL一般都是用的innodb这种存储引擎,在开始一个事务进行数据的修改时,数据会首先写入到InnoDB的重做日志(redo log),到了一定的程度(例如,达到了特定的时间间隔或日志大小)才会写入到硬盘的文件中。
如果这个时候服务突然崩溃了,例如断电。然后再重新启动MySQL得时候,MySQL会检测到InnoDB数据文件和重做日志之间存在不一致性,然后就会通过一些方法来使得硬盘上的数据何redo log中的数据一致,如果重做日志本身受到损坏就没法完成这个数据的恢复过程,无法保证数据的一致性,MySQL就不给启动。
解决方法
1、通过 使用innodb_force_recovery配置选项忽略一些错误,让服务能启动起来。
当设置了innodb_force_recovery参数,InnoDB会尝试跳过某些操作以启动数据库,但并不是所有的innodb_force_recovery值都会使InnoDB完全处于只读模式。从4开始,数据库就是只读模式了。
innodb_force_recovery可以设置6个值
-
0:默认值。不采取特殊措施
-
1 :让服务器忽略某些潜在的损坏页面错误
-
2 :阻止主线程的运行,这避免了创建新的 redo log 项
-
3 :不执行事务回滚操作
-
4 :阻止插入缓冲区的合并操作
-
5 :不查看撤销日志,这意味着不会尝试恢复任何未完成的事务
-
6 :不执行 redo 日志回放
一般设置这个值,从1开始试,然后尝试正常启动服务器。如果仍然没法启动,就从1开始递增到6。
[mysqld]
innodb_force_recovery=6
2、正常启动服务后,对数据进行备份
mysqldump -uroot -p -A -F --single-transaction --flush-privileges --default-character-set=utf8 > mysqlall_back.sql
3、停止mysql服务并清空mysql数据目录
mv /var/lib/mysql /var/lib/mysql-bak
mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql
4、初始化一个新的MySQL数据目录
# 初始化得root用户无密码,可以无密码登录
mysqld --initialize-insecure
# 这个命令会为root用户创建一个临时随机密码 在MySQL错误日志中找到这个随机生成的临时密码
mysqld --initialize
说明:
-
mysqld --initialize 和 mysqld --initialize-insecure 是从MySQL 5.7.6开始引入的,用以替代旧的mysql_install_db工具
-
需要确保MySQL的数据目录是空的才行,不然没法初始化成功。
-
用户必须有足够的权限来创建、写入和修改MySQL的数据目录中的文件和子目录,所以可以用root用户身份来执行,如果不成功就用mysql用户来下执行。
sudo -u mysql mysqld --initialize-insecure
5、修改配置文件
将配置文件中的 innodb_force_recovery 注释或者将其值改为0
# [mysqld]表示的是mysql服务端的配置
[mysqld]
innodb_force_recovery=0
6、启动服务并还原数据
将上面备份的数据进行还原
sudo systemctl start mysql.service
mysql -uroot -p < mysqlall_back.sql
说明:
如果执行mysqld --initialize-insecure初始化,出现数据目录中数据不全的情况,这个时候把数据目录中的文件全给删了,然后重新再来一次。如果 mysqld --initialize-insecure 还是不行就换 mysqld --initialize。都不行那就需要考虑是不是其它原因影响了。
重新导入数据能恢复正常的原因
-
清除损坏数据: 在导入数据之前,您通常会首先清空或删除原始数据库中的所有数据。这意味着所有的损坏数据、损坏的索引和其他可能的问题都将被移除。
-
重建数据: 重新导入数据时,数据文件将从头开始重新创建。这意味着任何受损的数据页、损坏的索引或其他底层结构都会被新的、整洁的结构替代。
-
重新生成redo log: 从备份重新导入数据时,MySQL会在事务提交时写入新的redo log条目。因此,任何受损的、旧的redo log条目都会被忽略,并且不会影响新导入的数据。
数据表检查
可以使用mysqlcheck命令来检查、修复、优化和分析MySQL中的表,mysqlcheck是安装mysql服务就带了的。
如果MySQL服务器意外关闭(例如,由于电源中断),在重新启动后(可以启动),可以使用 mysqlcheck 来检查和修复可能出现问题的表。
检查所有数据库的所有表:
mysqlcheck -u [username] -p --check-all-databases
检查特定数据库的所有表:
mysqlcheck -u [username] -p [database_name]
修复指定的表
mysqlcheck -u [username] -p --repair [database_name] [table_name]
修复数据库中的所有表:
mysqlcheck -u [username] -p --repair [database_name]
在检查时自动修复任何发现的问题
mysqlcheck -u [username] -p --auto-repair [database_name]