有一个简单的方法来从meteor部署的应用程序导出数据吗?
有一个简单的方法来从meteor部署的应用程序导出数据吗?
所以,例如,如果我已经部署了一个名为test.meteor.com的应用程序…
我怎么能轻松地下载该应用程序收集的数据 – 以便我可以从部署的应用程序的数据本地运行它?
要获取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
下面是如何做相反的事情:(上传你的本地monogo数据库meteor)
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/
基于Kasper Souren的解决scheme,我创build了一个更新的脚本,可以与当前版本的Meteor配合使用,当您使用密码保护您的远程Meteor应用程序时也可以使用。
请创build以下脚本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`
我创build了一个工具, mmongo
,它包装了所有的mmongo
客户端shell命令,以便在Meteor数据库上使用。 如果您使用npm
(节点包pipe理器),您可以使用:
npm install -g mmongo
否则,请参阅自述文件 。
要备份您的Meteor数据库,您现在可以执行:
mmongo test.meteor.com dump
将其上传到您当地的开发meteor将是:
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
Github , NPM
我想你的数据是在一个mongodb数据库,所以如果是这样的话,问题是比meteor更多的mongo相关。 你可以看看mongoexport和mongoimport命令行工具 。
编辑(例如):
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,因为它默认使用本地服务器。
这是另一个在bash中的解决scheme
#! /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}
meteor备份是迄今为止最简单的方法。
sudo npm install -g meteor-db-utils meteor-backup [domain] [collection...]
截至2015年3月,您仍然需要指定您想要获取的所有集合(直到解决此问题 )。
从以下的东西
我正在做
mongodump $(meteor mongo -U example.meteor.com | coffee url2args.cfee)
加上这个小小的咖啡文字,加上一个错位的扩展名,以免混淆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]}"
(如果meteormongo -U -mongodumpoptions会给出这些选项,或者如果mongodump会接受mongo:// URL,则会更好)
# 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/
当上传本地数据库到远程数据库,有一个断言exception
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)
我做了这个简单的Rakefile将活动数据库复制到本地。
要将活动数据库恢复到我的本地机器,我只是做…
rake copy_live_db
将myapp
replace为meteor.com的名称 – 例如myapp.meteor.com
。
要求'rubygems' 要求“开放式” desc“将活动数据库备份到本地./dump文件夹” 任务:backup_live_db uri =`meteor mongo myapp --url` pass = uri.match(/ client:([^ @] +)@ /)[1] 放入“使用实时数据库密码:#{pass}” `mongodump -h meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -u client -p#{pass}` 结束 desc“将实时数据库复制到本地” 任务:copy_live_db =>:backup_live_db 服务器=`meteor蒙古--url` uri = URI.parse(服务器) `mongorestore --host#{uri.host} --port#{uri.port} --db meteor - drop dump / myapp_meteor_com /` 结束 desc“还原上次备份” 任务:恢复做 服务器=`meteor蒙古--url` uri = URI.parse(服务器) `mongorestore --host#{uri.host} --port#{uri.port} --db meteor - drop dump / myapp_meteor_com /` 结束
要在您的meteor deploy myAppName
站点上使用现有的本地 mongodb数据库,您需要转储,然后恢复mongodb。
按照上面的指示mongodump
(记住path),然后运行以下来生成您的' mongorestore
'(replace第二步和复制/粘贴):
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
从mongorestore可以采取一个单一的url参数,而不是单独的参数?
我想你可以通过sshfs使用远程安装的文件系统,然后使用rsync同步mongodb的文件夹本身或我相信的整个Meteor文件夹。 这就像做一个增量备份,可能更有效率。 可以使用相同的解决scheme来发送代码的更改等,为什么不同时更改数据库更改呢? (一石二鸟)
这是一个简单的bash脚本,可以让你从meteor.com托pipe的网站上转储数据库。
#!/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]}