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
| HOST_IP="192.168.72.128" HOST_SSH_USER="root" HOST_SSH_PASS="regen"
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 配置文件:
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
|
4. 测试脚本
4.1 单次直接运行-检查备份
运行脚本
1 2
| cd /data/scripts/influxdb-docker-ssh-backup.sh bash influxdb-docker-ssh-backup.sh
|
检查备份是否存在

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
|
检查备份

检查脚本日志
1
| cat /var/log/influxdb-backup.log
|

脚本
以下是脚本内容:
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
set -euo pipefail
HOST_IP="192.168.72.128" HOST_SSH_USER="root" HOST_SSH_PASS="regen"
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"
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. 容器正在运行"
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}"
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'"
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}"
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}"
echo "6. 清理容器内备份目录..." sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no ${HOST_SSH_USER}@${HOST_IP} \ "cd ${HOST_BACKUP_DIR} && rm ${DATE} -rf"
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. 宿主机过期备份清理完成"
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}"
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.sh
和Dockerfile
后即可构建镜像
1
| docker build -t influxdb-backup:1.0 .
|


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
| 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
set -euo pipefail
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"
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. 容器正在运行"
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}"
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'"
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}"
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}"
echo "6. 清理容器内备份目录..." sshpass -p "$HOST_SSH_PASS" ssh -o StrictHostKeyChecking=no "${HOST_SSH_USER}@${HOST_IP}" \ "cd ${HOST_BACKUP_DIR} && rm -rf ${DATE}"
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. 宿主机过期备份清理完成"
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}"
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
|

使用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" 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
|
