视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
悲伤的故事,当不小心删了线上的数据库
2020-11-09 06:50:54 责编:小采
文档


前言

  由于最近开学季,我司又做的是高校相关的业务,所以比较忙,都没有什么时间来写文章,人一旦太忙的话就容易忙中出错。我呢就在前几天,不是,是我有个朋友在前几天去操作线上的数据库时,差点表演了一波删库跑路。

  提前说明:真的是我朋友,不是我。真的是我朋友,不是我。真的是我朋友,不是我。不过为了叙事方便,以下把“我朋友”简称为“我”。

  事情是这样的,我在对比部分表结构时发现这个库和其他库的表结构差的比较多,所以以为这个环境是没有在使用的环境,就直接对这几张表进行了一个覆盖操作,刚好这几张表还是和学生钱包相关的,然后到晚上10点多公司的前方驻校人员在群里反馈说是为什么钱包里钱变成0.0了,我一看到这个就直接吓尿了,想着是不是该跑路了。

  不过幸好看过一些数据库恢复的方案,还是略知一二。

数据恢复

1.开启binlog日志

我使用的binlog日志来恢复数据,要用binlog肯定首先得确保binlog日志是开启状态的,可以用命令来查看。

show variables like 'log_%';复制代码

可以看到它是ON状态的,表示已开启,如果它是OFF状态的话,在my.cnf中[mysqld]后添加配置后重启mysql服务来开启。

# my.cnf文件
[mysqld]
log-bin=mysql-bin
server-id=1复制代码

2.查看binlog日志

确保开启binlog日之后,可以通过命令来查看binlog日志状态。

# 查看binlog日志的目录show master status;复制代码
# 查看binlog日志内容show binlog events IN 'mysql-bin.000002';复制代码
  • Log_name 表示binlog日志名称
  • Pos 表示pos起始点
  • Event_type 表示此次操作的类型
  • Server_id 表示机器id,由my.cnf中配置指定
  • End_log_pos 表示pos结束点
  • Info 表示具体语句
  • # 进入存储binlog日志的文件木了,可以通过这条命令查看详情
     mysqlbinlog --base-output=decode-rows -v mysql-bin.000002;复制代码
    # 将binlog日志转为txt导出
    mysqlbinlog --base-output=decode-rows -v mysql-bin.000002 > sql.txt复制代码

    3.恢复数据

    binlog日志恢复数据的话,常用的有命令行恢复,或者是把binlog日志拷贝出来,用读取binlog的工具来转成.sql文件,然后把里面的需要用到的sql都复制出来然后再跑一遍,这里主要讲的是命令行恢复的方法。

    命令行恢复主要是通过排查binlog日志,确认要恢复的起始点和结束点后,输入命令进行恢复。或者是预估一下自己误操作失误的时间,通过一个时间段来恢复数据。

    # 通过起始点和结束点恢复 
    mysqlbinlog --start-position="582" --stop-position="9414" mysql-bin.000002 | mysql -uroot -proot;复制代码
    # 通过起始时间和结束时间来恢复,传入的时间可以是一个yyyy-MM-dd HH:mm:ss 的时间格式,也可以是一个时间戳
    mysqlbinlog --start-datetime="2020-9-1 8:25:04" --stop-datetime="2020-9-1 20:00:00" mysql-bin.000002 | mysql -uroot -proot复制代码

    可以看到,在输入恢复命令后,我清空的数据库数据又回来了。

    4.问题

    binlog日志虽然可以恢复数据,但是也存在问题,当binlog日志在不断增大后,会进行自动删除,那就导致已经删除的那部分日志的数据就恢复不了了。

    不过binlog日志的大小和保存时间都是在可以在mysql中进行设置的。不过还是推荐做好每日的备份,这样可保万无一失。

    # 设置文件大小,单位是字节,下面换算是100Mset global max_binlog_size=104857600;
    
    # 设置文件保存天数,下面是保存7天,默认值为0,表示"没有自动删除"set global expire_logs_days = 7;复制代码

    每日备份

    对于线上环境来说,做好每日备份和binlog一起用才是王道。线上一般都是部署在linux上的,所以这里就简单列一下linux的定时备份方法。

    1.检查是否安装定时任务,安装crontab

    yum install crontabs复制代码

    2.设置定时任务

    /var/spool/cron/root 此文件为crontab定时任务,可通过crontab -e或者直接修改此文件修改.

    crontab -l查看定时任务.

    3.创建一个shell脚本

    touch xxx.sh

    mysqldump -uroot -p"密码" 数据库名 > /mysql/person_`date +%Y%m%d`.sql复制代码

    4.修改文件权限

    chmod 777 xxx.sh

    5.打开定时任务文件

    crontab -e

    每天凌晨2点执行
    00 2 * * * /xxx.sh复制代码

    完结!

    想了解更多编程学习,敬请关注php培训栏目!

    下载本文
    显示全文
    专题