mysql断电恢复

总结摘要
mysql断电恢复

需求

服务器意外断电,导致mysql启动不了

强制恢复后备份

进入恢复模式

在 /etc/my.cnf中添加如下配置:

1
2
[mysqld]
innodb_force_recovery = 1

其中后面的值设置为1、如果1不能启动成功,再逐步增加为2/3/4/5/6等。直到能启动mysql为止!!!

  1. (SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
  2. (SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
  3. (SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
  4. (SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
  5. (SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
  6. (SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

启动mysql服务

1
systemctl start mysqld

mysqldump备份

1
mysqldump -u root -p 123456 xxx > xxx_backup.sql

还原

停止mysql服务

1
systemctl stop mysqld

注释恢复模式,设置新的数据目录

在 /etc/my.cnf中添加如下配置:

1
2
3
4
5
[mysqld]
# 恢复模式
# innodb_force_recovery = 1
datadir=/home/data/mysql
socket=/home/data/mysql/mysql.sock

新建并配置新的数据目录

1
2
3
4
5
6
7
8
9

# 备份数据目录
cp -r /xxx/mysql /xxx/mysql_bak
# 新建目录
mkdir -p /home/data/mysql
# 将目录授权给mysql用户组
chown -R mysql:mysql /home/data/mysql
# 更改目录权限也可以不加权限防止其他用户无法访问比如root用户设置750权限普通用户访问mysql.sock文件可能存在权限不够
chmod 750 /home/data/mysql

重新初始化配置内容

1
mysqld --defaults-file=/etc/my.cnf  --initialize --user=mysql

关闭selinux

1
2
3
4
5
6
7
# 查看selinux状态
getenforce
# 临时关闭
setenforce 0
- 永久关闭(需要重启系统)
vim /etc/selinux/config
SELINUX=disabled

启动mysqld

1
systemctl start mysqld

获取初始密码

1
grep 'temporary password' /var/log/mysqld.log

登录,创建新数据库,设置登录密码,设置允许网络访问

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 用初始密码登录
mysql -u root -p
# 创建数据库
create schema xxx;
# 进入mysql库
use mysql;
# 修改密码(修改为自己的密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxx';
#更新域属性'%'表示允许外部访问
update user set host ='%' where user ='root';
#授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
#刷新权限
FLUSH PRIVILEGES;
#退出mysql
quit;

如果输入密码,提示错误。

SQLSTATE[HY000] [2002] Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (mysql.sock是服务启动时候生成的文件)

1
2
# 新建mysql.sock软链接
ln -s /home/data/mysql/mysql.sock /var/lib/mysql/mysql.sock

mysql还原

1
mysql -u root -p 123456 xxx < xxx_backup.sql