是否有一种简单的方法可以从meteor部署的应用程序中导出数据?
因此,例如,如果我部署了名为test.meteor.com的应用程序......
我如何轻松下载该应用程序收集的数据 - 以便我可以使用部署的应用程序中的数据在本地运行它?
答案 0 :(得分:91)
要在meteor.com上获取已部署站点的URL,请使用该命令(如果密码保护,您可能需要提供站点密码):
meteor mongo --url YOURSITE.meteor.com
将返回类似的内容:
mongodb://client:PASSWORD@sky.member1.mongolayer.com:27017/YOURSITE_meteor_com
您可以将其提供给mongodump
mongodump -u client -h sky.member1.mongolayer.com:27017 -d YOURSITE_meteor_com\
-p PASSWORD
密码仅适用于一分钟。用法:
$ meteor --help mongo
答案 1 :(得分:38)
以下是如何做相反的事情:(将你当地的monogo db上传到流星)
https://gist.github.com/IslamMagdy/5519514
# How to upload local db to meteor:
# -h = host, -d = database name, -o = dump folder name
mongodump -h 127.0.0.1:3002 -d meteor -o meteor
# get meteor db url, username, and password
meteor mongo --url myapp.meteor.com
# -h = host, -d = database name (app domain), -p = password, folder = the path to the dumped db
mongorestore -u client -h c0.meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -p 'password' folder/
答案 2 :(得分:10)
基于Kasper Souren的解决方案,我创建了一个更新的脚本,该脚本可与当前版本的Meteor一起使用,并且当您使用密码保护远程Meteor应用程序时也可以使用。
请创建以下脚本parse-mongo-url.coffee
:
spawn = require('child_process').spawn
mongo = spawn 'meteor', ['mongo', '--url', 'YOURPROJECT.meteor.com'], stdio: [process.stdin, 'pipe', process.stderr]
mongo.stdout.on 'data', (data) ->
data = data.toString()
m = data.match /mongodb:\/\/([^:]+):([^@]+)@([^:]+):27017\/([^\/]+)/
if m?
process.stdout.write "-u #{m[1]} -p #{m[2]} -h #{m[3]} -d #{m[4]}"
else
if data == 'Password: '
process.stderr.write data
然后在* nix shell中执行它:
mongodump `coffee parse-mongo-url.coffee`
答案 3 :(得分:6)
我创建了一个工具mmongo
,它包装了所有Mongo DB客户端shell命令,以方便在Meteor数据库上使用。如果您使用npm
(节点包管理器),则可以使用以下命令安装它:
npm install -g mmongo
否则,请参阅README。
要备份Meteor数据库,您现在可以执行以下操作:
mmongo test.meteor.com dump
将其上传到您当地的开发流星将是:
mmongo restore dump/test_meteor_com
如果您不小心删除了生产数据库:
mmongo test.meteor.com --eval 'db.dropDatabase()' # whoops!
您可以轻松恢复它:
mmongo test.meteor.com restore dump/test_meteor_com
如果你宁愿将一个集合(比如tasks
)导出为可读的东西:
mmongo test.meteor.com export -c tasks -o tasks.json
然后,您可以在文本编辑器中打开tasks.json
,进行一些更改并插入更改:
mmongo test.meteor.com import tasks.json -c tasks --upsert
答案 4 :(得分:5)
我认为你的数据是在一个mongodb数据库中,所以如果是这样的话,问题就是与流星有关的问题。您可以查看mongoexport and mongoimport command line tools。
编辑(例如):
mongoexport -h flame.mongohq.com:12345 -u my_user -p my_pwd -d my_db -c my_coll
您需要在计算机上安装mongodb以使用此命令行工具,显然您需要mongodb信息。在上面的例子中,我连接到MongoHQ(flame.mongohq.com是主机,'12345'是你的mongo服务器的端口),但我不知道meteor主机实际使用了哪个Mongo主机。如果你在本地试过Meteor示例(TODO,排行榜等),很可能你已经安装了Mongo,因为它默认使用本地服务器。
答案 5 :(得分:3)
这是bash中的另一个解决方案
#! /bin/bash
# inspired by http://stackoverflow.com/questions/11353547/bash-string-extraction-manipulation
# http://www.davidpashley.com/articles/writing-robust-shell-scripts/
set -o nounset
set -o errexit
set -o pipefail
set -x
# stackoverflow.com/questions/7216358/date-command-on-os-x-doesnt-have-iso-8601-i-option
function nowString {
date -u +"%Y-%m-%dT%H:%M:%SZ"
}
NOW=$(nowString)
# prod_url="mongodb://...:...@...:.../..."
prod_pattern="mongodb://([^:]+):([^@]+)@([^:]+):([^/]+)/(.*)"
prod_url=$(meteor mongo katapoolt --url | tr -d '\n')
[[ ${prod_url} =~ ${prod_pattern} ]]
PROD_USER="${BASH_REMATCH[1]}"
PROD_PASSWORD="${BASH_REMATCH[2]}"
PROD_HOST="${BASH_REMATCH[3]}"
PROD_PORT="${BASH_REMATCH[4]}"
PROD_DB="${BASH_REMATCH[5]}"
PROD_DUMP_DIR=dumps/${NOW}
mkdir -p dumps
# local_url="mongodb://...:.../..."
local_pattern="mongodb://([^:]+):([^/]+)/(.*)"
local_url=$(meteor mongo --url | tr -d '\n')
[[ ${local_url} =~ ${local_pattern} ]]
LOCAL_HOST="${BASH_REMATCH[1]}"
LOCAL_PORT="${BASH_REMATCH[2]}"
LOCAL_DB="${BASH_REMATCH[3]}"
mongodump --host ${PROD_HOST} --port ${PROD_PORT} --username ${PROD_USER} --password ${PROD_PASSWORD} --db ${PROD_DB} --out ${PROD_DUMP_DIR}
mongorestore --port ${LOCAL_PORT} --host ${LOCAL_HOST} --db ${LOCAL_DB} ${PROD_DUMP_DIR}/${PROD_DB}
答案 6 :(得分:2)
meteor-backup是最简单的方法。
sudo npm install -g meteor-db-utils
meteor-backup [domain] [collection...]
截至2015年3月,您仍需要指定要获取的所有馆藏(直到this issue已解决)。
过去的资料
我在做
mongodump $(meteor mongo -U example.meteor.com | coffee url2args.cfee)
连同这个小小的coffeescript,加上一个错误的扩展,以免混淆Meteor,url2args.cfee
:
stdin = process.openStdin()
stdin.setEncoding 'utf8'
stdin.on 'data', (input) ->
m = input.match /mongodb:\/\/(\w+):((\w+-)+\w+)@((\w+\.)+\w+):27017\/(\w+)/
console.log "-u #{m[1]} -h #{m[4]} -p #{m[2]} -d #{m[6]}"
(如果meteor mongo -U --mongodumpoptions会提供这些选项,或者mongodump会接受mongo:// URL)会更好
答案 7 :(得分:2)
# How to upload local db to meteor:
# -h = host, -d = database name, -o = dump folder name
mongodump -h 127.0.0.1:3001 -d meteor -o meteor
# get meteor db url, username, and password
meteor mongo --url myapp.meteor.com
# -h = host, -d = database name (app domain), -p = password, folder = the path to the dumped db
mongorestore -u client -h http://production-db-a2.meteor.io:27017 -d myapp_meteor_com -p 'password' folder/
将本地数据库上传到远程数据库时,有一个断言异常
shubham@shubham-PC:$ mongorestore -u client -h http://production-db-a2.meteor.io:27017 -d myapp_meteor_com -p my_password local/
2015-04-22T16:37:38.504+0530 Assertion failure _setName.size() src/mongo/client/dbclientinterface.h 219
2015-04-22T16:37:38.506+0530 0xdcc299 0xd6c7c8 0xd4bfd2 0x663468 0x65d82e 0x605f98 0x606442 0x7f5d102f8ec5 0x60af41
mongorestore(_ZN5mongo15printStackTraceERSo+0x39) [0xdcc299]
mongorestore(_ZN5mongo10logContextEPKc+0x198) [0xd6c7c8]
mongorestore(_ZN5mongo12verifyFailedEPKcS1_j+0x102) [0xd4bfd2]
mongorestore(_ZN5mongo16ConnectionStringC2ENS0_14ConnectionTypeERKSsS3_+0x1c8) [0x663468]
mongorestore(_ZN5mongo16ConnectionString5parseERKSsRSs+0x1ce) [0x65d82e]
mongorestore(_ZN5mongo4Tool4mainEiPPcS2_+0x2c8) [0x605f98]
mongorestore(main+0x42) [0x606442]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f5d102f8ec5]
mongorestore() [0x60af41]
terminate called after throwing an instance of 'mongo::AssertionException'
what(): assertion src/mongo/client/dbclientinterface.h:219
Aborted (core dumped)
答案 8 :(得分:1)
我制作了这个简单的Rakefile来将实时数据库复制到本地。
要将实时数据库恢复到我的本地计算机,我只是...
rake copy_live_db
将myapp
替换为您的meteor.com名称 - 例如myapp.meteor.com
。
require 'rubygems' require 'open-uri' desc "Backup the live db to local ./dump folder" task :backup_live_db do uri = `meteor mongo myapp --url` pass = uri.match(/client:([^@]+)@/)[1] puts "Using live db password: #{pass}" `mongodump -h meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -u client -p #{pass}` end desc "Copy live database to local" task :copy_live_db => :backup_live_db do server = `meteor mongo --url` uri = URI.parse(server) `mongorestore --host #{uri.host} --port #{uri.port} --db meteor --drop dump/myapp_meteor_com/` end desc "Restore last backup" task :restore do server = `meteor mongo --url` uri = URI.parse(server) `mongorestore --host #{uri.host} --port #{uri.port} --db meteor --drop dump/myapp_meteor_com/` end
答案 9 :(得分:0)
要在meteor deploy myAppName
站点上使用现有的本地 mongodb数据库,您需要转储,然后还原mongodb。
按照上述说明mongodump
(请记住路径),然后运行以下操作以生成' mongorestore
' (替换第二步并复制/粘贴):
CMD=meteor mongo -U myAppName.meteor.com | tail -1 | sed 's_mongodb://\([a-z0-9\-]*\):\([a-f0-9\-]*\)@\(.*\)/\(.*\)_mongorestore -u \1 -p \2 -h \3 -d \4_'
然后
$CMD /path/to/dump
来自Can mongorestore take a single url argument instead of separate arguments?
答案 10 :(得分:0)
我认为您可以通过sshfs然后rsync使用远程安装的文件系统来同步mongodb的文件夹本身或我相信的整个Meteor文件夹。这就像进行增量备份并且可能更有效。 可以使用相同的解决方案来发送代码更改等,那么为什么不同时让数据库更改呢?! (用1石头杀死2只鸟)
答案 11 :(得分:0)
这是一个简单的bash脚本,允许您从meteor.com托管站点转储数据库。
#!/bin/bash
site="rankz.meteor.com"
name="$(meteor mongo --url $site)"
echo $name
IFS='@' read -a mongoString <<< "$name"
echo "HEAD: ${mongoString[0]}"
echo "TAIL: ${mongoString[1]}"
IFS=':' read -a pwd <<< "${mongoString[0]}"
echo "${pwd[1]}"
echo "${pwd[1]:2}"
echo "${pwd[2]}"
IFS='/' read -a site <<< "${mongoString[1]}"
echo "${site[0]}"
echo "${site[1]}"
mongodump -u ${pwd[1]:2} -h ${site[0]} -d ${site[1]}\
-p ${pwd[2]}