MySQL备份与恢复

一、逻辑备份(mysqldump,最常用)

适用场景:中小型数据库、跨版本迁移、全库/单库/表级备份,支持备份结构、数据分离,操作简单通用。

核心优势:备份文件为SQL文本,体积小、可编辑,跨平台兼容性强;缺点:大数据量(100G以上)场景下,备份和恢复速度较慢。

1.1 全库备份(备份所有数据库)

命令格式:

|---------------------------------------------------------------------|
| bash mysqldump -u用户名 -p --all-databases > 全库备份_$(date +%Y%m%d).sql |

实操示例(用户名root,备份文件按日期命名):

|---------------------------------------------------------------------|
| bash mysqldump -uroot -p --all-databases > backup_all_20260331.sql |

说明:执行命令后,会提示输入MySQL密码,输入正确后开始备份,备份文件生成在当前执行命令的目录下。

1.2 单库备份(最常用场景)

命令格式:

|------------------------------------------|
| bash mysqldump -u用户名 -p 数据库名 > 单库备份.sql |

实操示例(备份testdb数据库):

|------------------------------------------------------|
| bash mysqldump -uroot -p testdb > backup_testdb.sql |

1.3 仅备份表结构(不含数据)

适用场景:仅需复制数据库表结构,用于环境搭建、结构迁移。

命令格式:

|---------------------------------------------|
| bash mysqldump -u用户名 -p -d 数据库名 > 结构备份.sql |

1.4 仅备份数据(不含结构)

适用场景:已有表结构,仅需备份数据(如数据迁移、数据备份归档)。

命令格式:

|---------------------------------------------|
| bash mysqldump -u用户名 -p -t 数据库名 > 数据备份.sql |

二、mysqldump 数据恢复(对应逻辑备份)

核心原则:恢复前需确认目标数据库已存在(全库恢复除外),避免因数据库不存在导致恢复失败;恢复过程中建议停止数据库写入操作,防止数据冲突。

2.1 全库恢复

命令格式:

|---------------------------------|
| bash mysql -u用户名 -p < 全库备份.sql |

说明:执行后输入密码,系统会自动覆盖现有全库数据,适用于数据库崩溃后的全量恢复,恢复前建议备份当前数据(避免误操作)。

2.2 单库恢复(最常用场景)

步骤:1. 先创建空的目标数据库(若不存在);2. 执行恢复命令。

创建空数据库命令:

|---------------------------------------------------|
| bash mysql -uroot -p -e "create database testdb;" |

恢复命令格式:

|--------------------------------------|
| bash mysql -u用户名 -p 目标库名 < 备份文件.sql |

实操示例(恢复testdb数据库):

|--------------------------------------------------|
| bash mysql -uroot -p testdb < backup_testdb.sql |

三、物理备份(直接拷贝数据文件)

适用场景:大型数据库(100G以上)、需要快速备份与恢复的场景,依赖MySQL数据文件的原生存储格式。

核心优势:备份和恢复速度极快,接近文件拷贝速度;缺点:不能跨平台(如Windows与Linux之间),且MySQL版本需一致(不同版本数据文件格式可能不同)。

3.1 备份步骤

  1. 停止MySQL服务,避免备份过程中数据写入导致文件损坏(关键步骤);
    命令:systemctl stop mysqld(Linux)、net stop mysql(Windows)
  1. 复制MySQL数据目录(默认路径):
    Linux默认路径:/var/lib/mysql
    Windows默认路径:C:\ProgramData\MySQL\MySQL Server X.X\data
  1. 将数据目录完整拷贝到备份存储位置(如本地其他磁盘、远程服务器);
  1. 启动MySQL服务,完成备份;
    命令:systemctl start mysqld(Linux)、net start mysql(Windows)

3.2 恢复步骤

  1. 停止MySQL服务(同备份步骤1);
  1. 删除当前MySQL数据目录下的所有文件(备份原有数据目录,防止误删);
  1. 将备份的 data 目录完整覆盖到当前MySQL数据目录;
  1. 启动MySQL服务,完成恢复;
  1. 验证:登录MySQL,查看数据库、表及数据是否完整。

四、生产环境必备:定时自动备份

生产环境中,手动备份易遗漏、易出错,需配置定时自动备份,同时清理旧备份,节省存储资源。以下以Linux系统为例,实现每天自动备份、自动清理旧备份。

4.1 编写备份脚本(backup_mysql.sh)

  1. 创建备份目录(如/backup/mysql),用于存储备份文件:

|-----------------------------|
| bash mkdir -p /backup/mysql |

  1. 创建脚本文件,编辑内容:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bash #!/bin/bash # MySQL定时备份脚本 # 日期格式(精确到分秒,避免备份文件重名) DATE=(date +%Y%m%d_%H%M%S) # 备份目录 BACKUP_DIR="/backup/mysql" # MySQL用户名 MYSQL_USER="root" # MySQL密码(注意:若密码含特殊字符,需加引号) MYSQL_PASS="你的MySQL密码" # 需备份的数据库名(多个数据库用空格分隔,如"testdb db2") DATABASE="testdb" # 1. 执行备份,并用gzip压缩(减少存储占用) mysqldump -uMYSQL_USER -pMYSQL_PASS --single-transaction DATABASE | gzip > BACKUP_DIR/backup_DATABASE_DATE.sql.gz # 2. 删除7天前的旧备份(避免存储溢出,可根据需求调整天数) find BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete |

4.2 给脚本添加执行权限

|-------------------------------|
| bash chmod +x backup_mysql.sh |

4.3 设置定时任务(crontab)

  1. 编辑定时任务:

|-----------------|
| bash crontab -e |

  1. 添加定时任务(每天凌晨2点执行备份,避开业务高峰):

|-------------------------------------------------|
| bash 0 2 * * * /backup/mysql/backup_mysql.sh |

定时任务格式说明:分 时 日 月 周,0 2 * * * 表示每天凌晨2点整执行脚本。

  1. 查看定时任务是否生效:

|-----------------|
| bash crontab -l |

五、安全与最佳实践

  1. 备份验证:备份完成后,必须定期(如每周)抽取备份文件进行恢复测试,确认备份文件可用,避免"备份成功但无法恢复"的问题。
  1. 备份加密:重要数据库的备份文件需加密存储(如用gpg加密),避免明文泄露敏感数据,不建议将备份文件直接放在公网可访问的服务器上。
  1. 备份时段:生产库备份需避开业务高峰(如凌晨2-4点),避免备份操作占用过多服务器资源,影响业务正常运行。
  1. 双备份策略:重要数据需采用"本地备份 + 云端/异地备份",防止本地服务器故障(如硬盘损坏)导致备份丢失。
  1. 锁表避免:InnoDB引擎备份时,添加--single-transaction 参数;MyISAM引擎备份时,添加--lock-tables 参数,避免备份过程中数据不一致。
  1. 备份日志:在备份脚本中添加日志记录(如输出备份结果到日志文件),方便排查备份失败问题。
相关推荐
jnrjian2 小时前
recover database using backup controlfile until cancel 假recover,真一致
数据库·oracle
lifewange3 小时前
java连接Mysql数据库
java·数据库·mysql
大妮哟3 小时前
postgresql数据库日志量异常原因排查
数据库·postgresql·oracle
还是做不到嘛\.4 小时前
Dvwa靶场-SQL Injection (Blind)-基于sqlmap
数据库·sql·web安全
不写八个4 小时前
PHP教程004:php链接mysql数据库
数据库·mysql·php
Dylan~~~4 小时前
深度解析Cassandra:分布式数据库的王者之路
数据库·分布式
荒川之神5 小时前
Oracle HR 模式递归函数练习(基于 employees 表)
数据库·oracle
小陈工5 小时前
2026年3月31日技术资讯洞察:AI智能体安全、异步编程突破与Python运行时演进
开发语言·jvm·数据库·人工智能·python·安全·oracle
杨云龙UP6 小时前
Linux生产环境下Oracle RMAN 备份、核查、清理与验证常用命令整理_20260330
linux·运维·服务器·数据库·oracle