用Shell脚本给TDEngine数据备份上“保险”:自动定时备份与清理实战
TDEngine数据库自动化备份实战从脚本设计到生产级部署在物联网和时序数据管理领域TDEngine凭借其高性能和低存储成本的优势已成为众多企业的核心数据基础设施。但数据安全永远是系统设计的最后一道防线——当硬件故障、人为误操作或网络攻击发生时能否快速恢复业务数据直接决定了企业的损失程度。本文将分享一套经过生产验证的TDEngine自动化备份方案涵盖备份策略设计、健壮性脚本编写、监控告警集成等全流程实践。1. 备份系统架构设计1.1 多级备份策略生产环境备份必须遵循3-2-1原则至少保留3份数据副本使用2种不同存储介质其中1份存放在异地。针对TDEngine时序数据库特性我们设计三级备份体系日级热备保留最近7天的每日增量备份使用服务器本地SSD存储月级温备保留最近12个月的完整月备份挂载NFS网络存储年度冷备永久保留的年度快照同步至对象存储如MinIO# 典型目录结构示例 /home/tdengine/backups/ ├── daily/ # 日备份 │ ├── 2024-06-01/ │ └── 2024-06-02/ ├── monthly/ # 月备份 │ ├── 2024-05/ │ └── 2024-06/ └── yearly/ # 年备份 ├── 2023/ └── 2024/1.2 资源规划要点执行taosdump时会占用大量CPU和I/O资源需特别注意资源类型推荐配置风险提示磁盘空间数据量的3倍空间不足导致备份中断内存每线程至少2GBOOM killer可能终止进程网络带宽千兆网络(≥100MB/s)远程备份时延显著增加备份时间窗口业务低峰期(如凌晨2-4点)高峰备份可能影响生产查询性能提示使用du -sh $dataDir/vnode --excludewal估算实际数据量wal目录存放的是预写日志不需要计入备份空间2. 核心备份脚本实现2.1 基础备份功能以下脚本实现了带错误重试机制的taosdump调用#!/bin/bash # 设置严格模式任何命令失败立即退出 set -eo pipefail # 基础配置 BACKUP_ROOT/data/tdengine/backups LOG_FILE/var/log/tdengine/backup_$(date %Y%m%d).log TAOS_USERadmin TAOS_PASS$(cat /etc/tdengine/.taos.pass) # 密码从安全文件读取 MAX_RETRIES3 # 初始化日志 exec (tee -a $LOG_FILE) echo 备份开始 $(date %Y-%m-%d %H:%M:%S) # 执行带重试的备份命令 function backup_with_retry() { local db$1 local output_dir$2 local retry_count0 while [ $retry_count -lt $MAX_RETRIES ]; do if taosdump -u $TAOS_USER -p $TAOS_PASS -o $output_dir -D $db; then echo [成功] 数据库 $db 备份到 $output_dir return 0 else ((retry_count)) echo [警告] $db 备份失败 (尝试 $retry_count/$MAX_RETRIES) sleep $((retry_count * 10)) fi done echo [错误] $db 备份最终失败 return 1 } # 主备份流程 current_date$(date %Y-%m-%d) backup_dir$BACKUP_ROOT/daily/$current_date mkdir -p $backup_dir # 获取需要备份的数据库列表 databases$(taos -u $TAOS_USER -p $TAOS_PASS -s show databases; | awk NR2 {print $1}) for db in $databases; do if [[ $db ! information_schema ]]; then backup_with_retry $db $backup_dir/$db fi done echo 备份完成 $(date %Y-%m-%d %H:%M:%S) 2.2 备份完整性校验备份完成后必须验证数据有效性添加以下检查逻辑# 在backup_with_retry函数成功后添加 echo 开始校验备份文件完整性... if [ ! -f $output_dir/dbs.sql ]; then echo [错误] 缺少数据库schema文件 exit 1 fi # 检查至少有一个数据文件 if [ $(ls $output_dir/*_tables.*.sql 2/dev/null | wc -l) -eq 0 ]; then echo [错误] 未找到数据表备份文件 exit 1 fi # 快速抽样验证 sample_file$(ls $output_dir/*_tables.*.sql | head -1) if ! grep -q CREATE TABLE $sample_file; then echo [错误] 抽样文件格式异常 exit 1 fi3. 高级备份管理功能3.1 智能清理策略基于保留策略自动清理旧备份避免存储空间耗尽# 保留策略配置 DAILY_RETAIN7 # 保留最近7天 MONTHLY_RETAIN12 # 保留最近12个月 YEARLY_RETAIN5 # 保留最近5年 # 清理旧日备份 find $BACKUP_ROOT/daily -mindepth 1 -maxdepth 1 -type d -mtime $DAILY_RETAIN -exec rm -rf {} # 清理旧月备份保留每月1日的备份 find $BACKUP_ROOT/monthly -mindepth 1 -maxdepth 1 -type d | sort -r | awk -v retain$MONTHLY_RETAIN NRretain | xargs rm -rf # 清理旧年备份 find $BACKUP_ROOT/yearly -mindepth 1 -maxdepth 1 -type d | sort -r | awk -v retain$YEARLY_RETAIN NRretain | xargs rm -rf3.2 备份监控与告警集成Prometheus监控指标和邮件告警# 生成Prometheus格式的指标文件 function export_metrics() { local status$1 cat EOF /var/lib/node_exporter/textfile/tdengine_backup.prom # HELP tdengine_backup_status Last backup status (0success, 1failure) # TYPE tdengine_backup_status gauge tdengine_backup_status $status # HELP tdengine_backup_timestamp_seconds Last backup completion timestamp # TYPE tdengine_backup_timestamp_seconds gauge tdengine_backup_timestamp_seconds $(date %s) EOF } # 在脚本最后调用0表示成功1表示失败 if [[ $? -eq 0 ]]; then export_metrics 0 echo 备份成功 | mailx -s [TDEngine] 备份成功通知 ops-teamexample.com else export_metrics 1 echo 备份失败请检查日志 $LOG_FILE | mailx -s [TDEngine] 备份失败告警 ops-teamexample.com exit 1 fi4. 生产环境部署方案4.1 系统服务化配置将备份脚本封装为systemd服务实现高可靠性管理# /etc/systemd/system/tdengine-backup.service [Unit] DescriptionTDEngine Database Backup Service Afternetwork.target tdengine.service [Service] Typeoneshot Usertdengine Grouptdengine ExecStart/usr/local/bin/tdengine-backup.sh LoggingMaxBytes10M LoggingMaxFiles5 [Install] WantedBymulti-user.target配合定时器实现每日自动执行# /etc/systemd/system/tdengine-backup.timer [Unit] DescriptionDaily TDEngine Backup Timer [Timer] OnCalendar*-*-* 02:00:00 Persistenttrue [Install] WantedBytimers.target4.2 安全加固措施密码安全管理使用chmod 600 /etc/tdengine/.taos.pass限制密码文件权限在脚本中通过TAOS_PASS$(cat /etc/tdengine/.taos.pass)读取备份文件加密# 使用GPG加密备份文件 gpg --batch --yes --passphrase-file /path/to/keyfile --output $output_dir.gpg --symmetric $output_dir网络传输安全# 使用rsync over SSH同步到远程 rsync -az --delete -e ssh -i /path/to/ssh_key $BACKUP_ROOT/ backup-userremote-host:/backup/tdengine/5. 灾备恢复演练备份系统的有效性必须通过定期恢复演练来验证。以下是标准恢复流程准备恢复环境# 在新节点安装相同版本TDEngine wget https://www.taosdata.com/assets-download/TDengine-server-3.4.0.2-Linux-x64.tar.gz tar xzf TDengine-server-3.4.0.2-Linux-x64.tar.gz cd TDengine-server-3.4.0.2 ./install.sh执行数据恢复# 选择最近的备份版本 RESTORE_DIR/data/tdengine/backups/daily/2024-06-15 # 按数据库逐个恢复 for db_dir in $RESTORE_DIR/*; do if [ -d $db_dir ]; then db_name$(basename $db_dir) echo 正在恢复数据库 $db_name... taosdump -i $db_dir fi done验证数据一致性-- 在taos shell中执行 USE target_database; SELECT COUNT(*) FROM information_schema.ins_tables; SELECT MAX(ts) FROM device_001;建议每季度至少执行一次完整恢复演练并记录以下指标指标项达标要求实测结果恢复时间(RTO)4小时2.5小时数据丢失量(RPO)5分钟0校验通过率100%100%在实际项目中这套方案成功帮助某智能电表平台在磁盘阵列故障后2小时内恢复了超过50亿条时序数据记录。关键点在于多级备份策略降低了存储成本自动化监控确保了备份可靠性而定期演练则保证了恢复流程的顺畅。