mysql - 从 docker 容器记录 mysql 查询

标签 mysql docker docker-compose

我是 docker 的新手,我仍在弄清楚它是如何工作的。我已经通过 docker-compose 设置了一个 wordpress 站点,我使用的 yaml 文件如下。

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - ./db_data/db/backup.sql:/docker-entrypoint-initdb.d/backup.sql #it loads an already existing database
       #- ./db_data/all.log:/var/log/mysql/all.log # i want here to have the logs of mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
     volumes:
       - ./db_data/wp-content:/var/www/html/wp-content # loads the files from an existing installation of wordpress
volumes:
    db_data:

正如你在这条线上看到的
- ./db_data/all.log:/var/log/mysql/all.log 

我试图以某种方式使它成为这样我可以记录所有的查询。我通过执行以下操作设法做到了这一点:

1) docker-compose up,同时将 yaml 文件中的 all.log 行注释掉。

2)使用bash登录mysql的容器并运行以下命令
mysql -u root -psomewordpress -e "SET global log_output = 'FILE'; SET global general_log_file='/var/log/mysql/all.log'; SET global general_log = 1;"

3) 转到/var/lib/docker/volumes 并创建文件。

我想要实现的是以某种方式使这个命令成为 yaml 文件的一部分,这样我也可以将 all.log 文件安装在 yaml 文件所在的位置。

最佳答案

我为解决我的问题所做的是使用以下内容:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - ./db_data/db/backup.sql:/docker-entrypoint-initdb.d/backup.sql #it loads an already existing database
       -./logs/mysql:/var/log/mysql # to get the folder of mysql in my logs/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
     volumes:
       - ./db_data/wp-content:/var/www/html/wp-content

此代码会将 mysql 的 docker 容器内的内容与我的文件夹 logs/mysql 同步。所以我在里面放了一个小shell脚本。
#!/bin/bash

if [ ! -f /var/log/mysql/all.log ]; then
    touch /var/log/mysql/all.log
fi

chmod 777 /var/log/mysql/all.log
mysql -u root -psomewordpress -e "SET global log_output = 'FILE'; SET global general_log_file='/var/log/mysql/all.log'; SET global general_log = 1;"

它检查 all.log 文件是否存在,如果不存在,则创建它,然后启动 mysql 日志记录。就是这样,之后所有查询都直接记录到我可以直接访问的 all.log 中。
还有一件事,要执行您可能想要使用的 shell 脚本
docker exec 5.7-mysql "./var/log/mysql/initlogs.sh"

其中 initlogs.sh 是 shell 脚本的名称。

我真的希望它会帮助某人!

关于mysql - 从 docker 容器记录 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52968679/

相关文章:

docker-compose 构建 nginx : network error (check Internet connection and firewall)

php - 如何过滤掉用户已回答的问题?

php - 如何提高 MySQL 数据库的性能

docker - 为什么 docker 容器可以运行,尽管 docker-machine 没有运行?

docker - 偶尔刷新 Flower 数据库和/或从 Docker 中正常退出?

php - Docker MySQL mysqli::real_connect():(HY000/2002):连接被拒绝

mysql - SQL 触发器 - 使用 sum(tableB.col) WHERE tableA.userID = tableB.userID 更新表 A

python - 在mysql加载数据文件导入期间删除CSV公式值

Jenkins 管道中的 docker.build() 有两个标签

docker - 在 docker-compose run 命令中使用 docker 环境变量