二进制日志记录了数据库的所有改变,使得任何Slave都可以通过执行Master二进制日志保持数据的一致。
二进制日志仅包含可能改变数据库的语句。那些尚没有但是可能改变数据库的语句也会记录下来,注意那些可能带来变化的语句,如DROP TABLE IFEXISTS CREATE IF NOT EXISTS,以及那些不匹配任何行的语句,select语句一般不会被记录,因为它们不会对数据库做任何改动。
服务器上的事务通常不是一个接一个顺序执行的,而是交错的并行执行,为了防止两个事务之间产生冲突导致不一致的结果,服务器要确保事务的执行是顺序化的。二进制日志按Master上的提交顺序记录事务,虽然事务可能在Master上交错执行,但每个事务在二进制日志中的顺序是不变的,取决于事务的提交(commit)时间。 二进制日志的结构
看上图,二进制日志由若干个文件组成,事件存储在一系列binlog文件中,文件名类似于host-bin.000001,还有一个索引文件通常文件名为host-bin.index,索引文件跟踪服务器使用的所以binlog文件,索引文件的每一行都包含了一个binlog文件的完整文件名,使用这些命令,如PURGE BINARY LOGS,RESTART MASTER FLUSH LOGS,添加或删除binlog文件,也导致索引文件添加或删除行。 数据安全
比较常见的敏感信息就是密码,当执行改变数据库中表的语句,并且它包含访问这个表所必须的密码的时候,包含密码的事件就会被写入二进制日志。
例:
update employee set pass= password(‘123456’) where email = ‘mats@example.com’;
如果复制是正确的,最好重写这个语句,可以通过以下方法实现:计算和存储哈希密码到用户自定义变量,然后在表达式中使用它:
set @password =password(‘123456’);
update employee set pass= @password where email = ‘mats@example.com’;
由于set语句没有被复制,密码将不会存储在二进制日志中,而仅在执行该语句的时候存储在服务器内存中。 清除binlog文件
随着时间的推移,服务器会集聚binlog文件,要使服务器自动清理旧的binlog文件,需设置expire-logs-days选项。这个选项可用来作为一个服务器变量,达到你想保留binlog文件的天数,如果希望在重启后仍保持自动清除,必须添加该设置到my.cnf文件。
使用PURGE BINARY LOGS 命令手工清除binlog文件,有如下两种格式:
PURGE BINARYLOGS BEFORE datetime
这个命令格式将清除在给定时间之前的所有binlog文件。如果datetime在一个日志文件的中间,那么datetime所在的那个文件之前的所有文件将被清除。 实战演练:
1、由于是通过日期时间删除,我们先要知道需要删除那个时间之前的二进制日志。
mysqlbinlog --force-if-open--base64-output=never mysql-bin.000003
2、假如我们需要删除2014/09/09之前的日志,执行如下命令:
PURGE BINARY LOGS BEFORE 140909;
PURGE BINARY LOGS TO ‘filename’
这个命令格式将清除在给定文件之前的所有文件。也就是Show master logs 命令输出的所有文件中,在filename之前的文件都将被删除。 实战演练:
PURGE BINARY LOGS TO 'mysql-bin.000002';