2012-07-24 47 views
23

No puedo replicar entre dos servidores de couchdb, por lo que me gustaría pasar al archivo desde un servidor y cargar desde el archivo al otro servidor.Volcado de CouchDB a archivo y carga desde el archivo

he usado esta declaración para volcar y funcionó bien:

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

Pero cuando he usado esta declaración a la carga:

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

Fracasó como esto:

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

¿Algunas ideas?

+0

será este hacer una copia de seguridad de las revisiones de cada uno de los documentos? – user3526

Respuesta

14

Como se ha dicho, se debe utilizar el " y no como argumento de la opción

-H Si usted es un usuario de Linux o MacOSX puede utilizar la herramienta de couchdb-dump, que básicamente funciona en shell bash.

que vuelca la base de datos en un archivo local (archivo de texto ASCII), con el formato solicitado por http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

continuación, puede restaurar con la carga de documentos en bloque o con el couchdb-dump herramienta de restauración incluido en el paquete.

Este es el enlace a la herramienta: https://github.com/animamea/couchdb-dump

pero se pueden encontrar también otras herramientas:

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

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

+1

Parece una tarea bastante pequeña para usar una herramienta para. Los comandos cURL funcionó perfectamente para mí :) –

+0

https://github.com/animamea/couchdb-dump no funcionó para mí :(sed El interior mágico produce jsons inválidos incluso en un simple docs –

+0

@MaxLobur mismo aquí –

7

La razón de su error real es que se está utilizando en lugar de ASCII " alrededor de su argumento -H en la línea de comandos.

Sin embargo, la verdadera solución aquí es simplemente copiar el archivo <DATABASE_NAME>.couch del directorio /path/to/var/lib/couchdb de un servidor a otro.

+0

Intenté copiar los archivos * .couch primero, pero después de vincularlos para acceder a las entradas de la base de datos, recibí el error, que la base de datos se compiló con una versión incorrecta de Erlang. – eriq

+1

Bien, bien, ambos Couches necesitan ser de la misma versión. – smathy

+1

¡seguro! ¿Cómo acepto? Sin embargo, fue una respuesta buena y correcta. Obviamente no estoy muy familiarizado con este sistema. – eriq

2

Como solución alternativa, puede utilizar las utilidades couchdb-load y couchdb-dump del proyecto couchdb-python.

+0

Advertencia: los que no funcionan con Python 3.x (TypeError: write() El argumento debe ser str, no bytes) –

+0

@MaxLobur por qué no informar sobre eso aquí https://github.com/djc/couchdb-python/ cuestiones ? (; – Kxepal

+1

informó ya –

6

Puede utilizar la línea de comandos para convertir la salida del comando curl para la estructura "documentos" que requiere el _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 es el nombre de un excelente procesador de línea de comandos muy útil (es decir en esta situación).

Espero que ayude.

+0

Tu ejemplo usando jq fue muy útil, gracias! También encontré que uno de mis archivos era demasiado grande para cargar, y fragmentar usando jq hizo el truco: 'cat db.json | jq '{" docs ": .docs [0: 30000]}> db.0-30000.json; cat db.json | jq' { "docs": .docs [30000:]} '> db.30000-.json' –

+0

¿Hay alguna manera de incluir las revisiones? –

+0

Sí, por supuesto, simplemente suelte '| jq' del (.docs []. _rev) '' parte que elimina las revisiones. ¿Es eso lo que necesita? Tenga en cuenta que No podrá restaurar el archivo si incluye las revisiones, AFAIK. – Roberto

Cuestiones relacionadas