0

我从引擎场备份了我的数据库,该备份在sql.gz文件中下载。由于我的数据库中的一张表太大,所以我想skip在本地系统中恢复它时使用它。

我使用gunzip < file_name.sql.gz | mysql -u user_name -p password database name命令来恢复备份。

4

2 回答 2

1

您现在可能已经确定了一个解决方案,但我想我会添加一些见解。MySQL 的恢复操作目前不提供从恢复操作中排除单个表的简单方法,但您可以考虑以下几个选项:

  • 如果您的本地 MySQL 服务器提供“黑洞”引擎,您可以gawk在创建该表时使用它来更改该表的 ENGINE 定义。这将是这样的:

    gunzip < file_name.sql.gz | gawk -v RS='' '{print gensub(/(CREATE TABLE .[table_to_be_skipped].*) ENGINE=InnoDB/, "\\1 ENGINE=Blackhole", 1)}' | mysql -u user_name -p password database name.

    这指示数据库在重新加载期间仅通过针对该表的行插入。加载完成后,您可以将其修改回 InnoDB 引擎,使用alter table [table_to_be_skipped] engine=innodb;. 这样做的缺点是您仍在通过更大的备份下载和解析。


  • 另一种选择是使用此处描述的 Awk 方法创建两个备份文件,一个代表排除表之前的表和数据,另一个代表它后面的所有内容。这里棘手的部分是,如果您在排除表的任一侧添加表,则必须更新此脚本。这也导致必须下载和解析更大的备份文件,但从语法角度来看往往更容易记住。

  • 到目前为止,解决此问题的最佳选择是简单地对忽略此表的源数据库进行手动备份。如果可能,请使用副本,如果您正在使用所有 InnoDB 表或非 InnoDB 表的一致性对您的本地环境的重要性最低,请使用该--single-transaction选项。mysqldump以下应该可以解决问题:

    mysqldump -u user_name -p --single-transaction --ignore-table=[table_to_be_skipped] database name | gzip > file_name.sql.gz

    这有一个明显的好处,即不需要任何复杂的解析或更大的文件下载。

于 2015-05-29T14:35:46.833 回答
0

不确定这是否会有所帮助,但我们有可用于处理数据库备份的文档- 此外,您可能希望通过工单或在 IRC freenode 上的#engineyard 中与支持人员交谈。

于 2015-02-27T14:36:45.390 回答