在mysql的机制里,除了采用mysqldump来对数据库进行完整备份外,还有一种方式配合起来更加的强大和灵活,就是二进制日志回滚法.
概念&功能:二进制日志是指,当你进行数据流的操作时,数据库会记录除了select以的sql操作,例如update、delete、alter……,记录的类型包含了完整的sql语句、操作时间、执行时间、错误代码等。
有了二进制日志,就可以将数据回滚到任意时刻,比如数据库崩溃的前夕,或者其他灾难的前一时刻,几乎可以做到数据0丢失,能够体验到时光倒流,如同“穿越”的感觉。
使用方法:要想使用二进制日志,首先确定你的数据库版本支持,自mysql5.1开始二进制日志就取代了原来的“更新日志”。
打开配置文件my.cnf进行选项设置,代码如下:
[mysqld] log-bin=<path> //phpfensi.com
这样当你重启mysql服务器的时候,就会创建相应的目录和文件。文件名是以数字序号为扩展名的文件,如果在配置文件中设置了分割大小值,当单个二进制文件达到这个限制时就会自动生成一个新的文件,也可以使用在工具mysqladmin中运行flush-logs命令来手动刷新,以及再次运行mysqldump进行完整备份时加参数–flush-logs或–deletel-masger-logs 来刷新或删除日志。
这些mysql日志我们可以使用mysqlbinlog二进制日志文件工具处理
服务器生成的二进制日志文件写成二进制格式。要想检查这些文本格式的文件,应使用mysqlbinlog实用工具。
应这样调用mysqlbinlog,代码如下:
shell> mysqlbinlog [options] log-files...
例如,要想显示二进制日志binlog.000003的内容,使用下面的命令,代码如下:
shell> mysqlbinlog binlog.0000003
输出包括在binlog.000003中包含的所有语句,以及其它信息例如每个语句花费的时间、客户发出的线程ID、发出线程时的时间戳等等.
查看二进制日志,代码如下:
mysqlbinlog xxx-bin.000989
配合grep筛选,代码如下:
mysqlbinlog xxxx-bin.000989 |grep uid=9527
当然也可以通过正则而模糊查看,代码如下:
mysqlbinlog xxxx-bin.[0-9]*
运行回滚操作:
如果不是进行回滚,不要执行这条 mysqlbinlog xxxx-bin.[0-9]* | mysql
注意事项:如果在my.cnf中指定了默认编码,将会导致二进制查看时报错unknown variable ‘default-character-set=utf8′,这是一个bug,个人理解是由于客户端和配置文件的这一方式二进制根据没有进行相应的更新支持,预计在以后的版本中就消除这个bug,临时的解决方法就是注释掉配置文件中这一句,不用重启mysql服务,带使用完这个工具,在将注释去掉即可.
如果使用了二进制日志,则对性能有一定影响,据官方预计在1%左右,当然,对于它所起到的强大作用而言,1%性能损耗是完全值得的.