从Docker容器记录mysql查询

时间:2018-10-24 12:10:31

标签: 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文件所在的位置。

1 个答案:

答案 0 :(得分:0)

我为解决问题而采取的措施是:

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中。
还有一件事,要执行该外壳脚本,您可能要使用

docker exec 5.7-mysql "./var/log/mysql/initlogs.sh"

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

我真的希望它能对某人有所帮助!