跳转至

MySQL 其它备份命令

1. 只备份数据库结构(不备份数据)

备份所有数据库结构

Bash
# 备份所有数据库的表结构、视图、存储过程、函数、事件
mysqldump -uroot -p'密码' \
--all-databases \
--no-data \                    # 关键参数:不备份数据
--routines \                   # 包含存储过程和函数
--events \                     # 包含事件
--triggers \                   # 包含触发器
--default-character-set=utf8mb4 \
--set-gtid-purged=OFF \
--single-transaction \
> /tmp/schema_all_$(date +%Y%m%d).sql

备份指定数据库结构

Bash
# 备份单个数据库结构
mysqldump -uroot -p'密码' \
--databases 数据库名 \
--no-data \
--routines \
--events \
--triggers \
> /backup/schema_数据库名_$(date +%Y%m%d).sql

# 备份多个数据库结构
mysqldump -uroot -p'密码' \
--databases 库1 库2 库3 \
--no-data \
> /tmp/schema_multiple_$(date +%Y%m%d).sql

只备份表结构(不含其他对象)

Bash
1
2
3
4
5
6
7
8
# 只备份表结构,不包含存储过程、事件等
mysqldump -uroot -p'密码' \
数据库名 \
--no-data \
--skip-triggers \              # 不包含触发器
--skip-routines \              # 不包含存储过程和函数
--skip-events \                # 不包含事件
> /tmp/tables_only_数据库名.sql

2. 只备份数据(不备份表结构)

备份所有数据

Bash
# 备份所有数据库的数据(无表结构)
/usr/local/mysql/bin/mysqldump \
-uroot -p'密码' \
--all-databases \
--no-create-info \            # 关键参数:不创建表结构
--skip-triggers \             # 不包含触发器定义
--skip-routines \             # 不包含存储过程和函数
--skip-events \               # 不包含事件
--complete-insert \           # 使用完整的INSERT语句(包含列名)
--extended-insert \           # 使用多行INSERT语法(提高效率)
--set-gtid-purged=OFF \
--single-transaction \
--quick \
> /tmp/data_only_all_$(date +%Y%m%d).sql

备份指定表的数据

Bash
# 备份单个表的数据
mysqldump -uroot -p'密码' \
数据库名 \
表名 \
--no-create-info \
--complete-insert \
> /tmp/data_数据库名_表名_$(date +%Y%m%d).sql

# 备份多个表的数据
mysqldump -uroot -p'密码' \
数据库名 \
表1 表2 表3 \
--no-create-info \
> /tmp/data_multiple_tables.sql

备份数据并带条件筛选

Bash
# 只备份特定条件的数据
mysqldump -uroot -p'密码' \
数据库名 \
表名 \
--no-create-info \
--where="create_time > '2024-01-01' AND status = 'active'" \
> /tmp/data_filtered.sql

# 只备份最近7天的数据
mysqldump -uroot -p'密码' \
数据库名 \
表名 \
--no-create-info \
--where="created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)" \
> /tmp/data_last_7days.sql

3.特殊场景备份

只备份存储过程和函数

Bash
1
2
3
4
5
6
7
8
mysqldump -uroot -p'密码' \
--all-databases \
--routines \
--no-create-info \
--no-data \
--skip-triggers \
--skip-opt \
> /tmp/routines_only.sql

只备份触发器

Bash
# MySQL没有直接只备份触发器的命令,可以通过以下方式
# 方法1:从结构备份中提取
mysqldump -uroot -p'密码' \
--all-databases \
--triggers \
--no-create-info \
--no-data \
> /tmp/triggers_temp.sql

# 方法2:查询information_schema
mysql -uroot -p'密码' -Nse "
SELECT CONCAT('DROP TRIGGER IF EXISTS ', TRIGGER_NAME, ';',
              'CREATE TRIGGER ', TRIGGER_NAME, ' ', ACTION_TIMING, ' ', 
              EVENT_MANIPULATION, ' ON ', EVENT_OBJECT_SCHEMA, '.', 
              EVENT_OBJECT_TABLE, ' FOR EACH ROW ', ACTION_STATEMENT, ';')
FROM information_schema.TRIGGERS
WHERE TRIGGER_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys');
" > /tmp/triggers.sql

只备份事件

Bash
1
2
3
4
5
6
7
8
mysqldump -uroot -p'密码' \
--all-databases \
--events \
--no-create-info \
--no-data \
--skip-routines \
--skip-triggers \
> /tmp/events_only.sql

4.恢复时分开使用

先恢复结构,再恢复数据

Bash
# 恢复数据库结构
mysql -uroot -p'密码' < /tmp/schema_all.sql

# 恢复数据(可能需要在恢复前禁用外键检查)
mysql -uroot -p'密码' -e "SET FOREIGN_KEY_CHECKS=0;"
mysql -uroot -p'密码' < /tmp/data_only_all.sql
mysql -uroot -p'密码' -e "SET FOREIGN_KEY_CHECKS=1;"

# 恢复存储过程、函数等
mysql -uroot -p'密码' < /tmp/routines_only.sql

单表恢复示例

Bash
# 恢复表结构
mysql -uroot -p'密码' 数据库名 < /tmp/users_schema.sql

# 恢复表数据(可带条件)
mysql -uroot -p'密码' 数据库名 -e "
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE users;  -- 清空现有数据
SET FOREIGN_KEY_CHECKS=1;
"
mysql -uroot -p'密码' 数据库名 < /tmp/users_data.sql