MySQL备份核心指南
一、mysqldump命令详解
1.1 mysqldump基础认知
mysqldump 是MySQL官方提供的命令行工具,核心作用是将MySQL数据库/表的结构(表定义)和/或数据导出为SQL脚本文件,是MySQL全量备份的首选方式。
- 支持场景:单表/多表备份、单库/多库备份、全库备份、仅结构/仅数据备份;
- 适配引擎:对InnoDB(推荐
--single-transaction)和MyISAM(推荐--lock-tables)都有针对性参数; - 核心优势:备份文件是可读的SQL脚本,恢复简单、兼容性强。
1.1.1 基础语法
bash
# 格式1:备份指定数据库的部分/全部表
mysqldump [连接/功能参数] 数据库名 [表名1 表名2 ...] > 备份文件.sql
# 格式2:备份多个数据库(包含CREATE DATABASE语句)
mysqldump [参数] --databases 库名1 库名2 ... > 备份文件.sql
# 格式3:备份所有数据库(含系统库如mysql)
mysqldump [参数] --all-databases > 备份文件.sql
1.2 核心参数详解
1.2.1 必选连接参数(基础)
| 参数 | 说明 |
|---|---|
-u, --user=用户名 |
指定连接MySQL的用户名(如 -u root) |
-p, --password |
指定密码(建议只写 -p 不跟密码,回车后输入,避免明文暴露) |
-h, --host=IP/域名 |
远程连接时指定数据库服务器地址(本地可省略,默认127.0.0.1) |
-P, --port=端口 |
指定MySQL端口(默认3306,远程非默认端口必写) |
-S, --socket=文件 |
本地连接时指定socket文件(如 -S /var/lib/mysql/mysql.sock) |
1.2.2 常用功能参数(核心)
| 参数 | 说明 |
|---|---|
--databases (-B) |
备份多个数据库,备份文件包含CREATE DATABASE和USE语句,恢复无需提前建库 |
--all-databases (-A) |
备份MySQL中所有数据库(含系统库,如mysql、information_schema) |
-d, --no-data |
仅备份表结构,不备份数据 |
-t, --no-create-info |
仅备份数据,不备份表结构 |
-w, --where='条件' |
只备份满足条件的数据(如--where="id < 1000"或--where="status=1") |
--single-transaction |
开启事务,基于快照备份(InnoDB引擎推荐),无锁备份,保证数据一致性 |
--lock-tables |
备份时锁定所有表(MyISAM引擎推荐),避免备份过程中数据修改 |
--master-data=2 |
记录备份时刻的binlog位置(1=写入执行语句,2=注释语句),用于增量备份/主从同步 |
--flush-logs (-F) |
备份前刷新binlog日志(配合--master-data使用) |
--default-character-set |
指定字符集(如utf8mb4),避免备份/恢复乱码 |
-c, --complete-insert |
生成带列名的完整INSERT语句(如INSERT INTO t (id,name) VALUES (1,'a')),恢复更安全 |
--add-drop-table |
备份文件中添加DROP TABLE语句(默认开启,恢复前先删表) |
--add-drop-database |
备份文件中添加DROP DATABASE语句(恢复前先删库,慎用) |
1.2.3 优化类参数
| 参数 | 说明 |
|---|---|
-q, --quick |
快速导出,逐行读取数据(而非加载到内存),减少内存占用(默认开启) |
-e, --extended-insert |
生成多行INSERT语句(默认开启),备份文件更小、恢复更快 |
--compress (-C) |
压缩传输数据(远程备份时减少网络开销) |
1.3 实战示例(开箱即用)
1.3.1 本地备份单个数据库(InnoDB引擎)
bash
# 推荐写法:无锁备份 + 指定字符集 + 完整INSERT语句
mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 -c testdb > testdb_backup_20260213.sql
1.3.2 备份多个数据库
bash
mysqldump -u root -p --databases testdb1 testdb2 --default-character-set=utf8mb4 > multi_db_backup.sql
1.3.3 仅备份表结构(无数据)
bash
mysqldump -u root -p -d testdb > testdb_structure.sql
1.3.4 仅备份单个表的部分数据
bash
# 备份testdb库中user表,仅保留create_time >= 2026-01-01的数据
mysqldump -u root -p testdb user --where="create_time >= '2026-01-01'" > testdb_user_2026.sql
1.3.5 远程备份数据库
bash
# 连接192.168.1.100的3307端口,备份testdb库
mysqldump -u root -p -h 192.168.1.100 -P 3307 testdb > remote_testdb_backup.sql
1.3.6 备份并压缩(节省空间,大库必备)
bash
# 用gzip压缩,生成.sql.gz文件
mysqldump -u root -p --single-transaction testdb | gzip > testdb_backup.sql.gz
1.3.7 恢复备份(补充,备份后必用)
bash
# 恢复普通备份
mysql -u root -p testdb < testdb_backup.sql
# 恢复压缩备份(先解压再恢复)
gzip -d < testdb_backup.sql.gz | mysql -u root -p testdb
1.4 注意事项
- 权限要求 :执行
mysqldump的用户需要SELECT、LOCK TABLES(锁表备份时)、SHOW VIEW(备份视图时)等权限; - 引擎适配 :
- InnoDB:优先用
--single-transaction(无锁,保证一致性); - MyISAM:必须用
--lock-tables(无事务,锁表保证数据完整);
- InnoDB:优先用
- 密码安全 :不要在命令行直接写密码(如
-p123456),会暴露在ps进程列表中; - 大库备份:建议配合压缩工具(gzip/bzip2),并在业务低峰期执行;
- 增量备份 :
mysqldump是全量备份,增量备份需结合MySQL binlog日志。
二、MySQL存储过程备份方法
2.1 核心前提:存储过程的存储位置
MySQL中存储过程(含函数)的定义、参数、代码逻辑等元数据,都存储在系统库information_schema的ROUTINES表中,这是备份的核心依据。
- 关键字段:
ROUTINE_SCHEMA:存储过程所属数据库名;ROUTINE_NAME:存储过程名称;ROUTINE_TYPE:类型(PROCEDURE=存储过程,FUNCTION=函数);ROUTINE_DEFINITION:存储过程的核心代码。
2.2 方法1:用mysqldump备份(推荐,简单高效)
mysqldump是备份存储过程的首选方式,但默认不会包含存储过程/函数 ,必须显式加--routines(简写-R)参数。
2.2.1 备份指定数据库的「所有存储过程+表结构+数据」
bash
# 包含:表结构+数据+存储过程+函数(-R)+ 触发器(--triggers默认开启)
mysqldump -u root -p --routines --default-character-set=utf8mb4 数据库名 > 备份文件.sql
2.2.2 仅备份存储过程(不备份表结构/数据,精准备份)
bash
# --no-data (-t):不备份数据;--no-create-info (-d):不备份表结构;-R:备份存储过程/函数
mysqldump -u root -p --routines --no-data --no-create-info --default-character-set=utf8mb4 数据库名 > 仅存储过程备份.sql
2.2.3 备份多个数据库的存储过程
bash
mysqldump -u root -p --routines --no-data --no-create-info --databases 库名1 库名2 > 多库存储过程备份.sql
2.2.4 备份全库的所有存储过程
bash
mysqldump -u root -p --routines --no-data --no-create-info --all-databases > 全库存储过程备份.sql
2.3 方法2:查询系统表备份(灵活,可自定义筛选)
如果只需备份指定存储过程 (而非全部),可直接查询information_schema.ROUTINES表,拼接出完整的创建语句并导出到文件。
2.3.1 单条查询(查看指定存储过程定义)
sql
-- 查询指定数据库下的指定存储过程
SELECT ROUTINE_DEFINITION
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = '你的数据库名'
AND ROUTINE_NAME = '你的存储过程名'
AND ROUTINE_TYPE = 'PROCEDURE';
2.3.2 批量导出所有存储过程(生成完整创建语句)
创建一个脚本文件(如backup_procedures.sql),内容如下:
sql
-- 切换到目标数据库(替换为你的数据库名)
USE 你的数据库名;
-- 拼接存储过程的创建语句(包含删除原有存储过程的逻辑,避免恢复冲突)
SELECT CONCAT(
'DROP PROCEDURE IF EXISTS ', ROUTINE_NAME, ';',
CHAR(10), -- 换行符
CREATE_PROCEDURE, ';'
) AS procedure_sql
FROM (
-- 查存储过程的完整创建语句
SELECT
ROUTINE_NAME,
CONCAT(
'CREATE DEFINER=`', DEFINER, '` PROCEDURE `', ROUTINE_NAME, '`(',
PARAMETER_LIST, ')',
CHAR(10),
ROUTINE_DEFINITION
) AS CREATE_PROCEDURE
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = '你的数据库名'
AND ROUTINE_TYPE = 'PROCEDURE'
) AS t;
2.3.3 执行脚本并导出到文件
bash
# 执行SQL脚本,将结果导出到文件(仅保留存储过程创建语句)
mysql -u root -p --skip-column-names --default-character-set=utf8mb4 < backup_procedures.sql > procedures_backup.sql
--skip-column-names:去掉查询结果的列名,只保留纯SQL语句,方便恢复。
2.4 存储过程的恢复方法
2.4.1 恢复普通备份文件
bash
# 恢复到指定数据库(需确保数据库已存在)
mysql -u root -p --default-character-set=utf8mb4 目标数据库名 < 存储过程备份.sql
2.4.2 恢复单个存储过程(手动执行)
sql
-- 先登录MySQL
mysql -u root -p
-- 切换到目标库
USE 你的数据库名;
-- 执行存储过程创建语句(从备份文件中复制)
DROP PROCEDURE IF EXISTS 你的存储过程名;
CREATE DEFINER=`root`@`localhost` PROCEDURE `你的存储过程名`(参数列表)
BEGIN
-- 存储过程逻辑
SELECT * FROM user;
END;
2.5 关键注意事项
- 权限要求 :
- 备份用户:需要
SELECT(查系统表)、SHOW ROUTINE权限; - 恢复用户:需要
CREATE ROUTINE(创建存储过程)、ALTER ROUTINE(修改/删除)权限;
- 备份用户:需要
- 字符集 :备份/恢复时务必指定
--default-character-set=utf8mb4,避免存储过程中的中文注释/逻辑乱码; - 依赖检查:恢复存储过程前,需确保其依赖的表、函数已存在,否则会报错;
- DEFINER问题 :备份的存储过程会包含
DEFINER(定义者),如果恢复的环境中该用户不存在,可删除DEFINER=root@localhost``部分,使用当前登录用户创建。
2.6 mysqldump核心要点
- 核心定位:MySQL官方全量备份工具,导出SQL格式备份,支持多场景精准备份;
- 引擎适配 :InnoDB用
--single-transaction(无锁),MyISAM用--lock-tables(锁表); - 实战技巧 :远程备份加
-h/-P、大库备份加压缩、指定utf8mb4避免乱码,恢复用mysql < 备份文件.sql。
2.7 存储过程备份核心要点
- 推荐方式 :
mysqldump加--routines (-R)参数,结合--no-data --no-create-info可仅备份存储过程; - 灵活方式 :查询
information_schema.ROUTINES表可筛选指定存储过程备份; - 恢复要点 :确保用户权限和依赖表结构存在,处理
DEFINER兼容性问题。
三、触发器、函数、事件与事务备份
3.1 核心参数整合
覆盖函数/触发器/事件+事务一致性的关键mysqldump参数:
--routines (-R):备份存储过程+自定义函数--triggers:备份触发器(默认开启,建议显式指定)--events (-E):备份定时事件(默认不备份,必须显式添加)--single-transaction:InnoDB无锁事务快照,保证数据一致性--no-data (-t):不备份表数据,仅备份结构与逻辑对象
3.2 分场景备份命令
3.2.1 全量备份(表+数据+函数+过程+触发器+事件+事务一致性)
bash
# InnoDB引擎生产推荐
mysqldump -u root -p \
--single-transaction \
--routines \
--triggers \
--events \
--default-character-set=utf8mb4 \
数据库名 > 全量完整备份.sql
# MyISAM引擎
mysqldump -u root -p \
--lock-tables \
--routines \
--triggers \
--events \
--default-character-set=utf8mb4 \
数据库名 > MyISAM全量备份.sql
3.2.2 仅备份逻辑对象(无表结构/无数据)
bash
mysqldump -u root -p \
--routines \
--triggers \
--events \
--no-data \
--no-create-info \
--default-character-set=utf8mb4 \
数据库名 > 仅函数过程触发器事件备份.sql
3.3 事务在备份中的核心作用
- 事务不是备份对象 ,是保证备份一致性的核心机制
- InnoDB:
--single-transaction开启只读事务快照,无锁、一致、不阻塞业务 - MyISAM:无事务,必须用
--lock-tables锁表保证完整性 - 仅对表数据生效,函数/触发器/存储过程为静态对象,天然一致
四、其他必须备份的MySQL对象
4.1 视图(View)
- 必要性:虚拟表,业务查询/报表高度依赖,漏备会导致业务报错
- 备份方式:mysqldump备份表结构时默认包含视图
- 单独备份命令:
bash
mysqldump -u root -p -d 数据库名 > 视图备份.sql
4.2 事件(Event)
- 必要性:MySQL定时任务,如数据清理、统计,默认不备份
- 备份参数:必须加
--events (-E) - 单独查询备份:
sql
SELECT CONCAT('CREATE EVENT ', EVENT_NAME, ' ON SCHEDULE ', EVENT_SCHEDULE, ' DO ', EVENT_DEFINITION, ';')
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = '数据库名';
4.3 数据库用户与权限
- 必要性:恢复后应用连接数据库的核心,最易遗漏
- 备份用户:
sql
SELECT CONCAT("CREATE USER '", user, "'@'", host, "' IDENTIFIED BY PASSWORD '", authentication_string, "';")
FROM mysql.user;
- 备份权限:
sql
SHOW GRANTS FOR '用户名'@'%';
4.4 MySQL配置文件(my.cnf/my.ini)
- 必要性:包含端口、字符集、缓存、引擎、主从配置
- 备份方式:直接复制
bash
cp /etc/my.cnf /备份路径/my.cnf.bak
4.5 主从同步信息
- 必要性:主从架构恢复后快速重建同步
- 主库:记录
SHOW MASTER STATUS;的File与Position - 从库:记录
SHOW SLAVE STATUS\G;的同步位点信息
五、生产环境备份补充要点
5.1 DEFINER权限报错解决
生产高频坑:备份包含DEFINER,新环境用户不存在导致恢复失败
bash
# 备份时直接移除DEFINER
mysqldump -u root -p --routines --no-data 数据库名 | sed 's/DEFINER=`[^`]*`@`[^`]*`//g' > 无DEFINER备份.sql
5.2 自动化定时备份脚本
bash
#!/bin/bash
DB_USER="root"
DB_NAME="数据库名"
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=7
BACKUP_TIME=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_full_${BACKUP_TIME}.sql"
mysqldump -u$DB_USER -p --single-transaction --routines --events --triggers --default-character-set=utf8mb4 $DB_NAME | sed 's/DEFINER=`[^`]*`@`[^`]*`//g' > $BACKUP_FILE
find $BACKUP_DIR -name "*.sql" -mtime +$RETENTION_DAYS -delete
5.3 备份有效性验证
bash
# 测试库恢复验证
mysql -u root -p -e "CREATE DATABASE test_restore;"
mysql -u root -p test_restore < 备份文件.sql
mysql -u root -p -e "SHOW PROCEDURE STATUS; SHOW TRIGGERS; SHOW EVENTS;"
5.4 版本兼容与应急恢复
- MySQL 5.7 ↔ 8.0 需注意sql_mode与权限兼容
- 误删逻辑对象可通过binlog恢复
bash
mysqlbinlog binlog文件 | grep -A 20 "CREATE PROCEDURE"
六、终极一键完整备份命令
覆盖:表+数据+视图+函数+存储过程+触发器+事件+事务一致性
bash
mysqldump -u root -p \
--single-transaction \
--routines \
--events \
--triggers \
--default-character-set=utf8mb4 \
数据库名 > 终极全量备份.sql
七、全量备份核心总结
7.1 必备份对象清单
- 数据层:表结构、表数据
- 逻辑层:函数、存储过程、触发器、视图、事件
- 环境层:用户权限、配置文件、主从信息
7.2 核心参数口诀
- 函数过程:
-R / --routines - 定时事件:
-E / --events - 触发器:
--triggers(默认开) - 一致备份:
--single-transaction(InnoDB) - 字符集:
--default-character-set=utf8mb4
7.3 生产三要素
- 定时自动化
- 备份必验证
- DEFINER必处理
八、恢复操作全流程
8.1 普通全量备份恢复
bash
# 登录MySQL创建目标数据库
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS target_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 执行恢复
mysql -u root -p target_db < 全量完整备份.sql
8.2 仅逻辑对象恢复(函数/过程/触发器/事件)
bash
mysql -u root -p target_db < 仅函数过程触发器事件备份.sql
8.3 压缩备份恢复
bash
# 直接解压并恢复
gzip -d -c 备份文件.sql.gz | mysql -u root -p target_db
8.4 恢复后校验
8.4.1 校验表结构
sql
USE target_db;
SHOW TABLES;
DESC 表名;
8.4.2 校验存储过程与函数
sql
SHOW PROCEDURE STATUS WHERE Db = 'target_db';
SHOW FUNCTION STATUS WHERE Db = 'target_db';
8.4.3 校验触发器
sql
SHOW TRIGGERS;
8.4.4 校验事件
sql
SHOW EVENTS;
8.4.5 校验视图
sql
SHOW FULL TABLES IN target_db WHERE TABLE_TYPE = 'VIEW';
九、常见问题与解决方案
9.1 备份/恢复中文乱码
- 解决方案:所有操作添加参数 --default-character-set=utf8mb4
- 数据库、表、连接字符集统一为utf8mb4
9.2 存储过程/函数创建失败
sql
-- 临时关闭函数创建限制
SET GLOBAL log_bin_trust_function_creators = 1;
9.3 DEFINER用户不存在
- 方案1:备份时通过sed移除DEFINER
- 方案2:手动创建对应用户
- 方案3:修改备份文件中的DEFINER为当前用户
9.4 触发器依赖表不存在
- 解决方案:先恢复表结构,再恢复触发器
9.5 事件调度器未开启
sql
-- 开启事件调度器
SET GLOBAL event_scheduler = ON;
-- 校验状态
SHOW VARIABLES LIKE 'event_scheduler';
十、生产备份规范建议
10.1 备份周期
- 全量备份:每日凌晨低峰期执行1次
- 增量备份:配合binlog每小时归档
- 逻辑对象备份:每次发布前单独备份
10.2 备份保留策略
- 全量备份:保留7天
- 月度全量:归档长期保留
- 发布前备份:永久保留关键版本
10.3 备份存储要求
- 本地磁盘+远程存储双备份
- 备份文件权限设为600,仅管理员可访问
- 定期异地同步
10.4 恢复演练
- 每月至少执行1次恢复演练
- 验证备份完整性与恢复耗时
- 记录恢复流程形成文档
十一、核心参数速查表
11.1 mysqldump必背参数
- -u:指定用户名
- -p:指定密码
- -h:指定主机
- -P:指定端口
- -R --routines:备份存储过程+函数
- -E --events:备份事件
- --triggers:备份触发器
- --single-transaction:InnoDB一致性备份
- --default-character-set=utf8mb4:指定字符集
- --no-data:仅备份结构
- --databases:备份多数据库
- --all-databases:备份全库
11.2 备份对象与参数对应
- 表结构/数据:默认
- 存储过程/函数:-R
- 触发器:--triggers
- 事件:-E
- 视图:默认
- 一致性:--single-transaction
十二、最终总结
12.1 完整备份覆盖范围
- 数据:表结构、表数据
- 业务逻辑:函数、存储过程、触发器、视图、事件
- 系统配置:用户权限、配置文件、主从信息
12.2 最优备份命令
bash
# InnoDB生产环境终极备份命令
mysqldump -u root -p \
--single-transaction \
--routines \
--events \
--triggers \
--default-character-set=utf8mb4 \
数据库名 | sed 's/DEFINER=`[^`]*`@`[^`]*`//g' | gzip > 备份文件名_$(date +%Y%m%d).sql.gz
12.3 生产核心原则
- 备份不验证,等于没备份
- 定期演练恢复流程
- 统一字符集,处理DEFINER
- 定时自动化,异地多副本