关于 tigris-backup-export
为数据库备份、应用数据导出和文件归档提供 Tigris 存储实施方案的技能,面向使用多种主流框架的开发者。内容涵盖定时备份、保留策略及恢复流程,并给出不同技术栈的实现示例。
主要功能
- 01压缩并上传数据库转储
- 02按计划自动运行备份
- 03通过生命周期规则清理旧备份
- 04从指定备份下载并恢复
- 05提供多种框架的实施示例
适用场景
- 01为应用设置定时数据库备份
- 02按保留期限自动删除旧文件
- 03从 Tigris 下载备份并恢复数据库
- 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 设置和访问密钥管理
官方文档
- Tigris CLI:https://www.tigrisdata.com/docs/