TDengine脚本备份方案:全库/单库备份与飞书通知

文章目录

TDengine备份脚本

1、TDengine备份工具

由于开源版本不支持在web端直接备份,所以本脚本采用官方备份工具:taosdump

taosdump 是一个开源工具,用于支持从运行中的 TDengine TSDB 集群备份数据并将备份的数据恢复到相同或另一个正在运行的 TDengine TSDB 集群中。taosdump 可以将数据库作为逻辑数据单元进行备份,也可以对数据库中指定时间段内的数据记录进行备份。在使用 taosdump 时,可以指定数据备份的目录路径。如果不指定目录路径,taosdump 将默认将数据备份到当前目录。

bash 复制代码
taosdump -h localhost -P 6030 -D dbname -u root -p  -o /file/path

执行上述命令后,taosdump 会连接 localhost:6030 所在的 TDengine TSDB 集群,查询数据库 dbname 中的所有数据,并将数据备份到 /file/path 下。

bash 复制代码
 taosdump -A -P 6030 -u root -p -o /file/path

执行上述命令后,taosdump 会连接 localhost:6030 所在的 TDengine TSDB 集群,查询数据库中的所有数据,并将数据备份到 /file/path 下。

在使用 taosdump 时,如果指定的存储路径已经包含数据文件,taosdump 会提示用户并立即退出,以避免数据被覆盖。这意味着同一存储路径只能用于一次备份。如果你看到相关提示,请谨慎操作,以免误操作导致数据丢失。要将本地指定文件路径中的数据文件恢复到正在运行的 TDengine TSDB 集群中,可以通过指定命令行参数和数据文件所在路径来执行 taosdump 命令。以下为 taosdump 执行数据恢复的示例代码。

恢复数据库命令:

bash 复制代码
taosdump -i /backup/path -h localhost -P 6030

2、脚本备份逻辑

bash 复制代码
判断备份模式 → 执行对应备份(单库/全库) → 备份成功 → 压缩备份目录 → 删除原备份目录 → 发送飞书成功通知
若备份失败--->直接发送飞书失败通知

首先是配置核心字段:

bash 复制代码
# ============ 核心配置字段 ================
TAOS_HOST="localhost"
TAOS_PORT=6030
TAOS_USER="root"
TAOS_PASS="password"
# 备份模式配置 full=全库备份  single=单库备份
BACKUP_MODE="full"
# 当BACKUP_MODE=single时,此处填写需要备份的单库名
SINGLE_DB_NAME="message"
# 备份根目录
BACKUP_BASE_DIR="/data/backup/tdengine"
# 飞书机器人WEBHOOK地址
FEISHU_WEBHOOK="https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

TAOS_HOST/TAOS_PORT/TAOS_USER/TAOS_PASS:TDengine 数据库连接信息,备份命令会直接调用这 4 个参数,带账号密码认证;

备份模式核心开关,二选一,改这里就能切换备份方式:

  • full → 执行全库备份 ,会调用 -A 参数;
  • single → 执行单库备份 ,会调用 -D 参数 + 指定库名;

SINGLE_DB_NAME="message"仅单库模式生效,full 全库模式下这个配置会被自动忽略,不会影响任何逻辑;

BACKUP_BASE_DIR:备份文件的根目录,所有的备份压缩包都会存在这个目录下;

FEISHU_WEBHOOK:飞书机器人的推送地址,通知内容会通过这个地址发送到你的飞书群。

核心备份字段:

bash 复制代码
exec_backup() {
    mkdir -p "${BACKUP_DIR}"
    if [ "${BACKUP_MODE}" == "single" ]; then
        taosdump -P ${TAOS_PORT} -u ${TAOS_USER} -p${TAOS_PASS} -D ${SINGLE_DB_NAME} -o ${BACKUP_DIR}
    elif [ "${BACKUP_MODE}" == "full" ]; then
        taosdump -A -P ${TAOS_PORT} -u ${TAOS_USER} -p${TAOS_PASS} -o ${BACKUP_DIR}
    else
        BACKUP_STATUS="失败"
        BACKUP_MSG="BACKUP_MODE配置错误,仅支持full/single"
        return 1
    fi
    if [ $? -ne 0 ]; then
        BACKUP_STATUS="失败"
        BACKUP_MSG="备份执行异常,请查看taosdump日志"
        return 1
    fi
    return 0
}

mkdir -p "${BACKUP_DIR}":创建备份目录,参数 -p 是「安全创建」,即使上级目录不存在也会自动创建,目录已存在也不会报错,绝对安全,不会因为目录问题导致备份失败;

  • BACKUP_MODE=single → 执行【单库备份】,实现命令:taosdump -P 端口 -u 用户名 -p密码 -D 指定库名 -o 备份目录
  • BACKUP_MODE=full → 执行【全库备份】,实现命令:taosdump -A -P 端口 -u 用户名 -p密码 -o 备份目录

备份失败时:把 BACKUP_STATUS 改为「失败」,填充错误信息,return 1 告诉主流程「备份失败」;

备份成功时:return 0 告诉主流程「备份成功」。

压缩备份文件:

bash 复制代码
zip_backup() {
    zip -rq "${BACKUP_ZIP}" "${BACKUP_DIR}"
    if [ -f "${BACKUP_ZIP}" ]; then
        rm -rf "${BACKUP_DIR}"
    fi
}

zip:

  • -r:递归压缩,备份目录里的所有文件 / 子目录都会被压缩进去,缺一不可;
  • -q:静默压缩,压缩过程中不输出任何日志,让你的终端只显示 taosdump 的备份日志,干净整洁;

if [ -f "${BACKUP_ZIP}" ]:判断压缩包是否真实生成成功;

飞书通知函数 send_feishu_msg():

bash 复制代码
# 飞书通知实现
send_feishu_msg() {
    BACKUP_END_TIME=$(date +'%Y-%m-%d %H:%M:%S')
    ZIP_SIZE=$(du -sh ${BACKUP_ZIP} 2>/dev/null | awk '{print $1}')
    if [ "${BACKUP_MODE}" = "full" ]; then
        SHOW_DB_NAME="全部数据库"
    else
        SHOW_DB_NAME="${SINGLE_DB_NAME}"
    fi

    curl -s -k --connect-timeout 20 --max-time 30 \
    -H "Content-Type: application/json; charset=utf-8" \
    -X POST ${FEISHU_WEBHOOK} \
    -d @- << EOF
{
    "msg_type": "post",
    "content": {
        "post": {
            "zh_cn": {
                "title": "TDengine数据库备份通知",
                "content": [
                    [{"tag": "text", "text": "主机名:${HOST_NAME}"}],
                    [{"tag": "text", "text": "备份模式:${BACKUP_MODE}"}],
                    [{"tag": "text", "text": "备份库名:${SHOW_DB_NAME}"}],
                    [{"tag": "text", "text": "备份状态:${BACKUP_STATUS}"}],
                    [{"tag": "text", "text": "开始时间:${BACKUP_START_TIME}"}],
                    [{"tag": "text", "text": "完成时间:${BACKUP_END_TIME}"}],
                    [{"tag": "text", "text": "备份文件:${BACKUP_ZIP}"}],
                    [{"tag": "text", "text": "文件大小:${ZIP_SIZE}"}]
                ]
            }
        }
    }
}
EOF
}

BACKUP_END_TIME:获取备份完成的格式化时间,用于通知展示;

ZIP_SIZE=$(du -sh ${BACKUP_ZIP} 2>/dev/null | awk '{print $1}'):自动获取压缩包的大小,例如 10M2>/dev/null 是屏蔽无关错误,不影响执行;

动态展示库名:

  • 全库备份 → 显示「全部数据库」;
  • 单库备份 → 显示配置的库名(message);

最后使用curl完成消息发送。

3、脚本与执行过程

做这个备份脚本之前,我特意去TDengine的官方社区去问了一下,会不会损失性能或者备份途中锁表啥的,官方回复如下:

所以,备份是一定会有性能损失的,这都可以理解,既然不会锁表那就可以直接备份了。

全备份脚本如下:

bash 复制代码
#!/bin/bash
# TDengine数据库备份脚本
# 描述:全库或单库数据备份脚本,包含文件压缩和飞书通知
# 作者:是垚不是土
# 日期:2025-12-30

# 设置系统编码为 UTF-8,防止中文乱码
export LANG=zh_CN.UTF-8

# ============ 核心配置字段 ================
TAOS_HOST="localhost"
TAOS_PORT=6030
TAOS_USER="root"
TAOS_PASS="password"
# 备份模式配置 full=全库备份  single=单库备份
BACKUP_MODE="full"
# 当BACKUP_MODE=single时,此处填写需要备份的单库名
SINGLE_DB_NAME="message"
# 备份根目录
BACKUP_BASE_DIR="/data/backup/tdengine"
# 飞书机器人WEBHOOK地址
FEISHU_WEBHOOK="https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxxxxxxxxxx"

# =============自动生成变量=================
BACKUP_TIME=$(date +%Y%m%d%H%M)
BACKUP_DIR="${BACKUP_BASE_DIR}/${BACKUP_TIME}"
BACKUP_ZIP="${BACKUP_DIR}.zip"
HOST_NAME=$(hostname)
SERVER_IP=$(hostname -i)
BACKUP_START_TIME=$(date +'%Y-%m-%d %H:%M:%S')
BACKUP_STATUS="成功"
BACKUP_MSG=""

# 核心备份执行逻辑
exec_backup() {
    mkdir -p "${BACKUP_DIR}"
    if [ "${BACKUP_MODE}" == "single" ]; then
        taosdump -P ${TAOS_PORT} -u ${TAOS_USER} -p${TAOS_PASS} -D ${SINGLE_DB_NAME} -o ${BACKUP_DIR}
    elif [ "${BACKUP_MODE}" == "full" ]; then
        taosdump -A -P ${TAOS_PORT} -u ${TAOS_USER} -p${TAOS_PASS} -o ${BACKUP_DIR}
    else
        BACKUP_STATUS="失败"
        BACKUP_MSG="BACKUP_MODE配置错误,仅支持full/single"
        return 1
    fi
    if [ $? -ne 0 ]; then
        BACKUP_STATUS="失败"
        BACKUP_MSG="备份执行异常,请查看taosdump日志"
        return 1
    fi
    return 0
}

# 压缩+删除原目录
zip_backup() {
    zip -rq "${BACKUP_ZIP}" "${BACKUP_DIR}"
    if [ -f "${BACKUP_ZIP}" ]; then
        rm -rf "${BACKUP_DIR}"
    fi
}

# 飞书通知实现
send_feishu_msg() {
    BACKUP_END_TIME=$(date +'%Y-%m-%d %H:%M:%S')
    ZIP_SIZE=$(du -sh ${BACKUP_ZIP} 2>/dev/null | awk '{print $1}')
    if [ "${BACKUP_MODE}" = "full" ]; then
        SHOW_DB_NAME="全部数据库"
    else
        SHOW_DB_NAME="${SINGLE_DB_NAME}"
    fi

    curl -s -k --connect-timeout 20 --max-time 30 \
    -H "Content-Type: application/json; charset=utf-8" \
    -X POST ${FEISHU_WEBHOOK} \
    -d @- << EOF
{
    "msg_type": "post",
    "content": {
        "post": {
            "zh_cn": {
                "title": "TDengine数据库备份通知",
                "content": [
                    [{"tag": "text", "text": "主机名:${HOST_NAME}"}],
                    [{"tag": "text", "text": "备份模式:${BACKUP_MODE}"}],
                    [{"tag": "text", "text": "备份库名:${SHOW_DB_NAME}"}],
                    [{"tag": "text", "text": "备份状态:${BACKUP_STATUS}"}],
                    [{"tag": "text", "text": "开始时间:${BACKUP_START_TIME}"}],
                    [{"tag": "text", "text": "完成时间:${BACKUP_END_TIME}"}],
                    [{"tag": "text", "text": "备份文件:${BACKUP_ZIP}"}],
                    [{"tag": "text", "text": "文件大小:${ZIP_SIZE}"}]
                ]
            }
        }
    }
}
EOF
}

# 主执行流程
if exec_backup; then
    zip_backup
    send_feishu_msg
    exit 0
else
    send_feishu_msg
    exit 1
fi

赋予脚本执行权限,并执行脚本:

bash 复制代码
mkdir -p /data/backup/tdengine/
chmod +x tdengine_backup.sh 
./tdengine_backup.sh

(1)测试单库备份

bash 复制代码
# ============ 核心配置字段 ================
---
# 备份模式配置   full=全库备份  single=单库备份
BACKUP_MODE="single"
# 当BACKUP_MODE=single时,此处填写需要备份的单库名
SINGLE_DB_NAME="message"
---

将配置字段相应修改,再执行脚本:

bash 复制代码
root@deploy:/data/backup/tdengine# ./tdengine_backup.sh 

Connect mode is : Native

==============================
========== arguments config =========
TDengine Community Edition
taosdump version: 3.3.6.13
git: 1a3a182ba16ee188c0677fb6cd637b34c52f6bd7
build: Linux-x64 2025-06-28 22:48:07 +0800
host: (null)
user: root
port: 6030
outpath: /data/backup/tdengine/202512301425/
inpath: 
resultFile: ./dump_result.txt
all_databases: false
databases: true
databasesSeq: message
schemaonly: false
with_property: true
avro codec: snappy
data_batch: 16383
thread_num: 8
allow_sys: false
escape_char: true
loose_mode: false
isDumpIn: false
arg_list_len: 0
start time: 2025-12-30 14:26:12
OK: Database: message exists
INFO: Getting table(s) count of db (message) ...
INFO: Start to dump out database: message
INFO: start dump out super table data (realtime_monitor) ...
INFO: start dump super table meta (realtime_monitor) col:17 tags:2 ...
INFO: Get super table (realtime_monitor) child tables (3) ok
INFO: The number of tables of realtime_monitor is 3!
INFO: connection: 0x1635400 is dumping out schema of sub-table(s) of realtime_monitor 
INFO: connection 0x1635400 is dumping out schema: 1 from realtime_monitor.realtime_monitor_27220917000000_02
INFO: connection 0x1635400 is dumping out schema: 2 from realtime_monitor.realtime_monitor_55031412782305_02
INFO: connection 0x1635400 is dumping out schema: 3 from realtime_monitor.realtime_monitor_27220917000000_01
OK: total 3 table(s) of stable: realtime_monitor schema dumped.
INFO: create 3 thread(s) to export data ...
.INFO: message.realtime_monitor [1/3] write avro 100% of realtime_monitor_55031412782305_02
.INFO: message.realtime_monitor [2/3] write avro 100% of realtime_monitor_27220917000000_01
.INFO: message.realtime_monitor [3/3] write avro 100% of realtime_monitor_27220917000000_02
INFO: super table (realtime_monitor) dump 3 child data ok. close taos connections...
OK: Database message dumped
OK: 1075 row(s) dumped out!
end time: 2025-12-30 14:26:27
{"StatusCode":0,"StatusMessage":"success","code":0,"data":{},"msg":"success"}
root@deploy:/data/backup/tdengine# ls -lt 
total 38228
-rw-r--r-- 1 root root    12285 Dec 30 14:26 202512301425.zip
-rw-r--r-- 1 root root     5595 Dec 30 14:26 dump_result.txt
-rwxr-xr-x 1 root root     3769 Dec 30 14:25 tdengine_backup.sh

执行完成后,在/data/backup/tdengine目录之下回生成一个202512301425.zip,当然前面的时间戳要看你备份开始的时间。

并且飞书也收到了信息:

(2)测试全库备份

过程基本一致:

bash 复制代码
# ============ 核心配置字段 ================
---
# 备份模式配置   full=全库备份  single=单库备份
BACKUP_MODE="full"
# 当BACKUP_MODE=single时,此处填写需要备份的单库名
SINGLE_DB_NAME="message"
---

BACKUP_MODE设置成full后,SINGLE_DB_NAME将不再生效,过程不再演示,展示飞书通知结果:

4、总结

这个脚本整体是没什么大问题的,虽然存在一点小小的bug,比如说:

bash 复制代码
root@deploy:/data/backup/tdengine# ls data/
backup
root@deploy:/data/backup/tdengine# ls data/backup/
tdengine
root@deploy:/data/backup/tdengine# ls data/backup/tdengine/
202512301436
root@deploy:/data/backup/tdengine# ls data/backup/tdengine/202512301436/
dbs.sql  taosdump.3534153239176
root@deploy:/data/backup/tdengine# 

将备份文件解压之后竟然嵌套了哈哈哈哈哈,不过没啥影响。

当然,这个脚本要是想好用,肯定要去结合定时执行这一类的操作,使用crontab之类的定时执行,他就是一个完整的自动化备份方案了,如果有特定的需求,比如说我只备份过去一段时间的数据,那还请阅读TDengine的官方文档寻找命令格式,并相应修改脚本即可。

如果有一些新的思路也可以联系我。

相关推荐
无言(* ̄(エ) ̄)2 小时前
C语言--运算符/函数/结构体/指针
c语言·开发语言·数据结构·数据库·算法·mongodb
Dream Algorithm2 小时前
RWA : Real World Asset
大数据·区块链
码农小白猿2 小时前
提升压力容器改造方案报告标准条款审核效率,IACheck助力合规与安全
运维·人工智能·安全·ai·自动化·iacheck
Tipriest_2 小时前
ubuntu快速查看一个apt包的描述信息和依赖等
linux·运维·ubuntu·apt
翼龙云_cloud2 小时前
亚马逊云渠道商:AWS Lightsail 极速部署演示环境搭建指南
运维·服务器·云计算·aws
石小千2 小时前
Jenkins配置Maven 3.9.12
运维·jenkins·maven
嘉禾望岗5032 小时前
Spark-Submit参数介绍及任务资源使用测试
大数据·分布式·spark
飞Link2 小时前
【Wandb】Linux环境下通过Docker部署Wandb教程
运维·docker·容器·数据挖掘
`林中水滴`2 小时前
Flume停止维护了!
大数据·flume