怎样用脚本恢复MySQL数据库?

wen 实用脚本 2

本文目录导读:

怎样用脚本恢复MySQL数据库?

  1. 使用 mysqldump 备份恢复(最常用)
  2. 增强版恢复脚本(带错误检查)
  3. 选择性恢复(只恢复特定表)
  4. 使用 Python 脚本恢复
  5. 自动恢复最新备份的脚本
  6. 使用 PHP 脚本恢复
  7. 注意事项

我来介绍几种用脚本恢复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);

注意事项

  1. 备份文件权限:确保脚本有权限读取备份文件

  2. 数据库权限:确保数据库用户有创建和导入数据的权限

  3. 字符集:如果备份文件使用了特定字符集,恢复时可能需要指定

    mysql -u$DB_USER -p$DB_PASSWORD --default-character-set=utf8mb4 $DB_NAME < backup.sql
  4. 大文件处理:对于大型备份文件,考虑分块处理

  5. 外键约束:恢复时临时关闭外键检查可以避免导入顺序问题

  6. 事务处理:考虑使用事务确保恢复的原子性

选择哪种脚本取决于你的具体需求和环境,对于日常使用,最简单的 mysql < backup.sql 通常就足够了。

抱歉,评论功能暂时关闭!