我正在尝试弄清楚如何打开/关闭 MySQL 5.1.48 通用查询日志,而无需重新启动服务器(目前在生产中不提供此选项)。在我的测试环境中,它不起作用。
根据这,我应该可以说:
set global general_log = 'OFF';
确实有效:通用查询日志中不再添加查询。但是当我这样做时:
set global general_log = 'ON';
它抱怨说:
ERROR 1146 (42S02): Table 'mysql.general_log' doesn't exist
(确实没有),并且日志添加了一个标准启动头(“mysqld,版本:5.1.48...”),然后没有其他内容。
我是否可以转到具有相同平台/版本的另一个 MySQL 数据库,复制它show create table mysql.general_log;
并在此处运行?这样安全吗,还是这是更深层次问题的征兆?当我打开常规查询日志时,我是否应该这样做?我在手册中没有看到任何关于此的内容。
答案1
全局 general_log 变量用于打开或关闭(默认关闭)当前选定的日志记录目标。如果未指定,则记录到 mysql.general_log 表:
如果省略 --log-output 或未指定值,则默认为 FILE。(对于 MySQL 5.1.6 至 5.1.20,默认日志记录目标是 TABLE。)
为了打开文件日志,您必须重新启动 MySQL 并指定--log-output=FILE
(或 my.cnf 等效项)
对于记录到表,以下几点值得注意:
对于新安装的 MySQL 5.1.6 或更高版本,日志表在安装过程中与其他系统表一起创建。如果将 MySQL 从 5.1.6 之前的版本升级到 MySQL 5.1.6 或更高版本,则必须在升级后升级系统表以确保日志表存在。请参见第 4.4.8 节“mysql_upgrade — 检查 MySQL 升级表”。
第 4.4.8 节MySQL 手册中说:
mysql_upgrade 检查所有数据库中的所有表是否与 MySQL Server 的当前版本不兼容。mysql_upgrade 还会升级系统表,以便您可以利用可能已添加的新权限或功能。
值得阅读手册的该部分以确保您的系统表全部正确且为正确的版本。
噢,我再强调一遍:
在执行此类操作之前,请备份数据库
答案2
我已经创建了那张缺失的表格并为我工作。
use mysql;
CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'