从Docker容器中记录MySQL查询

5

我是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)在yaml文件中注释掉包含all.log的那一行,在docker-compose up运行时。

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文件的一部分,以便我还可以在yaml文件所在的位置挂载all.log文件。

1个回答

8

为了解决我的问题,我使用以下方法:

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容器内的内容与我的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脚本的名称。

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


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