繁体   English   中英

从sql.gz文件还原数据,但跳过单个表

[英]Restore data from sql.gz file, but skip a single table

我从引擎码中备份了数据库,该备份在sql.gz文件中下载。 由于数据库的表之一太大,因此我想在本地系统中还原它时skip它。

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

到目前为止,您可能已经找到了解决方案,但是我认为我需要补充一些见解。 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 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引擎alter table [table_to_be_skipped] engine=innodb; 这样做的缺点是您仍在通过较大的备份进行下载和解析。


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

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

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

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

不确定这是否有帮助,但是我们有处理数据库备份的文档-另外,您可能想通过票务或IRC freenode上的#engineyard与支持人员联系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM