暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL binlog 提取 delete 并转换为 insert

原创 Jeff 2023-11-09
1093

MySQL binlog 提取 delete 并转换为 insert

# 循环 tab 表清单进行 delete 操作转换 insert sql文件 # 输入 DBname dbname=database_name # for 循环 tab 表清单进行 delete 操作转换 insert sql文件 for tab in table_name1 table_name2; do # mysqlbinlog 抓取指定表的delete行到 $tab.delete.txt 文件,一般挖掘的delete语句格式为"DELETE FROM `$dbname`.`$tab`" mysqlbinlog -vv -d $dbname --start-datetime='2023-11-09 12:30:00' --stop-datetime='2023-11-09 13:10:00' binlog.001221 | awk -v a="$dbname.$tab" -v b="\`$dbname\`.\`$tab\`" -v dl="DELETE FROM" '$0~dl && ($0~a || $0~b) { while(1){ print $0; getline; if($0 !~ /^###/){ break; }; } }' >$tab.delete.txt # 替换每行开头字符串 "### " 为空(即删除) sed -i 's/^### //g' $tab.delete.txt # 替换每行开头字符串 "DELETE FROM" 为"INSERT INTO" sed -i "s/^DELETE FROM/INSERT INTO/g" $tab.delete.txt # 替换每行开头字符串 "WHERE" 为"VALUES(" sed -i "s/^WHERE/VALUES(/g" $tab.delete.txt # 或取表的列数量 lastnum=$(tail -n 1 $tab.delete.txt | awk -F"=" '{print $1}') # 在每个最后列下一行插入字符串");" sed -i "/${lastnum}=.*/a\);" $tab.delete.txt echo "${dbname}.${tab}-${lastnum}" # 替换每行第一个"="为"JeffStartSplit",作为截取字符串开始标识 sed -i 's/=/JeffStartSplit/' $tab.delete.txt # 替换每行第后一个"/*"(即:字符串倒序第一个"*/")为"JeffStopSplit"(即:字符串倒序"tilpSpotSffeJ"),作为截取字符串结束标识 rev $tab.delete.txt | sed 's/\*\//tilpSpotSffeJ/' | rev >$tab.temp.txt # 以字符串JeffStartSplit或JeffStopSplit截取文件,判断文件中每行是否以"INSERT"或"VALUES"或");"字符串开头 # 是:打印所有列;否:以","拼接打印第二列(即列值,如果最后会多一个",",后面有处理),打印内容输入到文件$tab.insert.sql cat $tab.temp.txt | awk -F"JeffStartSplit|JeffStopSplit" '{ if($0 ~ /^INSERT|^VALUES|^);/){ print $0; }else{ printf $2","; }; }' >$tab.insert.sql rm -rf $tab.*.txt tail -3 $tab.insert.sql # 替换 ",);" 为 ");" sed -i 's/,);/);/g' $tab.insert.sql # 该表处理完成,打印生成的sql文件完整路径 echo -e "# Get insert sql in $(realpath $tab.insert.sql)\n\n" done
最后修改时间:2023-11-15 09:35:34
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论