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

Posted

技术标签:

【中文标题】有没有一种简单的方法可以从流星部署的应用程序中导出数据?【英文标题】:Is there a simple way to export the data from a meteor deployed app? 【发布时间】:2012-06-17 00:02:17 【问题描述】:

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

如何轻松下载该应用收集的数据 - 以便我可以使用来自已部署应用的数据在本地运行它?

【问题讨论】:

直接访问meteor DB..看到这个***.com/a/31639624/2837412 【参考方案1】:

这是一个简单的 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]

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:
# 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)

【讨论】:

【参考方案4】:

我创建了一个工具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

Github, NPM

【讨论】:

我只是想补充一点,以避免“system.users: not authorized” error你也可以这样做:mmongo test.meteor.com dump --excludeCollection=system.users【参考方案5】:

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)

连同这个小咖啡脚本,为了不混淆 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,那就更好了)

【讨论】:

【参考方案6】:

要在您的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?

【讨论】:

【参考方案7】:

这是 bash 中的另一种解决方案

#! /bin/bash
# inspired by http://***.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

# ***.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,那将是杀手!非常感谢。 在 Git Shell 下不起作用,因为 msysgit 附带的 libregex 似乎不支持 =~ 运算符。【参考方案8】:

下面是相反的方法:(将本地 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/

【讨论】:

我收到以下错误任何想法错误:错误:根目录必须是单个数据库的转储错误:使用 --db 指定数据库名称时 @almog,确保您的mongorestore 文件夹指向.bson 文件所在的位置。例如,对于mongodump -h 127.0.0.1:3002 -d meteormongorestore(从与mongodump 相同的目录执行)的转储数据库的路径是dump/meteor/【参考方案9】:

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

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

rake copy_live_db

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

需要“红宝石” 需要'open-uri' 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 mongo --url` uri = URI.parse(服务器) `mongorestore --host #uri.host --port #uri.port --db meteor --drop dump/myapp_meteor_com/` 结尾 desc "恢复上次备份" 任务:恢复做 服务器 = `meteor mongo --url` uri = URI.parse(服务器) `mongorestore --host #uri.host --port #uri.port --db meteor --drop dump/myapp_meteor_com/` 结尾

【讨论】:

【参考方案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 命令很快就会过时。【参考方案11】:

要获取您在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

【讨论】:

谢谢!这非常有帮助,除了我要补充的是 -d 应该是 yoursite_meteor_com。 谢谢,我真的在找这个。顺便说一句,我的流星项目的主机名是 skybreak.member1.mongolayer.com 而不是 sky.member1.mongolayer.com 是的,需要注意的是,数据库名称末尾的 \ 旨在让您在终端的下一行继续执行命令。它不是数据库名称的一部分,如果您将命令全部写在一行上,您将看到错误。 不适合我。在我输入meteor mongo --url YOURSITE.meteor.com 后,它问我username &amp; password。我尝试使用在流星中登录我的帐户的用户名和密码,但没有运气。【参考方案12】:

我想你的数据在一个 mongodb 数据库中,所以如果是这样的话,这个问题比流星更与 mongo 相关。你可以看看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 服务器的端口),但我不知道流星托管实际使用的是哪个 Mongo 主机。如果您在本地尝试过 Meteor 示例(TODO、排行榜等),那么您很可能已经安装了 Mongo,因为它默认使用本地服务器。

【讨论】:

不确定是否可以在流星服务器上运行 mongo 命令行。有人知道吗? 事实上,你从你的计算机上运行它,但是你指定了云托管的 mongo 信息(主机,端口,可能是用户和密码)。我会在几分钟内给你举个例子。 我编辑了答案,希望对您有所帮助。该命令非常简单,我展示了最有用/最常见的参数,默认情况下它输出到标准输出,您可以将其重定向到文件或直接将其指定为参数。 mongoexport --help 非常详细。

以上是关于有没有一种简单的方法可以从流星部署的应用程序中导出数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode 中导出应用程序文件

从用户的 iTunes 库中导出视频

从 Anylogic 数据库中导出数据

Microsoft Access 中有没有一种方法可以从具有复合主键的 Excel 文件中导入?

如何取消部署流星应用程序?

将简单的服务器端 JS 文件添加到流星