本文目录导读:

MySQL 备份指定表
基础备份脚本
#!/bin/bash
# MySQL 配置
DB_HOST="localhost"
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
TABLE_NAME="your_table"
BACKUP_DIR="/path/to/backup"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份指定表
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME $TABLE_NAME > $BACKUP_DIR/${TABLE_NAME}_${DATE}.sql
echo "表 $TABLE_NAME 已备份到 $BACKUP_DIR/${TABLE_NAME}_${DATE}.sql"
增强版备份脚本(包含压缩和清理)
#!/bin/bash
# 配置参数
DB_HOST="localhost"
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
TABLES=("users" "orders" "products") # 指定多个表
BACKUP_DIR="/data/backup/mysql"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份多个指定表
for TABLE in "${TABLES[@]}"; do
echo "开始备份表: $TABLE"
# 备份单个表
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS \
--single-transaction \
--routines \
--triggers \
$DB_NAME $TABLE | gzip > ${BACKUP_DIR}/${TABLE}_${DATE}.sql.gz
if [ $? -eq 0 ]; then
echo "✅ 表 $TABLE 备份成功: ${TABLE}_${DATE}.sql.gz"
else
echo "❌ 表 $TABLE 备份失败"
fi
done
# 清理过期备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "已清理超过 $RETENTION_DAYS 天的旧备份"
PostgreSQL 备份指定表
#!/bin/bash
# PostgreSQL 配置
PG_HOST="localhost"
PG_PORT="5432"
PG_USER="postgres"
PG_PASS="your_password"
DB_NAME="your_database"
TABLE_NAME="your_table"
BACKUP_DIR="/data/backup/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
# 设置密码
export PGPASSWORD=$PG_PASS
# 备份指定表
pg_dump -h $PG_HOST -p $PG_PORT -U $PG_USER \
-t $TABLE_NAME \
-F c \
$DB_NAME > ${BACKUP_DIR}/${TABLE_NAME}_${DATE}.dump
echo "表 $TABLE_NAME 已备份到 ${BACKUP_DIR}/${TABLE_NAME}_${DATE}.dump"
# 取消密码变量
unset PGPASSWORD
SQL Server 备份指定表
#!/bin/bash
# SQL Server 配置
SERVER="localhost"
DATABASE="your_database"
USERNAME="sa"
PASSWORD="your_password"
TABLE_NAME="your_table"
BACKUP_DIR="/data/backup/mssql"
DATE=$(date +%Y%m%d_%H%M%S)
# 使用 bcp 工具导出表数据
bcp "$DATABASE.dbo.$TABLE_NAME" out "${BACKUP_DIR}/${TABLE_NAME}_${DATE}.csv" \
-S $SERVER -U $USERNAME -P $PASSWORD -c -t"," -T
echo "表 $TABLE_NAME 已导出到 ${BACKUP_DIR}/${TABLE_NAME}_${DATE}.csv"
通用结构化备份脚本
#!/bin/bash
# ================== 配置区域 ==================
# 数据库类型:mysql/postgres/mssql
DB_TYPE="mysql"
# 数据库连接信息
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
# 要备份的表(空格分隔)
TABLES=("table1" "table2" "table3")
# 备份设置
BACKUP_DIR="/data/backup/database"
RETENTION_DAYS=30
COMPRESS=true
# ================== 备份逻辑 ==================
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
backup_table() {
local TABLE=$1
local BACKUP_FILE="${BACKUP_DIR}/${TABLE}_${DATE}"
echo "开始备份表: $TABLE"
case $DB_TYPE in
mysql)
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS \
--single-transaction \
$DB_NAME $TABLE > ${BACKUP_FILE}.sql
;;
postgres)
export PGPASSWORD=$DB_PASS
pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER \
-t $TABLE $DB_NAME > ${BACKUP_FILE}.sql
unset PGPASSWORD
;;
mssql)
bcp "$DB_NAME.dbo.$TABLE" out "${BACKUP_FILE}.csv" \
-S $DB_HOST -U $DB_USER -P $DB_PASS -c -t","
;;
*)
echo "不支持的数据库类型: $DB_TYPE"
return 1
;;
esac
# 压缩备份
if [ "$COMPRESS" = true ] && [ -f "${BACKUP_FILE}.sql" ]; then
gzip -f ${BACKUP_FILE}.sql
BACKUP_FILE="${BACKUP_FILE}.sql.gz"
fi
echo "✅ 表 $TABLE 备份完成: $BACKUP_FILE"
}
# 备份所有指定表
for TABLE in "${TABLES[@]}"; do
backup_table $TABLE
done
# 清理过期备份
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -delete
echo "🎉 备份完成,已清理超过 $RETENTION_DAYS 天的旧备份"
使用方式
设置执行权限
chmod +x backup_tables.sh
传递参数执行
# 直接运行
./backup_tables.sh
# 或使用参数
DB_HOST="192.168.1.100" DB_NAME="mydb" TABLES=("users" "orders") ./backup_tables.sh
添加到 crontab 定时执行
# 每天凌晨2点备份 0 2 * * * /path/to/backup_tables.sh >> /var/log/backup.log 2>&1
注意事项
- 密码安全:建议使用配置文件或环境变量,避免明文密码
- 权限设置:确保备份目录有足够的磁盘空间
- 备份验证:定期检查备份文件完整性
- 监控告警:添加失败通知机制
- 测试恢复:定期测试备份恢复流程
选择适合您需求的版本,根据实际情况调整配置即可。