在测试 Linux 的 Back In Time 备份实用程序的过程中,我注意到我无法理解 MariaDB 实际上如何保存数据。
在向表中添加虚假记录并将其保留到下一次快照发生之后,我惊讶地发现恢复旧快照(在添加虚假记录之前拍摄)并没有导致虚假记录被删除。
我又尝试了两次:添加了虚假的新记录,发生了快照(自动发生,因为这是我告诉 Back In Time 要做的事情)...并且恢复并没有按照我的预期进行。
查看主目录(所有数据库都是子目录)中实际的“修改者”文件,我发现只有两个文件似乎发生了变化:ib_logfile0
和ib_logfile1
。在配置我的 Back In Time 作业时,我故意忽略了这些文件,因为我假设它们“只是日志”。显然不是。
为了解决我眼前的问题,我所要做的就是将这两个文件包含到我的快照中。但是如何或通过什么过程更新ibdata1
新信息?也许是在 MySQL 服务关闭时?还是启动时?
奇怪的是,我似乎没有找到太多有关此的信息。
答案1
您不能使用像 Back in Time 这样的通用备份实用程序来备份数据库。
正如您所发现的,您需要一个一致的数据库文件快照才能进行可用的备份。没有它,您最终会得到不正确或无法启动的东西。问题是ib_logfile*
临时存储然后被迁移到表空间。您只能在干净关闭(这比 systemctl stop mysqld 更严重)的情况下删除它们,而这显然在您进行备份时没有发生。
因此,简而言之,对于 MySQL,使用一个能够识别 MySQL 的备份程序(mysqldump、mydumper、xtrabackup),或一个一致的快照工具(llvm 快照或基于文件系统的一致快照功能)或一个前面的方法之一的复制从属。
从 MySQL 外部修改 MySQL 数据文件只会导致数据丢失。不要这样做。