mysql的备份与恢复(使用mysqldump)

目录

1.使用mysqldump进行完全备份

2.使用二进制日志进行增量备份

3.恢复备份


1.使用mysqldump进行完全备份

bash 复制代码
# 备份所有数据库并刷新二进制日志
mysqldump -u username -p -A -F > all_databases.sql

# 备份多个数据库(包含结构和数据)
mysqldump -u username -p -B db1 db2 db3 > multiple_databases.sql

本地定时备份脚本

bash 复制代码
#!/bin/bash

# 功能:分库备份、错误处理、日志记录、过期文件清理

# 配置信息
mysql_user="root"
mysql_password="Haojing@123456"

# 备份的数据库列表
backup_db_arr=("mysql" "data_cube" "zsmartcity_auth" "datax_web" "dolphinscheduler")

# 备份目录和日志文件
backup_location="/home/mysqlback"
log_file="${backup_location}/backup_$(date +%Y%m%d).log"

# 过期备份清理设置
expire_backup_delete="ON"
expire_days=15

# 邮件通知设置(可选)
enable_email_notification="OFF"
email_recipient="admin@example.com"

# 日志函数
log() {
    local message="[$(date +'%Y-%m-%d %H:%M:%S')] $1"
    echo "$message"
    echo "$message" >> "$log_file"
}

# 邮件通知函数
send_email() {
    if [ "$enable_email_notification" = "ON" ]; then
        local subject="[MySQL备份] $1"
        local content="$2"
        echo "$content" | mail -s "$subject" "$email_recipient"
    fi
}

# 初始化
mkdir -p "$backup_location"
mkdir -p "${backup_location}/error_logs"

log "=========================================="
log "开始执行 MySQL 数据库备份任务"
log "=========================================="

# 检查是否有数据库需要备份
if [ ${#backup_db_arr[@]} -eq 0 ]; then
    local error_msg="错误: 没有指定需要备份的数据库!"
    log "$error_msg"
    send_email "备份失败" "$error_msg"
    exit 1
fi

# 创建今日备份目录
backup_date=$(date +%Y-%m-%d)
backup_dir="${backup_location}/${backup_date}"
mkdir -p "$backup_dir"

# 备份每个数据库
success_count=0
total_count=${#backup_db_arr[@]}

log "开始备份数据库,总共 ${total_count} 个数据库"

for dbname in "${backup_db_arr[@]}"; do
    log "正在备份数据库: $dbname"
    
    backup_file="${backup_dir}/${dbname}_$(date +%Y%m%d%H%M).sql.gz"
    error_log="${backup_location}/error_logs/${dbname}_$(date +%Y%m%d%H%M).err"
    
    # 执行备份
    mysqldump -u"$mysql_user" -p"$mysql_password" -F \
        --single-transaction \
        --quick \
        --lock-tables=false \
        "$dbname" 2> "$error_log" | gzip > "$backup_file"
    
    # 检查备份结果
    if [ $? -eq 0 ] && [ -s "$backup_file" ]; then
        log "数据库 $dbname 备份成功,文件大小: $(du -h "$backup_file" | awk '{print $1}')"
        success_count=$((success_count + 1))
        
        # 检查错误日志
        if [ -s "$error_log" ]; then
            log "警告: 备份 $dbname 时出现非致命错误,请查看: $error_log"
        else
            rm -f "$error_log"
        fi
    else
        log "错误: 数据库 $dbname 备份失败!"
        if [ -f "$error_log" ]; then
            log "错误详情: $(cat "$error_log")"
        fi
        # 删除可能生成的空文件
        [ -f "$backup_file" ] && rm -f "$backup_file"
    fi
done

# 清理过期备份
if [ "$expire_backup_delete" = "ON" ]; then
    log "开始清理 ${expire_days} 天前的备份文件..."
    find "$backup_location" -type d -mtime +"$expire_days" -exec rm -rf {} \; 2>/dev/null
    log "过期备份清理完成"
fi

# 备份总结
if [ "$success_count" -eq "$total_count" ]; then
    local status="成功"
    local email_status="成功"
else
    local status="部分失败"
    local email_status="部分失败 (成功: ${success_count}/${total_count})"
fi

log "=========================================="
log "备份任务执行完毕,状态: $status"
log "成功备份: ${success_count}/${total_count} 个数据库"
log "备份目录: $backup_dir"
log "=========================================="

# 发送邮件通知
send_email "备份${email_status}" "备份日期: $backup_date\n状态: $status\n成功: ${success_count}/${total_count} 个数据库\n备份目录: $backup_dir"

2.使用二进制日志进行增量备份

二进制日志(binlog)记录了所有对数据库造成更改的 SQL 语句,启用后可以实现增量备份。

bash 复制代码
# 修改 MySQL 配置文件 my.cnf 或 my.ini
[mysqld]
log-bin = /var/log/mysql/mysql-bin.log    # 启用二进制日志
server-id=1   # 服务器唯一标识(主从复制时必须)
expire-logs-days = 10    # 日志保留天数(自动清理旧日志)

# 重启 MySQL 服务使配置生效
systemctl restart mysqld

# 验证配置是否生效
SHOW VARIABLES LIKE 'log_bin';    -- 应显示 ON
SHOW VARIABLES LIKE 'binlog_format';
SHOW MASTER STATUS;               -- 查看当前二进制日志信息

3.恢复备份

方案一:使用 mysqldump 备份恢复

bash 复制代码
# 恢复单个数据库
mysql -u username -p database_name < backup.sql

# 恢复时指定新数据库名
mysql -u username -p new_database_name < backup.sql

方案二:结合二进制日志进行时间点恢复

bash 复制代码
# 1. 首先恢复完整备份
mysql -u username -p database_name < backup.sql

# 2. 使用 mysqlbinlog 工具恢复增量数据
mysqlbinlog /var/log/mysql/mysql-bin.000001 | mysql -u username -p database_name

# 3. 恢复到指定时间点
mysqlbinlog --stop-datetime="2025-07-01 12:00:00" /var/log/mysql/mysql-bin.000001 | mysql -u username -p database_name