首先我们要知道什么是binlog日志
binlog是
MySQL数据库的二进制日志文件,记录了数据库更改的所有操作,但不包括SELECT和SHOW这类操作,这些操作对数据进行修改、管理操作、数据库修改等操作都会被记录在日志中。
对于一个sql,它常常被分为以下几种类型:
-
DDL:Data Definition Language,数据定义语言
-
用来操作数据库、表、列等,比如 CREATE、ALTER、DROP
-
-
DML:Data Manipulation Language,数据操作语言
-
用来操作表里的数据,比如 INSERT、UPDATE、DELETE
-
-
DCL:Data Control Language,数据控制语言
-
用来操作访问权限等,比如 GRANT
-
-
DQL:Data Query Language,数据查询语言
-
用来查询数据,比如 SELECT
-
-
TCL:Transaction Control Language,事务控制语言
-
用于数据库的事务管理,比如 COMMIT,ROLLBACK
-
(binlog是不会记录查询操作的)
接下来我看先查看一下当前数据库是否已经开启:
- 我们可以通过以下命令查询binlog日志的开关是否开启,以及日志的存储位置
-
show variables like '%log_bin%';
-
-
执行上面的sql会得到下面结果
-
其主要字段含义分别如下:
-
log_bin 表示是否开启 binlog(ON开启,OFF关闭)
- log_bin_basename 表示的是 binlog 所在的文件夹,在后面我们查看 binlog 具体内容的时候,会需要进入到这个文件夹进行查看。
- log_bin_index 表示的是 binlog 的索引文件,我们可以在其中找到所有的 binlog 日志
- log_bin_trustfunctioncreators是一个全局系统变量,主要影响MySQL对存储函数创建、修改权限的控制以及这些函数在二进制日志记录中的行为
-
在默认设置下(log_bin_trust_function_creators=OFF),创建或修改存储函数的用户不仅需要拥有常规的CREATE ROUTINE或ALTER ROUTINE权限,还需要额外的SUPER特权。这是因为存储函数如果未被声明为确定性(DETERMINISTIC)或明确表示不修改数据(通过NO SQL或READS SQL DATA特性),则可能存在对复制和数据恢复不利的行为,如产生不可重复的结果或执行非预期的更新操作。为了保障数据一致性,MySQL对此类操作施加了严格的权限要求。
-
当设置log_bin_trust_function_creators=ON 时,这一严格要求被放宽。用户无需具备SUPER特权也能创建或修改存储函数,即使这些函数没有明确声明为确定性或不修改数据。这种设置下,MySQL假设函数创建者了解并能够确保他们所创建的函数对复制环境是安全的,从而降低了权限门槛。
-
关于log_bin_trustfunctioncreators更多详细内容请参考博客:深入理解MySQL中的log_bin_trust_function_creators系统变量_log-bin-trust-function-creators-CSDN博客
-
- log_bin_use_v1_row_events: on 表示使用版本1二进制日志行,off 表示使用版本2二进制日志行
- sql_log_bin 用于主从复制,这个参数关闭后,主库的改动不会记录到 binlog,不会复制到从库
-
- 要想开启binlog日志,需要在/etc/my.cnf文件中加入以下内容
log-bin=mysql-bin # 确认是打开状态,并指定存储日志位置
server-id=1 # MySQL将其视为一个正常的从服务器,并对其进行正常的主从复制操作。
binlog_format=row # DDL 时是明文,DML是加密的
expire-logs-days=20 # 指定日志文件保留天数
最后重启MySQL
systemctl restart mysqld