闪回脚本:mysql_rollback.py

  
 <代码> # !/bin/env python
  # - * -编码:utf - 8 - *
  
  导入系统,系统,再保险,getopt
  进口MySQLdb
  
  主机=' 127.0.0.1 '
  用户="
  密码="
  端口=3306
  start_datetime=' 1971-01-01就是'
  stop_datetime=' 2037-01-01就是'
  start_position=' 4 '
  stop_position=' 18446744073709551615 '
  数据库="
  mysqlbinlog_bin=' mysqlbinlog - v '
  binlog="
  fileContent="
  输出=' rollback.sql '
  only_primary=0
  
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  #功能:获取参数,生成相应的binlog解析文件
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  def getopts_parse_binlog ():
  全球主机
  全球用户
  全球密码
  全球港口
  全球fileContent
  全球产出
  全球binlog
  全球start_datetime
  全球stop_datetime
  全球start_position
  全球stop_position
  全球数据库
  globaloutput=薄ⅰ爸骰?薄ⅰ坝没苈?薄ⅰ?薄ⅰ?薄ⅰ案踫tart-datetime \="
  起始位置,“stop-datetime="=?“停止位置=","数据库=","只有="])
  除了getopt.GetoptError:
  打印”参数输入有误! ! ! ! !”
  选择=[]
  如果选项==[]或[0][0]选项(”——帮助”):
  使用()
  sys.exit ()
  打印”正在获取参数.....”
  名字,价值选择:
  如果名称==? f”或名称==薄猙inlog”:
  binlog=值
  如果名称==? o”或名称==薄涑觥?
  输出=值
  如果名称==? h”或名称==薄骰?
  主机=值
  如果名称==? u”或名称==薄没А?
  用户=值
  如果名称==皃”或名称==薄苈搿?
  密码=值
  如果名称==皃”或名称==薄邸?
  端口=值
  如果name==薄猻tart-datetime”:
  start_datetime=值
  如果name==薄猻top-datetime”:
  stop_datetime=值
  如果name==薄鹗嘉恢谩?
  start_position=值
  如果name==薄V刮恢谩?
  stop_position=值
  如果名称==? d”或名称==薄菘狻?
  数据库=值
  如果name==薄挥小?
  “+数据库+””
  其他:
  condition_database="
  打印”正在解析binlog .....”
  fileContent=操作系统。popen (“% s % s——base64-output=DECODE-ROWS start-datetime=? s”——stop-datetime=? s”——起始位置=? s”——停止位置=' % s ' % s \
  | grep“# # #”- b 2 | sed - e ' s/# # #//g - e ' s/^插入/# #插入/g - e ' s/^更新/# #更新/g - e ' s/^删除/# #删除/g’“\
  % (mysqlbinlog_bin、binlog start_datetime、stop_datetime start_position, stop_position, condition_database)) .read ()
  #打印fileContent
  
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  #功能:初始化binlog里的所有表名和列名,用全局字典result_dict来储存每个表有哪些列
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  def init_col_name ():
  全球result_dict
  全球pri_dict
  全球fileContent
  result_dict={}
  pri_dict={}
  table_list=re.findall (“。*”\ \”。*”, fileContent)
  table_list=列表(设置(table_list))
  # table_list为所有在这段binlog里出现过的表
  打印”正在初始化列名.....”
  在table_list表:
  sname=table.split (“。”) [0] .replace ('”、“)
  tname=table.split (“。”) [1] .replace ('”、“)
  #连接数据库获取列和列id
  试一试:
  康涅狄格州=MySQLdb.connect(主机=主机、用户=用户,密码=密码,端口=int(港口))
  光标=conn.cursor ()
  游标。执行(“选择ordinal_position column_name \
  从information_schema。列\
  在table_schema=' % s '和table_name=' % s '“% (sname tname))
  
  结果=cursor.fetchall ()
  如果结果==():
  打印“警告:”+ sname + '。' + tname +”已删除的
  # sys.exit ()
  result_dict [sname + '。' + tname]=结果
  游标。执行(“选择ordinal_position column_name \
  从information_schema。列\
  table_schema=? s”和table_name=? s”和column_key=案锩贫鹊场薄? (sname tname))
  革命制度党=cursor.fetchall ()
  #印刷革命制度党
  pri_dict [sname + '。' + tname]=革命制度党
  cursor.close ()
  conn.close ()
  MySQLdb除外。错误,e:
  试一试:
  打印”错误% d: % s“% (e。args [0], e.args [1])
  除了IndexError:
  打印“MySQL错误:% s % str (e)
  
  sys.exit ()
  #打印result_dict
  #打印pri_dict
  
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  #功能:拼凑回滚sql,逆序
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  def gen_rollback_sql ():
  全球“==========================================================================================命令行选项:
  ——帮助#:打印帮助信息
  - f, binlog #: binlog文件。(必需)
  - o,输出文件#:输出回滚sql文件。(默认“rollback.sql”)
  - h,主机#:主机。(默认127.0.0.1)
  - u,用户#:用户。(必需)
  # - p,密码:密码。(必需)
  - p,端口#:端口。3306(默认)
  ——start-datetime #: datetime。(默认1970-01-01就是)
  ——stop-datetime #:停止datetime。默认的2070-01-01就是
  ——起始位置#:起始位置。(默认“4”)
  ——停止位置#:停止位置。(默认' 18446744073709551615 ')
  #:- d,数据库列表条目仅为这个数据库(没有默认值)。
  ——只有#:“
  
  打印help_info
  sys.exit ()
  
  if __name__==癬_main__”:
  getopts_parse_binlog ()
  init_col_name ()
  gen_rollback_sql() 

闪回脚本:mysql_rollback.py