欢迎投稿

今日深度:

MySQL 异常断电恢复方法,如果这个时候服务突然

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。都不行那就需要考虑是不是其它原因影响了。


重新导入数据能恢复正常的原因

  1. 清除损坏数据: 在导入数据之前,您通常会首先清空或删除原始数据库中的所有数据。这意味着所有的损坏数据、损坏的索引和其他可能的问题都将被移除。

  2. 重建数据: 重新导入数据时,数据文件将从头开始重新创建。这意味着任何受损的数据页、损坏的索引或其他底层结构都会被新的、整洁的结构替代。

  3. 重新生成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]

www.htsjk.Com true http://www.htsjk.com/Mysql/47177.html NewsArticle MySQL 异常断电恢复方法,如果这个时候服务突然 MySQL异常断电无法启动原因 现在MySQL一般都是用的innodb这种存储引擎,在开始一个事务进行数据的修改时,数据会首先写入到InnoDB的重做...
评论暂时关闭