binlog二进制日志包含描述数据库更改的“事件”,如表创建操作或表数据更改。除非使用基于行的日志记录,否则它还包含可能已进行更改的语句的事件(例如,不匹配任何行的DELETE)。二进制日志还包含关于每个语句花费多长时间更新数据的信息。二进制日志有两个重要的用途:
1、备份,用于从服务器的备份。主服务器将二进制日志中包含的事件发送给从服务器,从服务器执行这些事件以对主服务器进行相同的数据更改。
2、恢复,某些数据恢复操作需要使用二进制日志。备份恢复后,将重新执行备份后记录的二进制日志中的事件。这些事件使数据库从备份时起保持最新的数据。
其中:二进制日志不用于SELECT或SHOW等不修改数据的语句。在进行了修改后数据不变的情况下也会将此修改记录到二进制文件。要记录所有语句(例如,要识别问题查询),请使用常规查询日志。
在运行启用了二进制日志记录的服务器会使性能稍微降低。但是,二进制日志的好处是允许您设置复制和恢复操作,这个小的性能下降不会影响到数据库的正常操作。
但是,二进制记录文件的前提是必须将修改任务执行完毕,只有完整的事件或事务才会被记录或读取。
binlog的 优点:不需要记录每条数据的变化,只记录怎样操作数据的语法,减少了IO,提高性能
缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。
新特性:
从MySQL 8.0.14开始,二进制日志文件可以被加密,帮助保护这些文件和其中包含的潜在敏感数据不被外部攻击者滥用,也不被存储它们的操作系统的用户未经授权地查看。通过将binlog_encryption系统变量设置为on,可以在MySQL服务器上启用加密。
在此我们简单的介绍了mysql的binlog更多binlog请到官网自行阅读。https://dev.mysql.com/doc/refman/8.0/en/binary-log.html
binlog的配置
1、找到数据库配置文件my.cfn在文件中的[mysql]下配置
server_id=1918
log_bin = mysql-bin
binlog_format = ROW
2、关闭数据库服务,并且重新启动
systemctl stop mysqld.service
systemctl start mysqld.service
3、在数据库中查看是否修改了log_bin为no
mysql> show variables like 'log_%';
4、这样bin_log已开启我们简单测试一下
1.查看所有binlog日志列表
mysql> show master logs;
2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status;
3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs;
注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
4.重置(清空)所有binlog日志
mysql> reset master;
目前我们还没有看到里面的具体内容,因为其为二进制文件,所以我们不可以直接查看,所以我们引出下面的查看方法。
在查看之前我们可以看到开启bin_log后会产生2个文件
其中 二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
1、我们使用mysql自带的查看工具mysqlbinlog
注: server id 1918 数据库主机的服务号;
end_log_pos 123 pos点
thread_id=11 线程号
由于我们没有写任何对数据库的操作,所以我们看不到任何被操作的日志信息。我们手动写一些语句。再看其结果。
我们写了一个创建binlog库的语句再次查看
2、通过sql语句进行查询
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
选项解析:
IN 'log_name' 指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos 指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] 偏移量(不指定就是0)
row_count 查询总条数(不指定就是所有行)
下一篇我们继续学习mysqlbinlog的备份与恢复