这是对MySQL“僵尸”表,无法删除我在那里询问有关 mysql 模式中的恶意表的问题。
长话短说:
- 我不小心将文件 general.log 写入了 MySQL datadir
- 后来删除了
- mysqldump 开始抱怨缺少有关表 general_log 的信息
- 不能放下桌子
- 无法重新创建表并将其删除,
现在我在information_schema中找到了一行:
mysql> select * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'general_log';
+---------------+--------------+-------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------------+----------+----------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+--------------+-------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------------+----------+----------------+---------------+
| NULL | mysql | general_log | BASE TABLE | CSV | 10 | Dynamic | 2 | 0 | 0 | 0 | 0 | 0 | NULL | NULL | NULL | NULL | utf8_general_ci | NULL | | General log |
+---------------+--------------+-------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------------+----------+----------------+---------------+
1 row in set (0.00 sec)
我想删除那一行。
这样安全吗?
其他表格中是否有与此条目相关的更多信息?
答案1
那并不是你所说的僵尸表。
安装mysql的时候,mysql.general_log
已经包含了该表。
它使用CSV 存储引擎。
代表它的两个文件是
/var/lib/mysql/mysql/general_log.frm
/var/lib/mysql/mysql/general_log.CSV
您可以选择在该表中启用常规日志记录。就我个人而言,我永远不会将其用作 CSV 表。我会将其转换为 MyISAM 并对其进行索引。然后,激活它,以便我可以按日期时间查询表并按时间范围定位 SQL 命令和用户。
我在 DBA StackExchange 上发布了很多关于如何设置和使用它的帖子。以下是其中一些:
Dec 27, 2011
:如何进行 MySQL 用户记账Jan 08, 2012
:如何启用 MySQL 常规日志?Feb 11, 2012
:MySQL 常规日志
强调一下:这不是幻像表。这是真的。只需在 mysql 客户端中运行:
SHOW CREATE TTABLE mysql.general_log\G
或者在操作系统中
ls -l /var/lib/mysql/mysql/general_log.*
现在,如果 mysqldump 抱怨该表,那么很有可能您删除了该/var/lib/mysql/mysql/general_log.CSV
文件,而保留了另一个文件/var/lib/mysql/mysql/general_log.frm
。有两种解决方案:
解决方案 #1:再次创建 CSV 文件
echo -n > /var/lib/mysql/mysql/general_log.CSV
chown mysql:mysql /var/lib/mysql/mysql/general_log.CSV
解决方案 #2:删除.frm
文件
rm -f /var/lib/mysql/mysql/general_log.frm
警告:一旦删除/var/lib/mysql/mysql/general_log.frm
,您就无法创建通用日志表,除非您执行以下操作:
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';
如果您不打算将常规日志用作表,那么删除它应该没问题。