如何使用官方Docker镜像启用MySQL二进制日志记录?

9

如何使用官方的mysql镜像启用二进制日志记录是最佳方法?

我尝试使用mysql:5.7镜像,在运行时覆盖命令,通过启动选项启用二进制日志记录到mysqld(如下所示)。这种方法的问题是mysql用户没有写入/var/log/mysql目录的权限。

运行命令:

docker run -d \
  --name mysql \
  -v /var/lib/mysql:/var/lib/mysql \
  mysql:5.7 \
  mysqld \
  --datadir=/var/lib/mysql \
  --user=mysql \
  --server-id=1 \
  --log-bin=/var/log/mysql/mysql-bin.log \
  --binlog_do_db=test

输出结果:
mysqld: File '/var/log/mysql/mysql-bin.index' not found (Errcode: 2 - No such file or directory)

我应该复制存储库并添加一个卷用于/var/log/mysql,让MySQL用户可以写入并创建自定义镜像,还是有更好的方法来完成这个任务?是否仅使用官方MySQL镜像也能实现此功能?

1个回答

17
这种方法的问题在于mysql用户没有写入 /var/log/mysql 目录的权限。
实际上,问题是在 mysql:5.7 Docker 镜像中不存在目录 /var/log/mysql。您可以运行以下容器来确认:
$ docker run --rm mysql:5.7 ls /var/log/
alternatives.log
apt
bootstrap.log
btmp
dmesg
dpkg.log
faillog
fsck
lastlog
wtmp

此外,MySQL二进制日志不是用于跟踪您的MySQL服务器活动或错误的日志;它们是为了在服务器崩溃时使您的MySQL服务器有机会恢复数据而存在的日志。

因此,您需要这些二进制日志:

  • 靠近您的数据
  • 写入快速文件系统中

在大多数情况下,Docker容器文件系统很慢,这就是为什么指定Docker容器的MySQL数据文件夹为VOLUME的原因。

因此,您还希望将二进制日志写入Docker数据卷而不是Docker容器文件系统。


长话短说,使用以下命令启动容器:


```bash 命令 ```

docker run -d \
  --name mysql \
  -v /var/lib/mysql:/var/lib/mysql \
  mysql:5.7 \
  mysqld \
  --datadir=/var/lib/mysql \
  --user=mysql \
  --server-id=1 \
  --log-bin=/var/lib/mysql/mysql-bin.log \
  --binlog_do_db=test

谢谢。我已经把自己搞糊涂了,但这让我意识到了我的错误所在。一开始就不应该使用 /var/log。 - Brett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接