2016-04-22 75 views
1

我一直在试图找到一种方法来做到这一点,但不能,我有一种感觉,有没有一种简单的方法来做我想做的事。Mongorestore通过标准输入不同名称的数据库

我一直在使用mongodump | mongorestore作为一种避免创建实际存储的文件集的方式进行测试,这对于基于云的服务非常有用。到目前为止,我已经被指定相同的分贝测试这一点,尽管它在技术上是没有必要的,是这样的...

mongodump -h hostname -d dumpdb --excludeCollection bigcollection --archive | mongorestore --archive -d dumpdb --drop 
mongodump -h hostname -d dumpdb -c bigcollection --archive --queryFile onlythese.json | mongorestore --archive -d dumpdb -c bigcollection --drop 

我发现,这些选项的工作最适合我。当我试图指定-o -选项与单个数据库,--archive删除,我有一些问题,但因为这工作,我没有搞砸了。 因为我恢复到相同的分贝,并且因为只有那时在那里的集合被恢复,我意识到我可以在两个mongorestore命令中敲掉-d-c。但是,这很容易做到,并且是为下一步设置的...... 我所要做的只是将指定的分两步恢复到不同名称的数据库,像这样...

mongodump -h hostname -d dumpdb --excludeCollection bigcollection --archive | mongorestore --archive -d restoredb --drop 
mongodump -h hostname -d dumpdb -c bigcollection --archive --queryFile onlythese.json | mongorestore --archive -d restoredb -c bigcollection --drop 

转储工作正常,但恢复不。基于有限的文档,我的假设是dump db和restore db需要相同才能工作;如果mongorestore中指定的数据库不在转储中,则它将不会恢复。 我觉得这很烦人;我的另一个想法是恢复数据库,并将其复制到其他数据库。 我曾考虑过使用其他工具,如mongo-dump-stream,但考虑到目前为止所有工作都在顺利进行,我希望能够使用默认工具。 另一方面,我确实将存档转储到一个文件(如:> dumpdb.tar),并尝试从那里恢复(如--archive=dumpdb.tar),这是我确认数据库需要在转储中的方式。

任何建议/意见/黑客将受到欢迎。

+0

你是在错误的站点。 [dba.stackexchange.com](http://dba.stackechange.com)是关于数据库管理和备份的问题。 StackOverflow适用于“编程”问题,但事实并非如此。 –

回答

0

我还没有真正找到答案,但是,基于mongodb Jira,它看起来像是一个开放的问题,并且在他们的时间轴上有一个功能请求,实际上能够恢复到不同的数据库你开始的是什么。与此同时,我想出了一个不太好,但好的解决方案:由于存档文件还包含元数据,在mongorestore的代码中显示这些数据都已更改,因此您可以替换二进制文件流中具有相同长度的数据库的名称;所以,我的代码现在看起来像这样:

mongodump -h hostname -d dumpdb --excludeCollection bigcollection --archive | bbe -e "s/$(echo -n dumpdb | xxd -g 0 -u -ps -c 256 | sed -r 's/[A-F0-9]{2}/\\x&/g')\x00/$(echo -n rstrdb | xxd -g 0 -u -ps -c 256 | sed -r 's/[A-F0-9]{2}/\\x&/g')\x00/g" | mongorestore --archive --drop 

你会发现,我用bbe和掉线-d标签,因为这只是改变了存档的元数据数据库的名称,将恢复到新。 这里的一个显而易见的问题是,你不能优雅地改变长度;一个较长的名称将不起作用,而较短的名称则需要填充,这可能不起作用。否则,对于那些寻找比转储到文件或运行copyDatabase命令(不这么做!)更好的解决方案,这是一个可行的解决方案。

0

作为的mongorestore 3.4版本,可以使用--nsFrom--nsTo选项,提供了基于模式的方式来操作你的集合和/或源和目的地之间DBS的名称做到这一点。

例如,从一个名叫DUMPDB到一个新的命名restoredb数据库的数据库转储:

从MongoDB的文档
mongodump -h hostname -d dumpdb --archive | mongorestore --archive --nsFrom "dumpdb.*" --nsTo "restoredb.*" --drop 

更多:https://docs.mongodb.com/manual/reference/program/mongorestore/#change-collections-namespaces-during-restore

相关问题