我使用mysql:5.7
官方 docker 映像并使用自定义 .cnf 文件设置general_log_file
并logs_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_error
或slow_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
会给服务器带来不必要的负担,如果可能的话应该避免这种情况。