我有一台 Windows Server 2008 R2 机器,上面有 2 个 MySQL MyISAM 数据库。这些数据库相当大,总大小超过 20GB。
我每周更新一次这些数据库。(在此过程中,我会禁用我的网站 - 但这对我来说没问题)。然后,我关闭 MySQL 服务器实例,并将物理文件夹复制到同一服务器上的另一个备份文件夹(带日期戳 - 例如:CB1_17_03_2016)。
不过,我最近注意到,在备份文件夹中,单个文件(或大多数文件)- .MYD、.MYI 等的修改日期/时间与实际 MySQL 数据文件夹中的文件不同(较旧)。就好像复制文件时没有进行任何更改。我在 .bat 文件中使用以下代码来复制数据文件:
REM Switch off MySQL service, backup the newly updated folders, and switch on MySQL service again.
SET BackupFolder=C:\Backups\Data
FOR /f "tokens=1-5 delims=/ " %%d in ("%date%") DO SET Folder1=%BackupFolder%\CB1_%%d_%%e_%%f
FOR /f "tokens=1-5 delims=/ " %%d in ("%date%") DO SET Folder2=%BackupFolder%\CB2_%%d_%%e_%%f
SET MySqlFolder=...the folder where the MySQL data files are...
robocopy "%MySqlFolder%\cb1" "%Folder1%"
robocopy "%MySqlFolder%\cb2" "%Folder2%"
cd "%MySQLPath%" (set to MySql.exe location)
NET START MySQL
更新表后立即进行此复制。在关闭 MySQL 实例并复制文件之前,我是否需要发出 FLUSH TABLES 或类似命令?
提前致谢,蒂姆
答案1
也许,可以改用以下方法:
答案2
您不能简单地复制 MySQL 文件来进行备份。它会不一致,而且很可能损坏。
在具有 MyISAM 表的 Windows 上(我假设没有 InnoDB 表),您有以下备份选项:
- mysqlhotcopy(它复制文件但用 包装它
FLUSH TABLES WITH READ LOCK
) - mysqldump/mysqlpump
- 冷备份的从属设备
- Oracle 的 MySQL 企业备份 ($$$)
答案3
你想要做的就是物理备份,从某种意义上说,您正在复制原始数据库文件。
更安全的做法是停止 mysql 并复制整个目录 - 换句话说,就是您正在做的事情。
您在备份上看到较旧的修改时间,可能是因为当您重新启动 mysql 服务时,表文件被触及,并且它们的最后修改时间被更新。
为了确保文件相同,你可以对两个文件运行 MD5 比较器,前重启mysql服务,对比完成后重启服务,检查文件的最后修改时间是否更新。