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
 | 
按照实际情况进行修改以下参数。
| 12
 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 单次直接运行-检查备份
运行脚本
| 12
 
 | cd /data/scripts/influxdb-docker-ssh-backup.shbash influxdb-docker-ssh-backup.sh
 
 | 
检查备份是否存在

4.2 单次定时运行-检查备份、脚本日志
增加运行一次的定时任务进行测试:
假设今天是8.22 15:59,我设置一分钟后运行一次(即8.22 16:00)
| 12
 3
 
 | crontab -e0 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
 | 

脚本
以下是脚本内容:
| 12
 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:
 | 12
 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:
| 12
 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运行
| 12
 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运行
| 12
 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
 | 
