influxdb备份


基于脚本

操作步骤

1. 放置脚本

1.1 放置脚本

将脚本放置于/data/scripts/influxdb-docker-backup.sh。如果没有次路径则使用mkdir -p /data/scripts/ 创建。

1.2 赋权脚本

1
chmod +x /data/scripts/influxdb-docker-backup.sh

2. 修改脚本参数

1
vim /data/scripts/influxdb-docker-backup.sh

按照实际情况进行修改以下参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ==== 宿主机 SSH 配置 ====
HOST_IP="192.168.72.128" # 容器宿主机 IP
HOST_SSH_USER="root" # 宿主机 SSH 用户
HOST_SSH_PASS="regen" # 宿主机 SSH 密码

# ==== 宿主机备份目录 ====
HOST_BACKUP_DIR="/data/backup/influxdb" # 宿主机备份目录

# ==== 容器配置 ====
CONTAINER_NAME="influxdb"
ADMIN_USER="admin"
ADMIN_PASS="StrongPass123"
CONTAINER_BACKUP_DIR="/backup" # 容器内部备份目录


# ==== 本地备份机保存目录 ====
LOCAL_BACKUP_DIR="/data/backup/influxdb"
RETENTION_DAYS=5

3. 定时任务

3.1 编辑 Cron 配置

打开 cron 配置文件:

1
crontab -e

3.2 添加定时任务

在 Cron 配置文件中添加定时任务,每天凌晨 2 点执行备份脚本,添加以下行:

日志路径可自行修改。默认/var/logs/influxdb-backup.log

1
0 2 * * * /bin/bash /data/scripts/influxdb-docker-ssh-backup.sh >> /var/log/influxdb-backup.log 2>&1
  • 0 2 * * *:每天凌晨 2 点执行任务。

4. 测试脚本

4.1 单次直接运行-检查备份

运行脚本

1
2
cd /data/scripts/influxdb-docker-ssh-backup.sh
bash influxdb-docker-ssh-backup.sh

检查备份是否存在

image-20250826095817546

4.2 单次定时运行-检查备份、脚本日志

增加运行一次的定时任务进行测试:

假设今天是8.22 15:59,我设置一分钟后运行一次(即8.22 16:00)

1
2
3
crontab -e
0 16 22 8 * /bin/bash /data/scripts/influxdb-docker-ssh-backup.sh >> /var/log/influxdb-backup.log 2>&1
# 参数分别是 分 时 日 秒 年

检查备份

image-20250826095827350

检查脚本日志

1
cat /var/log/influxdb-backup.log

image-20250826095935651


脚本

以下是脚本内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash
# ==============================================================================
# 脚本名称:influxdb-docker-ssh-backup.sh
# 版本:v2.4
# 运行位置:备份机
# 功能:
# 通过 SSH 登录容器宿主机执行 InfluxDB 备份:
# 1. 在容器内生成数据库备份和用户信息
# 2. 将备份目录拷贝到宿主机
# 3. 宿主机打包成 tar.gz
# 4. 清理宿主机过期备份
# 5. 拉回备份机保存并清理过期备份
# ==============================================================================


set -euo pipefail

# ==== 宿主机 SSH 配置 ====
HOST_IP="192.168.72.128" # 容器宿主机 IP
HOST_SSH_USER="root" # 宿主机 SSH 用户
HOST_SSH_PASS="regen" # 宿主机 SSH 密码

# ==== 宿主机备份目录 ====
HOST_BACKUP_DIR="/data/backup/influxdb" # 宿主机备份目录

# ==== 容器配置 ====
CONTAINER_NAME="influxdb"
ADMIN_USER="admin"
ADMIN_PASS="123456"
CONTAINER_BACKUP_DIR="/backup" # 容器内部备份目录


# ==== 本地备份机保存目录 ====
LOCAL_BACKUP_DIR="/data/backup/influxdb"
RETENTION_DAYS=5

# ==== 日期 ====
DATE=$(date +"%Y%m%d-%H%M%S")
BACKUP_NAME="influxdb-backup-${DATE}.tar.gz"

# ==== 1. 检查容器是否运行 ====
echo "1. 检查宿主机容器状态..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \
"docker ps --format '{{.Names}}' | grep -q '^${CONTAINER_NAME}$'" || {
echo "容器 ${CONTAINER_NAME} 未运行,退出"
exit 1
}
echo "1. 容器正在运行"

# ==== 2. 容器内执行数据库备份 ====
echo "2. 在容器内生成数据库备份..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \
"docker exec ${CONTAINER_NAME} influxd backup -portable ${CONTAINER_BACKUP_DIR}/${DATE}"

# ==== 3. 容器内导出用户信息 ====
echo "3. 导出用户信息到容器内..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \
"docker exec ${CONTAINER_NAME} sh -c 'mkdir -p ${CONTAINER_BACKUP_DIR}/${DATE} && influx -username ${ADMIN_USER} -password ${ADMIN_PASS} -execute \"SHOW USERS\" > ${CONTAINER_BACKUP_DIR}/${DATE}/users_${DATE}.txt'"

# ==== 4. 将容器备份目录拷贝到宿主机 ====
echo "4. 从容器复制备份到宿主机..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \
"mkdir -p ${HOST_BACKUP_DIR} && docker cp ${CONTAINER_NAME}:${CONTAINER_BACKUP_DIR}/${DATE} ${HOST_BACKUP_DIR}/"
echo "4. 备份目录已拷贝到宿主机 ${HOST_BACKUP_DIR}/${DATE}"

# ==== 5. 宿主机打包备份 ====
echo "5. 宿主机打包成 tar.gz..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \
"cd ${HOST_BACKUP_DIR} && tar -czf ${BACKUP_NAME} ${DATE}"
echo "5. 宿主机打包完成:${HOST_BACKUP_DIR}/${BACKUP_NAME}"

# ==== 6. 清理容器内备份目录 ====
echo "6. 清理容器内备份目录..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \
"cd ${HOST_BACKUP_DIR} && rm ${DATE} -rf"

# ==== 6. 清理宿主机过期备份 ====
echo "6. 清理宿主机 ${RETENTION_DAYS} 天前的备份..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \
"find ${HOST_BACKUP_DIR} -type f -name 'influxdb-backup-*.tar.gz' -mtime +${RETENTION_DAYS} -delete"
echo "6. 宿主机过期备份清理完成"

# ==== 7. 拉取备份到备份机 ====
mkdir -p "${LOCAL_BACKUP_DIR}"
sshpass -p "$HOST_SSH_PASS" scp -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP}:${HOST_BACKUP_DIR}/${BACKUP_NAME} ${LOCAL_BACKUP_DIR}/
echo "7. 已拉取备份到备份机 ${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"

# ==== 8. 清理备份机本地过期文件 ====
echo "8. 清理 ${RETENTION_DAYS} 天前的本地备份..."
find "${LOCAL_BACKUP_DIR}" -type f -name "influxdb-backup-*.tar.gz" -mtime +${RETENTION_DAYS} -delete
echo "8. 本地过期备份清理完成"

echo "✅ 备份完成:${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"

基于容器

构建镜像

​ 准备好备份脚本influxdb-docker-ssh-backup.shDockerfile后即可构建镜像

1
docker build -t influxdb-backup:1.0 .

image-20250902144339463

image-20250902144314850

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 基于 Alpine 的轻量容器
FROM alpine:3.21

# 安装必备工具
RUN apk add --no-cache \
bash \
openssh-client \
sshpass \
curl \
tar \
gzip \
coreutils \
findutils

# 创建目录存放备份
RUN mkdir -p /data/backup/influxdb

# 复制备份脚本到容器
COPY influxdb-docker-ssh-backup.sh /usr/local/bin/influxdb-docker-ssh-backup.sh
RUN chmod +x /usr/local/bin/influxdb-docker-ssh-backup.sh

# 设置默认工作目录
WORKDIR /data/backup/influxdb

# 设置默认环境变量(可在运行时覆盖)
ENV HOST_IP=192.168.72.128 \
HOST_SSH_USER=root \
HOST_SSH_PASS=regen \
CONTAINER_NAME=influxdb \
ADMIN_USER=admin \
ADMIN_PASS=123456 \
HOST_BACKUP_DIR=/data/backup/influxdb \
CONTAINER_BACKUP_DIR=/backup \
LOCAL_BACKUP_DIR=/data/backup/influxdb \
RETENTION_DAYS=5

# 默认执行脚本
ENTRYPOINT ["/usr/local/bin/influxdb-docker-ssh-backup.sh"]

influxdb-docker-ssh-backup.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/sh
# ==============================================================================
# 脚本名称:influxdb-docker-ssh-backup.sh
# 版本:v2.4 (环境变量化)
# 功能:
# 通过 SSH 登录容器宿主机执行 InfluxDB 备份,并拉回备份机保存
# ==============================================================================

set -euo pipefail

# ==== 宿主机 SSH 配置 ====
HOST_IP="${HOST_IP:-192.168.72.128}"
HOST_SSH_USER="${HOST_SSH_USER:-root}"
HOST_SSH_PASS="${HOST_SSH_PASS:-regen}"

# ==== 宿主机备份目录 ====
HOST_BACKUP_DIR="${HOST_BACKUP_DIR:-/data/backup/influxdb}"

# ==== 容器配置 ====
CONTAINER_NAME="${CONTAINER_NAME:-influxdb}"
ADMIN_USER="${ADMIN_USER:-admin}"
ADMIN_PASS="${ADMIN_PASS:-123456}"
CONTAINER_BACKUP_DIR="${CONTAINER_BACKUP_DIR:-/backup}"

# ==== 本地备份机保存目录 ====
LOCAL_BACKUP_DIR="${LOCAL_BACKUP_DIR:-/data/backup/influxdb}"
RETENTION_DAYS="${RETENTION_DAYS:-5}"

# ==== 日期 ====
DATE=$(date +"%Y%m%d-%H%M%S")
BACKUP_NAME="influxdb-backup-${DATE}.tar.gz"

# ==== 1. 检查容器是否运行 ====
echo "1. 检查宿主机容器状态..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \
"docker ps --format '{{.Names}}' | grep -q '^${CONTAINER_NAME}$'" || {
echo "容器 ${CONTAINER_NAME} 未运行,退出"
exit 1
}
echo "1. 容器正在运行"

# ==== 2. 容器内执行数据库备份 ====
echo "2. 在容器内生成数据库备份..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \
"docker exec ${CONTAINER_NAME} influxd backup -portable ${CONTAINER_BACKUP_DIR}/${DATE}"

# ==== 3. 容器内导出用户信息 ====
echo "3. 导出用户信息到容器内..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \
"docker exec ${CONTAINER_NAME} sh -c 'mkdir -p ${CONTAINER_BACKUP_DIR}/${DATE} && influx -username ${ADMIN_USER} -password ${ADMIN_PASS} -execute \"SHOW USERS\" > ${CONTAINER_BACKUP_DIR}/${DATE}/users_${DATE}.txt'"

# ==== 4. 将容器备份目录拷贝到宿主机 ====
echo "4. 从容器复制备份到宿主机..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \
"mkdir -p ${HOST_BACKUP_DIR} && docker cp ${CONTAINER_NAME}:${CONTAINER_BACKUP_DIR}/${DATE} ${HOST_BACKUP_DIR}/"
echo "4. 备份目录已拷贝到宿主机 ${HOST_BACKUP_DIR}/${DATE}"

# ==== 5. 宿主机打包备份 ====
echo "5. 宿主机打包成 tar.gz..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \
"cd ${HOST_BACKUP_DIR} && tar -czf ${BACKUP_NAME} ${DATE}"
echo "5. 宿主机打包完成:${HOST_BACKUP_DIR}/${BACKUP_NAME}"

# ==== 6. 清理容器内备份目录 ====
echo "6. 清理容器内备份目录..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \
"cd ${HOST_BACKUP_DIR} && rm -rf ${DATE}"

# ==== 7. 清理宿主机过期备份 ====
echo "7. 清理宿主机 ${RETENTION_DAYS} 天前的备份..."
sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \
"find ${HOST_BACKUP_DIR} -type f -name 'influxdb-backup-*.tar.gz' -mtime +${RETENTION_DAYS} -delete"
echo "7. 宿主机过期备份清理完成"

# ==== 8. 拉取备份到备份机 ====
mkdir -p "${LOCAL_BACKUP_DIR}"
sshpass -p "$HOST_SSH_PASS" scp -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}:${HOST_BACKUP_DIR}/${BACKUP_NAME}" "${LOCAL_BACKUP_DIR}/"
echo "8. 已拉取备份到备份机 ${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"

# ==== 9. 清理备份机本地过期文件 ====
echo "9. 清理 ${RETENTION_DAYS} 天前的本地备份..."
find "${LOCAL_BACKUP_DIR}" -type f -name "influxdb-backup-*.tar.gz" -mtime +${RETENTION_DAYS} -delete
echo "9. 本地过期备份清理完成"

echo "✅ 备份完成:${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"

使用docker run运行

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run --rm \
-v /data/backup/influxdb:/data/backup/influxdb \
-e HOST_IP=192.168.99.203 \
-e HOST_SSH_USER=root \
-e HOST_SSH_PASS=6bH7GmTa \
-e CONTAINER_NAME=influxdb \
-e ADMIN_USER=admin \
-e ADMIN_PASS=StrongPass123 \
-e HOST_BACKUP_DIR=/data/backup/influxdb \
-e CONTAINER_BACKUP_DIR=/backup \
-e LOCAL_BACKUP_DIR=/data/backup/influxdb \
-e RETENTION_DAYS=5 \
influxdb-backup:1.0

image-20250902144759534

使用docker-compose运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: "3.9"

services:
influxdb-backup:
image: influxdb-backup:1.0
container_name: influxdb-backup
restart: "no" # 如果是每天定时运行,可以设置为 no
volumes:
- /data/backup/influxdb:/data/backup/influxdb
environment:
HOST_IP: "192.168.99.203"
HOST_SSH_USER: "root"
HOST_SSH_PASS: "regen"
CONTAINER_NAME: "influxdb"
ADMIN_USER: "admin"
ADMIN_PASS: "StrongPass123"
HOST_BACKUP_DIR: "/data/backup/influxdb"
CONTAINER_BACKUP_DIR: "/backup"
LOCAL_BACKUP_DIR: "/data/backup/influxdb"
RETENTION_DAYS: "5"
1
docker-compose run --rm influxdb-backup

image-20250902144843326