Mysql二进制日志
特点:
1:二进制日志以一种更有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。
2:二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。
3:二进制日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果你想要记录所有语句(例如,为了识别有问题的查询),你应使用一般查询日志。
4:二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。
5:二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。
6:运行服务器时若启用二进制日志则性能大约慢1%。但是,二进制日志的好处,即用于恢复并允许设置复制超过了这个小小的性能损失。
Windows 启用mysql二进制日志:
mysql有以下几种日志:
错误日志: -log-err
查询日志: -log
慢查询日志: -log-slow-queries
更新日志: -log-update
二进制日志: -log-bin
如图看出log_bin没有启动:
Mysql二进制恢复详解_数据库
启动mysql二进制文件:
更改my.ini:
[mysqld]
#binlog
server-id=1
log-bin=c:/mysqlbin/binlog.log
log-bin-index=c:/mysqlbin/binlog.index
重启mysql
net stop mysql
net start mysql
再查看mysql二进制status:
如图看出log_bin已经启动:
Mysql二进制恢复详解_休闲_02
查看二进制文件:
Mysql二进制恢复详解_数据库_03
执行mysqlbinlog命令查看日志:
Mysql二进制恢复详解_Mysql_04
为了方便查看日志内容 可以导出到.sql文件:
Mysql二进制恢复详解_二进制_05
然后创建数据库,创建一个表,并添加记录。
mysql>flush logs;  --产生第一个日志文件
mysql> create table test(id int auto_increment not null primary key,val int,data varchar(20));
mysql> insert into test(val,data) values(10,'liang');
mysql> insert into test(val,data) values(20,'jia');
mysql> insert into test(val,data) values(30,'hui');
mysql> flush logs; --产生第二个日志文件
mysql> insert into test(val,data) values(40,'aaa');
mysql> insert into test(val,data) values(50,'bbb');
mysql> insert into test(val,data) values(60,'ccc');
mysql> delete from test where id between 4 and 5;  --删除记录
mysql> insert into test(val,data) values(70,'ddd');
mysql> flush logs; --产生第三个文件文件
mysql> insert into test(val,data) values(80,'dddd');
mysql> insert into test(val,data) values(90,'eeee');
mysql> drop table test; --删除表
二进制恢复表:
mysqlbinlog c:\mysqlbin\binlog.000002 | mysql -uroot -proot
Mysql二进制恢复详解_二进制_06
mysqlbinlog c:\mysqlbin\binlog.000003 --stop-pos=861 | mysql -uroot -proot
Mysql二进制恢复详解_二进制_07
mysqlbinlog c:\mysqlbin\binlog.000003 --start-pos=992 | mysql -uroot -proot
Mysql二进制恢复详解_Mysql_08
mysqlbinlog c:\mysqlbin\binlog.000004 --stop-pos=564 | mysql -uroot -proot
Mysql二进制恢复详解_二进制_09
举例:当只是需要恢复部分记录的时候,可以使用时间点或位置点来定位
shell> mysqlbinlog --start-date="2009-04-20 9:01:00" --stop-date="2009-04-20 10:00:01" mysql-bin.000001 | mysql -uUser -pUserPWD
shell> mysqlbinlog --start-position="368301" --stop-position="368312" mysql-bin.000001 | mysql -uUser -pUserPWD
如果MySQL服务器上有多个要执行的二进制日志,安全的方法是在一个连接中处理它们。
原因:假设第1个日志文件包含一个CREATE TEMPORARY TABLE语句,第2个日志文件包含一个使用该临时表的语句,则会造成问题。
恢复多个二进制日志文件的方法:
shell> mysqlbinlog hostname-bin.000001 hostname-bin.000002 | mysql -uUser -pUserPWD
另一个方法:
shell> mysqlbinlog hostname-bin.000001 >  /tmp/statements.sql
shell> mysqlbinlog hostname-bin.000002 > /tmp/statements.sql
shell> mysql -uUser -pUserPWD -e "source /tmp/statements.sql"
连接mysql服务器查看和删除二进制日志文件查看二进制日志文件
mysql> SHOW BINLOG EVENTS \G;
mysql> SHOW MASTER LOGS;
清除二进制日志文件
mysql> PURGE { MASTER|BINARY } LOGS TO 'log_name';
mysql> PURGE { MASTER|BINARY } LOGS BEFORE 'datetime';
例如:
mysql> PURGE MASTER LOGS TO 'mysql-bin.000001';
mysql> PURGE MASTER LOGS BEFORE '2009-12-20 13:00:00';
另一种清除二进制日志方法
mysql > flush logs;
mysql > reset master;