暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

4.5.6 mysqlpump-数据库备份程序

原创 由迪 2020-11-25
1074

所述mysqlpump客户实用程序执行 逻辑备份,产生一组能够被执行以再现原始数据库对象定义和表数据的SQL语句。它转储一个或多个MySQL数据库以进行备份或转移到另一台SQL服务器。

小费

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

mysqlpump功能包括:

  • 并行处理数据库以及数据库中的对象,以加快转储过程
  • 更好地控制要转储的数据库和数据库对象(表,存储的程序,用户帐户)
  • 的用户帐户倾倒作为帐户管理语句(CREATE USERGRANT),而不是作为到刀片mysql系统数据库
  • 创建压缩输出的能力
  • 进度指示器(值是估计值)
  • 对于转储文件重新加载,InnoDB通过在插入行后添加索引,可以更快地为表 创建二级索引

注意

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

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

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

注意

在Windows上使用PowerShell通过输出重定向创建的转储将创建具有UTF-16编码的文件:

shell> mysqlpump [options] > dump.sql

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

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

mysqlpump调用语法

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

shell> mysqlpump --all-databases

要转储单个数据库或该数据库中的某些表,请在命令行上命名该数据库,还可以选择后面加上表名:

shell> mysqlpump db_name
shell> mysqlpump db_name tbl_name1 tbl_name2 ...

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

shell> mysqlpump --databases db_name1 db_name2 ...

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

shell> mysqlpump --exclude-databases=% --users

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

mysqlpump支持几个选项,包括或不包括数据库,表,存储的程序和用户定义。参见mysqlpump对象选择

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

shell> mysqlpump [options] > dump.sql
shell> 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选项

选项名称 描述 介绍了 不推荐使用
–add-drop-database 在每个CREATE DATABASE语句之前添加DROP DATABASE语句
–add-drop-table 在每个CREATE TABLE语句之前添加DROP TABLE语句
–add-drop-user 在每个CREATE USER语句之前添加DROP USER语句
–add-locks 用LOCK TABLES和UNLOCK TABLES语句包围每个表转储
-所有数据库 转储所有数据库
–bind-address 使用指定的网络接口连接到MySQL Server
–character-sets-dir 字符集的安装目录
–column-statistics 编写ANALYZE TABLE语句以生成统计数据直方图
-完全插入 使用包含列名的完整INSERT语句
- 压缩 压缩客户端和服务器之间发送的所有信息 8.0.18
–compress-输出 输出压缩算法
-压缩算法 用于服务器连接的允许压缩算法 8.0.18
-数据库 将所有名称参数解释为数据库名称
-调试 编写调试日志
-调试检查 程序退出时打印调试信息
- 调试信息 程序退出时打印调试信息,内存和CPU统计信息
–default-auth 身份验证插件使用
–default-character-set 指定默认字符集
-默认并行度 并行处理的默认线程数
–defaults-extra-file 除常规选项文件外,还读取命名的选项文件
–defaults-file 只读命名的选项文件
–defaults-group-suffix 选项组后缀值
–defer-table-indexes 对于重新加载,将索引创建推迟到加载表行之后
-事件 从转储的数据库中转储事件
–exclude-databases 从转储中排除的数据库
-排除事件 从转储中排除的事件
–exclude-routines 从转储中排除的例程
–exclude-tables 从转储中排除的表
-排除触发 触发从转储中排除
–exclude-users 从转储中排除的用户
–extended-insert 使用多行INSERT语法
–get-server-public-key 从服务器请求RSA公钥
- 救命 显示帮助信息并退出
–hex-blob 使用十六进制表示法转储二进制列
- 主办 MySQL服务器所在的主机
–include-databases 转储中包含的数据库
–include-events 转储中包含的事件
–include例程 转储中包含的例程
–include-tables 转储中包含的表
–include-triggers 触发包含在转储中
–include-users 要包含在转储中的用户
–insert-ignore 编写INSERT IGNORE而不是INSERT语句
–log-错误文件 将警告和错误附加到命名文件
-登录路径 从.mylogin.cnf中读取登录路径选项
–max-allowed-packet 发送到服务器或从服务器接收的最大数据包长度
–net-buffer-length TCP / IP和套接字通信的缓冲区大小
–no-create-db 不要写CREATE DATABASE语句
–no-create-info 不要编写重新创建每个转储表的CREATE TABLE语句
-无默认值 不读取选项文件
-平行方案 指定模式处理并行性
- 密码 连接服务器时使用的密码
–plugin-dir 安装插件的目录
- 港口 用于连接的TCP / IP端口号
–print-defaults 打印默认选项
- 协议 使用的传输协议
- 更换 编写REPLACE语句而不是INSERT语句
-结果文件 直接输出到给定文件
-例程 从转储的数据库中转储存储的例程(过程和函数)
–server-public-key-path 包含RSA公钥的文件的路径名
–set字符集 将SET NAMES default_character_set添加到输出
–set-gtid-purged 是否将SET @@ GLOBAL.GTID_PURGED添加到输出
-单笔交易 在单个事务中转储表
–skip-definer 从视图和存储的程序CREATE语句中忽略DEFINER和SQL SECURITY子句
–skip-dump-rows 不要转储表行
- 插座 Unix套接字文件或Windows命名管道使用
–ssl-ca 包含受信任的SSL证书颁发机构列表的文件
–ssl-capath 包含受信任的SSL证书颁发机构证书文件的目录
–ssl-cert 包含X.509证书的文件
–ssl-cipher 连接加密的允许密码
–ssl-crl 包含证书吊销列表的文件
–ssl-crlpath 包含证书吊销列表文件的目录
–ssl-fips-mode 是否在客户端启用FIPS模式
–ssl键 包含X.509密钥的文件
–ssl模式 与服务器连接的所需安全状态
–tls-ciphersuites 允许的TLSv1.3密码套件用于加密连接 8.0.16
–tls-version 允许的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中有某些例外 )。
  • 如果在没有排除选项的情况下给出了包含选项,则仅转储名为“ included”的对象。
  • 如果在没有包含选项的情况下给出了排除选项,则所有对象都将被转储,除非命名为被排除的对象。
  • 如果给出了包含和排除选项,则不会转储所有名为“排除”和未命名为“包括”的对象。所有其他对象将被转储。

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

shell> 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是逗号分隔的数据库名称的列表。如果option参数以开头 *N*:,则队列使用N*线程。否则,该 --default-parallelism 选项确定队列线程的数量。

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

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

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

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

启用并行性后,可以对来自不同数据库的输出进行交织。例如, INSERT可以对并行转储的多个表中的语句进行交织;声明未按任何特定顺序编写。这不会影响重新加载,因为输出语句使用数据库名称来限定对象名称,或者在USE需要时以语句开头 。

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

例子:

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

mysqlpump建立一个队列过程 db1db2另一个排队的过程db3,和默认队列来处理所有其他数据库。所有队列使用两个线程。

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

除了所有队列都使用四个线程之外,这与前面的示例相同。

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

队列db1db2 使用五个线程,队列db3使用3个线程,默认队列使用两个线程的默认。

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

mysqlpump限制

mysqlpump不转储 performance_schemandbinfosys默认模式。要转储任何这些,请在命令行上明确命名它们。您也可以使用--databases--include-databases选项为它们命名 。

mysqlpump不会转储 INFORMATION_SCHEMA模式。

mysqlpump不转储 InnoDB CREATE TABLESPACE语句。

mysqlpump使用CREATE USERGRANT语句以逻辑形式转储用户帐户(例如,当您使用 --include-usersor --users选项时)。出于这个原因,转储mysql系统数据库默认情况下不包括含有用户定义的授权表:userdbtables_privcolumns_privprocs_priv,或 proxies_priv。要转储任何授权表,请先命名mysql数据库,再命名表名:

shell> mysqlpump mysql user db ...
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论