mongodb 管理操作

mongodb 管理操作

数据导出 mongoexport

mongoexport 和 mongoimport 的使用方法。假设库里有一张 user 表,里面有 2 条记录,我们要将它导出

1
2
3
4
5
6
> use my_mongodb
switched to db my_mongodb
> db.user.find();
{ "_id" : ObjectId("4f81a4a1779282ca68fd8a5a"), "uid" : 2, "username" : "Jerry", "age" : 100 }
{ "_id" : ObjectId("4f844d1847d25a9ce5f120c4"), "uid" : 1, "username" : "Tom", "age" : 25 }
>

常用导出方法

1
2
3
4
5
6
7
[root@localhost bin]# ./mongoexport -d my_mongodb -c user -o user.dat
connected to: 127.0.0.1
exported 2 records
[root@localhost bin]# cat user.dat
{ "_id" : { "$oid" : "4f81a4a1779282ca68fd8a5a" }, "uid" : 2, "username" : "Jerry", "age" : 100 }
{ "_id" : { "$oid" : "4f844d1847d25a9ce5f120c4" }, "uid" : 1, "username" : "Tom", "age" : 25 }
[root@localhost bin]#
参数说明:
-d 指明使用的库, 为” my_mongodb”
-c 指明要导出的表, 本例中为”user”
-o 指明要导出的文件名, 本例中为”user.dat”

导出的方式使用的是 JSON 的样式

导出 CSV 格式的文件

1
2
3
4
5
6
7
8
9
[root@localhost bin]# ./mongoexport -d my_mongodb -c user --csv -f uid,username,age -o
user_csv.dat
connected to: 127.0.0.1
exported 2 records
[root@localhost bin]# cat user_csv.dat
uid,username,age
2,"Jerry",100
1,"Tom",25
[root@localhost bin]#
参数说明:
-csv 指要要导出为 csv 格式
-f 指明需要导出哪些例
更详细的用法可以 mongoexport –help 来查看

数据导入 mongoimport

导入 JSON 数据, 先将表 user 删除掉

1
2
3
4
5
> db.user.drop();
true
> show collections;
system.indexes
>

然后导入数据

1
2
3
4
[root@localhost bin]# ./mongoimport -d my_mongodb -c user user.dat
connected to: 127.0.0.1
imported 2 objects
[root@localhost bin]#

导入 CSV 数据

1
2
3
4
5
6
先将表 user 删除掉
> db.user.drop();
true
> show collections;
system.indexes
>

然后导入数据

1
2
3
4
5
[root@localhost bin]# ./mongoimport -d my_mongodb -c user --type csv --headerline --file
user_csv.dat
connected to: 127.0.0.1
imported 3 objects
[root@localhost bin]#

参数说明:
-type 指明要导入的文件格式
-headerline 批明不导入第一行,因为第一行是列名
-file 指明要导入的文件路径

注意:
CSV 格式良好,主流数据库都支持导出为 CSV 的格式,所以这种格式非常利于异构数据迁移

数据备份 mongodump

用 mongodump 来做 MongoDB 的库或表级别的备份:

备份 my_mongodb 数据库

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost bin]# ./mongodump -d my_mongodb
connected to: 127.0.0.1
DATABASE: my_mongodb to dump/my_mongodb
my_mongodb.system.indexes to dump/my_mongodb/system.indexes.bson
1 objects
my_mongodb.user to dump/my_mongodb/user.bson
2 objects
[root@localhost bin]# ll
总计 67648
-rwxr-xr-x 1 root root 7508756 2011-04-06 bsondump
drwxr-xr-x 3 root root 4096 04-10 23:54 dump
-rwxr-xr-x 1 root root 2978016 2011-04-06 mongo

此时会在当前目录下创建一个 dump 目录,用于存放备份出来的文件也可以指定备份存放的目录.

1
2
3
4
5
6
7
8
9
[root@localhost bin]# ./mongodump -d my_mongodb -o my_mongodb_dump
connected to: 127.0.0.1
DATABASE: my_mongodb to my_mongodb_dump/my_mongodb
my_mongodb.system.indexes to
my_mongodb_dump/my_mongodb/system.indexes.bson
1 objects
my_mongodb.user to my_mongodb_dump/my_mongodb/user.bson
2 objects
[root@localhost bin]#

文件存在了当前目录下的 my_mongodb_dump 目录下

数据恢复 mongorestore

将库 my_mongodb 删除掉

1
2
3
4
5
6
7
8
9
> use my_mongodb
switched to db my_mongodb
> db.dropDatabase()
{ "dropped" : "my_mongodb", "ok" : 1 }
> show dbs
admin (empty)
local (empty)
test (empty)
>

数据库恢复

1
2
3
4
5
6
7
8
9
10
[root@localhost bin]# ./mongorestore -d my_mongodb my_mongodb_dump/*
connected to: 127.0.0.1
Wed Apr 11 00:03:03 my_mongodb_dump/my_mongodb/user.bson
Wed Apr 11 00:03:03 going into namespace [my_mongodb.user]
Wed Apr 11 00:03:03 2 objects found
Wed Apr 11 00:03:03 my_mongodb_dump/my_mongodb/system.indexes.bson
Wed Apr 11 00:03:03 going into namespace [my_mongodb.system.indexes]
Wed Apr 11 00:03:03 { name: "_id_", ns: "my_mongodb.user", key: { _id: 1 }, v: 0 }
Wed Apr 11 00:03:03 1 objects found
[root@localhost bin]#

数据库又回来了,其实要是想恢复库,也大可不必先删除 my_mongodb 库,只要指
明 –drop 参数,就可以在恢复的时候先删除表然后再向表中插入数据的

访问控制

官方手册中启动 MongoDB 服务时没有任何参数,一旦客户端连接后可以对数据库任意操作,而且可以远程访问数据库,所以推荐开发阶段可以不设置任何参数,但对于生产环境还
是要仔细考虑一下安全方面的因素,而提高 MongoDB 数据库安全有几个方面:

1.绑定 IP 内网地址访问 MongoDB 服务
2. 设置监听端口
3. 使用用户名和口令登录

绑定 IP 内网地址访问 MongoDB 服务

MongoDB 可以限制只允许某一特定 IP 来访问,只要在启动时加一个参数 bind_ip 即可,如
下:服务端限制只有 192.168.1.103 这个 IP 可以访问 MongoDB 服务

bin]# ./mongod --bind_ip 192.168.1.103```
1
2
3
4
5
6
7

> 客户端访问时需要明确指定服务端的 IP,否则会报错:

```[root@localhost bin]# ./mongo 192.168.1.102
MongoDB server version: 3.4.9
connecting to: 192.168.1.103/test
>

设置监听端口

官方默认的监听端口是 27017,为了安全起见,一般都会修改这个监听端口,避免恶意的连
接尝试,具体如下:
将服务端监听端口修改为 28018

1
[root@localhost bin]# ./mongod --bind_ip 192.168.1.103 --port 28018

端户访问时不指定端口,会连接到默认端口 27017,对于本例会报错

1
2
3
4
5
[root@localhost bin]# ./mongo 192.168.1.102
MongoDB server version: 3.4.9
connecting to: 192.168.1.102/test
Sun Apr 15 15:55:51 Error: couldn't connect to server 192.168.1.102 shell/mongo.js:81
exception: connect failed

所以当服务端指定了端口后,客户端必须要明确指定端口才可以正常访问

1
2
3
4
[root@localhost bin]# ./mongo 192.168.1.102:28018
MongoDB server version: 3.4.9
connecting to: 192.168.1.102:28018/test
>

使用用户名和口令登录

MongoDB 默认的启动是不验证用户名和密码的,启动 MongoDB 后,可以直接用 MongoDB 连接上来,对所有的库具有 root 权限。所以启动的时候指定参数,可以阻止客户端的访问和连接。

先启用系统的登录验证模块, 只需在启动时指定 auth 参数即可,如:

1
[root@localhost bin]# ./mongod --auth

本地客户端连接一下看看效果;

1
2
3
4
5
[root@localhost bin]# ./mongo
MongoDB server version: 3.4.9
connecting to: test
> show collections;
>

启用了登录验证模块,但登录时没有指定用户,为什么还可以登录呢?在最初始的时候 MongoDB 都默认有一个 admin 数据库(默认是空的),而 admin.system.users 中将会保存比在其它数据库中设置的用户权限更大的用户信息。
注意:当 admin.system.users 中没有添加任何用户时,即使 MongoDB 启动时添加了 –auth参数,如果在除 admin 数据库中添加了用户,此时不进行任何认证依然可以使用任何操作,直到在 admin.system.users 中添加了一个用户。

1、建立系统 root 用户. 在 admin 库中新添一个用户 root:

[root@localhost bin]# ./mongo
MongoDB server version: 3.4.9
connecting to: test
> db.createUser({user:"anziguoer", "pwd":"anziguoer", roles:["root"]})
{
"user" : "anziguoer",
"readOnly" : false,
"pwd" : "e54950178e2fa777b1d174e9b106b6ab"
}
> db.auth("anziguoer","anziguoer")
1
>

本地客户端连接,但不指定用户,结果如下:
1
2
3
4
5
6
7
8
9
[root@localhost bin]# ./mongo
MongoDB server version: 3.4.9
connecting to: test
> show collections;
Sun Apr 15 16:36:52 uncaught exception: error: {
"$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",
"code" : 10057
}
>
连上 test 库了,但进一步操作时有异常,看来 MongoDB 允许未授权连接,不能进行任何本地客户端连接,指定用户,结果如下:
1
2
3
4
5
6
7
8
[root@localhost bin]# ./mongo -u root -p
MongoDB server version: 3.4.9
Enter password:
connecting to: test
> show collections;
system.indexes
system.users
>
看来指定了用户名之后,访问数据库才是正常 2、建立指定权限用户 MongoDB 也支持为某个特定的数据库来设置用户,如我们为 test 库设一个只读的用户 user_reader: [root@localhost bin]# ./mongo -u root -p MongoDB server version: 3.4.9 Enter password: connecting to: test > show collections; system.indexes system.users > use test switched to db test > db.createUser({user:"anziguoer", "pwd":"anziguoer", roles:["root"]}) { "user" : "user_reader", "readOnly" : true, "pwd" : "0809760bb61ee027199e513c5ecdedc6" } > 客户端用此用户来访问: [root@localhost bin]# ./mongo -u user_reader -p MongoDB server version: 3.4.9 Enter password: connecting to: test > show collections; system.indexes system.users >
坚持原创技术分享,您的支持将鼓励我继续创作!
//