基本概念
binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志;其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,记录了所有的DDL和DML(除了数据查询语句)语句,并以事务的形式保存在磁盘中,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。
作用主要有:
复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves并回放来达到master-slave数据一致的目的
数据恢复:通过mysqlbinlog工具恢复数据
增量备份
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
日志管理
开启binlog
修改配置文件 my.cnf
配置 log-bin 和 log-bin-index 的值,如果没有则自行加上去。
log-bin=mysql-bin
log-bin-index=mysql-bin.index
这里的 log-bin 是指以后生成各 Binlog 文件的前缀,比如上述使用master-bin,那么文件就将会是master-bin.000001、master-bin.000002 等。
log-bin-index 则指 binlog index 文件的名称,这里我们设置为master-bin.index,可以不配置。
命令查看配置
binlog开启后,可以在配置文件中查看其位置信息,也可以在myslq命令行中查看:
mysql> show variables like '%log_bin%';
+---------------------------------+---------------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------------+
| log_bin | ON |
| log_bin_basename | D:\Program Files\MySQL\data\mysql-bin |
| log_bin_index | D:\Program Files\MySQL\data\mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+---------------------------------------------+
6 rows in set (0.07 sec)
查看binlog文件列表
mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 202 | No |
| mysql-bin.000002 | 2062 | No |
+------------------+-----------+-----------+
2 rows in set (0.07 sec)
binlog文件开启binlog后,会在数据目录(默认)生产host-bin.n(具体binlog信息)文件及host-bin.index索引文件(记录binlog文件列表)。当binlog日志写满(binlog大小max_binlog_size,默认1G),或者数据库重启才会生产新文件,但是也可通过手工进行切换让其重新生成新的文件(flush logs);另外,如果正使用大的事务,由于一个事务不能横跨两个文件,因此也可能在binlog文件未满的情况下刷新文件。
查看日志状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 2062 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.08 sec)
显示正在写入的二进制文件,及当前position
刷新日志
mysql> flush logs;
Query OK, 0 rows affected (0.12 sec)
mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 202 | No |
| mysql-bin.000002 | 2109 | No |
| mysql-bin.000003 | 155 | No |
+------------------+-----------+-----------+
3 rows in set (0.07 sec)
自此刻开始产生一个新编号的binlog日志文件
每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
重置(清空)所有binlog