MySQL被黑客攻击勒索5000美元,幸好有备份

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL被黑客攻击勒索5000美元,幸好有备份

黑客被攻击发送的短信

958500a6d7f84d309cf8f2a76d158b01.png



一、设计场景


1)增量备份在周一到周六凌晨3点,复制mysql-bin.00000*到指定目录;
2)全量备份则使用mysqldump将整个数据库导出,
每周日凌晨3点执行,并会删除上周留下的mysq-bin.00000*,然后对mysql的备份操作会保留在bak.log文件中。


二、技术点


Mysqldump、mysqlbinlog、crontab


三、服务器信息


主机:centos7;数据库:mysql5.7


四、准备工作


4.1 开启binlog日志功能


binlog日志默认不开启,记录的是mysql数据库dml的操作


mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+


4.2 新建目录,执行


which mysql
#mkdir /home/mysql
#cd /home/mysql
#mkdir mysql-bin    #增量日志文件目录


4.3 修改所属的用户/组:(不修改,mysql无法重启)


#chown -R mysql.mysql mysql-bin


4.4 修改mysql配置文件,执行


#vim /etc/my.cnf
其中,server-id表示单个结点的id,这里由于只有一个结点,
所以可以把id随机指定为一个数,这里将id设置成1。
若集群中有多个结点,则id不能相同(对于5.7以下版本不需要指定server-id);
log_bin指定binlog日志文件的存储路径,日志文件以mysql-bin开头。
加入以下内容:
server-id=1
log_bin=/home/mysql/mysql-bin/mysql-bin


aa8b85583cb8400eb4fc2878f5558bd8.png

4.5 重启mysql,执行


#service mysqld restart    --root用户执行


(5)查看日志文件


#cd /home/mysql/mysql-bin
[root@Jeames mysql-bin]# ll
total 8
-rw-r----- 1 mysql oinstall 154 Jan 14 05:45 mysql-bin.000001
-rw-r----- 1 mysql oinstall  39 Jan 14 05:45 mysql-bin.index
(6)进入数据库,查看启动效果
#mysql -uroot -p
#show variables like '%log_bin%';
+---------------------------------+---------------------------------------+
| Variable_name                   | Value                                 |
+---------------------------------+---------------------------------------+
| log_bin                         | ON                                    |
| log_bin_basename                | /home/mysql/mysql-bin/mysql-bin       |
| log_bin_index                   | /home/mysql/mysql-bin/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                   |
| log_bin_use_v1_row_events       | OFF                                   |
| sql_log_bin                     | ON                                    |
+---------------------------------+---------------------------------------+


五、编写全量备份脚本(Mysql-FullyBak.sh)


 进入/home/mysql目录
新建目录:mkdir backup
进入backup目录,新建daily目录:mkdir daily
切换到/home/mysql目录,执行
#vim Mysql-FullyBak.sh      --脚本中注意日期中+前面的空格及单引号
--------------------------------------------------------
#mysqldump to Fully backup mysql data per week!
source /etc/profile
BakDir=/home/mysql/backup
LogFile=/home/mysql/backup/bak.log
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
/usr/bin/mysqldump -uroot -proot --quick --events --databases wmp --flush-logs \
--delete-master-logs --single-transaction >$DumpFile
/bin/tar -zvcf $GZDumpFile $DumpFile
/bin/rm $DumpFile
oldDate=`date -d '7 days ago' +%Y%m%d`
oldBakFile=${oldDate}".sql.tgz"
/bin/rm $oldBakFile
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile
cd $BakDir/daily
/bin/rm -f *
参数说明:
–flush-logs
结束当前日志,生成新日志文件。
–delete-master-logs
清除以前的日志,以释放空间。
–quick
该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
–single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。
–events
导出事件
–master-data=2
其中参数–master-data=[0|1|2]
0: 不记录
1:记录为CHANGE MASTER语句
2:记录为注释的CHANGE MASTER语句
–master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称,
用于日后恢复时参考,例如输出的备份SQL文件中含有:
CHANGE MASTER TO MASTER_LOG_FILE=’MySQL-bin.000002′, MASTER_LOG_POS=106;


六、编写增量备份脚本


切换到/home/mysql目录,执行:
#vim Mysql-DailyBak.sh
-------------------------------------------
#use cp to bakup mysql data everyday!
source /etc/profile
BakDir=/home/mysql/backup/daily
BinDir=/home/mysql/mysql-bin
LogFile=/home/mysql/backup/bak.log
BinFile=/home/mysql/mysql-bin/mysql-bin.index
/usr/bin/mysqladmin -uroot -proot flush-logs
Counter=`wc -l $BinFile |awk '{print $1}'`   #产生新的mysql-bin.00000*文件
NextNum=0
#比对$Counter和¥NextNum这两个值来确定文件是不是最新的
for file in `cat $BinFile`
do
     base=`basename $file`
     #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
     NextNum=`expr $NextNum + 1`
     if [[ $NextNum -eq $Counter ]]
     then
        echo $base skip! >> $LogFile
      else
        dest=$BakDir/$base
         if(test -e $dest)
        #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
         then
               echo $base exist! >> $LogFile
         else
                cp $BinDir/$base $BakDir
                echo $base copying >> $LogFile
          fi
fi
done
chmod a+x test.sh  --给所有用户执行test.sh读写的权限


七、设置定时任务crontab

057056c5ab1c45d4a676fde68e7e0abb.png

65a5386d29a54eb988d665e7e11b096c.png
在命令行输入:
#crontab -e
添加相应的任务,wq存盘退出
#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /bin/bash -x /home/mysql/Mysql-FullyBak.sh >/dev/null 2>&1
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /bin/bash -x /home/mysql/Mysql-DailyBak.sh >/dev/null 2>&1
(2)查看定时任务:#crontab -l
参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 ;
  crontab -l //列出某个用户cron服务的详细内容;
  crontab -r //删除所有用户的cron服务;
  crontab -e //编辑某个用户的cron服务;
  例如:root查看自己的cron设置:crontab -u root -l
  例如:root删除用户fred的cron设置:crontab -u fred -r
补充:
(1)可直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务(针对整个系统的crontab文件);
(2)crontab执行定时任务的记录会写入到/var/log/cron这个文件中,该记录以帐号为区分。


ff0fdfa659ac4422bf23300b1068d8ff.png

八、恢复操作


恢复过程亦会写入日志文件,如果数据量很大,建议先关闭binlog日志功能
1、场景:假设早上9点的时候,数据库被攻击,drop了整个数据库!
2、恢复思路:
利用全备的sql文件中记录的CHANGE MASTER语句,binlog文件及其位置点信息,
找出binlog文件中增量的那部分。
用mysqlbinlog命令将上述的binlog文件导出为sql文件,并剔除其中的drop语句。
通过全备文件和增量binlog文件导出的sql文件,就可以恢复到完整的数据。
恢复步骤:
(1)首先,解压最新的全量备份文件,进入备份文件目录,执行
#cd /home/mysql/backup
#tar -zxvf XXX.sql.tgz
(2)查看全备之后新增的binlog文件,执行
#grep CHANGE XXX.sql        --全备文件
即mysql-bin.000027的154行,因此在该文件之前的binlog文件中的数据都已经包含在这个全备的sql文件中。
(3)将其他binlog文件(除去mysql-bin.000027)导出sql文件,执行
#mysqlbinlog mysql-bin.00000X >00Xbin.sql
(4) vim编辑最新的00Xbin.sql删除其中的drop语句
(5)恢复全备数据,执行:
#mysql -uroot -p < XXX.sql
如:#mysql -uroot -p < 20210115.sql
(7)恢复增量数据,执行(wmp为数据库名称)
#mysql -uroot -p wpm<00Xbin.sql
如:#mysql -uroot -p wmp<000027bin.sql
补充(若没删除,直接通过增量备份恢复)
若要恢复mysql-bin.000027文件的154行之后的信息
进入到mysql-bin.000027目录,执行(wmp为数据库名)
#cd daily
#mysqlbinlog --start-position=154 --database=wmp mysql-bin.000027 | mysql -uroot -p
至此数据库全部恢复完成
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
82 4
|
19天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
42 3
|
19天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
30 3
|
2月前
|
安全 关系型数据库 MySQL
MySQL用户备份
【10月更文挑战第2天】MySQL用户备份
59 3
|
2月前
|
存储 关系型数据库 MySQL
MySQL如何备份?
【10月更文挑战第2天】MySQL如何备份?
112 3
|
4月前
|
SQL 关系型数据库 MySQL
在Linux中,如何备份和恢复MySQL数据库?
在Linux中,如何备份和恢复MySQL数据库?
|
4月前
|
SQL 数据可视化 关系型数据库
MySQL 备份可视化巡检系统
MySQL 备份可视化巡检系统
|
4月前
|
存储 关系型数据库 MySQL
MySQL备份与恢复
MySQL备份与恢复
59 0
|
4月前
|
关系型数据库 MySQL Shell
分享一篇mysql数据库备份脚本
分享一篇mysql数据库备份脚本
35 0
|
4月前
|
关系型数据库 MySQL Shell
MySQL 备份:从mysqldump全备中 匹配出某几个表
MySQL 备份:从mysqldump全备中 匹配出某几个表