log_error 不适用于 docker 中的 mysql

log_error 不适用于 docker 中的 mysql

我使用mysql:5.7官方 docker 映像并使用自定义 .cnf 文件设置general_log_filelogs_error登录 mysql,但是当我设置错误日志时,出现以下错误:

$ sudo docker-compose up
db_1   | Initializing database
db_1   | Initializing database
db_1   | Initializing database
....

^CGracefully stopping... (press Ctrl+C again to force)

$ cat mysql-custom.cnf
[mysqld]
general_log_file        = /var/log/mysql/mysqld.log
general_log             = 1
log_error               = /var/log/mysql/error.log  # When i put this then getting above error.

在这里我收到错误,然后我输入了log_errorslow_query_log_file,有人知道为什么这个简单的东西不能在 docker 上工作吗?

答案1

在容器中时,您可能无法完全支持底层操作系统的功能;这种行为是设计使然,因为您希望为特定目的拥有一个更安全和受限制的环境。

因此,对于 MySQL 日志,您可能希望记录到 MYSQL DB/表。

对于 5.x 版本(5.1、5.2,不记得了),SQL 支持记录到 MySQL DB/表,而不是文件,并且默认情况下已经创建了两个表,mysql.general_log并且mysql.slow_log.

要设置它们的使用,您需要:

添加到/etc/mysql/my.cnf

[mysqld]
slow-query-log
general_log=1
log-output=TABLE

然后重启mysql。

要每天备份它们,您可以在有权查询数据库的系统中运行:

mysqldump mysql general_log  --lock-tables=0 > general_log_errors.db
mysqldump mysql slow_log  --lock-tables=0 > slow_log_errors.db

(需要使用lock-tables=0,否则会得到错误信息:

mysqldump: Got error: 1556: You can't use locks with log tables. when doing LOCK TABLES

然后运行以下查询来清理表。

TRUNCATE TABLE mysql.general_log;
TRUNCATE TABLE mysql.slow_log;

这是总体思路。您可能想要保留最近几天的日志,因此 MySQL TRUNCATE/DELETE 查询会更加详细。

默认情况下,这些表应该在那里,也许它已在该 docker 映像中被擦除。

因此,对于 v5.7,您可以使用以下命令创建它们:

CREATE TABLE IF NOT EXISTS `general_log` (
  `event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON    UPDATE CURRENT_TIMESTAMP(6),
  `user_host` mediumtext NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumblob NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';

CREATE TABLE IF NOT EXISTS `slow_log` (
  `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `user_host` mediumtext NOT NULL,
  `query_time` time(6) NOT NULL,
  `lock_time` time(6) NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumblob NOT NULL,
  `thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';

进一步阅读:将日志写入表

至于创建 error_file: /var/log 甚至可能不存在于您的 docker 文件中。如果上面这两个日志选项还不够,您可以在 MySQL 用户拥有的目录中创建一个用于测试的文件; MySQL 所在的此类目录之一通常是 /var/lib/mysql。

答案2

我昨天遇到了类似的问题,但我的是在 my.cnf 中设置错误日志的路径。我习惯使用log-error=/var/log/mysql/mysql.err(在其他非docker环境中工作正常),但在docker中使用时保留,我意识到它不接受.err扩展。然后我使用了.log扩展,效果很好。虽然我正在运行基本docker 映像,但运行映像mariadb:10.2时应该是相同的。mysql:5.7仅供参考:虽然错误文件是日志,但它不受变量的影响,log-output=TABLE因为它无法在表中查看mysql。我还认为日志记录TABLE会给服务器带来不必要的负担,如果可能的话应该避免这种情况。

相关内容