一、逻辑备份(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 备份步骤
- 停止MySQL服务,避免备份过程中数据写入导致文件损坏(关键步骤);
命令:systemctl stop mysqld(Linux)、net stop mysql(Windows)
- 复制MySQL数据目录(默认路径):
Linux默认路径:/var/lib/mysql
Windows默认路径:C:\ProgramData\MySQL\MySQL Server X.X\data
- 将数据目录完整拷贝到备份存储位置(如本地其他磁盘、远程服务器);
- 启动MySQL服务,完成备份;
命令:systemctl start mysqld(Linux)、net start mysql(Windows)
3.2 恢复步骤
- 停止MySQL服务(同备份步骤1);
- 删除当前MySQL数据目录下的所有文件(备份原有数据目录,防止误删);
- 将备份的 data 目录完整覆盖到当前MySQL数据目录;
- 启动MySQL服务,完成恢复;
- 验证:登录MySQL,查看数据库、表及数据是否完整。
四、生产环境必备:定时自动备份
生产环境中,手动备份易遗漏、易出错,需配置定时自动备份,同时清理旧备份,节省存储资源。以下以Linux系统为例,实现每天自动备份、自动清理旧备份。
4.1 编写备份脚本(backup_mysql.sh)
- 创建备份目录(如/backup/mysql),用于存储备份文件:
|-----------------------------|
| bash mkdir -p /backup/mysql |
- 创建脚本文件,编辑内容:
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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)
- 编辑定时任务:
|-----------------|
| bash crontab -e |
- 添加定时任务(每天凌晨2点执行备份,避开业务高峰):
|-------------------------------------------------|
| bash 0 2 * * * /backup/mysql/backup_mysql.sh |
定时任务格式说明:分 时 日 月 周,0 2 * * * 表示每天凌晨2点整执行脚本。
- 查看定时任务是否生效:
|-----------------|
| bash crontab -l |
五、安全与最佳实践
- 备份验证:备份完成后,必须定期(如每周)抽取备份文件进行恢复测试,确认备份文件可用,避免"备份成功但无法恢复"的问题。
- 备份加密:重要数据库的备份文件需加密存储(如用gpg加密),避免明文泄露敏感数据,不建议将备份文件直接放在公网可访问的服务器上。
- 备份时段:生产库备份需避开业务高峰(如凌晨2-4点),避免备份操作占用过多服务器资源,影响业务正常运行。
- 双备份策略:重要数据需采用"本地备份 + 云端/异地备份",防止本地服务器故障(如硬盘损坏)导致备份丢失。
- 锁表避免:InnoDB引擎备份时,添加--single-transaction 参数;MyISAM引擎备份时,添加--lock-tables 参数,避免备份过程中数据不一致。
- 备份日志:在备份脚本中添加日志记录(如输出备份结果到日志文件),方便排查备份失败问题。