迁移

1
2
3
4
5
6
# dump
mongodump --host 127.0.0.1 --port 27017 \
-u admin -p 123456 --authenticationDatabase admin \
--db watt \
--out ./mongodumps \
--gzip
1
2
3
4
5
6
7
8
9
10
11
mongo --host 127.1 --port 27017  -u admin -p 123456 --authenticationDatabase admin
# create new db
use admin
db.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
db.auth("admin","123456")

# grant
db.grantRolesToUser( "admin" , [ { role: "dbOwner", db: "admin" },
{ "role": "clusterAdmin", "db": "admin" },
{ "role": "userAdminAnyDatabase", "db": "admin" },
{ "role": "dbAdminAnyDatabase", "db": "admin" }])
1
2
3
4
5
6
7
8
9
10
11
12
13
# restore
use admin
db.grantRolesToUser("admin", [
{ role: "readWrite", db: "watt" },
{ role: "dbAdmin", db: "watt" }
])
mongorestore -h 127.0.0.1 -u admin -p 123456 --authenticationDatabase admin --nsInclude="watt.*" --drop ./mongodumps --gzip

# maybe need clear some collection
["colony", "colonyDataInfo", "colonyGroup", "colonyLink", "colonyStatus"].forEach(coll => {
db.getCollection(coll).deleteMany({})
print(`已清空集合 ${coll}`)
})

重新选举primary

1
2
3
4
5
6
7
8
9
10
11
# login primary
mongo --host 127.1 --port 27017 -u admin -p 123456 --authenticationDatabase admin

# look
rs.status().members.map(m => { return { name: m.name, stateStr: m.stateStr, optime: m.optime, health: m.health }; });

# ensure not wanted ip
mongo --host <目标Secondary_IP> --eval 'rs.freeze(120)' -u admin -p search --authenticationDatabase admin

# downgrade primary
mongo --host 127.1 --port 27017 --eval 'rs.stepDown(60)' -u admin -p search --authenticationDatabase admin

另一个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# change priority
mongo --host 127.1 --port 27017 -u admin -p 123456 --authenticationDatabase admin

# look
cfg = rs.conf()
printjson(cfg.members)

# change
# 设置目标节点优先级最高(默认priority=1,越大越优先)
cfg.members[1].priority = 5

# 禁止其他节点成为Primary(可选)
cfg.members[0].priority = 0.5
cfg.members[2].priority = 0.5

rs.reconfig(cfg)

下线旧机器

1
rs.remove("<secondary_ip:port>");

附录:常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use admin
show dbs
show collections

# eg 查询 dataInfo 集合
db.dataInfo.find()
db.dataInfo.count()

db.dataInfo.find(
{ data_name: { $regex: /^searchV7.*/ } },
{ data_name: 1, data_edition: 1}
)

db.dataInfo.aggregate([
{
$match: {
data_name: { $regex: /^searchV7.*/ },
reload_mode: "restart"
}
}
]).pretty()

ref
https://blog.csdn.net/fly0512/article/details/107180802