您应该如何“安全地”恢复(和备份)MySQL 数据库?我所说的“安全”是指:恢复应该创建/覆盖所需的数据库,但不要冒险更改该数据库之外的任何内容。
我已经阅读了https://dev.mysql.com/doc/refman/5.7/en/backup-types.html。
我有外部用户。他们和我可能想要交换备份以进行恢复。我们没有商业 MySQL Enterprise Backup,也没有寻找第三方商业产品。
在 Microsoft SQL Server 中有BACKUP
和RESTORE
命令。 BACKUP
创建一个只包含您想要的数据库的文件;它的行和它的所有模式/结构都包括在内。 RESTORE
接受这样的文件,并创建或覆盖其结构。用户可以恢复到同名数据库,或指定不同的数据库名称。这种行为正是我想要的。
在 MySQL 中,我遇到了 3 种可能性:
大多数人似乎使用
mysqldump
创建一个“转储文件”,并将mysql
其读回。转储文件包含任意 MySQL 语句的列表,这些语句由mysql
. 这是非常不可接受的:该文件可能包含任何SQL 语句。(限制恢复用户的访问权限以确保它不能做任何“顽皮”的事情是不可接受的。)还有一个问题是用户可能已经使用“包含 CREATE Schema”选项(MySQL Workbench)创建了转储文件,它硬编码原始数据库名称以供娱乐。这种“转储”方法完全不适合我,而且我发现有人会在生产环境中使用它感到惊讶。我遇到过 MySQL 的
SELECT ... INTO OUTFILE
和LOAD DATA INFILE
语句。至少它们不包含要执行的 SQL 代码。但是,它们看起来工作量很大,一次处理一个表而不是整个数据库,并且不处理表的结构,您必须自己了解才能进行恢复。有一个mysqlimport
辅助命令行实用程序,但我没有看到导出端的任何内容,也没有看到它用于恢复完整的数据库。最后一种是使用 MySQL 所说的“物理(原始)”而不是“逻辑”备份。这适用于数据库目录和文件本身。它相当于 SQL Server 的
detach
/attach
备份/恢复方法。但是,根据https://dev.mysql.com/doc/refman/5.7/en/backup-types.html,它有各种各样的警告,例如“备份只能移植到具有相同或相似硬件的其他机器上特征。” (我不知道,例如某些用户是 Windows 与 Windows,我不知道他们的架构)和“可以在 MySQL 服务器未运行时执行备份。如果服务器正在运行,则有必要执行适当的锁定,因此服务器在备份期间不会更改数据库内容。”
那么,如上所述,任何东西都可以满足(我认为)我对 MySQL 备份/恢复的适度要求吗?我真的是唯一一个认为上述 3 是唯一但不可接受的可能解决方案的人吗?