• Home
  • About
    • Xrlin photo

      Xrlin

      A blog for sharing my thoughts and knowledge

    • Learn More
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

记一次数据恢复的经历

29 Nov 2017

Reading time ~1 minute

缘起

今天有多名用户反映自己的配置丢失,导致访问受限, 起初以为是一个系统的严重性bug,后来对代码几经推敲并未发现逻辑漏洞,后来通过对近一周的log逐一分析比对,终于找到了原因,原来是一名具有较高权限用户的误操作,导致用户配置被误删/(ㄒoㄒ)/~~

处理

  1. 从log筛选相关避免信息以便从历史数据中恢复, 通过查看网络请求日志,找到该用户的操作记录,并筛选出误操作请求及参数。

  2. 备份数据筛选及恢复: 由于是6天前的误操作,现有的线上数据较之前已经有了很大变动, 数据库不可能保留每个时间点的备份,只能根据6天前较早时刻的数据进行恢复,由于备份操作是针对整个库进行,没有对每个数据表分开备份,所以只能从备份文件中选择相关的表并导入临时数据库中进行进一步清理并将结果导入线上数据库,为了从mysql的全库备份文件中筛选出特定的表数据,使用linux的sed命令从Mysql_backup.dump文件中分离出roles表的数据到roles.dump中:

sed -n -e '/DROP TABLE.*`roles`/,/UNLOCK TABLES/p' Mysql_backup.sql > roles.sq

因为sed命令是一次处理一行内容,通过临时缓冲区存放处理结果,通过sed命令可以高效处理大文本,避免内存耗尽, 使用-n选项启用silent模式只输出-e参数匹配的行, 并通过管道写入roles.dump这个文件, roles.dump文件中存在该次备份roles表的结构和数据,分别导出相关的表后导入到临时库中,通过log筛选出的数据在临时库中进行查询筛选后导出对应数据, 将这部分数据写入线上完成了数据的恢复同时不会影响到线上其余数据。



MySql Like Tweet +1