Documentation Home
MySQL 8.0 参考手册  / 第 4 章 MySQL 程序  / 4.5 客户端程序  /  4.5.6 mysqlpump——数据库备份程序

4.5.6 mysqlpump——数据库备份程序

mysqlpump客户端实用程序执行 逻辑备份,生成一组可执行的 SQL 语句以重现原始数据库对象定义和表数据它转储一个或多个 MySQL 数据库以进行备份或传输到另一台 SQL 服务器。

小费

考虑使用MySQL Shell 转储实用程序,它提供多线程并行转储、文件压缩和进度信息显示,以及 Oracle Cloud Infrastructure 对象存储流和 MySQL 数据库服务兼容性检查和修改等云功能。使用MySQL Shell 负载转储实用程序可以轻松地将转储导入 MySQL 服务器实例或 MySQL 数据库服务数据库系统。可以在此处找到 MySQL Shell 的安装说明。

mysqlpump功能包括:

  • 并行处理数据库和数据库中的对象,以加速转储过程

  • 更好地控制转储哪些数据库和数据库对象(表、存储程序、用户帐户)

  • 将用户帐户转储为帐户管理语句 ( CREATE USER, GRANT) 而不是插入到mysql系统数据库 中

  • 创建压缩输出的能力

  • 进度指示器(值是估计值)

  • InnoDB对于转储文件重新加载,通过在插入行后添加索引 来更快地为表创建二级索引

笔记

mysqlpump使用 MySQL 5.7 中引入的 MySQL 功能,因此假定使用 MySQL 5.7 或更高版本。

mysqlpump至少需要 SELECT转储表、SHOW VIEW转储视图、TRIGGER转储触发器以及未使用LOCK TABLES该 转储用户定义需要系统数据库--single-transactionSELECT权限mysql某些选项可能需要其他权限,如选项说明中所述。

要重新加载转储文件,您必须具有执行它包含的语句所需的权限,例如对 CREATE这些语句创建的对象的适当权限。

笔记

在 Windows 上使用 PowerShell 进行输出重定向的转储创建了一个具有 UTF-16 编码的文件:

mysqlpump [options] > dump.sql

但是,不允许将 UTF-16 作为连接字符集(请参阅第 10.4 节,“连接字符集和排序规则”),因此无法正确加载转储文件。要解决此问题,请使用 --result-file以 ASCII 格式创建输出的选项:

mysqlpump [options] --result-file=dump.sql

mysqlpump 调用语法

默认情况下,mysqlpump转储所有数据库( mysqlpump 限制中指出的某些例外)。要明确指定此行为,请使用以下 --all-databases选项:

mysqlpump --all-databases

要转储单个数据库或该数据库中的某些表,请在命令行上命名数据库,可选地后跟表名:

mysqlpump db_name
mysqlpump db_name tbl_name1 tbl_name2 ...

要将所有名称参数视为数据库名称,请使用以下 --databases选项:

mysqlpump --databases db_name1 db_name2 ...

默认情况下,mysqlpump不会转储用户帐户定义,即使转储 mysql包含授权表的系统数据库也是如此。CREATE USER要以and GRANT语句 的形式将授权表内容转储为逻辑定义,请使用该--users选项并禁止所有数据库转储:

mysqlpump --exclude-databases=% --users

在前面的命令中,%是一个匹配该 --exclude-databases选项的所有数据库名称的通配符。

mysqlpump支持多个用于包含或排除数据库、表、存储程序和用户定义的选项。请参阅mysqlpump 对象选择

要重新加载转储文件,请执行它包含的语句。例如使用mysql客户端:

mysqlpump [options] > dump.sql
mysql < dump.sql

以下讨论提供了额外的 mysqlpump用法示例。

要查看mysqlpump 支持的选项列表,请发出命令mysqlpump --help

mysqlpump 选项总结

mysqlpump支持以下选项,可以在命令行或 选项文件的组中指定[mysqlpump][client](在 MySQL 8.0.20 之前, mysqlpump读取 [mysql_dump]组而不是 [mysqlpump]。截至 8.0.20, [mysql_dump]仍然被接受但已弃用。)有关 MySQL 程序使用的选项文件的信息,请参阅第 4.2.2.2 节,“使用选项文件”.

表 4.16 mysqlpump 选项

选项名称 描述 介绍 弃用
--添加删除数据库 在每个 CREATE DATABASE 语句之前添加 DROP DATABASE 语句
--添加删除表 在每个 CREATE TABLE 语句之前添加 DROP TABLE 语句
--添加删除用户 在每个 CREATE USER 语句之前添加 DROP USER 语句
--添加锁 用 LOCK TABLES 和 UNLOCK TABLES 语句围绕每个表转储
--所有数据库 转储所有数据库
--绑定地址 使用指定的网络接口连接到 MySQL 服务器
--字符集目录 安装字符集的目录
--列统计 编写 ANALYZE TABLE 语句以生成统计直方图
--complete-插入 使用包含列名的完整 INSERT 语句
- 压缩 压缩客户端和服务器之间发送的所有信息 8.0.18
--压缩输出 输出压缩算法
--压缩算法 允许的服务器连接压缩算法 8.0.18
--数据库 将所有名称参数解释为数据库名称
--调试 写调试日志
--调试检查 程序退出时打印调试信息
- 调试信息 程序退出时打印调试信息、内存和 CPU 统计信息
--default-auth 要使用的身份验证插件
--默认字符集 指定默认字符集
--默认并行 并行处理的默认线程数
--defaults-extra-file 除了通常的选项文件外,还读取命名的选项文件
--defaults-文件 只读命名选项文件
--defaults-group-suffix 选项组后缀值
--defer-table-indexes 对于重新加载,将索引创建推迟到加载表行之后
--事件 从转储数据库中转储事件
--exclude-数据库 要从转储中排除的数据库
--排除事件 要从转储中排除的事件
--exclude-routines 从转储中排除的例程
--排除表 从转储中排除的表
--exclude-触发器 从转储中排除的触发器
--exclude-用户 要从转储中排除的用户
--扩展插入 使用多行 INSERT 语法
--get-server-public-key 从服务器请求 RSA 公钥
- 帮助 显示帮助信息并退出
--hex-blob 使用十六进制表示法转储二进制列
- 主持人 MySQL 服务器所在的主机
--include-数据库 要包含在转储中的数据库
--include-事件 要包含在转储中的事件
--include-routines 包含在转储中的例程
--include-tables 要包含在转储中的表
--include-触发器 要包含在转储中的触发器
--include-用户 要包含在转储中的用户
--插入忽略 编写 INSERT IGNORE 而不是 INSERT 语句
--日志错误文件 将警告和错误附加到命名文件
--登录路径 从 .mylogin.cnf 读取登录路径选项
--最大允许数据包 发送到服务器或从服务器接收的最大数据包长度
--net-buffer-length TCP/IP 和套接字通信的缓冲区大小
--no-create-db 不要编写 CREATE DATABASE 语句
--no-create-info 不要编写重新创建每个转储表的 CREATE TABLE 语句
--no-defaults 不读取选项文件
--parallel-schemas 指定模式处理并行性
- 密码 连接到服务器时使用的密码
--密码1 连接到服务器时使用的第一个多因素身份验证密码 8.0.27
--密码2 连接到服务器时使用的第二个多因素身份验证密码 8.0.27
--密码3 连接到服务器时使用的第三个多重身份验证密码 8.0.27
--插件目录 安装插件的目录
- 港口 用于连接的 TCP/IP 端口号
--print-defaults 打印默认选项
- 协议 使用的传输协议
- 代替 编写 REPLACE 语句而不是 INSERT 语句
--结果文件 直接输出到给定文件
--例程 从转储的数据库中转储存储的例程(过程和函数)
--server-public-key-path 包含 RSA 公钥的文件的路径名
--set-字符集 将 SET NAMES default_character_set 添加到输出
--set-gtid-清除 是否在输出中添加 SET @@GLOBAL.GTID_PURGED
--单笔交易 在单个事务中转储表
--skip-定义器 从视图和存储程序 CREATE 语句中省略 DEFINER 和 SQL SECURITY 子句
--skip-dump-rows 不要转储表行
--skip-generated-invisible-primary-key 不要转储有关生成的不可见主键的信息 8.0.30
- 插座 要使用的 Unix 套接字文件或 Windows 命名管道
--ssl-ca 包含可信 SSL 证书颁发机构列表的文件
--ssl-capath 包含受信任的 SSL 证书颁发机构证书文件的目录
--ssl证书 包含 X.509 证书的文件
--ssl密码 连接加密的允许密码
--ssl-crl 包含证书吊销列表的文件
--ssl-crlpath 包含证书吊销列表文件的目录
--ssl-fips-模式 客户端是否开启FIPS模式
--ssl-密钥 包含 X.509 密钥的文件
--ssl模式 连接到服务器的所需安全状态
--ssl 会话数据 包含 SSL 会话数据的文件 8.0.29
--ssl-session-data-continue-on-failed-reuse session重用失败是否建立连接 8.0.29
--tls-密码套件 用于加密连接的允许的 TLSv1.3 密码套件 8.0.16
--tls-版本 加密连接允许的 TLS 协议
--触发器 每个转储表的转储触发器
--tz-utc 将 SET TIME_ZONE='+00:00' 添加到转储文件
- 用户 连接到服务器时使用的 MySQL 用户名
--用户 转储用户帐户
- 版本 显示版本信息并退出
--watch-progress 显示进度指示器
--zstd-压缩级别 使用 zstd 压缩的服务器连接的压缩级别 8.0.18

mysqlpump 选项说明

mysqlpump 对象选择

mysqlpump有一组包含和排除选项,可以过滤多种对象类型并提供对要转储的对象的灵活控制:

可以多次给出任何包含或排除选项。效果是叠加的。这些选项的顺序无关紧要。

每个包含和排除选项的值是适当对象类型的逗号分隔名称列表。例如:

--exclude-databases=test,world
--include-tables=customer,invoice

对象名称中允许使用通配符:

  • %匹配零个或多个字符的任何序列。

  • _匹配任何单个字符。

例如, --include-tables=t%,__tmp 匹配所有以 开头的表名t和所有以 . 结尾的五个字符的表名 tmp

对于用户,没有主机部分的指定名称被解释为隐含主机%. 例如, u1u1@%是等价的。这与通常在 MySQL 中应用的相同(请参阅第 6.2.4 节,“指定帐户名称”)。

包含和排除选项相互作用如下:

  • 默认情况下,没有包含或排除选项, mysqlpump转储所有数据库( mysqlpump Restrictions中注明的某些例外情况)。

  • 如果在没有排除选项的情况下给出包含选项,则仅转储命名为包含的对象。

  • 如果在没有包含选项的情况下给出了排除选项,则所有对象都将被转储,除了那些命名为排除的对象。

  • 如果给出了包含和排除选项,则不会转储所有命名为排除的和未命名为包含的对象。所有其他对象都被转储。

如果正在转储多个数据库,则可以通过使用数据库名称限定对象名称来命名特定数据库中的表、触发器和例程。以下命令转储数据库db1db2,但不包括表 db1.t1db2.t2

mysqlpump --include-databases=db1,db2 --exclude-tables=db1.t1,db2.t2

以下选项提供了指定要转储的数据库的替代方法:

mysqlpump 并行处理

mysqlpump可以利用并行性来实现并发处理。您可以选择数据库之间的并发(同时转储多个数据库)和数据库内的并发(同时从给定数据库转储多个对象)。

默认情况下,mysqlpump设置一个队列和两个线程。您可以创建额外的队列并控制分配给每个队列的线程数,包括默认队列:

  • --default-parallelism=N 指定用于每个队列的默认线程数。如果没有此选项,N 则为 2。

    默认队列始终使用默认线程数。除非您另外指定,否则附加队列使用默认线程数。

  • --parallel-schemas=[N:]db_list 设置一个处理队列以转储命名的数据库,db_list并可选择指定队列使用的线程数。 db_list是以逗号分隔的数据库名称列表。如果选项参数以 开头 N:,则队列使用N线程。否则,该 --default-parallelism 选项确定队列线程数。

    该选项的多个实例 --parallel-schemas创建多个队列。

    数据库列表中的名称允许包含 过滤选项支持的相同字符 %和通配符(请参阅mysqlpump 对象选择)。 _

mysqlpump使用默认队列来处理任何未使用 --parallel-schemas选项明确命名的数据库,并在命令选项选择它们时转储用户定义。

通常,对于多个队列,mysqlpump 使用队列处理的数据库集之间的并行性来同时转储多个数据库。对于使用多线程的队列,mysqlpump在数据库中使用并行机制,同时从给定数据库中转储多个对象。可能会发生异常;例如,mysqlpump在从服务器获取数据库中的对象列表时可能会阻塞队列。

启用并行性后,可以交错来自不同数据库的输出。例如, INSERT并行转储的多个表中的语句可以交错;这些陈述没有按任何特定顺序书写。这不会影响重新加载,因为输出语句使用数据库名称限定对象名称或 USE根据需要在语句之前。

并行性的粒度是单个数据库对象。例如,无法使用多个线程并行转储单个表。

例子:

mysqlpump --parallel-schemas=db1,db2 --parallel-schemas=db3

mysqlpump设置一个队列来处理 db1db2,另一个队列来处理db3,以及一个默认队列来处理所有其他数据库。所有队列都使用两个线程。

mysqlpump --parallel-schemas=db1,db2 --parallel-schemas=db3
          --default-parallelism=4

这与前面的示例相同,只是所有队列都使用四个线程。

mysqlpump --parallel-schemas=5:db1,db2 --parallel-schemas=3:db3

db1和 的队列db2 使用5个线程,for的队列db3使用3个线程,default队列默认使用2个线程。

作为一种特殊情况,无论有 --default-parallelism=0没有 --parallel-schemas选项, mysqlpump作为单线程进程运行并且不创建队列。

mysqlpump 限制

默认情况下, mysqlpump不会转储 performance_schemandbinfosys模式。要转储其中任何一个,请在命令行上明确命名它们。您也可以使用 --databases--include-databases选项命名它们。

mysqlpump不转储 INFORMATION_SCHEMA模式。

mysqlpump不转储 InnoDB CREATE TABLESPACE语句。

mysqlpumpCREATE USER使用and 以逻辑形式转储用户帐户GRANT(例如,当您使用 --include-usersor --users选项时)。出于这个原因,系统数据库的转储在默认情况 mysql下不包括包含用户定义的授权表: 、、、、、、或 。要转储任何授权表,请在数据库后跟表名命名: userdbtables_privcolumns_privprocs_privproxies_privmysql

mysqlpump mysql user db ...