记录一次MySQL恢复

一、前言

此文章由一次数据库被黑客删除而引发
33d80d1a14156feb2092a70ad859564.png
由于对于Linux操作、docker使用、MySQL原理这些都相对不是很熟悉,所以记录下来避免以后在工作中遇到类似的问题而惊慌失措。

1.MySQL环境现状

docker管理的,8.0.26版本
启动语句:

docker run -d -p 3306:3306 --restart=always -v /data/soft/mysql/conf:/etc/mysql/conf.d -v /data/soft/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name  mysql mysql:8.0.26

2.存在的问题

  1. root密码简单导致被黑客攻击了,也是这次恢复的起因
  2. 数据卷挂载地址不是自己的常用地址,因为是直接用的之前虚拟机中的启动语句
  3. 没有对配置文件进行修改,配置常用的一些配置
    1. 还好MySQL8以后binlog日志默认开启
  4. 在装docker的时候把防火墙关了,想着我这破服务器没人看得上,就没开

3.恢复之后需要做的事情

  1. 修改数据卷挂载
  2. 配置常用的配置
  3. 安全方面
    1. 加强root密码
    2. 平时使用时,避免使用root账户
    3. 对访问数据库的ip进行限制
    4. 防火墙关了之后,处理完事务,要立即打开

二、恢复过程

1.查看binlog日志信息

MySQL5.7版本binlog默认不开启,MySQL8默认开启。

1)查看binlog的状态
show variables like '%log_bin%';

image.png
下面是我的binlog日志目录
image.png

2)如何开启binlog日志

需要修改my.cnf或my.ini配置文件,在[mysqld]下面增加 log_bin=mysql_bin_log,重启MySQL服务。

#log-bin=ON
#log-bin-basename=mysqlbinlog
binlog-format=ROW
log-bin=mysqlbinlog

需重启MySQL容器

3)查看binlog 事件

有以下几种方式:

show binary logs; //等价于show master logs;
show master status;
show binlog events;
show binlog events in 'mysqlbinlog.000001';

我目前的binlog日志是 binlog.000001-binlog.000010

show binlog events in 'binlog.000001'

通过这个可以大致的查找是从哪个地方开始删除的。
image.png
并且可以看到他添加了一张 RECOVER_YOUR_DATA的表,里面是勒索信息

2.通过binlog恢复

1)防止恢复数据后影响最新业务

需要执行flush logs,产生一个新的binlog文件,此时旧的binlog文件不会再有写入。

日志文件规则:

  1. 当停止或重启服务器时,服务器会把日志文件记入下一个日志文件,MySQL会在重启时生成一个新的日志文件,文件序号递增
  2. 如果日志文件超过max_binlog_size(默认值1G)系统变量配置的上线时,也会生成新的日志文件(在这里需要注意的是,如果你正使用大的事务,二进制日志还会超过max_binlog_size,不会生成新的日志文件,事务全写入一个二进制日志中,这种情况主要是为了保证事务的完整性)
  3. 日志被刷新时,新生成一个日志文件
2)找到恢复的起始位置
  • 数据恢复的开始位置
  • 数据恢复的结束位置
mysqlbinlog "文件名"
mysqlbinlog "文件名" > "test.sql"

通过mysqlbinlog将binlog转为sql,方面查询具体位置

mysqlbinlog --set-charset=utf-8 /var/lib/mysql/binlog.000001>backuptmp000001.sql

image.png
最终确定开始位置为:
binlog000002
编号:233
时间:240626 14:45:09

image.png
结束位置为
binlog000003
编号:33849
时间:240701 21:51:25

3)恢复操作
//按指定时间恢复
mysqlbinlog --start-datetime="2020-04-25 18:00:00" --stop datetime="2020-04-26 00:00:00" mysqlbinlog.000002 | mysql -uroot -p1234
//按事件位置号恢复
mysqlbinlog --start-position=154 --stop-position=957 mysqlbinlog.000002
| mysql -uroot -p1234

因为我的起始位置是在两个binlog里面,将起始位置各加上binlog文件即可

mysqlbinlog --start-position=233 binlog.000002 --stop-position=33849 binlog.000003 | mysql -uroot -p123456

三、恢复过程中的Linux语句记录

1.Linux防火墙命令

  1. 查看firewall服务状态
systemctl status firewalld
  1. 查看firewall的状态
firewall-cmd --state
  1. 开启防火墙
service firewalld start
  1. 重启防火墙
service firewalld restart
  1. 关闭防火墙
service firewalld stop
  1. 查看防火墙规则
firewall-cmd --list-all 

2.进入docker的MySQL容器

1)docker attach
docker attach mysql
  • docker attach 容器名称或容器ID

【注】
使用attach命令有一个问题,当有多个窗口同时使用该命令进入同一个容器时,所有的窗口中的信息都会同步显示,如果有一个窗口阻塞了,别的窗口也无法再进行其他操作。所以该命令只适合于自己的开发环境

2)docker exec
docker exec -it mysql bash
  • docker exec -it 容器名称或容器ID bash
  • bash:在mysql容器里面新开了一个bash进程,在该终端可以通过命令和mysql容器交互,类似于通过Xshell和远程linux服务器交互

3.docker容器内安装vim,ez,sz

apt-get update && apt-get install vim
apt-get update && apt-get install lrzsz

4.Linux查看文件常用命令

1)查看文件类型
file file_name
2)查看文本内容
(1)查看全部文本内容:
#1.输出所有文本内容
cat file_name

#2.文本内容所有行加上行编号输出
cat -n file_name


#3.文本内容非空行加上行编号输出
cat -b file_name

(2)分页查看文本内容:

1.more命令(常用的分页工具)

more file_name

2.less命令(more升级版分页工具)

less file_name

#显示行
less -N file_name
3)查看部分文件内容
(1)head命令

显示文件开头一些行的内容,默认显示文件前10行

1.查看显示文首内容

#head -n [number] file_name

head -n 100 file_name

#或不加 -n,head -100 file_name 也是显示文首100行内容

2.输出文首最后的多少个字节

head -c 10 file_name
(2)tail命令

显示文件最后一些行的内容,默认显示文件最后10行

1.显示文尾多少行内容

#tail -n [number] file_name

tail -n 100 file_name

2.当文件增长时输出追加的数据,比如日志实时生成,(Ctrl+c终止显示)

tail -f log_file

3.在-f与-s参数配合,睡眠几秒后再进行追加显示

tail -f -s 10 log_file

#10秒钟刷新一次

4.输出文尾最后的多少个字节

tail -c 10 file_name
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL Slave库恢复是指在主从复制的环境下,当从库出现异常或数据丢失时,需要将从库数据恢复到与主库一致的状态。下面是一次MySQL Slave库恢复的实战记录,供参考: 1. 确认从库数据丢失或异常情况 在主从复制的环境下,当从库出现异常或数据丢失时,需要先确认是从库数据丢失还是复制链路中出现问题。 可以通过以下方式进行确认: - 在从库上执行 SHOW SLAVE STATUS 命令,查看 Slave_IO_Running 和 Slave_SQL_Running 的状态,如果其中任意一个为 NO,则说明复制链路出现了问题; - 在从库上执行 SELECT COUNT(*) FROM 表名 命令,查看数据是否与主库一致,如果不一致,则说明从库数据出现了异常或数据丢失。 2. 确认主库数据一致性 在从库数据出现异常或数据丢失之前,需要先确认主库数据是否一致,可以通过以下方式进行确认: - 在主库上执行 SELECT COUNT(*) FROM 表名 命令,查看数据数量与从库是否一致; - 在主库上执行 SHOW MASTER STATUS 命令,查看 File 和 Position 的值。 如果主库数据不一致或者无法确认主库 File 和 Position 的值,则需要先进行主库数据修复。 3. 停止从库复制 在从库数据出现异常或数据丢失后,需要先停止从库复制,可以执行 STOP SLAVE 命令。 4. 备份主库数据 在进行从库恢复前,需要先对主库进行备份,可以通过以下方式进行备份: - 执行 mysqldump 命令备份主库数据; - 将主库数据目录进行复制备份。 5. 恢复从库数据 在备份主库数据后,需要将备份数据恢复到从库中,可以通过以下方式进行恢复: - 执行 mysql 命令将备份数据导入到从库中; - 将备份数据目录进行复制恢复。 6. 启动从库复制 在恢复从库数据后,需要启动从库复制,可以执行 START SLAVE 命令。 7. 确认从库数据一致性 在从库复制成功后,需要再次确认从库数据是否与主库一致,可以通过以下方式进行确认: - 在从库上执行 SELECT COUNT(*) FROM 表名 命令,查看数据数量与主库是否一致; - 在从库上执行 SHOW SLAVE STATUS 命令,查看 Slave_IO_Running 和 Slave_SQL_Running 的状态是否正常。 以上就是一次MySQL Slave库恢复的实战记录,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值