记录一次MySQL恢复

一、前言

此文章由一次数据库被黑客删除而引发

由于对于Linux操作、docker使用、MySQL原理这些都相对不是很熟悉,所以记录下来避免以后在工作中遇到类似的问题而惊慌失措。

1.MySQL环境现状

docker管理的,8.0.26版本

启动语句:

shell 复制代码
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的状态
sql 复制代码
show variables like '%log_bin%';

下面是我的binlog日志目录

2)如何开启binlog日志

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

shell 复制代码
#log-bin=ON
#log-bin-basename=mysqlbinlog
binlog-format=ROW
log-bin=mysqlbinlog

需重启MySQL容器

3)查看binlog 事件

有以下几种方式:

sql 复制代码
show binary logs; //等价于show master logs;
show master status;
show binlog events;
show binlog events in 'mysqlbinlog.000001';

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

sql 复制代码
show binlog events in 'binlog.000001'

通过这个可以大致的查找是从哪个地方开始删除的。

并且可以看到他添加了一张 RECOVER_YOUR_DATA的表,里面是勒索信息

2.通过binlog恢复

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

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

日志文件规则:

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

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

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

最终确定开始位置为:

binlog000002

编号:233

时间:240626 14:45:09

结束位置为

binlog000003

编号:33849

时间:240701 21:51:25

3)恢复操作
sql 复制代码
//按指定时间恢复
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文件即可

sql 复制代码
mysqlbinlog --start-position=233 binlog.000002 --stop-position=33849 binlog.000003 | mysql -uroot -p123456

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

1.Linux防火墙命令

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

2.进入docker的MySQL容器

1)docker attach
shell 复制代码
docker attach mysql
  • docker attach 容器名称或容器ID

【注】

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

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

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

shell 复制代码
apt-get update && apt-get install vim
shell 复制代码
apt-get update && apt-get install lrzsz

4.Linux查看文件常用命令

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

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


#3.文本内容非空行加上行编号输出
cat -b file_name
(2)分页查看文本内容:

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

shell 复制代码
more file_name

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

shell 复制代码
less file_name

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

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

1.查看显示文首内容

shell 复制代码
#head -n [number] file_name

head -n 100 file_name

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

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

shell 复制代码
head -c 10 file_name
(2)tail命令

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

1.显示文尾多少行内容

shell 复制代码
#tail -n [number] file_name

tail -n 100 file_name

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

shell 复制代码
tail -f log_file

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

shell 复制代码
tail -f -s 10 log_file

#10秒钟刷新一次

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

shell 复制代码
tail -c 10 file_name
相关推荐
momo小菜pa13 分钟前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke22 分钟前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
小宇成长录41 分钟前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.1 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
权^2 小时前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql
万事大吉CC6 小时前
mysql单表查询·3
数据库·mysql
苹果醋312 小时前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
计算机学姐15 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
-XWB-15 小时前
【MySQL】数据目录迁移
数据库·mysql
掘根16 小时前
【MySQL】Ubuntu环境下MySQL的安装与卸载
数据库·mysql·centos