mysqldump 备份恢复,从单库到全库恢复实操

一、恢复前的准备工作

在执行恢复操作前,务必做好以下检查,避免数据丢失或恢复失败:

  1. 确认目标 MySQL 服务正常运行(systemctl status mysqld);
  2. 验证备份文件的有效性:可通过 cat 备份文件.sql | head -20 查看是否有正常的 SQL 语句(如 CREATE DATABASEINSERT);
  3. 恢复前建议备份当前数据库(避免覆盖错误),生产环境优先在测试库验证后再操作;
  4. 确保执行恢复的 MySQL 用户有 CREATEINSERTALTER 等权限(推荐用 root 用户)。

二、基础恢复语法

mysqldump 生成的备份文件本质是 SQL 脚本,恢复核心是通过 mysql 命令执行该脚本,基础语法:

bash 复制代码
mysql [连接参数] [目标库名] < 备份文件路径/文件名.sql

核心连接参数和 mysqldump 一致:-u(用户名)、-p(密码)、-h(远程IP)、-P(端口)。

三、不同场景的恢复实操

1. 恢复单库备份(最常用)

适用于用 mysqldump -u -p 单库名 > 备份文件.sql 生成的备份文件。

场景1:目标库已存在(直接覆盖/追加数据)
bash 复制代码
# 恢复 test_db 库(需提前确保 test_db 库存在)
mysql -uroot -p test_db < /backup/mysql/test_db_20260113.sql

执行后输入 MySQL 密码,脚本会自动执行,将备份的表结构和数据导入 test_db 库。

场景2:目标库不存在(先建库再恢复)

如果删除了 test_db 库,需先创建空库再恢复:

bash 复制代码
# 1. 登录 MySQL 创建空库
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# 2. 恢复数据到新建的库
mysql -uroot -p test_db < /backup/mysql/test_db_20260113.sql

2. 恢复多库备份

适用于用 --databases 参数备份的多库文件(包含 CREATE DATABASE 语句),无需提前建库:

bash 复制代码
# 恢复 test_db1、test_db2 多个库(备份文件已包含建库语句)
mysql -uroot -p < /backup/mysql/multi_db_20260113.sql

关键说明 :多库备份文件里会有 CREATE DATABASEUSE 库名 语句,因此恢复时不需要指定具体库名,直接执行即可。

3. 恢复全库备份

适用于用 -A/--all-databases 备份的全库文件,恢复后会覆盖所有现有数据库(谨慎操作):

bash 复制代码
# 恢复所有数据库(包含系统库,生产环境需确认)
mysql -uroot -p < /backup/mysql/full_db_20260113.sql

注意 :全库恢复会覆盖 mysql 系统库(包含用户、权限),如果是跨服务器恢复,建议先备份目标服务器的 mysql 库。

4. 恢复压缩的备份文件(.sql.gz)

生产环境常用 gzip 压缩备份,恢复时无需手动解压,可通过管道直接执行:

bash 复制代码
# 直接恢复 gzip 压缩的备份文件(单库)
gzip -dc /backup/mysql/test_db_20260113.sql.gz | mysql -uroot -p test_db

# 恢复压缩的全库备份
gzip -dc /backup/mysql/full_db_20260113.sql.gz | mysql -uroot -p

参数解析:-dc 表示解压并输出到标准输出,避免生成解压后的临时文件,节省磁盘空间。

5. 恢复指定表(精准恢复)

如果只需恢复备份文件中的某一张表(如 test_db 库的 user 表),可通过 grep 筛选 SQL 语句:

bash 复制代码
# 从单库备份中提取 user 表的结构和数据并恢复
cat /backup/mysql/test_db_20260113.sql | grep -E "CREATE TABLE \`user\`|INSERT INTO \`user\`" | mysql -uroot -p test_db

或更精准的方式(先解压压缩包再筛选):

bash 复制代码
# 从压缩包中提取指定表
gzip -dc /backup/mysql/test_db_20260113.sql.gz | grep -E "CREATE TABLE \`user\`|INSERT INTO \`user\`" | mysql -uroot -p test_db

四、恢复常见问题与避坑

  1. 字符集不一致 :恢复后中文乱码,需确保备份和恢复时数据库字符集一致,可在 mysql 命令后加 --default-character-set=utf8mb4

    bash 复制代码
    mysql -uroot -p --default-character-set=utf8mb4 test_db < 备份文件.sql
  2. 权限不足 :提示 Access denied,需给用户赋权:

    sql 复制代码
    GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost' IDENTIFIED BY '密码';
    FLUSH PRIVILEGES;
  3. 表已存在 :提示 Table 'xxx' already exists,可先删除表再恢复(谨慎),或在备份文件中添加 DROP TABLE IF EXISTS(备份时加 --add-drop-table 参数)。

  4. 远程恢复 :恢复到远程 MySQL 服务器,需指定 -h-P

    bash 复制代码
    mysql -uroot -p -h192.168.1.100 -P3306 test_db < /backup/mysql/test_db_20260113.sql
相关推荐
ᰔᩚ. 一怀明月ꦿ2 小时前
MySQL 学习目标
学习·mysql·adb
他们叫我阿冠6 小时前
Day4学习--MySQL高级
数据库·学习·mysql
罗超驿6 小时前
20.MySQL事务隔离级别示例详解(脏读、不可重复读、幻读)
java·数据库·mysql·面试
独泪了无痕7 小时前
MySQL中 JSON 数据类型使用指南
mysql
我是一颗柠檬8 小时前
【MySQL全面教学】MySQL基础与环境搭建Day1(2026年)
数据库·后端·sql·mysql·database
我是一颗柠檬8 小时前
【MySQL全面教学】MySQL数据类型详解Day2(2026年)
数据库·后端·sql·mysql·database
小江的记录本8 小时前
【Java并发编程】锁机制:volatile:JMM内存模型、可见性/禁止指令重排、内存屏障、单例模式中的应用(附《思维导图》+《面试高频考点清单》)
java·后端·python·mysql·单例模式·面试·职场和发展
身如柳絮随风扬8 小时前
CentOS 7 搭建 MySQL 主从复制集群:从零到生产级高可用
linux·mysql·centos
数据库小学妹8 小时前
MySQL 性能监控实战:从零搭建 Prometheus + Grafana 监控告警体系(附排查 SOP)
mysql·性能优化·grafana·prometheus·dba
阿坤带你走近大数据9 小时前
mysql从5.7升级到8.0后ONLY_FULL_GROUP_BY是升级后应用报错的第一大原因
数据库·mysql