解决方案 #1:再次创建 CSV 文件

解决方案 #1:再次创建 CSV 文件

这是对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 上发布了很多关于如何设置和使用它的帖子。以下是其中一些:

强调一下:这不是幻像表。这是真的。只需在 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';

如果您不打算将常规日志用作表,那么删除它应该没问题。

相关内容