文章目录
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}'):自动获取压缩包的大小,例如 10M,2>/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的官方文档寻找命令格式,并相应修改脚本即可。
如果有一些新的思路也可以联系我。