首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从sql.gz文件恢复数据,但跳过单个表

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

Stack Overflow用户
提问于 2015-02-27 22:24:32
回答 2查看 2K关注 0票数 0

我从engine yard下载了我的数据库的备份,该文件位于sql.gz文件中。因为我的数据库中有一个表太大了,所以我想在本地系统中恢复它的时候使用skip。

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

EN

回答 2

Stack Overflow用户

发布于 2015-05-29 22:35:47

到目前为止,您可能已经确定了一个解决方案,但我认为我需要补充一些见解。MySQL的还原操作当前不提供从还原操作中排除单个表的简单方法,但您可以考虑以下几个选项:

  • 如果您的本地MySQL服务器提供了'Blackhole‘引擎,您可以使用gawk在创建该表时更改该表的引擎定义。这将类似于:

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方法创建两个备份文件,一个表示被排除的表之前的表和数据,另一个表示它后面的所有内容。这里的棘手之处在于,如果在排除的表的任意一侧添加表,则必须更新此脚本。这也会导致必须下载和解析较大的备份文件,但从语法perspective.

中更容易记住

到目前为止,

  • 解决此问题的最佳选择是在忽略此表的源数据库上执行手动备份。如果可能,请使用副本,如果您使用的是所有InnoDB表,则使用mysqldump的--single-transaction选项,或者非InnoDB表的一致性对您的本地环境最不重要。下面的代码应该可以解决这个问题:

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-02-27 22:36:45

不确定这是否会有帮助,但我们有处理database backups的文档--另外,你可能想通过工单或在IRC freenode上的#engineyard中与支持人员交谈。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28767306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档