将MongoDB数据库从本地迁移到远程服务器

49
我在我的本地 Ubuntu 机器上创建了一个数据库。
如何将它传输到我的远程服务器(ec2 Ubuntu)?
6个回答

91

TL;DR

使用 mongodumpmongorestore 对 MongoDB 数据库进行完整的二进制备份和还原。压缩备份的 dump 目录,以便更快地将其复制到 Amazon 实例上(BSON 往往可以很好地压缩)。

最佳实践

与其遵循临时指令,我强烈建议阅读 MongoDB 手册中的标准 Backup and Restore with MongoDB Tools 教程。

你也可以使用文件系统快照,但是mongodumpmongorestore只导出数据,因此备份文件会更小(即你的远程服务器不会因为预分配而继承任何过度存储分配)。

1
你好.. 你能说一下我需要添加什么链接来连接Ubuntu服务器的MongoDB吗? 例如 mongodb://localhost:27017/myapp,我们使用这个来连接本地数据库,当连接到远程服务器时,我们只需添加我们的服务器IP地址即可。 - hash
@Stennie,我收到了recv(): message len 759714643 is too large. Max is 48000000的错误信息,请问你知道如何处理吗? - Bruce Yong Li
请注意,使用“mongorestore”从“mongodump”文件还原数据库是非常非常慢的操作,即使是对于几GB大小的数据库也是如此。这可能需要几个小时、几天甚至几周的时间! - Shinebayar G
我能够在一台8核心VPS上,在不到7分钟的时间内使用mongorestore命令还原一个大小为33GB的Mongo数据库备份文件。 - jorisw

14

2个服务器之间的自动同步
如果你的本地主机可以从外部访问,你可以在管理员中使用copydb。
将MongoDB数据从一个硬件迁移到另一个硬件:

user@server:~$ mongo
MongoDB shell version: 2.6.11
connecting to: test
> use admin
switched to db admin
>db.runCommand({copydb:1,fromhost:'your previous host',fromdb:'Auctions_Data',todb:'Auctions_Data'})
{ "ok" : 1 }

1
快速而有效的方法 - https://docs.mongodb.com/manual/reference/command/copydb/ - coding_idiot
我们能否编写一个脚本,以便同时处理多个数据库? - ak3191

6

除了其他解决方案外,您可以创建一个Bash脚本来轻松完成此操作。

#!/bin/bash

HOST="somehost.com"
PORT="2345"
REMOTE_DB="some-remote-db"
LOCAL_DB="your-local-db"
USER="remote-user-name"
PASS="passwordForRemoteUser"

## DUMP REMOTE DATABASE
echo "Dumping '$HOST:$PORT/$REMOTE_DB'..."
mongodump --host $HOST:$PORT --db $REMOTE_DB -u $USER -p $PASS

## RESTORE DUMP DIRECTORY
echo "Restoring to '$LOCAL_DB'..."
mongorestore --db $LOCAL_DB --drop dump/$REMOTE_DB

## REMOVE DUMP FILES
echo "Removing dump files..."
rm -r dump

echo "Finished."

4

您可以创建数据库备份并将其传输到S3存储桶。

首先,安装s3cmd:

sudo yum --enablerepo epel install s3cmd

#to configure s3cmd
s3cmd --configure

接着在一个名为backup.sh的文件中创建一个备份例程:

#!/bin/bash

#Force file syncronization and lock writes
mongo admin --eval "printjson(db.fsyncLock())"

MONGODUMP_PATH="/usr/bin/mongodump"
MONGO_HOST="prod.example.com"
MONGO_PORT="27017"
MONGO_DATABASE="dbname"

TIMESTAMP=`date +%F-%H%M`
S3_BUCKET_NAME="bucketname"
S3_BUCKET_PATH="mongodb-backups"


# Create backup
$MONGODUMP_PATH -h $MONGO_HOST:$MONGO_PORT -d $MONGO_DATABASE

# Add timestamp to backup
mv dump mongodb-$HOSTNAME-$TIMESTAMP
tar cf mongodb-$HOSTNAME-$TIMESTAMP.tar mongodb-$HOSTNAME-$TIMESTAMP

# Upload to S3
s3cmd put mongodb-$HOSTNAME-$TIMESTAMP.tar s3://$S3_BUCKET_NAME/$S3_BUCKET_PATH/mongodb-$HOSTNAME-$TIMESTAMP.tar


#Unlock databases writes
mongo admin --eval "printjson(db.fsyncUnlock())"

当你运行 bash backup.sh 命令后,将会创建一个类似于 mongodb-localhost-10-10-2013.tar 的新文件。
在远程服务器上,您可以使用 wget 从 Amazon S3 下载文件。使用 tar -xvf backupname.tar 命令来解压备份文件。
要进行还原操作,您可以使用以下命令: mongorestore --dbpath <数据库路径> <备份目录> 像这样: mongorestore --dbpath /var/lib/mongo backup_directory_name 希望这些内容能够帮到您。

那么如何将Mondodb的链接添加到我的应用程序中呢? 在 service.js 文件中,使用 mongoose.connect('mongodb://localhost:27017/mean-demo'); 进行连接。 - hash
尝试运行 mongorestore ... 命令,出现 'If you are running a mongod on the same path you should connect to that instead of direct data file access' 错误。发现在不使用 --dbpath <database path> 参数的情况下也可以正常工作。 - Putnik

0

在远程服务器上安装Mongo软件 停止本地计算机上的mongod。 将数据文件和配置复制到远程计算机。 验证数据文件的权限与本地计算机上的权限相同。 然后在远程服务器上启动mongod。


1
步骤1:我使用sudo service mongodb stop停止了我的mongodb。 步骤2:我制作了/var/lib/mogodb文件的tar包并将其通过scp发送到服务器。但是如何配置它呢? - Praveen Singh Yadav
1
如何复制数据? - WhoAmI
@PraveenSinghYadav 你可能也想复制配置。请检查 /etc/mongod.conf 文件。 - Tata
1
如果源服务器和目标服务器有不同的操作系统(例如Debian到CentOS或Windows),是否仍然可以复制数据库文件? - nurb
我个人没有尝试过,但我认为它可能会起作用。 - Tata

-1
现在您已经找到了数据文件,并将它们通过scp传输到必要的服务器位置,例如 /data/db/* ,您可以使用参数dbpath启动mongod命令,如下所示:mongod --dbpath /data/db 确保您已正确地将所有文件复制到这个新文件夹中。

但是我该如何在EC2 mongodb实例上上传db数据? - WhoAmI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接