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的官方文档寻找命令格式,并相应修改脚本即可。

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

相关推荐
大树8810 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠10 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
大志哥12311 小时前
ES和Logstash日志链路系统上线后遭遇切片爆炸(解决)
大数据·elasticsearch
霸道流氓气质11 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工12 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
果丁智能12 小时前
物联网智能锁赋能集中式住宿:身份核验与远程权限管控的全链路技术实践
大数据·人工智能·物联网·智能家居
酣大智12 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
麦聪聊数据12 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
ApacheSeaTunnel12 小时前
实战演示 | 基于 Apache SeaTunnel 与 Apache DolphinScheduler 实现 MySQL 到 Doris 离线定时增量同步
大数据·mysql·开源·doris·数据集成·seatunnel·数据同步
shushangyun_12 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化