0

如果我有一个在 RHEL 上运行的 MonetDB 数据库,该数据库在数亿行(数百 GB)的区域内有数十个(但不是数百个)表,并且我有兴趣为它实施一个体面的备份策略,特别是关于这样做的机制。

到目前为止,我一直在使用 bash 脚本迭代地调用 msqldump,在数据库中的每个表中调用一次,然后将数据输出到如下文件中:

msqldump -u [username] -t [tablename] -d [dbname] > /path/[tablename].sql.gz

我已经设置了一个 .monetdb 文件,因此在每次调用 msqldump 时不会提示我输入密码,因此可以调用此脚本并允许在无人值守的情况下完成。

这似乎有效,因为我得到了一组文件,其中包含将这些表恢复到 MonetDB 数据库所需的所有数据和模式,但它看起来确实很粗糙(并且执行起来很耗时),所以我想知道是否有“更好”的方法?

例如,如果数据库的内容在 msqldump 操作期间发生变化,我是否应该担心会发生什么?是否有更清洁和/或更快的方法来获得 MonetDB 数据库的完整备份,可能是通过停止 db/farm 并仅复制数据文件本身,如果是,实现此目的的确切方法是什么?是否有人/组织以任何类型的大规模或企业方式使用 MonetDB,他们如何实现可能为 MSSQL 数据库或类似数据库实施的相同类型的备份策略?

我在网上和 StackOverflow 上搜索了很多东西,但找不到太多关于这个主题的指导方式,所以我希望这里有人能提供帮助。

提前致谢。

4

1 回答 1

2

msqldump是将干净的数据库快照转换为序列化 SQL 脚本的首选方法。不过,也许您更愿意为整个数据库只调用一次,而不是每个表调用一次。如果您的数据库模式随时间发生变化,这将更快,但更重要的是更一致。

正如您所暗示的,您还可以以二进制格式制作数据库的物理副本。每个数据库都存储在同名文件夹下,在<dbfarm location>/<dbname>. 这需要停止(monetdb stop)和锁定(monetdb lock)数据库,以防止用户自动启动它。要恢复数据库,只需将其复制回<dbfarm location>并解锁 ( monetdb release)。不需要进一步的数据库注册/设置。如果您想用不同的名称恢复它,只需更改其文件夹的名称。

将序列化和二进制作为您的两种策略,请考虑以下事项:

  • Serialized 跨版本更健壮。二进制 DB 通常会自动转换为所需的版本,但前提是存储的版本不太旧。
  • 序列化更安全,因为它可以根据需要进行编辑
  • 序列化不需要停机。关于您的具体问题:转储期间无需担心更新。转储发生在隔离的快照上。相反,二进制备份需要停止并锁定数据库
  • 二进制通常更快
  • 两者都不能执行增量备份

我的首选方法是假设生产数据库被频繁使用,这与您建议的方法相同,但同时针对整个数据库(并将其通过管道传输到gzip,您在示例中忘记了):

msqldump -u [username] -d [dbname] | gzip > /path/[databasename].sql.gz

有用的链接:

更新:从 2020 年 6 月 (11.37.7) 版本开始,“热备份”功能允许在不停止数据库的情况下拍摄二进制快照:https: //www.monetdb.org/Documentation/ServerAdministration/Backup/HotBackup

于 2015-12-25T18:52:38.000 回答