mcpField
T
tigris-backup-export

tigris-backup-export

github.com/tigrisdata云与 DevOps275 次安装14 周前更新
代码仓库

关于 tigris-backup-export

为数据库备份、应用数据导出和文件归档提供 Tigris 存储实施方案的技能,面向使用多种主流框架的开发者。内容涵盖定时备份、保留策略及恢复流程,并给出不同技术栈的实现示例。

主要功能

  1. 01压缩并上传数据库转储
  2. 02按计划自动运行备份
  3. 03通过生命周期规则清理旧备份
  4. 04从指定备份下载并恢复
  5. 05提供多种框架的实施示例

适用场景

  1. 01为应用设置定时数据库备份
  2. 02按保留期限自动删除旧文件
  3. 03从 Tigris 下载备份并恢复数据库
  4. 04为 Rails、Django 或 Laravel 集成备份

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tigrisdata/skills --skill tigris-backup-export

安装后在 Claude Code 中输入/tigris-backup-export确认已加载。

附带文件metadata.jsonREADME.md

详细介绍

Tigris 备份与导出

备份数据库、导出应用数据,并将文件归档到 Tigris。涵盖所有主流框架的自动化备份流水线、保留策略和恢复工作流。

前提条件

在进行任何操作之前,如果尚未安装 Tigris CLI,请先安装:

tigris help || npm install -g @tigrisdata/cli

如果需要安装,请告知用户:“我正在安装 Tigris CLI(@tigrisdata/cli),以便我们使用 Tigris 对象存储。”

概述

组件用途
备份脚本转储数据库、压缩并上传到 Tigris
调度器按 cron 计划运行备份
保留策略自动删除旧备份(生命周期规则)
恢复下载并从指定备份恢复

命名约定: backups/db/YYYY-MM-DDTHH:MM:SSZ.sql.gz


通用模式

#!/bin/bash
# scripts/backup.sh
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
BACKUP_FILE="backup-${TIMESTAMP}.sql.gz"
BUCKET="my-app-backups"

# Dump and compress
pg_dump "$DATABASE_URL" | gzip > "/tmp/$BACKUP_FILE"

# Upload to Tigris
tigris cp "/tmp/$BACKUP_FILE" "t3://$BUCKET/backups/db/$BACKUP_FILE"

# Clean up local file
rm "/tmp/$BACKUP_FILE"

echo "Backup uploaded: backups/db/$BACKUP_FILE"

MySQL:

mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "/tmp/$BACKUP_FILE"

Next.js / Express(Node.js)

import { exec } from "child_process";
import { promisify } from "util";
import { createReadStream } from "fs";
import { unlink } from "fs/promises";
import { put } from "@tigrisdata/storage";

const execAsync = promisify(exec);

async function backupDatabase() {
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
  const filename = `backup-${timestamp}.sql.gz`;
  const localPath = `/tmp/${filename}`;

  // Dump and compress
  await execAsync(
    `pg_dump "${process.env.DATABASE_URL}" | gzip > "${localPath}"`,
  );

  // Upload to Tigris
  const stream = createReadStream(localPath);
  const result = await put(`backups/db/${filename}`, stream, {
    contentType: "application/gzip",
    multipart: true,
    config: { bucket: "my-app-backups" },
  });

  // Clean up
  await unlink(localPath);

  if (result.error) throw result.error;
  return result.data?.path;
}
使用 node-cron 进行调度
import cron from "node-cron";

// Daily at 2 AM UTC
cron.schedule("0 2 * * *", async () => {
  try {
    const path = await backupDatabase();
    console.log(`Backup complete: ${path}`);
  } catch (error) {
    console.error("Backup failed:", error);
  }
});

Rails

Rake 任务

注意: 目前尚无原生 Tigris Ruby SDK。此方案使用指向 Tigris 的 aws-sdk-s3。

# lib/tasks/backup.rake
namespace :db do
  desc "Backup database to Tigris"
  task backup: :environment do
    require "aws-sdk-s3"

    timestamp = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
    filename = "backup-#{timestamp}.sql.gz"
    local_path = "/tmp/#{filename}"

    # Dump and compress
    db_config = ActiveRecord::Base.connection_db_config.configuration_hash
    system("pg_dump '#{db_config[:url] || build_pg_url(db_config)}' | gzip > '#{local_path}'")

    # Upload to Tigris
    s3 = Aws::S3::Client.new(
      endpoint: "https://t3.storage.dev",
      region: "auto",
      access_key_id: ENV["AWS_ACCESS_KEY_ID"],
      secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
    )

    File.open(local_path, "rb") do |file|
      s3.put_object(
        bucket: ENV["TIGRIS_BACKUP_BUCKET"],
        key: "backups/db/#{filename}",
        body: file,
        content_type: "application/gzip",
      )
    end

    File.delete(local_path)
    puts "Backup uploaded: backups/db/#{filename}"
  end
end
使用 whenever 进行调度
# config/schedule.rb (whenever gem)
every 1.day, at: "2:00 am" do
  rake "db:backup"
end

Django

管理命令

使用 tigris-boto3-ext(安装:pip install tigris-boto3-ext)。如需完整的 Python/Django 支持,请参阅 tigris-python-sdk 技能。

# myapp/management/commands/dbbackup.py
import gzip
import subprocess
from datetime import datetime, timezone
from django.core.management.base import BaseCommand
from django.conf import settings
import boto3
from botocore.client import Config

class Command(BaseCommand):
    help = "Backup database to Tigris"

    def handle(self, *args, **options):
        timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
        filename = f"backup-{timestamp}.sql.gz"
        local_path = f"/tmp/{filename}"

        # Dump and compress
        db = settings.DATABASES["default"]
        dump_cmd = (
            f'pg_dump "postgresql://{db["USER"]}:{db["PASSWORD"]}'
            f'@{db["HOST"]}:{db["PORT"]}/{db["NAME"]}"'
        )
        with gzip.open(local_path, "wb") as f:
            result = subprocess.run(dump_cmd, shell=True, capture_output=True)
            f.write(result.stdout)

        # Upload to Tigris
        s3 = boto3.client(
            "s3",
            endpoint_url="https://t3.storage.dev",
            aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
            aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
            region_name="auto",
            config=Config(s3={"addressing_style": "virtual"}),
        )
        s3.upload_file(
            local_path,
            settings.TIGRIS_BACKUP_BUCKET,
            f"backups/db/{filename}",
        )

        import os
        os.unlink(local_path)
        self.stdout.write(f"Backup uploaded: backups/db/{filename}")
python manage.py dbbackup
使用 celery-beat 进行调度
# settings.py
CELERY_BEAT_SCHEDULE = {
    "daily-backup": {
        "task": "myapp.tasks.backup_database",
        "schedule": crontab(hour=2, minute=0),
    },
}

Laravel

Artisan 命令
// app/Console/Commands/BackupDatabase.php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;

class BackupDatabase extends Command
{
    protected $signature = 'db:backup';
    protected $description = 'Backup database to Tigris';

    public function handle()
    {
        $timestamp = now()->utc()->format('Y-m-d\TH:i:s\Z');
        $filename = "backup-{$timestamp}.sql.gz";
        $localPath = "/tmp/{$filename}";

        // Dump and compress
        $dbUrl = config('database.connections.pgsql.url')
            ?? sprintf('postgresql://%s:%s@%s:%s/%s',
                config('database.connections.pgsql.username'),
                config('database.connections.pgsql.password'),
                config('database.connections.pgsql.host'),
                config('database.connections.pgsql.port'),
                config('database.connections.pgsql.database'),
            );

        exec("pg_dump \"{$dbUrl}\" | gzip > \"{$localPath}\"");

        // Upload to Tigris
        Storage::disk('tigris')->put(
            "backups/db/{$filename}",
            file_get_contents($localPath),
        );

        unlink($localPath);
        $this->info("Backup uploaded: backups/db/{$filename}");
    }
}
在 Kernel 中设置调度
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
    $schedule->command('db:backup')->dailyAt('02:00');
}

也可以使用 spatie/laravel-backup:

composer require spatie/laravel-backup
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

在 config/backup.php 中配置 tigris 磁盘。


恢复

# List backups
tigris ls t3://my-app-backups/backups/db/

# Download and restore
tigris cp t3://my-app-backups/backups/db/backup-2026-03-18T02:00:00Z.sql.gz /tmp/restore.sql.gz
gunzip /tmp/restore.sql.gz
psql "$DATABASE_URL" < /tmp/restore.sql

保留策略

使用 Tigris 生命周期规则自动删除旧备份:

tigris buckets lifecycle set my-app-backups --config lifecycle.json
{
  "Rules": [
    {
      "ID": "delete-old-backups",
      "Filter": { "Prefix": "backups/db/" },
      "Status": "Enabled",
      "Expiration": { "Days": 30 }
    }
  ]
}

建议的保留期限:

类型保留期限
每日备份30 天
每周备份90 天
每月备份1 年

关键规则

始终: 上传前进行压缩(gzip)| 文件名中使用时间戳 | 设置保留策略/生命周期规则 | 定期测试恢复 | 将备份存储桶凭据与应用凭据分开存放

切勿: 将备份存放在与应用数据相同的存储桶中 | 跳过数据库转储的压缩 | 上传后忘记清理本地临时文件


相关技能

  • tigris-lifecycle-management — 自动删除旧备份
  • tigris-security-access-control — 分离备份凭据
  • file-storage — CLI 设置和访问密钥管理

官方文档

评论

支持 Markdown