Mysql常用备份恢复方法

文章目录

一、逻辑备份1(mysqldump)

逻辑备份通过生成SQL脚本备份数据,与存储引擎无关,适合中小规模数据库、数据迁移或跨平台备份,恢复时需注意数据量大小(大库恢复耗时较长)。

1. 基础备份命令
  • 备份单个数据库(含数据+结构)

    复制代码
    mysqldump -u 用户名 -p 数据库名 > 备份文件路径.sql
    # 示例
    mysqldump -u root -p test > /backup/test_backup.sql

    执行后会提示输入数据库密码,密码需保密。

  • 备份多个数据库

    复制代码
    mysqldump -u 用户名 -p --databases 数据库1 数据库2 > 备份文件路径.sql
    # 示例:
    mysqldump -u root -p --databases test1 test2 > /backup/multi_db.sql

    支持一次性备份多个指定数据库,备份文件包含所有库的创建语句和数据。

  • 备份所有数据库 (mysql数据库+业务数据库)

    复制代码
    mysqldump -u 用户名 -p --all-databases > 备份文件路径.sql
    # 示例:
    mysqldump -u root -p --all-databases > /backup/all_db.sql

    适用于全量备份整个MySQL实例,备份文件包含所有库的结构和数据。

  • 备份单个数据库的结构(不含数据)

    复制代码
    mysqldump -u 用户名 -p --no-data 数据库名 > 备份文件路径.sql
    # 示例:
    mysqldump -u root -p --no-data test > /backup/test_structure.sql

    生成的SQL脚本仅包含表结构、存储过程、触发器等,可用于快速重建数据库框架。

  • 备份单个数据库的指定表

    复制代码
    mysqldump -u 用户名 -p 数据库名 表1 表2 > 备份文件路径.sql
    # 示例:
    mysqldump -u root -p test tb1 > /backup/test_tb1.sql

    适合仅备份核心业务表,减少备份文件大小。

2. 进阶参数与生产场景优化
  • 带压缩的备份(节省存储空间)

    先执行备份命令生成SQL脚本,再用gzip压缩:

    复制代码
    mysqldump -u root -p test | gzip > /backup/test_backup.sql.gz

    压缩后文件体积可减少70%-90%,适合远程传输或长期归档。

  • InnoDB引擎生产环境推荐命令

    使用--single-transaction参数实现热备份(不锁表,业务可正常运行):

    复制代码
    mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 test > /backup/test_hot_backup.sql
    • --single-transaction:InnoDB引擎支持,通过事务快照实现无锁备份,避免业务中断。
    • --default-character-set=utf8mb4:指定字符集,避免恢复时出现乱码(需与线上库字符集一致)。
  • 仅备份数据(不含结构)

    使用--no-create-info参数,生成的SQL仅包含INSERT语句,适合已有表结构的快速数据恢复:

    复制代码
    mysqldump -u root -p --no-create-info test > /backup/test_data_only.sql

二、逻辑备份2(mydumper)

myDumper是一个MySQL逻辑备份工具。它有2个工具:

  • mydumper负责导出 MySQL 数据库的一致备份

  • myloader从 mydumper 读取备份,连接到目标数据库并导入备份。

    这两个工具都使用多线程功能。

mydumper 主要有以下几点特性:

  • 支持多线程导出数据,速度更快。
  • 支持一致性备份。
  • 支持将导出文件压缩,节约空间。
  • 支持多线程恢复。
  • 支持以守护进程模式工作,定时快照和连续二进制日志。
  • 支持按照指定大小将备份文件切割。
  • 数据与建表语句分离。

下载地址:https://github.com/mydumper/mydumper/releases

  • 备份全库(-o 输出文件目录)

    mydumper -u root -p rt__1605 -o /backup2

备份结果是.sql文件

  • 备份全库(包含其他)

    包含触发器(-G)、事件(-E)、存储过程和函数(-R)

    mydumper -u root -p rt__1605 -G -R -E -o /backup3

  • 备份指定数据库(-B或--database)

    mydumper -u root -p rt__1605 -G -R -E -B test,test2 -o /backup4

  • 导出指定表(-T或--tables-list)

    mydumper -u root -p rt__1605 -T test.tb1,test2.tb21 -o /backup5

  • 只导出表结构,不导出表数据(-d或--no-data)

    mydumper -u root -p rt__1605 -B test -d -o /backup6

  • 只导出表数据,不导出表结构(-m或者--no-schemas)

    mydumper -u root -p rt__1605 -m -B test -o /backup7

  • 压缩备份(-c或--compress)

    mydumper -u root -p rt__1605 -B test,test2 -c --clear -o /backup8

--clear:备份前清理备份目录

  • 综合备份

压缩、4线程、备份前清理备份目录、备份包含触发器、事件、存储过程和函数,备份前清理目录

复制代码
mydumper -u root -p rt__1605 -G -E -R  -t 4 -c --clear -o /backup9
  • 用正则表达式

    排除某些表或者数据库,使用--regex参数

可以使用--regex功能,例如不备份test和mysql数据库:

复制代码
mydumper --regex '^(?!(test\.|mysql\.))'   -u root -p rt__1605 -o /backup10

仅备份test和test2数据库:

复制代码
mydumper --regex '^(test\.|test2\.)'   -u root -p rt__1605 -o /backup11

不备份以test开头的所有数据库:

复制代码
mydumper --regex '^(?!(test))'  -u root -p rt__1605 -o /backup12

三、物理备份(直接复制数据文件)

物理备份直接复制MySQL数据目录文件,速度快、恢复效率高,但需停止服务(冷备份)或使用专用工具(热备份),适合大规模数据库或频繁备份场景。

1.冷备份(停止MySQL服务)

适用于非核心业务或允许短暂中断的场景,步骤简单:

  1. 停止MySQL服务:systemctl stop mysql

  2. 复制数据目录和日志目录:

    复制代码
    # 备份数据目录(以CentOS为例,路径可能因安装方式不同而变化)
    cp -r /var/lib/mysql /backup/mysql_data_backup
    # 备份日志目录(InnoDB日志)
    cp -r /var/log/mysql /backup/mysql_log_backup
  3. 恢复时替换原目录文件,再启动MySQL服务即可。

2.热备份

Percona XtraBackup(开源物理备份工具,支持InnoDB热备份)

支持在线热备份,适合生产环境大规模数据库,恢复速度快,但学习成本较高。


四、其他工具备份

  • mysqlpump (MySQL 5.7+新增工具,比mysqldump更高效)

    命令示例(备份单个数据库):

    复制代码
    mysqlpump -u root -p test > /backup/test_pump.sql

    支持并行备份、增量备份,备份速度比mysqldump提升30%-50%,适合中等规模数据库。


五、备份恢复与自动化

1. 恢复命令1
  • 逻辑备份恢复

    复制代码
    mysql -u 用户名 -p 数据库名 < 备份文件路径.sql
    # 示例:
    mysql -u root -p test < /backup/test_backup.sql
  • 物理备份恢复

    将备份的数据目录/日志目录替换原路径文件,启动MySQL服务即可(冷备份)。

2.恢复命令2(恢复mydumper的备份文件)
  • 恢复指定库(-o如果表存在则删除表)

    myloader -u root -p rt__1605 -o -s test -d /backup2

  • 将源库的test库导入备库的test3库(自动新建test3)

    myloader -u root -p rt__1605 -o -B test3 -s test -d /backup2

  • 导入特定的表

    在导出的目录中选择metadata文件和需要单独导入的表的结构文件和数据文件移到一个新目录下,最好提前建好库表,否则需要把建库表的文件一起移动到新目录,移动到新目录后可以使用myloader指定新目录进行恢复数据。

3. 自动化备份(Shell脚本+定时任务)

通过Shell脚本结合crontab实现每日自动备份,示例脚本:

复制代码
#!/bin/bash
# 设置备份参数
DB_USER="root"
DB_PASS="密码"
DB_NAME="mydb"
BACKUP_DIR="/backup/mysql"
DATE_DIR=$(date +%Y-%m-%d)
BACKUP_FILE="${BACKUP_DIR}/${DATE_DIR}/${DB_NAME}_$(date +%H%M%S).sql.gz"

# 创建备份目录
mkdir -p ${BACKUP_DIR}/${DATE_DIR}

# 执行备份并压缩
mysqldump -u${DB_USER} -p${DB_PASS} --single-transaction ${DB_NAME} | gzip > ${BACKUP_FILE}

# 保留最近7天的备份,删除旧文件
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +7 -delete

添加定时任务:crontab -e,设置每日凌晨2点执行:

复制代码
0 2 * * * /path/to/backup_script.sh

六、附件

1.mydumper参数
参数 简写 描述
连接选项
--host -h 连接的MySQL数据库服务器
--user -u 连接数据库的用户
--password -p 连接数据库用户的密码
--ask-password -a 提示输入用户的密码
--port -p MySQL数据库端口
--socket -S 用于连接的 UNIX 域套接字文件
--protocol 用于连接的协议(tcp、socket)
--compress-protocol -C 对 MySQL 连接使用压缩
--ssl 使用 SSL 连接
--ssl-MODE 连接到服务器所需的安全状态:DISABLED、PREFERRED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY
--key 密钥文件的路径名
--cert 证书文件的路径名
--ca 证书颁发机构文件的路径名
--capath 包含 PEM 格式的受信任 SSL CA 证书的目录的路径名
--cipher 用于 SSL 加密的允许密码列表
--tls-version 服务器允许哪些协议进行加密连接
过滤选项
--regex -X db.table' 匹配的正则表达式
--database -B 需要备份的数据库
--ignore-engines -i 要忽略的存储引擎的列表 ,逗号分隔
--updated-since -u 使用 Update_time 仅转储最近 U 天内更新的表
--partition-regex 按分区名称过滤的正则表达式
--omit-from-file -O 包含要跳过的数据库.表条目列表的文件,每行一个(在应用正则表达式选项之前跳过)
--tables-list -T 要备份的表列表,以逗号分隔(不排除正则表达式选项)。 表名必须包含数据库名。 例如:test.t1,test.t2
锁选项
--tidb-snapshot -z 使用 TiDB 快照
--no-locks -k 不执行临时共享读锁 ,警告:这将会导致非一致性备份
--use-savepoints 使用 savepoints 来减少元数据锁的产生,需要 SUPER 权限
--no-backup-locks 不使用 Percona 的 backup locks (备份锁)
--lock-all-tables 对所有的表 LOCK TABLE,而不是使用FTWRL
--less-locking 对于 InnoDB 存储引擎的表最少的锁时间
--trx-consistency-only 事务一致性
--skip-ddl-locks 跳过DDL锁
PMM选项
--pmm-path 默认值为 /usr/local/percona/pmm2/collectors/textfile-collector/high-resolution
--pmm-resolution 默认值较高
执行选项
--exec-threads 与 --exec 一起使用的线程数量
--exec 使用文件作为参数来执行命令
--exec-per-thread 设置将由 STDIN 接收并将 STDOUT 写入输出文件的命令
--exec-per-thread-extension 使用 --exec-per-thread 时设置 STDOUT 文件的扩展名
长查询选项
--long-query-retries 重新检测长查询 ,默认0(不检测)
--long-query-retry-interval 长查询检测的间隔时间 ,默认60秒
--long-query-guard -l 设置长查询的时间阈值 ,默认60秒
--kill-long-queries -k kill 长查询(替代aborting)
Job选项
--MAX-threads-per-TABLE 每张表的最大线程数
--CHAR-deep 定义当主键是字符串时要使用的字符数
--CHAR-chunk 定义应将表拆分为多少部分。 默认情况下我们使用线程数量
--ROWS -r 将表拆分为这么多行的块。 它可以是 MIN:START_AT:MAX。 MAX 可以为 0,表示没有限制。 如果查询时间少于 1 秒,则块大小将加倍;如果查询时间超过 2 秒,则块大小减半
--split-partitions 将分区转储到单独的文件中。 此选项会覆盖分区表的 --rows 选项
校验选项
--checksum-all -M 转储所有对象的校验和
--data-checksums 转储表与数据的校验和
--schema-checksums 转储模式表和视图创建校验和
--routine-checksums 转储触发器、函数和例程的校验和
对象选项
--no-schemas -M 不备份表结构,(数据和触发器)
--all-tablespaces -Y 备份所有表空间
--no-data -d 不备份表的数据
--triggers -G 备份触发器,默认情况下不备份
--events -E 备份事件,默认情况下不备份
--routines -R 备份存储过程和函数,默认情况下不备份
--skip-constraints 从CREATE TABLE语句中删除约束。默认情况下,不修改该语句
--skip-indexes 从CREATE TABLE语句中删除索引。默认情况下,不修改该语句
--views-as-tables 将视图作为表导出
--no-views -W 不备份视图
Statement选项
--load-data 不创建 INSERT INTO 语句,而是创建 LOAD DATA 语句和 .dat 文件
--csv 自动启用--load-data 并设置变量以 CSV 格式导出
--include-header 添加列名到头部
--fields-terminated-by 定义分割字段的字符
--fields-enclosed-by 定义包围字段的字符。 默认: "
--fields-escaped-by 转义字符,默认: ''
--lines-starting-by 在每行的开头添加字符串。 使用 --load-data 时,它会添加到 LOAD DATA 语句中。 当使用它时,它也会影响 INSERT INTO 语句。
--lines-terminated-by 在每行末尾添加字符串。 当使用 --load-data 时,它被添加到 LOAD DATA 语句中。 当使用它时,它也会影响 INSERT INTO 语句。
--statement-terminated-by 这可能永远不会被使用,除非你知道你在做什么
--insert-ignore -N 使用 INSERT IGNORE 备份行
--REPLACE 用 REPLACE 替换备份行
--complete-insert 使用包含列名的完整 INSERT 语句
--hex-blob 使用十六进制表示法转储二进制列
--skip-definer 从 CREATE 语句中删除 DEFINER。 默认情况下,语句不被修改
--statement-size -S 尝试的 INSERT 语句大小(以字节为单位),默认 1000000
--tz-utc SET TIME_ZONE '+00:00' 在转储顶部,允许在服务器具有不同时区的数据或数据在不同时区的服务器之间移动时转储 TIMESTAMP 数据,默认为使用 - -skip-tz-utc 禁用。
--skip-tz-utc 禁用--tz-utc
--set-NAMES 设置名称,使用它需要您自担风险,默认二进制文件
Extra选项
--chunk-filesize -F 将数据文件分割成以 MB 为单位的多个块
--exit-IF-broken-TABLE-found 如果发现损坏的表则退出
--success-on-1146 如果表不存在,则不增加错误计数并发出警告而不是错误
--build-empty-FILES -E 即使表中没有可用数据也构建转储文件
--no-check-generated-fields 与生成字段相关的查询不会被执行。如果您生成了列,则会导致恢复问题
--order-by-primary 如果不存在主键,则按主键或唯一键对数据进行排序
--compact 提供较少的详细输出。禁用页眉/页脚构造
--compress -c 使用 /usr/bin/gzip 和 /usr/bin/zstd 压缩输出文件。 选项:GZIP 和 ZSTD。 默认值:GZIP
--use-defer 使用延迟整数分片,直到处理完所有非整数主键表(为大量表保存RSS)
--check-ROW-COUNT 如果导出的行数与select count(*)不一致,则导出失败
Daemon选项
--daemon -d 后台运行
--snapshot-interval -i 每个转储快照之间的间隔(以分钟为单位),需要 --daemon,默认 60
--snapshot-COUNT -X 快照数量,默认2
Application选项
--help -? 显示帮助选项
--outputdir -o 输出文件的目录
--clear 导出前清理输出目录
--dirty 覆盖输出目录而不清除(注意左下块)
--stream 一旦文件被写入,它将通过 STDOUT 流式传输。 自 v0.12.7-1 起,接受 NO_DELETE、NO_STREAM_AND_NO_DELETE 和 TRADITIONAL(默认值),如果未给出参数则使用
--logfile -l 要使用的日志文件名,默认情况下使用 stdout
--disk-limits 如果确定没有足够的磁盘空间,则设置暂停和恢复的限制。接受类似以下值:':'(以 MB 为单位)。例如:100:500 将在只有 100MB剩余时暂停,如果有 500MB可用则恢复
--threads -T 要使用的线程数,默认 4
--version -V 显示程序版本并退出
--verbose -V 输出的详细程度,0 silent, 1 errors, 2 warnings, 3 info, default 2
--debug 打开调试输出(自动将verbosity设置为3)
--defaults-file 使用特定的默认文件。 默认值:/etc/mydumper.cnf
--defaults-extra-file 使用额外的默认文件。 这是在 --defaults-file 之后加载的,替换以前定义的值
--fifodir 需要时将在其中创建 FIFO 文件的目录。 默认值:与备份相同
2.myloader参数
参数 简写 描述
连接参数
--host -h 连接的MySQL数据库服务器
--user -u 连接数据库的用户
--password -p 连接数据库用户的密码
--ask-password -a 提示输入用户的密码
--port -p MySQL数据库端口
--socket -S 用于连接的 UNIX 域套接字文件
--protocol 用于连接的协议(tcp、socket)
--compress-protocol -C 对 MySQL 连接使用压缩
--ssl 使用 SSL 连接
--ssl-MODE 连接到服务器所需的安全状态:DISABLED、PREFERRED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY
--key 密钥文件的路径名
--cert 证书文件的路径名
--ca 证书颁发机构文件的路径名
--capath 包含 PEM 格式的受信任 SSL CA 证书的目录的路径名
--cipher 用于 SSL 加密的允许密码列表
--tls-version 服务器允许哪些协议进行加密连接
过滤选项
--regex -X db.table' 匹配的正则表达式
--source-DB -S 要还原的数据库,-s db1 -B db2,表示源库中的db1数据库,导入到db2数据库中。
--skip-triggers 不导入触发器,默认导入
--skip-post 不导入事件、存储过程和函数,默认都导入
--skip-constraints 不导入约束,默认导入
--skip-indexes 不导入innodb表的二级索引,默认导入
--no-data 不导入表数据
--omit-from-file -O 包含要跳过的数据库.表条目列表的文件,每行一个(在应用正则表达式选项之前跳过)
--tables-list -T 要备份的表列表,以逗号分隔(不排除正则表达式选项)。 表名必须包含数据库名。 例如:test.t1,test.t2
PMM选项
--pmm-path 默认值为 /usr/local/percona/pmm2/collectors/textfile-collector/high-resolution
--pmm-resolution 默认值较高
Execution选项
--enable-binlog -E 启用恢复数据的二进制日志记录
--innodb-optimize-keys 创建不包含索引的表,并在末尾添加索引。选项:AFTER_IMPORT_PER_TABLE和AFTER_IMPORT_ALL_TABLES。默认值:AFTER_IMPORT_PER_TABLE
--no-schema 不导入表结构和触发器
--purge-MODE 这指定了截断模式,可以是:FAIL、NONE、DROP、truncate和DELETE。未设置默认值:FAIL
--disable-redo-LOG 禁用REDO_LOG并在之后启用它,不检查初始状态
--checksum 校验和:skip, fail, warn(默认)。
--overwrite-tables -O 如果表存在则删除表
--overwrite-unsafe 与--overwrite-tables相同,但尽量快速数据加载。可能导致外键的InnoDB死锁
--retry-COUNT 锁等待超时超过重试计数,默认为10(当前仅适用于DROP TABLE)
--serialized-TABLE-creation 表的重新创建将以串行方式执行,每次执行一个线程。这意味着架构创建的最大线程数=1。此选项将在以后的版本中删除
--stream 它将从STDIN接收流,并在开始处理之前在磁盘中创建文件。自v0.12.7-1起,接受NO_DELETE、NO_STREAM_AND_NO_DELETE和TRADICTIONAL(这是默认值,在未给定参数的情况下使用)
Threads选项
--MAX-threads-per-TABLE 每张表要使用的最大线程数,默认为--threads
--MAX-threads-FOR-INDEX-creation 用于创建索引的最大线程数,默认为4
--MAX-threads-FOR-post-actions 操作后的最大线程数,如:约束、过程、视图和触发器,默认为1
--MAX-threads-FOR-schema-creation 用于创建schema的最大线程数。当它设置为1时,与序列化表创建相同,默认为4
--exec-per-thread 设置STDIN将从输入文件接收的命令,并写入STDOUT
--exec-per-thread-extension 当使用--exec-per-thread时,设置输入文件扩展名。否则将被忽略
Statement选项
--ROWS -r 将INSERT语句拆分成多行
--queries-per-transaction -q 每个事务的查询数,默认为1000
--append-IF-NOT-exist 将IF NOT EXISTS追加到创建表语句中。当https://bugs.mysql.com/bug.php?id=103791已实施
--set-NAMES 设置名称,使用风险自负,默认二进制
--skip-definer 从CREATE语句中删除DEFINER。默认情况下,不修改语句
Application选项
--help -? 帮助选项
--directory -d 导入的目录
--logfile -l 要使用的日志文件名,默认情况下使用stdout
--database -B 要恢复到的备用数据库
--quote-character -q INSERT语句中使用的标识符引号字符,可以是`或者",默认从导出的文件中读取
--resume 期望在备份目录中找到恢复文件,并且只处理这些文件
--threads -T 要使用的线程数,默认 4
--version -V 显示程序版本并退出
--verbose -V 输出的详细程度,0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
--debug 打开调试输出(自动将verbosity设置为3)
--defaults-file 使用特定的默认文件。 默认值:/etc/mydumper.cnf
--defaults-extra-file 使用额外的默认文件。 这是在 --defaults-file 之后加载的,替换以前定义的值
--fifodir 需要时将在其中创建 FIFO 文件的目录。 默认值:与备份相同

本文结束!

2026.6.24第2次修订

参考博文: https://blog.csdn.net/zj88189748/article/details/138485472