忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 19573 | 回复: 10

mysqlbinlog分析 [复制链接]

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 10:44 |显示全部楼层
使用和不使用--base64-output=decode-rows的区别:

[root@mysql-n1 binlog]# mysqlbinlog--base64-output=decode-rows ./mysql
-bin.000003 >base_rows.log
[root@mysql-n1 binlog]# mysqlbinlog./mysql-bin.000003 >nobase_rows.log

用对比工具分析两个log的结果:

20120810.png

可以知道row-format的binlog消失了。

因此:

[root@mysql-n1 binlog]# mysqlbinlog --base64-output=decode-rows -v ./mysql-bin.000003

可以注释掉row-format的binlog,出现可识别的sql(不过也是注释的)


论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 10:48 |显示全部楼层
再继续通过分析binlog

[root@mysql-n1 binlog]# mysqlbinlog --base64-output=decode-rows -v ./my
sql-bin.000003  |  grep -e "^##* UPDATE" -e "^##* INSERT" -e "^##* DELE
TE" -e "^##* REPLACE" -i -e "^update" -e "^insert" -e "^delete" -e "^re
place"
### INSERT INTO zsd.user
### INSERT INTO zsd.user
### INSERT INTO zsd.user
### INSERT INTO zsd.user
### INSERT INTO zsd.user
### INSERT INTO zsd.user

可以把每条的记录(update,insert,delete,replace)都可以统计出来。

其中:
grep指令:
-e, --regexp=PATTERN      use PATTERN as a regular expression
-i, --ignore-case         ignore case distinctions (忽视大小写差别)

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 11:12 |显示全部楼层
学习awk指令:

awk例子:
[root@mysql-n1 binlog]# vi test
wo zhang sheng dong

[root@mysql-n1 binlog]# cat ./test |awk -F ' ' '{print $1,$2,$3}'
wo zhang sheng

这里awk的意思是:以空格为分界符,输出前三个域。

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 11:30 |显示全部楼层
学习sed指令:基本用法

[root@mysql-n1 binlog]# vi test2
###zhang
###liu
###hu

[root@mysql-n1 binlog]# cat test2 |sed 's/^##*//g'
zhang
liu
hu

sed指令有着替换的功能:类似的例子:s/pig/cow/g (意思:把pig变成cow)

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 11:32 |显示全部楼层
基于awk和sed命令的使用,我在继续分析mysql日志,可以得到:

[root@mysql-n1 binlog]# mysqlbinlog --base64-output=decode-rows -v ./my
sql-bin.000003  |  grep -e "^##* UPDATE" -e "^##* INSERT" -e "^##* DELE
TE" -e "^##* REPLACE" -i -e "^update" -e "^insert" -e "^delete" -e "^re
place"|  awk -F ' ' ' { print $1,$2,$3,$4}' |  sed 's/^##*//g'
INSERT INTO zsd.user
INSERT INTO zsd.user
INSERT INTO zsd.user
INSERT INTO zsd.user
INSERT INTO zsd.user
INSERT INTO zsd.user
UPDATE zsd.user
DELETE FROM zsd.user

替换掉前面所用的'###'

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 11:36 |显示全部楼层
使用tr '[A-Z]' '[a-z]' (把所有的大写字母变成小写)

[root@mysql-n1 binlog]# mysqlbinlog --base64-output=decode-rows -v ./my
sql-bin.000003  |  grep -e "^##* UPDATE" -e "^##* INSERT" -e "^##* DELE
TE" -e "^##* REPLACE" -i -e "^update" -e "^insert" -e "^delete" -e "^re
place"|  awk -F ' ' ' { print $1,$2,$3,$4}' |  sed 's/^##*//g'|tr '[A-Z
]' '[a-z]'
insert into zsd.user
insert into zsd.user
insert into zsd.user
insert into zsd.user
insert into zsd.user
insert into zsd.user
update zsd.user
delete from zsd.user

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 11:59 |显示全部楼层
学习sed命令,基础第二阶:

sed -e "s/\t/ /g;s/\`//g;s/(.*$//;"

其中-e:
  -e script, --expression=script
                 add the script to the commands to be executed



上面的命令:"s/\t/ /g;s/\`//g;s/(.*$//;" 得拆分看:

s/\t/ /g; (把制表符换成空格)
s/\`//g;  (把`换成空)
s/(.*$//; (把(.*----.*为捡破烂模式,通吃所有的字符串.)

例子:
[root@mysql-n1 binlog]# vi test3
`zhangshengdong(..???\\zkdkjsdji%##

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 12:00 |显示全部楼层
[root@mysql-n1 binlog]# cat ./test3 | sed -e "s/\t//g;s/\`//g;s/(.*$//;"
zhangshengdong

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 12:05 |显示全部楼层
然后,再继续分析binlog日志:

mysqlbinlog --base64-output=decode-rows -v ./mysql-bin.000003  \
|  grep -e "^##* UPDATE" -e "^##* INSERT" -e "^##* DELETE" -e "^##* \
REPLACE" -i -e "^update" -e "^insert" -e "^delete" -e "^replace"|  \
awk -F ' ' ' { print $1,$2,$3,$4}' |  sed 's/^##*//g' | tr '[A-Z]' '[a-z]' \
|  awk -F ' ' ' { if($1=="update") {$3=""} print $1,$2,$3}' \
|  sed -e "s/\t/ /g;s/\`//g;s/(.*$//;s/[a-zA-Z0-9\_\-]*\.//;s/ set .*$//;s/ as .*$//" \

insert into user
insert into user
insert into user
insert into user
insert into user
insert into user
update user
delete from user

(把前面的zsd.都祛除了)

论坛徽章:
1
2015亚冠之本尤德科
日期:2015-06-05 17:25:48
发表于 2012-08-10 12:12 |显示全部楼层
sort命令:

sort -nr

-n, --numeric-sort          compare according to string numerical value
-r, --reverse               reverse the result of comparisons

例子:
[root@mysql-n1 binlog]# cat finally.log
insert into user
insert into user
insert into user
insert into user
insert into user
insert into user
update user
delete from user
[root@mysql-n1 binlog]# cat finally.log |sort
delete from user
insert into user
insert into user
insert into user
insert into user
insert into user
insert into user
update user
[root@mysql-n1 binlog]# cat finally.log |sort |uniq -c
      1 delete from user
      6 insert into user
      1 update user
[root@mysql-n1 binlog]# cat finally.log |sort |uniq -c |sort -nr
      6 insert into user
      1 update user
      1 delete from user
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP