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
相关推荐
大白要努力!5 小时前
MySQL 8.0 + Navicat 完整操作指南
数据库·mysql
云絮.6 小时前
数据库操作
数据库·mysql·算法·oracle
设计师小聂!8 小时前
宝塔 Linux 面板保姆级教程
linux·mysql·开源·运维开发
Tong Z9 小时前
Mysql DDL中的ALGORITHM
数据库·mysql
minji...13 小时前
MySQL数据库 (七) MySQL表的基本查询(上),insert、replace、select、where、order by
数据库·mysql·select·replace·insert·order by·where
折戟不必沉沙15 小时前
mysql忘记密码
数据库·mysql
kuonyuma15 小时前
MyBatis入门·注解操作
java·spring boot·mysql·spring·mybatis
聪明努力的积极向上15 小时前
【claude code】MySQL MCP 配置完整指南
数据库·mysql·ai编程
DIY源码阁15 小时前
JavaSwing酒店管理系统 - MySQL版
java·mysql·eclipse
川石课堂软件测试15 小时前
UI自动化测试|元素操作&浏览器操作实践
功能测试·测试工具·mysql·ui·docker·容器·单元测试