从sql.gz文件恢复数据,但跳过单个表

时间:2015-02-27 14:24:32

标签: mysql database-restore gunzip

我从发动机码中备份了我的数据库,该数据库已在sql.gz文件中下载。由于我的数据库中的一个表太大,所以我想在我的本地系统中恢复它时skip

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

2 个答案:

答案 0 :(得分:1)

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

  • 如果您的本地MySQL服务器提供“Blackhole”引擎,您可以使用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

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

  • 另一种选择是使用描述here的Awk方法创建两个备份文件,一个表示排除表之前的表和数据,另一个表示其后的所有内容。这里棘手的部分是,如果在排除表的任一侧添加表,则必须更新此脚本。这也导致必须下载和解析更大的备份文件,但从语法角度来看往往更容易记住。
  • 到目前为止,解决此问题的最佳方法是在源数据库上执行忽略此表的手动备份。如果可能,请使用副本,如果使用所有InnoDB表,则使用--single-transaction选项mysqldump,或者非InnoDB表的一致性对本地环境的重要性最小。以下应该可以解决问题:

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

    这样做的好处是不需要任何复杂的解析或更大的文件下载。

答案 1 :(得分:0)

不确定这是否有帮助,但我们有可用于处理database backups的文档 - 此外,您可能希望通过票证或#IRineyard在IRC freenode上与支持人员交谈。