<代码> # !/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()