当前位置:   article > 正文

基于阿里云RDS数据误删除的回滚方案_set @@global.foreign_key_checks=0 没有权限 阿里云rds

set @@global.foreign_key_checks=0 没有权限 阿里云rds

场景是这样子的:

如果有人不小心删了数据库,怎么办?

       主从?恐怕不行,数据实时同步,备库的数据也被删了。

       那从库延迟同步,如何?嗯嗯,应该可以。那问题来了。如果延迟同步的情况下,发生数据库误删除,运维人员赶紧切到从库上,终究是能尽快的恢复业务,只是有一部分数据会丢失,那么怎样让服务继续运行的情况下,补回那一部分丢失的数据呢?

      这种情况下,我的脚本就派上用场了!


我的思路是这样子的:

     忘记一件事,强调一下,在切换到从库之前,请将关键表中的主键如果是自增ID,那请将自增ID向后增大一定数值,这样是为了让丢失的数据能补回!

     alter table users AUTO_INCREMENT=xxxxx; 这个语句应该是可帮助你的.

    有些请款,可能需要暂时关闭外键set foreign_key_checks=0;

     言归正传的讲,我们当时的场景是这样的,我们用的阿里云的RDS,所以恢复之前还得先下载binlog日志。

    所以准备条件就这样的:

1. 需要在阿里云上创建一个子账号,

2. 需要aliyuncli工具调用RDS接口,得到binlog日志内网下载地址。

3. 需要在灾备RDS上创建一个binlog的账号

4. 需要一个下载binlog日志并能解包的脚本

5. 需要一个将binlog日志转换成可用sql的脚本


开始干活写脚本

1. 利用aliyuncli工具,输入如下命令:

aliyuncli rds DescribeBinlogFiles--DBInstanceId rdsid --StartTime 2017-02-15T14:00:00Z --EndTime2017-02-15T14:30:00Z

脚本: 

  1. #!/usr/bin/python
  2. #coding:utf-8
  3. import os,sys
  4. import json
  5. import time
  6. def get_url():
  7. #urlContent = os.popen("aliyuncli rds DescribeBinlogFiles--DBInstanceId rdsid --StartTime 2017-02-17T10:00:00Z --EndTime2017-02-17T12:00:00Z")
  8. DBId = ''
  9. starttime = '2017-02-20 09:00:00'
  10. endtime = '2017-02-20 12:00:00'
  11. starttime = conv_time(starttime,8)
  12. endtime = conv_time(endtime,8)
  13. urlContent = os.popen("aliyuncli rds DescribeBinlogFiles--DBInstanceId %s --StartTime %s --EndTime%s"%(DBId,starttime,endtime)).read()
  14. urlContent = json.loads(urlContent)
  15. urlfile = file('urlfile','w+')
  16. for url in urlContent['Items']['BinLogFile']:
  17. if url['HostInstanceID'] == 1669377:
  18. print url
  19. urlfile.write('%s\n'%url["IntranetDownloadLink"])
  20. urlfile.close()
  21. def conv_time(n_time,n=8):
  22. s_time = time.mktime(time.strptime(n_time,"%Y-%m-%d%H:%M:%S"))
  23. addtime = 3600 * n
  24. f_time = s_time -addtime
  25. n_time =time.strftime("%Y-%m-%dT%H:%M:%SZ",time.localtime(f_time))
  26. return n_time
  27. if __name__ == '__main__':
  28. get_url()



2. 得到的内网地址,放入urlfie文件

 

#!/bin/bash
 
wget -c -i /opt/binlog/rds_binlog/urlfile-P /opt/binlog/rds_tar
if [ $? != 0 ];then
   echo "wget error"
fi
cd /opt/binlog/rds_sql
ls /opt/binlog/rds_tar/*.tar* |xargs -n1tar xvf



3. 利用python脚本对binlog日志进行转换

  脚本思路:

 1. 利用binlog工具进行转换成sql,但是sql有些需要去转换成我们可识别的形式

  2. 转换sql,查询mysql的表字段,利用正则表达式匹配insert,delete,update的语句,将所有@1这种类型的字段进行转换

  1. #encoding:UTF-8
  2. #!/usr/bin/python
  3. import os,sys,re,getopt
  4. import MySQLdb
  5. import time,datetime
  6. host =''
  7. user = ''
  8. password = ''
  9. port = 3306
  10. start_datetime = ''
  11. stop_datetime = ''
  12. start_position = ''
  13. stop_position = ''
  14. database = ''
  15. mysqlbinlog_bin = 'mysqlbinlog -v'
  16. binlog = ''
  17. fileContent = ''
  18. output='rollback.sql'
  19. only_primary = 1
  20. tmp_binlog_file ="tmp_binlog_file"
  21. field_list = ''
  22. #----------------------------------------------------------------------------------------
  23. # 功能:获取参数,生成相应的binlog解析文件
  24. #----------------------------------------------------------------------------------------
  25. def getopts_parse_binlog():
  26. globalhost
  27. globaluser
  28. globalpassword
  29. globalport
  30. globalfileContent
  31. globaloutput
  32. globalbinlog
  33. globalstart_datetime
  34. globalstop_datetime
  35. globalstart_position
  36. globalstop_position
  37. globaldatabase
  38. globalonly_primary
  39. try:
  40. options,args= getopt.getopt(sys.argv[1:],"f:o:h:u:p:P:d:",["help","binlog=","output=","host=","user=",\
  41. "password=","port=","start-datetime=","stop-datetime=","start-position=","stop-position=","database=","only-primary="])
  42. exceptgetopt.GetoptError:
  43. print"参数输入有误!!!"
  44. options= []
  45. ifoptions == [] or options[0][0] in ("--help"): #如果输入错误或者--help则提示帮助信息
  46. usage() #显示帮助信息
  47. sys.exit()
  48. print"正在获取参数......"
  49. printoptions
  50. forname, value in options:
  51. ifname == "-f" or name == "--binlog":
  52. binlog= value
  53. elifname == "-o" or name == "--output":
  54. output= value
  55. elifname == "-h" or name == "--host":
  56. host= value
  57. elifname == "-u" or name == "--user":
  58. user= value
  59. elifname == "-p" or name == "--password":
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/307277
推荐阅读
相关标签
  

闽ICP备14008679号