2012-07-24 103 views
23

我无法在两台couchdb服务器之间进行复制,因此我想从一台服务器转储到文件并从文件加载到另一台服务器。CouchDB转储到文件并从文件加载

我用这个语句来转储和它工作得很好:

curl -X GET http://localhost:5984/<DATABASE_NAME>/_all_docs?include_docs=true > FILE.txt 

但是,当我用这个语句加载:

curl -d @FILE.txt -H “Content-Type: application/json” -X POST http://localhost:5984/<DATABASE_NAME>/_bulk_docs 

它没有像这样:

curl: (6) Could not resolve host: application; Host not found {"error":"bad_content_type","reason":"Content-Type must be application/json"} 

有任何想法吗?

+0

将这个备份每个文件的修订版本? – user3526 2015-02-22 11:02:01

回答

14

至于说,你应该使用"而不是作为-H选项

的说法如果你是一个Linux或MacOSX的用户可以使用couchdb-dump工具,基本上工作在bash shell中。

它转储上的本地文件(ASCII文本文件)的数据库,通过http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

的要求格式化然后你可以用批量文件上传与CouchDB的转储还原或恢复工具包中包含的。

这是链接到该工具:https://github.com/animamea/couchdb-dump

但你也可以找到其他的工具:

https://github.com/stockr-labs/couchdbdump

https://github.com/zebooka/couchdb-dump

+1

这似乎是一个非常小的任务使用的工具。cURL命令对我来说完美:) – 2014-08-14 09:16:25

+0

https://github.com/animamea/couchdb-dump不适合我:(sed魔法里面产生无效jsons即使在一个简单的文档 – 2016-07-26 22:40:59

+0

@MaxLobur same在这里。 – 2017-01-02 01:15:11

7

您实际错误的原因是您在命令行上的-H参数周围使用的是而不是纯粹的ASCII "

但是,这里真正的解决方案是从/path/to/var/lib/couchdb目录中将<DATABASE_NAME>.couch文件从一台服务器复制到另一台服务器。

+0

我试图首先复制* .couch文件,但在绑定访问数据库条目后,我收到错误,数据库是用错误的Erlang版本构建的。 – eriq 2012-07-25 17:06:09

+1

好的,对,两个沙发需要是相同的版本。 – smathy 2012-07-25 21:13:20

+1

当然!我如何接受?永远不要说这是一个好的,正确的答案。我显然不太熟悉这个系统。 – eriq 2012-08-13 22:11:49

2

作为替代解决方案,您可以使用来自couchdb-python项目的couchdb-loadcouchdb-dump实用程序。

+0

警告:那些不适用于python 3.x(TypeError:write()参数必须是str,而不是字节) – 2016-07-26 22:34:09

+0

@MaxLobur为什么不在这里报告呢https://github.com/djc/couchdb-python/问题? (; – Kxepal 2016-07-27 15:51:52

+1

已报告 – 2016-07-28 10:44:12

6

可以使用下面的命令行输出转换的卷曲命令到_bulk_docs要求的“文档”结构:

curl -X GET 'http://localhost:5984/mydatabase/_all_docs?include_docs=true' | jq '{"docs": [.rows[].doc]}' | jq 'del(.docs[]._rev)' > db.json 

jq是非常有用的优秀命令行处理器的名称(即,在这个情况下)。

希望它有帮助。

+0

你的例子使用jq是非常有用的,谢谢!我还发现我的一个文件太大加载,并使用jq分块做的伎俩:'cat db.json | jq'{“docs”:.docs [0:30000]}'> db.0-30000.json; cat db.json | jq'{ “docs”:.docs [30000:]}'> db.30000-.json' – 2016-06-15 15:14:29

+0

有没有办法包含修订版? – 2016-06-15 21:51:43

+0

是的,当然,只要放下'| jq'del(.docs []。 _rev)''部分删除了修订版。那是你需要的吗?请注意,哟如果您包含修订版AFAIK,您将无法恢复文件。 – Roberto 2016-06-16 18:40:09

相关问题