show variables like 'log_%'; 查询数据库当前是否开启了binlog
真正的修改很简单,就修改一个配置然后重启
要修改的文件名字是 mysqld.cnf,他一般存在于 /etc/mysql/mysql.conf.d 下,只需要在文件内追加几行
[mysqld]
# binlog 配置server-id=1
log-bin = mysql-bin.log
expire-logs-days = 14
max-binlog-size = 500M# 5.7以后的版本需要制定唯一的编号
server-id = 1# 记得加上这个配置,否则当我们开启binlog之后,在创建函数的时候必须为函数指定一个参数来表明函数做了哪些操作:
# 参数有:#1 DETERMINISTIC 不确定的
#2 NO SQL 没有SQl语句,当然也不会修改数据
#3 READS SQL DATA 只是读取数据,当然也不会修改数据
#4 MODIFIES SQL DATA 要修改数据
#5 CONTAINS SQL 包含了SQL语句log_bin_trust_function_creators=1
log-bin 最好不要随便定义目录,因为有权限的问题,可能导致最终数据库无法正常启动
所以比较稳妥的做法是像我一样老实的单指定一个单文件,要是很不幸你设置了一个自定义目录,并且数据库你也重启了,那么你会发现你的mysql容器一直在尝试重启,无法正确启动,用 docker logs 容器名 命令可以看到
这时候无法通过 docker exec -ti 命令进入容器内,只能通过强行从宿主机将正确的配置文件覆盖到容器内,然后再次重启来解决问题了,具体方法为
docker inspect -f '{{.ID}}' 应用名 查出容器长ID
然后用 docker cp 源文件 容器长ID:/docker内路径 命令覆盖错误的配置文件,重新启动容器,然后mysql终于运行正常了!
show variables like 'log_%'; 再次查询mysql
大功告成!
另外还有一点需要注意的是同一个docker容器内如果有多个binlog则 log-bin 对应的文件名必须不能相同,不然会出现读取同一个binlog日志的现象
开启binlog后在创建函数的时候可能会报This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA 错
需要 set global log_bin_trust_function_creators=TRUE;
PS: 说明,本帖讲述的mysql是docker容器内的,重点是mysql.cnf的配置,后面所说的步骤是因为mysql在docker容器内,直接进入docker内修改mysql的配置文件,可能会因为配置文件的错误导致mysql无法正常启动,所以就顺带讲述了下无法正常启动的实例如何修改配置文件,当然修改容器内的配置文件还有其他比较简单的方法,本贴只列举当时使用的方法