![](/img/trans.png)
[英]restore all mysql database from a --all-database sql.gz file
[英]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;
。 这样做的缺点是您仍在通过较大的备份进行下载和解析。
到目前为止,解决此问题的最佳选择是简单地在忽略该表的源数据库上进行手动备份。 如果可能的话使用一个副本,并使用--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.