Mysqlpump - 数据库备份程序
mysqlpump 客户端实用程序执行逻辑备份,生成一组可以执行以恢复原始数据库对象定义和表数据的SQL语句。它将一个或多个MySQL数据库转储为备份或传输到另一个SQL服务器。
注意
从MySQL 8.0.34开始,mysqlpump已被弃用;预计在未来的MySQL版本中将其移除。您可以使用这些MySQL程序作为mysqldump和MySQL Shell来执行逻辑备份、转储数据库和类似任务。
提示
考虑使用MySQL Shell转储实用程序,它提供多线程转储、文件压缩和进度信息显示功能,以及诸如Oracle Cloud Infrastructure Object Storage流式传输和MySQL HeatWave Service兼容性检查和修改等功能。可以使用MySQL Shell加载转储实用程序将转储轻松导入到MySQL Server实例或MySQL HeatWave Service DB System中。
mysqlpump功能包括:
- 数据库和数据库内对象的并行处理,以加速转储过程
- 更好地控制要转储哪些数据库和数据库对象(表、存储程序、用户帐户)
- 将用户帐户转储为帐户管理语句(CREATE USER、GRANT),而不是插入到mysql系统数据库中
- 创建压缩输出的功能
- 进度指示器(值是估计值)
- 对于InnoDB表的行插入后更快的次级索引创建,用于重新加载转储文件
注意
mysqlpump使用自MySQL 5.7引入的MySQL功能,因此假定与MySQL 5.7或更高版本一起使用。
mysqlpump需要至少对转储表的SELECT权限、对转储视图的SHOW VIEW权限、对转储触发器的TRIGGER权限,以及如果未使用–single-transaction选项,则还需要LOCK TABLES权限。对mysql系统数据库的SELECT权限是转储用户定义所需的。某些选项可能需要其他权限,如选项描述中所指出的。
要重新加载转储文件,您必须具有执行其中包含的语句所需的权限,例如为由这些语句创建的对象提供的适当的CREATE权限。
注意
在Windows上使用PowerShell通过输出重定向创建的文件具有UTF-16编码:
mysqlpump [options] > dump.sql然而,UTF-16不是允许作为连接字符集的,因此转储文件无法正确加载。要解决此问题,请使用–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和GRANT语句的形式转储授权表内容,请使用–users选项并抑制所有数据库转储:
mysqlpump --exclude-databases=% --users
mysqlpump 对象选择
mysqlpump 具有一组包含和排除选项,这些选项可以过滤几种对象类型并提供对要转储的对象的灵活控制:
- –include-databases 和 –exclude-databases 适用于数据库及其内部的所有对象。
- –include-tables 和 –exclude-tables 适用于表。这些选项还影响与表关联的触发器,除非给定了触发器特定的选项。
- –include-triggers 和 –exclude-triggers 适用于触发器。
- –include-routines 和 –exclude-routines 适用于存储过程和函数。如果存储过程选项与存储过程名称匹配,它还会匹配同名的相同类型的存储函数。
- –include-events 和 –exclude-events 适用于 Event Scheduler 事件。
- –include-users 和 –exclude-users 适用于用户帐户。
任何包含或排除选项都可以多次给出。效果是累加的。这些选项的顺序无关紧要。
每个包含和排除选项的值都是逗号分隔的适当对象类型的名称列表。例如:
--exclude-databases=test,world --include-tables=customer,invoice
允许在对象名称中使用通配符字符:
- % 匹配零个或多个字符的任何序列。
- _ 匹配单个字符。
例如,–include-tables=t%,__tmp 匹配所有以 t 开头的表名以及所有五个字符的表名以 tmp 结尾的表名。
对于用户,未指定主机部分的名称将与隐含的 % 主机进行解释。例如,u1 和 u1@% 是等效的。这与 MySQL 中的一般规则相同。
包含和排除选项的作用如下:
- 默认情况下,没有包含或排除选项,mysqlpump 转储所有数据库(请注意 mysqlpump Restrictions 中的例外情况)。
- 如果没有排除选项而给定包含选项,则只转储命名为包含的对象。
- 如果没有包含选项而给定排除选项,则转储除命名为排除的对象之外的所有对象。
- 如果给定了包含和排除选项,则不转储命名为排除且未命名为包含的对象。所有其他对象都将被转储。
如果要转储多个数据库,可以通过在对象名称中限定数据库名称来指定特定数据库中的表、触发器和存储过程。以下命令转储 db1 和 db2 数据库,但排除 db1.t1 和 db2.t2 表:
mysqlpump --include-databases=db1,db2 --exclude-tables=db1.t1,db2.t2
以下选项提供了另一种指定要转储哪些数据库的方法:
- –all-databases 选项转储所有数据库(请注意 mysqlpump Restrictions 中的例外情况)。这相当于完全不指定对象选项(mysqlpump 的默认操作是转储所有内容)。
- –include-databases=% 类似于 –all-databases,但选择要转储的所有数据库,即使它们是 –all-databases 的例外。
- –databases 选项使 mysqlpump 将所有名称参数视为要转储的数据库的名称。这与指定相同数据库的 –include-databases 选项等效。
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 设置一个处理 db1 和 db2 的队列,另一个处理 db3 的队列,以及一个默认队列处理所有其他数据库。所有队列使用两个线程。
mysqlpump --parallel-schemas=db1,db2 --parallel-schemas=db3 --default-parallelism=4
这与上一个示例相同,只是所有队列使用四个线程。
mysqlpump --parallel-schemas=5:db1,db2 --parallel-schemas=3:db3
db1 和 db2 的队列使用五个线程,db3 的队列使用三个线程,默认队列使用默认的两线程。
特殊情况下,如果 –default-parallelism=0 且没有 –parallel-schemas 选项,mysqlpump 作为单线程进程运行并创建没有队列。
mysqlpump 限制
mysqlpump 默认不转储 performance_schema、ndbinfo 或 sys schema。要转储这些中的任何一个,请在命令行上显式命名它们。您还可以使用 –databases 或 –include-databases 选项命名它们。
mysqlpump 不转储 INFORMATION_SCHEMA schema。
mysqlpump 不转储 InnoDB CREATE TABLESPACE 语句。
mysqlpump 使用 CREATE USER 和 GRANT 语句以逻辑形式转储用户帐户(例如,当您使用 –include-users 或 –users 选项时)。因此,mysql 系统数据库的转储默认不包括包含用户定义的授权表:user、db、tables_priv、columns_priv、procs_priv 或 proxies_priv。要转储任何授权表,请在 mysql 数据库后指定表名:
mysqlpump mysql user db ...