如果mysql-server启用了--bin-log
选项,那么mysql在运行的时候会把执行的事件(事务,sql语句)记录到二进制文件中,在my.cnf文件中--bin-log
可以指定二进制文件存储的位置。
而mysqlbinlog的用途是解析这些二进制文件,变成可读的文本文件。
mysqlbinlog binlog_files | mysql -u root -p
上面命令的意思是,mysqlbinlog把二进制文件解析,然后转给mysql程序处理。其实,mysqlbinlog解析二进制文件后,得到的就是mysql命令。
下面的语句是查看二进制文件的内容:
mysqlbinlog binlog_File | more
如果我们要把mysql的日志在mysql数据库上执行,我们可以用下面的方式:
mysqlbinlog binlog_file1 | mysql -u root -p
如果只有一个二进制文件的时候,这里是没有问题的,如果有多个二进制文件:
mysqlbinlog binlog_file1 | mysql -u root -p
mysqlbinlog binlog_file2 | mysql -u root -p
这样子分开执行可能会有问题。假设在binlog_file1中,有一个语句CREATE TEMPORARYTABLE, 而在binlog_file2中,使用了TEMPORARYTABLE, 这样可能会报表不在的错误。因为temporary表的生命周期是在连接的生命周期内。而上面两个命令,代表了两个数据库连接。
下面的方法可以避免上面的问题:
mysqlbinlog binlog_file1 binlog_file2 | mysql -u root -p
当然,我们也可以把二进制文件的解析结果放到同一个文件,然后再执行:
mysqlbinlog binlog_file1 > /tmp/backup.sql;
mysqlbinlog binlog_file2 >> /tmp/backup.sql;//在backup.sql后面追加
mysql -u root -p -e "/tmp/backup.sql";
恢复指定时间区间的数据
mysqlbinlog binlog_file --start-datetime="2016-09-09 00:00:00" --end-datetime="2016-10-10 00:00:00" | mysql -u root -p;