本文目录导读:

我来介绍几种用脚本恢复MySQL数据库的方法:
使用 mysqldump 备份恢复(最常用)
基本恢复脚本
#!/bin/bash # restore_mysql.sh # 配置参数 DB_USER="root" DB_PASSWORD="your_password" DB_NAME="database_name" BACKUP_FILE="/path/to/backup.sql" # 恢复数据库 mysql -u$DB_USER -p$DB_PASSWORD $DB_NAME < $BACKUP_FILE echo "数据库恢复完成"
增强版恢复脚本(带错误检查)
#!/bin/bash
# restore_mysql_enhanced.sh
# 配置参数
DB_USER="root"
DB_PASSWORD="your_password"
DB_HOST="localhost"
DB_PORT="3306"
DB_NAME="database_name"
BACKUP_FILE="/path/to/backup.sql"
# 错误处理函数
handle_error() {
echo "错误: $1"
exit 1
}
# 检查备份文件是否存在
if [ ! -f "$BACKUP_FILE" ]; then
handle_error "备份文件 $BACKUP_FILE 不存在"
fi
# 检查数据库连接
mysql -u$DB_USER -p$DB_PASSWORD -h$DB_HOST -P$DB_PORT -e "SELECT 1" &>/dev/null
if [ $? -ne 0 ]; then
handle_error "无法连接到MySQL服务器"
fi
# 执行恢复
echo "开始恢复数据库 $DB_NAME..."
if mysql -u$DB_USER -p$DB_PASSWORD -h$DB_HOST -P$DB_PORT $DB_NAME < $BACKUP_FILE; then
echo "数据库恢复成功完成"
else
handle_error "数据库恢复失败"
fi
选择性恢复(只恢复特定表)
#!/bin/bash
# restore_specific_tables.sh
DB_USER="root"
DB_PASSWORD="your_password"
DB_NAME="database_name"
BACKUP_FILE="/path/to/backup.sql"
# 要恢复的表列表
TABLES=("users" "orders" "products")
echo "开始选择性恢复..."
for table in "${TABLES[@]}"; do
echo "恢复表: $table"
# 使用 sed 提取特定表的数据
sed -n "/-- Table structure for table \`$table\`/,/-- Dump completed/p" $BACKUP_FILE | \
mysql -u$DB_USER -p$DB_PASSWORD $DB_NAME
done
echo "选择性恢复完成"
使用 Python 脚本恢复
#!/usr/bin/env python3
# restore_mysql.py
import subprocess
import sys
import os
# MySQL 连接配置
config = {
'user': 'root',
'password': 'your_password',
'host': 'localhost',
'database': 'database_name'
}
def restore_database(backup_file):
"""使用子进程恢复数据库"""
# 检查备份文件
if not os.path.exists(backup_file):
print(f"错误: 备份文件 {backup_file} 不存在")
sys.exit(1)
# 构建命令
cmd = [
'mysql',
f'-u{config["user"]}',
f'-p{config["password"]}',
f'-h{config["host"]}',
config['database']
]
try:
# 执行恢复
with open(backup_file, 'r') as f:
result = subprocess.run(
cmd,
stdin=f,
capture_output=True,
text=True
)
if result.returncode == 0:
print(f"数据库 {config['database']} 恢复成功")
else:
print(f"恢复失败: {result.stderr}")
sys.exit(1)
except Exception as e:
print(f"发生错误: {e}")
sys.exit(1)
if __name__ == "__main__":
backup_file = "/path/to/backup.sql"
restore_database(backup_file)
自动恢复最新备份的脚本
#!/bin/bash
# auto_restore_latest.sh
BACKUP_DIR="/path/to/backups"
DB_USER="root"
DB_PASSWORD="your_password"
DB_NAME="database_name"
# 查找最新的备份文件
LATEST_BACKUP=$(ls -t $BACKUP_DIR/*.sql 2>/dev/null | head -1)
if [ -z "$LATEST_BACKUP" ]; then
echo "没有找到备份文件"
exit 1
fi
echo "找到最新备份: $LATEST_BACKUP"
# 确认恢复
read -p "确认恢复此备份?(y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "取消恢复"
exit 0
fi
# 先创建数据库(如果不存在)
mysql -u$DB_USER -p$DB_PASSWORD -e "CREATE DATABASE IF NOT EXISTS $DB_NAME"
# 执行恢复
echo "正在恢复..."
if mysql -u$DB_USER -p$DB_PASSWORD $DB_NAME < $LATEST_BACKUP; then
echo "恢复成功完成"
else
echo "恢复失败"
exit 1
fi
使用 PHP 脚本恢复
<?php
// restore_mysql.php
$config = [
'host' => 'localhost',
'username' => 'root',
'password' => 'your_password',
'database' => 'database_name',
'backup_file' => '/path/to/backup.sql'
];
function restoreDatabase($config) {
// 检查备份文件
if (!file_exists($config['backup_file'])) {
die("备份文件不存在");
}
// 读取备份文件内容
$sql = file_get_contents($config['backup_file']);
if ($sql === false) {
die("无法读取备份文件");
}
// 连接数据库
$conn = new mysqli(
$config['host'],
$config['username'],
$config['password'],
$config['database']
);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 关闭外键检查(避免导入顺序问题)
$conn->query("SET FOREIGN_KEY_CHECKS = 0");
// 分割SQL语句
$statements = explode(';', $sql);
$success_count = 0;
$error_count = 0;
foreach ($statements as $statement) {
$statement = trim($statement);
if (!empty($statement)) {
if ($conn->query($statement)) {
$success_count++;
} else {
echo "错误: " . $conn->error . "\n";
$error_count++;
}
}
}
// 恢复外键检查
$conn->query("SET FOREIGN_KEY_CHECKS = 1");
echo "恢复完成: 成功 $success_count, 失败 $error_count\n";
$conn->close();
}
restoreDatabase($config);
注意事项
-
备份文件权限:确保脚本有权限读取备份文件
-
数据库权限:确保数据库用户有创建和导入数据的权限
-
字符集:如果备份文件使用了特定字符集,恢复时可能需要指定
mysql -u$DB_USER -p$DB_PASSWORD --default-character-set=utf8mb4 $DB_NAME < backup.sql
-
大文件处理:对于大型备份文件,考虑分块处理
-
外键约束:恢复时临时关闭外键检查可以避免导入顺序问题
-
事务处理:考虑使用事务确保恢复的原子性
选择哪种脚本取决于你的具体需求和环境,对于日常使用,最简单的 mysql < backup.sql 通常就足够了。