修改 docker 中安装的 MySQL 的配置参数

文章目录

    今天中午发现服务器磁盘又快满了。按目录顺序排查了一遍,发现是 MySQL 的 binlog 文件占用了大量空间。之前通过 mysql console 设置的 binlog_expire_logs_seconds 参数(限制保持3天)在重启 mysql docker 容器后就失效了。参考前文 设置 MySQL binlog 保存天数,节省服务器硬盘空间

    好在今天的开发任务基本完成,也上线测试通过。所以就有时间来折腾一下 docker 中的 MySQL 配置了。以前是能不动就不动,主要是不太想过多了解 docker 的细节,感觉太浪费生命。但是,在自动化运维上,没搞定一项配置,就能节省以后的重复劳动,还是很有必要的。毕竟 AI 虽然可以写代码,但是我并不敢让 OpenClaw 这类神兽去线上服务器操作,还是得自己来。

    使用配置文件(最推荐,易于维护)

    首先我问了一下 Gemini,这是她最推荐的方式。即,创建一个自定义的配置文件,并将其挂载到容器中。在宿主机创建一个文件,例如 mysql.cnf:

    [mysqld]
    binlog_expire_logs_seconds=259200
    

    259200 秒代表 3 天。在 docker-compose.yml 中挂载该文件:

    services:
      mysql:
        image: mysql:8.0
        volumes:
          - ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf
    

    注:MySQL 会自动读取 /etc/mysql/conf.d/ 目录下所有以 .cnf 结尾的文件。

    docker volumes 可以设置单个文件么

    可以的。即支持挂载单个文件,也支持挂载整个目录。

    确认 docker 中的 /etc/mysql/conf.d/ 目录是否存在

    docker compose exec mysql bash
    
    # ls /etc/mysql/
    conf.d
    # ls /etc/mysql/conf.d/
    

    容器内 /etc/mysql/conf.d/ 目录存在,但是没有任何配置文件。

    查看 /etc/my.cnf 文件内容,确认是否包含以下行:

    !includedir /etc/mysql/conf.d/
    

    通常在最后一行。

    使新配置生效

    docker compose up -d mysql
    

    自动停止、删除旧容器,并根据新配置启动新容器。

    如果只修改了宿主机上被挂载的文件内容,MySQL 通常需要重启才能读取新配置,但此时你执行 docker restart 就生效了,因为挂载关系没变,只是内容变了。

    执行速度很快,感觉嗖的一下就重启好了。

    心惊胆颤地检查了一下网站是否正常,以及配置是否生效,结果一切正常,binlog_expire_logs_seconds 的值也正确了。没用的 docker 知识又增加了😓

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式