记录一次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
相关推荐
风随心飞飞1 小时前
linux 环境下mysql 数据库自动备份和清库 通过crontab 创建定时任务实现mysql数据库备份
linux·数据库·mysql
奥尔特星云大使1 小时前
读写分离中间件简介
数据库·mysql·中间件·读写分离
disanleya3 小时前
MySQL数据库安装后,如何设置自动化备份策略?
mysql
奥尔特星云大使4 小时前
mysql高可用架构之MHA部署(二)VIP漂移(保姆级)
android·mysql·架构·mha·ip漂移
-Xie-4 小时前
Mysql杂志(三十一)——Join连接算法与子查询、排序优化
数据库·mysql
程序新视界4 小时前
在连表查询场景下,MySQL隐式转换存在的坑
数据库·mysql·dba
咋吃都不胖lyh5 小时前
MySQL 与Power BI 的作用,以及在数据分析中扮演的角色
mysql·数据分析·powerbi
瓯雅爱分享12 小时前
Java+Vue构建的采购招投标一体化管理系统,集成招标计划、投标审核、在线竞价、中标公示及合同跟踪功能,附完整源码,助力企业实现采购全流程自动化与规范化
java·mysql·vue·软件工程·源代码管理
咋吃都不胖lyh15 小时前
SQL-多对多关系
android·mysql·数据分析
哲Zheᗜe༘17 小时前
了解学习MySQL数据库基础
数据库·学习·mysql