今天早上开始从依赖进程中看到一些奇怪的错误。经过一番挖掘,文件/mysql/proc.MYD似乎设置为零长度。文件/mysql/db.MYD似乎也被截断了。
更有趣的是,复制的从属服务器并非如此。
- 什么会导致这个?
- 为什么它不会出现在从服务器上?
- 如果我将文件/mysql/proc*从奴隶复制回主人 - 这会恢复程序吗?
几乎/mysql文件夹中的每个文件都被同时触及。有些改变了,而许多没有改变。我的第一个想法是文件系统出现故障,但它似乎已本地化到这个文件夹。
编辑:相关细节:
RHEL 5.x
MySQL 5.5
我关闭了两个 MySQL 实例,并试图从磁带中取出 MySQL 文件夹。我会在卷上运行fsck,但手册页有一些非常可怕的警告。
最安全的做法是在两台机器上停止 MySQL,然后将
mysql
模式中所需的表文件从从属复制到主控,保存文件的副本。只要它们是 MyISAM 表(不是 InnoDB),这就是合法的操作。如果您无法关闭机器,则连接到它们并运行
FLUSH TABLES WITH READ LOCK;
等待提示返回,然后在复制文件时保持连接打开(以保持锁定)。然后UNLOCK TABLES;
释放全局读锁。MyISAM 表以这种方式非常灵活...您需要成对复制表的 MYD 和 MYI 文件,并且您可能应该复制匹配的 .frm 文件,以防它们不完全相同(尽管它们应该是)......只需保存您覆盖的任何内容的副本,不要尝试使用 InnoDB 表。这应该恢复程序;您可能需要重新启动服务器才能让所有线程识别它们(但我不这么认为)。
如果对表的更改
mysql
通常会在您的设置中复制,这往往表明存在潜在的系统问题......或者其他有权访问系统的人不太了解他们正在做什么......或者潜在的安全漏洞,不幸的是,没有尽管我的直觉是“怀疑恶意”,但这些事情确实比其他任何事情都更有可能在我身上跳出来。由于您确实启用了二进制日志记录,因此您应该查看时间戳建议使用的时间段内的二进制日志
mysqlbinlog --verbose --base64-output=decode-rows
,因为即使从站没有更改其表,这并不意味着在binlog 更改了您尚未发现的其他内容,或者由于任何其他原因(例如replicate-ignore-db
.我会检查所有授权表内容以及
mysql
架构中的所有其他内容。我还会用 重新配置服务器log_warnings = 2
,它会记录访问被拒绝的错误,如果您的系统有 I/O 容量来支持它而不会降低性能,我什至可能会想打开一般查询日志一段时间。我会进一步配置本地机器,将其系统日志消息的副本转发到另一个具有严格访问限制的系统,并彻底审计防火墙......所有这些听起来有点危言耸听,但没有其他文件系统问题的证据,这当然不能被认为是最有可能发生的事情。