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 ...