本文目录导读:

- 核心原则:先确认备份类型,再选择工具
- 场景一:使用 MySQL 逻辑备份(mysqldump 导出)
- 场景二:使用 MySQL 物理备份(Percona XtraBackup 或 mysqlbackup)
- 场景三:使用 PostgreSQL 逻辑备份(pg_dump)
- 场景四:使用 PostgreSQL 物理备份(基础备份 + WAL 归档)
- 场景五:针对云数据库(RDS、Cloud SQL 等)
- 通用注意事项(非常关键)
- 总结:我该用哪个工具?
恢复数据库的方法取决于你使用的数据库类型(如 MySQL、PostgreSQL、SQL Server、Oracle 等)以及你拥有的备份类型(逻辑备份如 SQL 文件、物理备份如数据文件、或快照等)。
下面我将以最常用的 MySQL 和 PostgreSQL 为例,介绍几种常见场景下的恢复工具和方法,如果你使用的是其他数据库(如 SQL Server、Oracle、MongoDB),原理类似,但具体命令不同。
核心原则:先确认备份类型,再选择工具
- 逻辑备份:通常是一个
.sql或.dump文件,包含 SQL 语句。 - 物理备份:直接复制数据库的数据文件、日志文件等。
- 快照/克隆:云服务商(如 AWS RDS、阿里云 RDS)的快照功能。
使用 MySQL 逻辑备份(mysqldump 导出)
这是最常见的场景,你手头有一个 .sql 文件(由 mysqldump 生成)。
工具: mysql 命令行客户端
恢复步骤:
-
创建数据库(如果备份文件不包含
CREATE DATABASE语句):mysql -u root -p CREATE DATABASE my_database_new; exit;
-
执行恢复:
mysql -u 用户名 -p 数据库名 < 备份文件路径.sql
示例:
mysql -u root -p my_database < /backups/db_backup_20231027.sql
(输入密码后,命令会静默执行)
-
下载备份文件:如果备份在远程服务器上,先通过
scp、ftp或云存储下载到本地。
使用 MySQL 物理备份(Percona XtraBackup 或 mysqlbackup)
你有一个包含数据文件(如 .ibd、.frm 或 .idb)的文件夹。
工具:
- Percona XtraBackup(最推荐,适用于 InnoDB)
- MySQL Enterprise Backup(商业版)
恢复步骤(以 XtraBackup 为例):
-
准备备份(回放事务日志,使文件一致):
xtrabackup --prepare --target-dir=/path/to/backup
-
停止 MySQL 服务:
systemctl stop mysql
-
复制回数据目录(确保先备份原数据目录):
# 假设 MySQL 数据目录是 /var/lib/mysql rsync -avrP /path/to/backup/ /var/lib/mysql/
-
设置权限:
chown -R mysql:mysql /var/lib/mysql
-
重启 MySQL:
systemctl start mysql
使用 PostgreSQL 逻辑备份(pg_dump)
你手头有一个 .dump 或 .sql 文件。
工具: pg_restore(推荐用于自定义格式 .dump)或 psql(用于纯 SQL 格式)
恢复步骤:
-
创建一个新数据库(因为 pg_dump 通常不包含
CREATE DATABASE):createdb -U postgres my_new_db
-
使用 pg_restore(适用于
pg_dump -Fc生成的.dump文件):pg_restore -U 用户名 -d 目标数据库名 --clean 备份文件.dump
--clean会在恢复前删除现有对象。 -
使用 psql(适用于
pg_dump生成的.sql文件):psql -U 用户名 -d 目标数据库名 < 备份文件.sql
使用 PostgreSQL 物理备份(基础备份 + WAL 归档)
你有一个基础备份文件夹和一系列 WAL 归档日志,这通常用于时间点恢复(PITR)。
工具: PostgreSQL 自带的 pg_basebackup 恢复流程。
恢复步骤(复杂,需谨慎):
- 停止 PostgreSQL。
- 清空并复制基础备份到数据目录。
- 配置
recovery.conf(PG 12 前)或postgresql.conf中的restore_command。 - 修改
recovery_target_time(可选,用于指定恢复到某个时间点)。 - 启动 PostgreSQL,它会自动应用 WAL 日志直到完成或达到目标时间。
- 恢复完成后,数据库会变为可写状态。
针对云数据库(RDS、Cloud SQL 等)
大多数云厂商提供控制台恢复或快照恢复,这是最简单、风险最低的方式。
工具: 云控制台 Web UI、CLI 工具(如 aws rds restore-db-instance-from-db-snapshot)
步骤:
- 登录云控制台。
- 找到数据库实例 -> “备份”或“快照”页面。
- 选择目标备份/快照。
- 点击“恢复”或“从快照还原”。
- 指定新实例名称(通常不能直接覆盖原实例)。
- 等待实例创建完成(可能需几分钟到几小时)。
通用注意事项(非常关键)
- 事先测试:绝对不要在生产库上直接第一次尝试恢复,先在测试环境或新实例上试一次,确认备份文件是好的。
- 版本兼容性:备份文件的版本
(如 MySQL 8.0)应尽量与目标数据库版本(8.0.x)一致,跨大版本恢复(如 5.7 恢复到 8.0)通常需要特殊处理或升级。 - 空间:确保目标磁盘空间足够容纳恢复后的数据。
- 权限:确保执行恢复的用户拥有
CREATE、INSERT、ALTER等权限(或SUPER/sysadmin角色)。 - 字符集:如果备份时使用了特定字符集(如
utf8mb4),目标数据库的字符集应一致。 - 网络:如果数据库在远程,确保网络连接稳定,或使用
pv等工具显示进度:zcat big_backup.sql.gz | pv | mysql -u root -p mydb
我该用哪个工具?
| 你的备份类型 | 对应恢复工具/命令 | 推荐场景 |
|---|---|---|
| .sql 文件 | mysql -u root -p db < file.sql |
MySQL 简单恢复 |
| .dump 文件 | pg_restore -d db file.dump |
PostgreSQL 自定义格式 |
| 数据文件 (.ibd) | xtrabackup --prepare + rsync |
MySQL 快速恢复 |
| WAL 归档 | PostgreSQL recovery.conf |
时间点恢复(PITR) |
| 云快照 | 云控制台 / CLI | 最安全、最简单的云上恢复 |
| mongo | mongorestore |
MongoDB 逻辑恢复 |
如果你能提供具体的数据库类型(MySQL、PostgreSQL、Oracle、SQL Server 等)以及备份文件的格式(.sql、.dump、.bak、.ibd 等),我可以给出更精确的命令和步骤。
标签: 数据库修复