有没有简单的方法可以从流星部署的应用程序导出数据?


71

有没有简单的方法可以从流星部署的应用程序导出数据?

因此,例如,如果我部署了一个名为test.meteor.com的应用...

我如何轻松下载该应用程序收集的数据-以便与已部署应用程序中的数据一起在本地运行?


直接访问流星数据库..参见此stackoverflow.com/a/31639624/2837412
Nishchit Dhanani

Answers:


90

要在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
谢谢!这非常有帮助,除了我将添加-d应该是yoursite_meteor_com。
埃里克(Erick)2012年

谢谢,我真的在寻找这个。顺带一提,我的流星项目的主机名是skybreak.member1.mongolayer.com,而不是sky.member1.mongolayer.com

2
是的,在这里需要特别注意的是,数据库名称末尾的\表示使您可以在终端的下一行继续执行命令。它不是数据库名称的一部分,并且如果您在一行中全部写出命令,将会看到错误。
病原

不为我工作。我进入后meteor mongo --url YOURSITE.meteor.com,它问我username & password。我尝试使用用户名和密码登录流星帐户,但没有运气。
Stiger

38

这是相反的方法:(将您的本地monogo数据库上传到流星)

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/

我收到以下错误提示:错误:错误:根目录必须是单个数据库的转储错误:使用--db指定数据库名称时
Almog Koren

@almog,请确保您的mongorestore文件夹指向.bson文件所在的位置。例如,使用mongodump -h 127.0.0.1:3002 -d meteor,转储数据库的路径mongorestore(从与相同的目录执行mongodump)是dump/meteor/
Donny Winston 2014年

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`

这是非常有用的。在一分钟的时间范围内弄乱用户名和密码,在该时间范围内凭据有效以将正确的mongodump或mongorestore命令组合在一起,很快就会变旧。
病原

6

我创建了一个工具,该工具mmongo包装了所有Mongo DB客户端外壳程序命令,以便在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

Github上NPM


1
我只是想补充一下,以避免“ system.users:未经授权”错误,您也可以这样做:mmongo test.meteor.com dump --excludeCollection=system.users
Giwan,2016年

5

我想您的数据在mongodb数据库中,因此,如果是这样的话,这个问题与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服务器的端口),但是我不知道流星托管实际上使用了哪个Mongo主机。如果您在本地尝试过Meteor示例(TODO,排行榜等),则可能已经安装了Mongo,因为它默认情况下使用本地服务器。


不知道我是否可以在流星服务器上运行mongo命令行。有人知道吗?
格雷格·默瑟

实际上,您是从计算机上运行它的,但是您指定了云托管的mongo信息(主机,端口,可能是用户&pwd)。我将在几分钟后尝试为您提供示例。
mna 2012年

我编辑了答案,希望对您有所帮助。该命令非常简单,我展示了最有用/最常用的参数,默认情况下它输出到stdout,您可以将其重定向到文件或直接将其指定为参数。mongoexport --help非常详细。
mna 2012年

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}

如果远程URL是bash脚本的argv,那将是杀手!!非常感谢。
gabrielhpugliese 2014年

在Git Shell下不起作用,因为msysgit附带的libregex不支持=〜运算符。
steph643

2

到目前为止,流星备份是最简单的方法。

sudo npm install -g meteor-db-utils
meteor-backup [domain] [collection...]

从2015年3月起,您仍然需要指定您要获取的所有集合(直到此问题得到解决)。


过去的东西

我正在做

mongodump $(meteor mongo -U example.meteor.com | coffee url2args.cfee)

为了使流星不致混淆,连同这个小巧的咖啡文字,加上错乱的扩展名,请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]}"

(如果流星mongo -U --mongodumpoptions提供这些选项,或者mongodump接受mongo:// URL,那会更好)


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)

1

我做了这个简单的Rakefile,将实时数据库复制到本地。

要将实时数据库恢复到我的本地计算机,我只是...

rake copy_live_db

myapp您的meteor.com的名称替换-例如myapp.meteor.com

需要“ ruby​​gems”
需要'open-uri'

desc“将活动数据库备份到本地./dump文件夹”
任务:backup_live_db
  uri =`meteor mongo myapp --url`
  通过= uri.match(/ client:([^ @] +)@ /)[1]
  放置“使用实时数据库密码:#{pass}”
  `mongodump -h meteor.m0.mongolayer.com:27017 -d myapp_meteor_com -u客户端-p#{pass}`
结束


desc“将实时数据库复制到本地”
任务:copy_live_db =>:backup_live_db
  服务器=`meteor mongo --url`
  uri = URI.parse(服务器)
  `mongorestore --host#{uri.host} --port#{uri.port} --db流星--drop dump / myapp_meteor_com /`
结束

desc“还原上一个备份”
任务:还原
  服务器=`meteor mongo --url`
  uri = URI.parse(服务器)
  `mongorestore --host#{uri.host} --port#{uri.port} --db流星--drop dump / myapp_meteor_com /`
结束

0

要使用站点上现有的本地mongodb数据库meteor deploy myAppName,需要先转储,然后还原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 

来自mongorestore可以采用单个url参数而不是单独的参数吗?


0

我认为您可以通过sshfs使用远程安装的文件系统,然后使用rsync同步mongodb的文件夹本身或我相信的整个Meteor文件夹。这就像进行增量备份一样,并且可能更有效。可以使用相同的解决方案来发送代码更改等信息,那么为什么不同时获取数据库更改呢?(用1块石头杀死2只鸟)


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]}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.