在Docker mysql容器中启用日志记录

huus2vyu  于 2023-02-18  发布在  Mysql
关注(0)|答案(4)|浏览(246)

我试着熟悉docker生态系统,并尝试设置一个mysql数据库容器,使用docker-compose时,如下所示:

version: '2'
services:
  db:
    image: mysql:5.6.33@sha256:31ad2efd094a1336ef1f8efaf40b88a5019778e7d9b8a8579a4f95a6be88eaba
    volumes:
      - "./db/data:/var/lib/mysql"
      - "./db/log:/var/log/mysql"
      - "./db/conf:/etc/mysql/conf.d"
    restart: "yes"
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: db
      MYSQL_USER: db
      MYSQL_PASSWORD: dbpw

我的conf目录包含一个文件:

[mysqld]
log_error       =/var/log/mysql/mysql_error.log
general_log_file=/var/log/mysql/mysql.log
general_log     =1
slow_query_log  =1
slow_query_log_file=/var/log/mysql/mysql_slow.log
long_query_time =2
log_queries_not_using_indexes = 1

不幸的是,我没有得到任何日志文件。设置本身是正确的,并使用cnf文件。连接到容器,并创建3个文件,chown他们到mysql,并重新启动容器,日志工作如预期。
我非常肯定这是一种常见的情况,而我目前运行它的方法似乎非常愚蠢。正确的方法是什么?
我可以通过在Dockerfile中移动所有这些东西来改进我的方法,但这对我来说仍然很奇怪。

kmpatx3s

kmpatx3s1#

我也在寻找同样的东西,现在,有一个更好的方法。
docker mysql写入:
许多配置选项可以作为标志传递给mysqld。这将给予您能够灵活地自定义容器,而无需cnf文件。例如,如果您想将所有表的默认编码和排序规则更改为使用UTF-8(utf8 mb 4),只需运行以下命令:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker-compose环境中,可以通过服务的“command”部分传递这些参数:

command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

在我的用例中,我只想打开日志并指定日志文件的路径:

command: mysqld --general-log=1 --general-log-file=/var/lib/mysql/general-log.log

有了足够的卷(例如- ./logs/mysql.log:/var/lib/mysql/general-log.log),就很容易到达它们。
这是非常直接的,避免了处理本地配置。它将适用于任何MySQL Docker images,并将保持my.cnf与映像所附带的一样。
编辑:将路径从/var/log/mysql/更改为/var/lib/mysql/,以确保MySQL可写文件夹。

oewdyzsn

oewdyzsn2#

连接到容器并创建3个文件后,将它们更改为mysql并重新启动容器,日志记录按预期工作。
这就指向了主机卷权限问题。当您从容器Map到主机时,不会在用户ID上进行Map,并且容器内部附加到UID的名称可能与外部有很大不同。您需要使用容器用户可以写入的内容初始化目录权限。一个简单的方法是创建一个组,该组对主机和容器上的文件都具有写入权限。然后将各个用户添加到映像和主机操作系统上的此组中。另一种选择是使用不能直接从主机访问的命名文件系统,并使用映像的目录权限对其进行初始化。
编辑:一个使用docer-composite.yml命名卷的示例非常简单:

version: '2'
volumes:
  mysql-data:
    driver: local
  mysql-log:
    driver: local
  mysql-conf:
    driver: local

services:
  db:
    image: mysql:5.6.33
    volumes:
      - "mysql-data:/var/lib/mysql"
      - "mysql-log:/var/log/mysql"
      - "mysql-conf:/etc/mysql/conf.d"
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: db
      MYSQL_USER: db
      MYSQL_PASSWORD: dbpw

请注意,我还从您的映像名称中删除了sha 256,此引用将阻止您能够拉取映像的修补版本。我也更喜欢“unless-stopped”重新启动策略,以便Docker在重新启动时执行预期的操作。

kognpnkq

kognpnkq3#

由于一个奇怪的PDO绑定问题,我需要临时启用日志记录,我想看看实际执行的查询。这个问题是搜索结果的第一名,我对任何答案都不满意。假设您已经为容器设置了卷,我让它按以下方式工作:
1.对数据库运行以下查询:

SET global general_log = on;
SET global general_log_file='/var/log/mysql/mysql.log';
SET global log_output = 'file';

1.使用docker ps获取容器ID。
1.运行docker exec -it <id> /usr/bin/tail -f /var/log/mysql/mysql.log
1.完成后运行以下查询:SET global general_log = off;
如果您在设置general_log_file变量时遇到问题,您可能需要将/bin/bash导入容器,然后使用正确的权限手动创建日志文件。

3z6pesqy

3z6pesqy4#

ponsfrilus answer外,您还可以通过docker run命令执行相同操作:

docker run --name some-mysql --restart always -v //d/MySqlDockerData:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --log_error=/var/lib/mysql/mysql_error.log --general_log_file=/var/lib/mysql/mysql.log --general_log=1 --slow_query_log=1 --slow_query_log_file=/var/lib/mysql/mysql_slow.log --long_query_time=2 --log_queries_not_using_indexes=1

相关问题