docker中mongo数据库备份

1,046 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

一、mongodb数据备份

1、查询docker的运行情况

docker ps

2、进入mongodb 的容器

docker exec -it [容器ID] bash 

例如:docker exec -it 9286d48386ae bash

3、创建一个目录为dump

mkdir dump 

4、进入db目录

cd data/db

5、备份数据到 /dump下(path:data/db)

mongodump -h 127.0.0.1 --port 27017 -u='root' -p='123456' -d testDB -o /dump
# 我这里没有密码:mongodump -h 127.0.0.1  -d oversee-store -o /dump

二、将容器内的文件传到本机(如果已经映射,可以跳过此步骤)

1、先拿到容器的短ID或者指定的name。

docker ps -a

2、然后根据这两项的任意一项拿到ID全称。

docker inspect -f '{{.Id}}' 3aa4495b2ac0

3、将容器内文件传到本机指定目录

docker cp ID全称:容器文件路径 本地路径
例如:docker cp 3aa4495b2ac0f113ae7a72743441f5a33012d084e3f6a79f42ed6d0ada9ff065:/dump /root/source/docker/mongo/mongo-data-backup

4、压缩文件并从服务器传至我的电脑

# 在  /root/source/docker/mongo/mongo-data-backup  文件夹下
zip -r dump.zip dump/
sz dump.zip

# 我的
zip -r oversee-store.zip oversee-store/
sz oversee-store.zip

三、将文件从我的电脑传至另一台服务器

1、解压缩

# 将压缩包上传至服务器后
unzip dump.zip
# 我的
unzip oversee-store.zip

2、查看这台机器上的mongodb完整ID

docker inspect -f '{{.Id}}' f54dfcdb4cbf

3、将服务器的压缩包传入docker

docker cp /home/lhz/docker/mongo/dump/ f54dfcdb4cbf4f3148b263f6f5005502752fd6cfa5a706e388d9198ac1c6f8ca:/dump
# 我的
docker cp /home/lhz/docker/mongo/mongoData/ f54dfcdb4cbf4f3148b263f6f5005502752fd6cfa5a706e388d9198ac1c6f8ca:/dump

4、进入docker容器

docker exec -it 6bb536ad1801 bash

copy文件夹

cp dir1/a.doc dir2  # 表示将dir1下的a.doc文件复制到dir2目录下
cp -r dir1 dir2 # 表示将dir1及其dir1下所包含的文件复制到dir2下
cp -r dir1/. dir2  # 表示将dir1下的文件复制到dir2,不包括dir1目录
#说明:cp参数 -i:询问,如果目标文件已经存在,则会询问是否覆盖;
# 我的
root@f54dfcdb4cbf:/dump/mongoData# cp -r oversee-store/ /dump

5、恢复数据库(222是数据库名称)

mongorestore -h 127.0.0.1:27017 -u='root' -p='123456' -d testDB /dump/testDB
# 我的
我这里没有密码,例如:mongorestore -h 127.0.0.1:27017  -d 222 /dump/222 

查看全部容器卷

docker volume ls

volumes:      
  - "./data/mongo:/data/db"      
  - "./data/mongo-entrypoint/:/docker-entrypoint-initdb.d/"      
  - "./copydata:/dump/"

四、自动化备份

1、本地新建项目

npm init -y

安装依赖

npm install node-schedule child_process --save

2、配置docker卷(见上面)

我这里配置了docker的volumes,容器中/dump的内容会在服务器的/root/source/docker/mongo/copydata 目录下

3、SFTP配置

项目配置SFTP .vscode/sftp.json

{
    "name": "xxxxxx",
    "host": "xx.xx.xx.xx",    
    "port": 22,     
    "username": "root", 
    "password": "xxxxxxxxxxxxx", 
    "protocol": "sftp", 
    "passive": false,
    "interactiveAuth": false,
    "remotePath": "/root/schedule/mongo",   
    "uploadOnSave": false, 
    "syncMode": "update",
    "ignore": [            
        "**/.vscode/**",
        "**/node_modules/**",
        "**/.DS_Store"
    ]
}

上传服务器后,进行npm install

4、编写sh脚本

src/mongo_data_backup.sh

#!/bin/bash
# 定时任务源码位置
DATA_SAVE_PATH='/root/schedule/mongo/data-save' # 数据备份存放处
DOCKER_COPY_DATA='/root/source/docker/mongo/copydata' # docker内mongo数据库导出数据的映射地址
currentdate=$(date +%Y%m%d%H%M%S) # 当前日期+时间

echo "------ 在docker内部执行操作(数据库备份) ------"
# 删除docker内备份文件夹下的内容(-f强制删除,忽略错误提示)
docker exec -i mongo_mongo_1 bash -c 'rm -rf -f /dump/oversee-store/*' &&

# 数据库备份指令
# 不要 -t 因为 -t是分配的一个伪终端。这里不需要分配伪终端。
docker exec -i mongo_mongo_1 bash -c 'mongodump -h 127.0.0.1  -d oversee-store -o /dump' &&

echo "------ 压缩 ------"
cd $DOCKER_COPY_DATA
zip -r oversee-store$currentdate.zip oversee-store/ &&

echo "------ 复制压缩包到指定位置 ------"
cp -r oversee-store$currentdate.zip /root/schedule/mongo/data-save &&

echo "------ 删除当前位置的压缩包 ------"
rm oversee-store$currentdate.zip &&
echo "------ end ------"

5、编写定时器

src/mongo_data_backup.js

const schedule = require('node-schedule');

function run_cmd(cmd, args, callback) {
  const { spawn } = require('child_process')
  var child = spawn(cmd, args);
  var resp = "";

  child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
  child.stdout.on('end', function() { callback (resp) });
}

const scheduleCronstyle = ()=>{
  // 每分钟的第30秒定时执行一次: 30 * * * * *
  // 秒数10的倍数执行: */10 * * * * *
  // 每天的0点0分0秒触发: 0 0 0 * * *
  schedule.scheduleJob('0 0 0 * * *',()=>{
    run_cmd('sh', ['./mongo_data_backup.sh'], function(text){ console.log(text) });
  }); 
}

scheduleCronstyle()

6、使用pm2启动js服务

pm2 start mongo_data_backup.js --name mongoDataBackup

可以看到 /root/schedule/mongo/data-save/ 文件夹下已经开始有打包数据了

7、传入本机保存

在/root/schedule/mongo/data-save/文件夹下

sz oversee-store20210727162430.zip

即可下载到本机了

或者SFTP整个拉取(看个人爱好)

8、恢复数据库(oversee-store是数据库名称)

解压缩

# 将压缩包上传至另外一台服务器后  
unzip dump.zip
# 我的
cd /home/lhz/docker/mongo/dump
unzip oversee-store20210727162430.zip

恢复数据库

# 删除docker中的备份
docker exec -i mongo_mongo_1 bash -c 'rm -rf -f /dump/*'
# 查看docker的id全称
docker inspect -f '{{.Id}}' mongo_mongo_1    # 得到 f54dfcdb4cbf4f3148b263f6f5005502752fd6cfa5a706e388d9198ac1c6f8ca
# 将文件传入docker
docker cp /home/lhz/docker/mongo/dump/oversee-store f54dfcdb4cbf4f3148b263f6f5005502752fd6cfa5a706e388d9198ac1c6f8ca:/dump
docker exec -it mongo_mongo_1 bash -c 'mongorestore -h 127.0.0.1  -d oversee-store /dump/oversee-store'