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

朝花夕拾16章MySQL Shell 使用 MySQL Shell 连接

原创 由迪 2023-06-12
697

4.3 MySQL Shell 连接

MySQL Shell 可以使用 X 协议和经典 MySQL 协议连接到 MySQL 服务器。您可以通过以下方式指定 MySQL Shell 全局连接的 MySQL 服务器实例:

这些连接到 MySQL 服务器实例的方法创建了全局会话,这是一个可以在所有 MySQL Shell 执行模式中使用的连接:SQL 模式、JavaScript 模式和 Python 模式。名为的 MySQL Shell 全局对象 session表示此连接,变量session持有对它的引用。您还可以通过使用 shell.openSession()mysqlx.getSession()mysql.getSession()mysql.getClassicSession()功能。这些连接可以在您创建它们的模式下使用,并且一次可以将其中一个分配为 MySQL Shell 的全局会话,因此它可以在所有模式下使用。有关会话对象的说明、如何对全局会话进行操作以及如何从 MySQL Shell 实例创建和管理多个连接,请参阅第 4.2 节,“MySQL Shell 会话”

所有这些连接到 MySQL 服务器实例的不同方式都支持指定连接,如下所示:

  • 使用类似 URI 的字符串指定的参数使用诸如myuser@example.com:3306/main-schema. 有关完整语法,请参阅使用类似 URI 的连接字符串进行连接
  • 用键值对指定的参数使用诸如 {user:'myuser', host:'example.com', port:3306, schema:'main-schema'}. 这些键值对以语言自然结构的形式提供以供实现。例如,您可以使用键值对作为 JavaScript 中的 JSON 对象或 Python 中的字典来提供连接参数。有关完整语法,请参阅使用键值对进行连接

有关详细信息, 请参阅使用类似 URI 的字符串或键值对连接到服务器。

重要的

无论您选择如何连接,了解 MySQL Shell 如何处理密码都很重要。默认情况下假定连接需要密码。密码(最大长度为 128 个字符)在登录提示时被请求,并且可以使用第 4.4 节“可插入密码存储”进行存储。如果指定的用户有一个不安全且不推荐的无密码帐户,或者如果正在使用套接字对等凭据身份验证(例如,当使用 Unix 套接字连接时),则必须明确指定不提供密码并且密码提示是不需要。为此,请使用以下方法之一:

  • 如果您使用类似 URI 的连接字符串进行连接,请在字符串中:的 之后 放置一个user,但不要在其后指定密码。
  • 如果您使用键值对进行连接,请在键''后 使用提供一个空字符串password
  • 如果您使用单独的参数进行连接,请指定--no-password 选项,或指定 --password=带有空值的选项。

如果您没有为连接指定参数,则使用以下默认值:

  • user默认为当前系统用户名。
  • host默认为 localhost.
  • port使用 X 协议连接时默认为 X 插件端口 33060,使用经典 MySQL 协议连接时默认为端口 3306。

要配置连接超时,请使用 connect-timeout连接参数。的值connect-timeout必须是一个以毫秒为单位定义时间范围的非负整数。超时默认值为 10000 毫秒,即 10 秒。例如:

// Decrease the timeout to 2 seconds.
mysql-js> \connect user@example.com?connect-timeout=2000
// Increase the timeout to 20 seconds
mysql-js> \connect user@example.com?connect-timeout=20000

要禁用超时,请将 的值设置 connect-timeout为 0,这意味着客户端会等待底层套接字超时,这取决于平台。

当一台或多台服务器无法访问时,某些打开许多服务器连接的操作可能需要很长时间才能执行,例如命令shell.connect()。连接超时可能无法为响应提供足够的时间。

从 MySQL Shell 8.0.28 开始,您可以使用 MySQL Shell 配置选项connectTimeout为任何不使用 AdminAPI 的会话设置默认连接超时。

除了 TCP 连接,您还可以使用 Unix 套接字文件或 Windows 命名管道进行连接。有关说明,请参阅 第 4.3.3 节,“使用 Unix 套接字和 Windows 命名管道进行连接”

如果 MySQL 服务器实例支持加密连接,您可以启用和配置连接以使用加密。有关说明,请参阅 第 4.3.4 节,“使用加密连接”

从 MySQL Shell 8.0.27 开始,经典 MySQL 协议连接支持使用 LDAP 和 Kerberos 身份验证。有关使用它们的说明,请参阅 第 4.3.5 节,“使用 LDAP 和 Kerberos 身份验证”

从 MySQL Shell 8.0.28 开始,MySQL Shell 支持 SSH 隧道连接到 MySQL 服务器实例。有关说明,请参阅 第 4.3.6 节 “使用 SSH 隧道”

您还可以请求连接对 MySQL Shell 和 MySQL 服务器实例之间发送的所有数据使用压缩。有关说明,请参阅 第 4.3.7 节,“使用压缩连接”

如果与服务器的连接丢失,您可以使用该 \reconnect命令,它使 MySQL Shell 使用现有连接参数为当前全局会话尝试多次重新连接尝试。该 \reconnect命令的指定没有任何参数或选项。如果这些尝试不成功,您可以使用该\connect 命令并指定连接参数来建立新的连接。

4.3.1 使用个别参数连接

除了使用连接字符串指定连接参数外,还可以在启动 MySQL Shell 时为每个值使用单独的命令参数来定义连接数据。有关 MySQL Shell 命令选项的完整参考,请参阅第 A.1 节,“mysqlsh — MySQL Shell”

使用以下连接相关参数:

命令选项的行为类似于使用命令选项连接到 MySQL 服务器中描述的 用于mysql客户端的选项。

使用以下命令选项来控制是否以及如何为连接提供密码:

  • --password=*password* ( ) 和一个值提供用于连接的密码(最多 128 个字符)。对于长格式 ,您必须在选项及其值之间使用等号而不是空格。对于缩写形式,选项与其值之间不能有空格。如果在任何一种情况下都使用空格,则该值不会被解释为密码,而可能被解释为另一个连接参数。 -p*password*``--password=``-p

    在命令行上指定密码应该被认为是不安全的。请参阅 密码安全的最终用户指南。您可以使用选项文件来避免在命令行中提供密码。

  • --password没有值也没有等号,或-p没有值,请求密码提示。

  • --no-password,或 --password=具有空值,指定用户在没有密码的情况下连接。当连接到服务器时,如果用户有一个不安全且不推荐的无密码帐户,或者如果正在使用套接字对等凭据身份验证(对于 Unix 套接字连接),则必须使用这些方法之一来显式指定不提供密码,不需要密码提示。

  • --password1--password2--password3,可从 MySQL Shell 8.0.28 获得,是需要多重身份验证的帐户的密码。您最多可以提供三个密码。这些选项的工作方式与 --password 选项相同,–password1 被视为等同于该选项。这些选项可从 MySQL Shell 8.0.28 获得,它们仅支持使用命令行参数建立的经典 MySQL 协议连接。

当以多种方式指定参数时,例如同时使用选项--uri和指定单个参数(如 ) --user,以下规则适用:

  • 如果多次指定参数,则使用最后一次出现的值。

  • 如果指定了单独的连接参数和 --uri,则将 的值--uri作为基础,并且单独参数的值会覆盖基础 URI 字符串中的特定组件。

    *user*例如从类似 URI 的字符串 覆盖:

    $> mysqlsh --uri user@localhost:33065 --user otheruser
    

从 MySQL Shell 到服务器的连接可以加密,并且可以压缩,如果您请求这些功能并且服务器支持它们。有关建立加密连接的说明,请参阅 第 4.3.4 节,“使用加密连接”。有关建立压缩连接的说明,请参阅 第 4.3.7 节,“使用压缩连接”

以下示例显示如何使用命令参数指定连接。尝试在端口 33065 与指定用户建立 X 协议连接:

$> mysqlsh --mysqlx -u user -h localhost -P 33065

尝试与指定用户建立经典MySQL协议连接,请求对连接进行压缩:

$> mysqlsh --mysql -u user -h localhost -C

4.3.2 使用登录路径和选项文件连接

从 MySQL Shell 8.0.32 开始,支持 MySQL 登录路径和选项文件。命令行开头支持以下 MySQL 命令行选项:

MySQL Shell 读取 MySQL 配置文件中的一个部分, [mysqlsh]其中包含 MySQL Shell 命令行选项。

MySQL Shell 还读取[client]MySQL 配置文件的部分。

笔记

[client]`MySQL Shell 不支持 某些选项,例如`local-infile`,并且某些选项在两者中具有相同的名称,但取不同的值,例如`[client]`选项 [`--compress`](https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_compress)和 `[mysqlsh]`选项 。 `compress=*`value`*

MySQL Shell 为这些选项返回一个特定的错误,指定选项的名称和错误。

有关选项文件位置、Windows 和 Linux 平台上的优先顺序以及选项语法的信息,请参阅 使用选项文件。有关登录路径的信息,请参阅--login-path

例如,如果您在选项文件中定义了以下内容, c:\my.ini例如:

[mysqlsh] sql [client] host=localhost user=user1 port=3306 database=sakila

这些选项设置如下:

  • sql:默认MySQL Shell模式,SQL。
  • host=localhost: 将主机定义为本地主机。
  • user=user1:定义用户为user1。
  • port=3306:定义连接端口为3306。
  • database=sakila:将默认架构定义为 sakila。

在没有任何连接字符串的情况下运行mysqlsh

        > mysqlsh
        
        MySQL Shell 8.0.32-commercial
        
        Copyright (c) 2016, 2022, Oracle and/or its affiliates.
        Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
        Other names may be trademarks of their respective owners.
        
        Type '\help' or '\?' for help; '\quit' to exit.
        Creating a Classic session to 'root@localhost:3306/sakila'
        Fetching global names, object names from `sakila` for auto-completion... Press ^C to stop.
        Your MySQL connection id is 93
        Server version: 8.0.31-commercial MySQL Enterprise Server - Commercial
        Default schema set to `sakila`.
        localhost:3306 ssl  sakila  SQL >

笔记

在命令行上定义的选项会覆盖所有其他值。

MySQL Shell 的优先顺序:

  • 命令行参数
  • 登录路径
  • 选项文件
  • 持久化 Shell 选项

4.3.3 使用 Unix 套接字和 Windows 命名管道连接

在 Unix 上,满足以下条件时,MySQL Shell 连接默认使用 Unix 套接字:

  • 未指定 TCP 端口。
  • 未指定主机名或等于 localhost
  • --socketor 选项-S被指定,有或没有套接字文件的路径。

如果您指定--socket没有值和等号,或者-S没有值,则使用协议的默认 Unix 套接字文件。如果您指定一个替代 Unix 套接字文件的路径,则使用该套接字文件。

如果指定了主机名但未指定 localhost,则建立 TCP 连接。在这种情况下,如果未指定 TCP 端口,则使用默认值 3306。

在 Windows 上,对于使用经典 MySQL 协议的 MySQL Shell 连接,如果将主机名指定为句点 (.),则 MySQL Shell 使用命名管道进行连接。

  • 如果您使用类似 URI 的连接字符串进行连接,请指定user@.
  • 如果您使用键值对进行连接,请指定 {"host": "."}
  • 如果您使用单独的参数进行连接,请指定 --host=.-h .

MySQL默认情况下,使用 管道名称。--socket您可以使用该选项或作为类似 URI 的连接字符串的一部分来 指定替代命名管道 。

在类似 URI 的字符串中,必须对 Unix 套接字文件或 Windows 命名管道的路径进行编码,使用百分比编码或用括号将路径括起来。括号消除了对目录分隔符等字符进行百分比编码的需要 /。如果 Unix 套接字文件的路径包含在类似 URI 的字符串中作为查询字符串的一部分,则前导斜杠必须进行百分号编码,但如果它替换主机名,则前导斜杠不得进行百分号编码,如图所示在以下示例中:

mysql-js> \connect user@localhost?socket=%2Ftmp%2Fmysql.sock
mysql-js> \connect user@localhost?socket=(/tmp/mysql.sock)
mysql-js> \connect user@/tmp%2Fmysql.sock 
mysql-js> \connect user@(/tmp/mysql.sock)

仅在 Windows 上,命名管道必须以字符作为前缀\\.\,并使用百分比编码进行编码或用括号括起来,如以下示例所示:

(\\.\named:pipe)
\\.\named%3Apipe

重要的

在 Windows 上,如果一个或多个 MySQL Shell 会话使用命名管道连接到 MySQL Server 实例并且您需要关闭服务器,则必须首先关闭 MySQL Shell 会话。仍以这种方式连接的会话会导致服务器在关闭过程中挂起。如果确实发生这种情况,请退出 MySQL Shell,服务器将继续关闭过程。

有关使用 Unix 套接字文件和 Windows 命名管道连接的更多信息,请参阅使用命令选项连接到 MySQL 服务器使用类似 URI 的字符串或键值对连接到服务器

4.3.4 使用加密连接

连接到启用 TLS(有时称为 SSL)的 MySQL 服务器时,可以使用加密连接。MySQL Shell 的大部分配置都基于 MySQL 服务器使用的选项,有关更多信息, 请参阅使用加密连接。

要在 MySQL Shell 启动时配置加密连接,请使用以下命令选项:

  • --ssl: 已弃用,将在未来版本中删除。使用 --ssl-mode。此选项启用或禁用加密连接。

  • --ssl-mode:此选项指定连接到服务器所需的安全状态。

  • --ssl-ca=*file_name*:包含受信任的 SSL 证书颁发机构列表的 PEM 格式文件的路径。

  • --ssl-capath=*dir_name*:包含 PEM 格式的受信任 SSL 证书颁发机构证书的目录的路径。

  • --ssl-cert=*file_name*:用于建立加密连接的 PEM 格式的 SSL 证书文件的名称。

  • --ssl-cipher=*name*:用于建立加密连接的 SSL 密码的名称。

  • --ssl-key=*file_name*:用于建立加密连接的 PEM 格式的 SSL 密钥文件的名称。

  • --ssl-crl=*name*:包含 PEM 格式的证书吊销列表的文件的路径。

  • --ssl-crlpath=*dir_name*:目录的路径,该目录包含包含 PEM 格式的证书吊销列表的文件。

  • --tls-ciphersuites=*suites*:加密连接允许的 TLS 密码套件,指定为以冒号分隔的 TLS 密码套件名称列表。例如 。在版本 8.0.18 中添加。 --tls-ciphersuites=*TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256*

  • --tls-version=*version*:允许加密连接的 TLS 协议,指定为逗号分隔列表。例如 。 --tls-version=*TLSv1.2,TLSv1.3*

    从 MySQL 8.0.28 开始,MySQL Server 不再支持 TLSv1 和 TLSv1.1 协议,并且 MySQL Shell 无法与协议设置为 TLSv1 或 TLSv1.1 建立 TLS/SSL 连接。如果您尝试使用 TLS/SSL 从任何版本的 MySQL Shell 连接到 8.0.28 或更高版本的 MySQL 服务器实例,并且您使用该选项指定 TLSv1 或 TLSv1.1 协议,您将看到以下结果--tls-version

    • 对于 TCP 连接,连接失败,并向 MySQL Shell 返回错误。
    • 对于套接字连接,如果 --ssl-mode设置为 REQUIRED,则连接失败。如果 --ssl-mode未设置为 REQUIRED,则建立连接但禁用 TLS/SSL。

    TLSv1 和 TLSv1.1 协议已从 MySQL 8.0.26 中弃用。有关背景信息,请参阅 IETF 备忘录 Deprecating TLSv1.0 and TLSv1.1。使用更安全的 TLSv1.2 和 TLSv1.3 协议在 MySQL Shell 和 MySQL Server 之间建立连接。TLSv1.3 要求 MySQL 服务器和客户端应用程序都使用 OpenSSL 1.1.1 或更高版本进行编译。有关 MySQL 服务器版本中对 TLS 协议版本的支持的更多信息,请参阅 删除对 TLSv1 和 TLSv1.1 协议的支持

或者,可以将 SSL 选项编码为类似 URI 的连接字符串的一部分,作为查询元素的一部分。可用的 SSL 选项与上面列出的选项相同,但前面没有连字符。例如, ssl-ca相当于 --ssl-ca.

在类似 URI 的字符串中指定的路径必须进行百分比编码,例如:

ssluser@127.0.0.1?ssl-ca%3D%2Froot%2Fclientcert%2Fca-cert.pem%26ssl-cert%3D%2Fro\
ot%2Fclientcert%2Fclient-cert.pem%26ssl-key%3D%2Froot%2Fclientcert%2Fclient-key
.pem

有关详细信息, 请参阅使用类似 URI 的字符串或键值对连接到服务器。

要在 JavaScript 或 Python 模式下为脚本会话建立加密连接,请在 connectionData字典中设置 SSL 信息。例如:

mysql-js> var session=mysqlx.getSession({host: 'localhost',
                                             user: 'root',
                                             password: 'password',
                                             ssl_ca: "path_to_ca_file",
                                             ssl_cert: "path_to_cert_file",
                                             ssl_key: "path_to_key_file"});

mysqlx.getSession()使用、 mysql.getSession()mysql.getClassicSession()创建 的会话ssl-mode=REQUIRED作为默认值(如果未 ssl-mode提供,并且既未 提供ssl-ca也未ssl-capath提供)。如果没有ssl-mode提供并且提供了ssl-caor中的任何一个ssl-capath,则创建的会话默认为 ssl-mode=VERIFY_CA.

有关详细信息, 请参阅使用键值对进行连接。

4.3.5 使用 LDAP 和 Kerberos 身份验证

MySQL 企业版支持使 MySQL 服务器能够使用 LDAP(轻量级目录访问协议)、带 Kerberos 的 LDAP 或本机 Kerberos 对 MySQL 用户进行身份验证的身份验证方法。MySQL Shell 8.0.27 支持经典 MySQL 协议连接的 LDAP 和 Kerberos 身份验证。X 协议连接不支持此功能。

以下部分描述了如何使用 LDAP 和 Kerberos 身份验证启用与 MySQL 服务器的连接。假定服务器在启用服务器端插件的情况下运行,并且客户端插件在客户端主机上可用。

简单的 LDAP 身份验证

MySQL 和 LDAP 协同工作以获取用户、凭证和组信息。有关简单 LDAP 身份验证过程的概述,请参阅 MySQL 用户的 LDAP 身份验证如何工作。要在 MySQL Shell 中使用简单的 LDAP 身份验证,必须满足以下条件:

  • 必须在设置为与 LDAP 服务器通信的 MySQL 服务器上创建用户帐户。authentication_ldap_simple必须使用服务器端插件和可选的 LDAP 用户专有名称 (DN) 来标识 MySQL 用户 。例如:

    CREATE USER 'admin'@'localhost' IDENTIFIED WITH authentication_ldap_simple BY 'uid=admin,ou=People,dc=my-domain,dc=com';

    此示例中的子句BY指示 MySQL 帐户根据哪个 LDAP 条目进行身份验证。DN 的特定属性可能因 LDAP 服务器而异。

  • MySQL Shell 使用客户端 mysql_clear_password插件,它以明文形式将密码发送到服务器。没有使用密码散列或加密,因此需要 MySQL Shell 和服务器之间的安全连接(使用 SSL 或套接字)。有关详细信息,请参阅 第 4.3.4 节,“使用加密连接”第 4.3.3 节,“使用 Unix 套接字和 Windows 命名管道连接”

  • 为了最大限度地降低安全风险, 必须通过将命令行选项mysql_clear_password的值设置 为on a secure connection 来显式启用该插件。例如,以下命令允许您为在上一个示例中创建的用户建立一个全局会话: --auth-methodclear_text_password

    $> mysqlsh admin@localhost:3308 --auth-method=clear_text_password
    Please provide the password for 'admin@localhost:3308': admin_password (admin LDAP password)
    

    笔记

    您还可以设置环境变量, LIBMYSQL_ENABLE_CLEARTEXT_PLUGINmysql_clear_password 为所有客户端连接启用插件。但是,这种方法本质上是不安全的,不推荐用于测试以外的任何场景。有关详细信息,请参阅 客户端明文可插入身份验证

基于 SASL 的 LDAP 身份验证

MySQL 服务器能够接受来自 LDAP 目录中 MySQL 授权表之外定义的用户的连接。客户端和服务器端 SASL LDAP 插件使用 SASL 消息在 LDAP 协议内安全传输凭据(请参阅 使用 LDAP 可插入身份验证)。

对于基于 SASL 的身份验证,必须使用服务器端插件和可选的 MySQL 帐户身份验证所依据的 LDAP 条目来标识 MySQL 用户 authentication_ldap_sasl。例如:

CREATE USER 'sammy'@'localhost' IDENTIFIED WITH authentication_ldap_sasl BY 'uid=sammy_ldap,ou=People,dc=my-domain,dc=com';

客户authentication_ldap_sasl_client 端插件随 MySQL 服务器包一起提供,而不是内置到libmysqlclient 客户端库中。MySQL Shell 提供持久连接选项 shell.options.mysqlPluginDir,使您能够定义所需插件的位置。或者,您可以通过使用非持久命令行选项指定路径来覆盖持久设置 --mysql-plugin-dir。例如,以下命令允许您在 Linux 主机上为上一示例中创建的用户建立全局会话:

$> mysqlsh sammy@localhost:3308 --mysql-plugin-dir="/usr/local/mysql/lib/plugin"
Please provide the password for 'sammy@localhost:3308': sammy_password (sammy_ldap LDAP password)

有关其他用法示例,请参阅 使用代理LDAP 身份验证组首选项和映射规范的LDAP 身份验证。

通过 LDAP SASL 进行 GSSAPI/Kerberos 身份验证

MySQL Shell 还支持通过 LDAP SASL 进行 Kerberos 身份验证。使用通用安全服务应用程序编程接口 (GSSAPI) 安全抽象接口,这种类型的连接向 Kerberos 进行身份验证以获取服务凭证,然后依次使用这些凭证来实现对其他服务的安全访问。仅支持 GSSAPI/Kerberos 作为 Linux 上的 MySQL 服务器和 MySQL Shell 的 LDAP 身份验证方法。

GSSAPI 库和 Kerberos 服务必须对 MySQL 服务器可用,连接才能成功。有关服务器端配置信息, 请参阅 GSSAPI/Kerberos 身份验证方法。

下面的一般示例创建了代理用户 named lucy@MYSQL.LOCAL,它承担了被代理用户 named 的特权 proxied_krb_usrMYSQL.LOCAL它假定在 Kerberos 配置文件中配置了 领域域/etc/krb5.conf

笔记

帐户名的用户部分包括主体域,因此“lucy@MYSQL.LOCAL”被引用为 LDAP Kerberos 身份验证的单个值。

CREATE USER 'lucy@MYSQL.LOCAL' IDENTIFIED WITH authentication_ldap_sasl BY '#krb_grp=proxied_krb_user'; CREATE USER 'proxied_krb_user'; GRANT ALL PRIVILEGES ON my_db.* TO 'proxied_krb_user'; GRANT PROXY on 'proxied_krb_user' TO 'lucy@MYSQL.LOCAL';

以下命令允许您在 Linux 主机上为上一示例中创建的用户建立全局会话。您必须指定服务器插件目录的位置,作为持久 shell.options.mysqlPluginDir连接选项或作为非持久命令选项,例如:

$> mysqlsh lucy%40MYSQL.LOCAL:password@localhost:3308/my_db 
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

在此示例中,百分比编码 ( ) 替换主体名称中的%40保留字符,并且是为 MySQL 服务器变量设置的值 。有关通过 LDAP SASL 进行 Kerberos 身份验证的服务器变量列表,请参阅 为 GSSAPI/Kerberos 配置服务器端 SASL LDAP 身份验证插件@passwordauthentication_ldap_sasl_bind_root_pwd

在调用 MySQL Shell 之前,您可以独立于 MySQL 从密钥分发中心获取并缓存票证授予票证。在这种情况下,调用 MySQL Shell 而不指定用户名或密码选项:

$> mysqlsh localhost:3308/my_db --auth-method=authentication_ldap_sasl_client 
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

--auth-method=authentication_ldap_sasl_client 省略用户凭据时,必须 指定该 选项。

Kerberos 认证

MySQL Shell 能够为使用 authentication_kerberos服务器端身份验证插件的帐户建立连接,前提是正确的 Kerberos 票证可用或可以从 Kerberos 获得。从 MySQL 企业版 8.0.27 开始,该功能在运行 Linux 和 Windows 的主机上可用(版本 8.0.26 仅支持 Linux)。有关详细的设置信息,请参阅 Kerberos 可插入身份验证

Kerberos 身份验证可以将用户名(例如lucy)和用户帐户中指定的领域域(例如 MYSQL.LOCAL)结合起来构造用户主体名称 (UPN),例如 lucy@MYSQL.LOCAL. 要创建与 UPN 对应的 MySQL 帐户 lucy@MYSQL.LOCAL,请使用以下语句:

CREATE USER 'lucy' IDENTIFIED WITH authentication_kerberos BY 'MYSQL.LOCAL';

客户端插件使用 UPN 和密码获取票证授予票证 (TGT),使用 TGT 获取 MySQL 服务票证 (ST),并使用 ST 向 MySQL 服务器进行身份验证。

以下命令允许您在 Linux 主机上为上一示例中创建的用户建立全局会话。您必须指定服务器插件目录的位置,作为持久 shell.options.mysqlPluginDir连接选项或作为非持久命令选项,例如:

$> mysqlsh lucy:3308 --mysql-plugin-dir="/usr/local/mysql/lib/plugin"
Please provide the password for 'lucy@localhost:3308': UPN_password

在调用 MySQL Shell 之前,您可以独立于 MySQL 从密钥分发中心获取并缓存 TGT。在这种情况下,调用 MySQL Shell 而不指定用户名或密码选项:

$> mysqlsh localhost:3308 --auth-method=authentication_kerberos_client
--mysql-plugin-dir="/usr/local/mysql/lib/plugin"

--auth-method=authentication_kerberos_client 省略用户凭据时,必须 指定该 选项。

4.3.6 使用 SSH 隧道

从 8.0.28 版开始,MySQL Shell 支持 SSH 隧道连接到 MySQL 服务器实例。SSH 隧道允许未加密的流量通过加密连接,并允许对受防火墙保护免受外部连接影响的服务器进行授权远程访问。

dba.deploySandboxInstance`使用 SSH 隧道从 MySQL Shell 建立的连接不支持使用 AdminAPI 命令,部署、启动、停止、终止和删除沙箱实例( 、、、 和 ) `dba.startSandboxInstance`的 命令除外。沙箱命令始终在 MySQL Shell 实例本地执行。 `dba.stopSandboxInstance``dba.killSandboxInstance``dba.deleteSandboxInstance

SSH 隧道一旦建立,就可以在从同一远程服务器实例连接的同一用户到同一主机的连接之间共享。MySQL Shell 函数 shell.listSshConnections()列出了来自 MySQL Shell 会话的当前连接和活动的 SSH 隧道,以及 SSH 服务器和连接的 MySQL 服务器实例的 URI。如果指定相同的 SSH 连接详细信息,MySQL Shell 会自动重新使用现有隧道。

您可以选择用于连接的 SSH 配置文件和身份文件(私钥)。设置 SSH 隧道时,MySQL Shell 按以下优先级顺序选择 SSH 配置文件:

  1. 您指定为连接选项的 SSH 配置文件。
  2. 使用 MySQL Shell 配置选项设置为默认值的 SSH 配置文件ssh.configFile。有关设置此选项的说明,请参阅 第 13.4 节,“配置 MySQL Shell 选项”
  3. 标准 SSH 配置文件 ~/.ssh/config

已知主机文件是从默认位置 ( ~/.ssh/known_hosts) 读取的,除非在 SSH 配置文件中设置了不同的配置。

对于身份文件(私钥),您可以ssh-identity-file在连接时使用选项指定自定义文件。没有为标识文件设置自定义默认值的选项。如果您不指定一个,SSH 库将使用以下身份验证尝试序列,直到一次成功:

  1. 如果正在使用 SSH 代理,则会尝试使用在那里配置的身份文件(如果可用)进行身份验证。
  2. 如果在 SSH 配置文件中为目标主机指定了身份文件,则会尝试使用该文件进行身份验证。
  3. 如果这些选项都不可用或身份验证尝试失败,则会使用 SSH 配置文件夹 ( ) 中的标准私钥文件尝试进行身份验证~/.ssh/id_rsa

通过 SSH 隧道传输数据的默认缓冲区大小为 10240 字节。您可以通过设置 MySQL Shell 配置选项来更改它ssh.bufferSize。有关设置此选项的说明,请参阅 第 13.4 节,“配置 MySQL Shell 选项”

当您使用任何 MySQL Shell 连接方法(方法shell.connect()mysqlsh命令参数或 \connectMySQL Shell 命令)时,SSH 隧道可用。

  • shell.connect()

    当您在 MySQL Shell 运行时使用该shell.connect()方法连接时,您可以指定一个 URI 用于连接到 SSH 服务器,或者使用键值对连接数据。此方法提供以下选项:ssh: 连接 SSH 服务器的 URI。URI 格式为 [user@]host[:port].uri:要通过 SSH 隧道访问的 MySQL 服务器实例的 URI。URI 格式为[scheme://] [user@]host:port. 不要使用基本连接参数 ( scheme, user, host, port) 为 SSH 隧道指定 MySQL 服务器连接,只需使用此选项即可。必须指定端口。ssh-password:连接SSH服务器的密码。ssh-config-file:用于连接到 SSH 服务器的 SSH 配置文件。ssh-identity-file:用于连接 SSH 服务器的标识文件。ssh-identity-pass:选项指定的标识文件的密码 ssh-identity-file。当您使用该方法时,这些选项也可用 ,该方法的工作方式与创建和返回对象shell.openSession()相同,而不是将其设置为 MySQL Shell 的全局会话。有关使用此连接方法和其他可用选项的完整说明,请参阅 使用类似 URI 的字符串或键值对连接到服务器shell.connect()``session

  • mysqlsh命令参数

    当您在 MySQL 启动时使用命令行选项进行连接时,您可以指定用于连接到 SSH 服务器的 URI。此方法提供以下选项:--ssh: 连接 SSH 服务器的 URI。URI 格式为 [user@]host[:port]. 使用此选项时,必须在 MySQL 实例 URI 中指定用于连接 MySQL 服务器实例的端口。--ssh-config-file:用于连接到 SSH 服务器的 SSH 配置文件。--ssh.configFile如果您使用空值指定此选项,则忽略由指定的自定义默认 SSH 配置文件,而是~/.ssh/config使用该文件。--ssh-identity-file:用于连接 SSH 服务器的标识文件。有关使用此连接方法和其他可用选项的完整说明,请参阅 第 4.3.1 节“使用各个参数连接”

  • \connectMySQL 外壳命令

    \connect 当您在 MySQL Shell 运行时 使用该命令进行连接时,您可以指定用于连接到 SSH 服务器的 URI。SSH 连接没有其他选项,因此您必须使用默认身份文件 ~/.ssh/id_rsa和默认 SSH 配置文件,它可以是标准文件 ~/.ssh/config或您使用 MySQL Shell 配置选项设置的自定义默认值 ssh.configFile(请参阅 第 13.4 节) ,“配置 MySQL Shell 选项”)。shell.connect()要获得其他设置选项,您可以在 MySQL Shell 启动时 使用该方法或在命令行上创建 SSH 隧道,然后通过\connect命令重用它。当您处于 MySQL Shell 会话中时,您可以使用该 shell.listSshConnections()命令查看当前连接的 SSH 隧道。

MySQL Shell 的 Secret Store 可以存储用于连接到 SSH 服务器和身份文件的密码和密码,以便在以后的连接中自动检索。如果您在连接选项中提供了密码或密码短语,则将使用它来代替存储在机密存储中的任何密码。请注意,虽然有允许它的选项,但在连接数据中指定显式密码是不安全的,因此不推荐使用。MySQL Shell 在需要密码时以交互方式提示输入密码,用于连接到 SSH 服务器或身份文件。例如:

mysql-js> shell.connect({uri:"mysql://root:sandbox@192.0.2.3:3306",
        > ssh:"root@198.51.100.4:2222", "ssh-identity-file":"/home/hanna/.ssh/config_pw"})
Creating a Classic session to 'root@192.0.2.3:3306'
Opening SSH tunnel to 198.51.100.4:2222...
Please provide key passphrase for /home/hanna/.ssh/config_pw: ********
Save password for 'file:/home/hanna/.ssh/config_pw'? 
[Y]es/[N]o/Ne[v]er (default No): y
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 7869
Server version: 8.0.28 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
<ClassicSession:root@192.0.2.3:3306>

4.3.7 使用压缩连接

从 MySQL Shell 8.0.14 开始,您可以为使用经典 MySQL 协议的 MySQL Shell 连接请求压缩,从 MySQL Shell 8.0.20 开始,还可以为使用 X 协议的 MySQL Shell 连接请求压缩。当会话请求压缩时,如果服务器支持压缩,并且可以与MySQL Shell 约定压缩算法,则客户端和服务器之间发送的所有信息都会被压缩。如果请求到 MySQL Shell 实用程序(例如升级检查程序实用程序)使用的连接,也会应用压缩。

对于 X 协议连接,默认情况下请求压缩,如果压缩连接的协商不成功,则允许未压缩的连接。对于经典的 MySQL 协议连接,默认情况下禁用压缩。建立连接后,MySQL Shell\status命令会显示会话是否正在使用压缩。该命令显示一行 Compression:内容 DisabledEnabled指示连接是否被压缩。如果启用了压缩,还会显示正在使用的压缩算法。

您可以设置defaultCompressMySQL Shell 配置选项以请求对每个全局会话进行压缩。由于 X 协议连接的默认设置是在 MySQL Shell 版本支持压缩的情况下请求压缩,因此此配置选项仅对经典 MySQL 协议连接有效。

有关连接压缩如何针对 X 协议连接进行操作的更多信息,请参阅 使用 X 插件进行连接压缩。有关连接压缩如何对经典 MySQL 协议连接进行操作以及 MySQL 服务器实例的压缩设置和功能的更多信息,请参阅 连接压缩控制

4.3.7.1 MySQL Shell 8.0.20及以后的压缩控制

从 MySQL Shell 8.0.20 开始,对于 X 协议连接和经典 MySQL 协议连接,每当您创建会话对象来管理与 MySQL 服务器实例的连接时,您都可以指定该连接是否需要、首选或禁用压缩。

  • required向服务器请求压缩连接,如果服务器不支持压缩或无法与 MySQL Shell 就压缩协议达成一致,则连接失败。
  • preferred从服务器请求压缩连接,如果服务器不支持压缩或不能与 MySQL Shell 就压缩协议达成一致,则回退到未压缩连接。这是 X 协议连接的默认值。
  • disabled请求未压缩的连接,如果服务器仅允许压缩连接,则连接失败。这是经典 MySQL 协议连接的默认设置。

从 MySQL Shell 8.0.20 开始,您还可以选择允许连接的压缩算法。默认情况下,MySQL Shell 为 X Protocol 连接向服务器推荐 zlib、LZ4 和 zstd 算法,为经典 MySQL 协议连接(不支持 LZ4 算法)推荐 zlib 和 zstd 算法。您可以指定这些算法的任意组合。您指定压缩算法的顺序是 MySQL Shell 建议它们的优先顺序,但服务器可能不受此优先级的影响,具体取决于协议和服务器配置。

指定任何压缩算法或它们的组合会自动请求对连接进行压缩,因此您可以这样做而不是使用单独的参数来指定是否需要、首选或禁用压缩。uncompressed使用这种连接压缩控制方法,您可以通过将选项(允许未压缩的连接)添加到压缩算法列表来指示压缩是必需的还是首选。如果包含uncompressed,则首选压缩,如果不包含,则需要压缩。也可以传入 uncompressed单独指定压缩被禁用。如果您在单独的参数中指定压缩是必需的、首选的或禁用的,则这优先于 uncompressed在压缩算法列表中使用。

您还可以为连接指定数字压缩级别,这适用于 X 协议连接的任何压缩算法,或仅适用于经典 MySQL 协议连接的 zstd 算法。对于 X 协议连接,如果服务器最终选择的算法不接受指定的压缩级别,则服务器会根据 Connection Compression with X Plugin中列出的行为选择适当的设置。例如,如果 MySQL Shell 请求 zlib 算法的压缩级别为 7,则服务器的 mysqlx_deflate_max_client_compression_level 系统变量(限制 deflate 或 zlib 压缩的最大压缩级别)设置为默认值 5,服务器使用最高允许压缩级别 5。

如果 MySQL 服务器实例不支持协议的连接压缩(X 协议连接在 MySQL 8.0.19 之前就是这种情况),或者如果它支持连接压缩但不支持指定连接算法和压缩级别,则 MySQL Shell 建立连接而不指定不支持的参数。

要从 MySQL Shell 8.0.20 请求压缩连接,请使用以下方法之一:

  • 如果您从命令行启动 MySQL Shell 并使用单独的命令选项指定连接参数,请使用 --compress ( -C) 选项,指定连接是否需要、首选或禁用压缩。例如:

    $> mysqlsh --mysqlx -u user -h localhost -C required
    

    --compress ( ) 选项-C与早期版本的 MySQL Shell(回到 MySQL 8.0.14)兼容,并且仍然接受这些版本的布尔设置。从 MySQL Shell 8.0.20 开始,如果您只指定 --compress ( -C) 而没有参数,则连接需要压缩。

    上面的 X 协议连接示例按照优先顺序向服务器建议 zlib、LZ4 和 zstd 算法。如果您更喜欢压缩算法的替代组合,您可以通过使用选项指定 --compression-algorithms一个字符串来指定它,该字符串包含以逗号分隔的允许算法列表。对于 X 协议连接,您可以按任意组合和优先顺序使用 zliblz4和 。zstd对于经典的 MySQL 协议连接,您可以使用 zlibzstd以任何组合和优先顺序。以下经典 MySQL 协议连接示例仅允许 zstd 算法:

    $> mysqlsh --mysql -u user -h localhost -C preferred --compression-algorithms=zstd
    

    您也可以 --compression-algorithms不 使用--compress ( -C) 选项来请求压缩。在这种情况下,uncompressed如果您想允许未压缩的连接,请将其添加到算法列表中,或者如果您不想允许它们,请将其省略。这种连接压缩控制方式与其他 MySQL 客户端(如mysql 和**mysqlbinlog)**兼容。以下经典 MySQL 协议连接示例与上面的示例具有相同的效果,其中preferred被指定为一个单独的选项,即建议使用 zstd 算法进行压缩,但回退到未压缩的连接:

    $> mysqlsh --mysql -u user -h localhost --compression-algorithms=zstd,uncompressed
    

    --compression-level您可以使用或 选项 配置压缩级别 --zstd-compression-level,这些选项已针对经典 MySQL 协议连接进行验证,但不适用于 X 协议连接。 --compression-level为 X 协议连接的任何算法或仅在经典 MySQL 协议连接上的 zstd 算法指定压缩级别的整数。 --zstd-compression-levelzstd算法的压缩级别指定1到22的整数,兼容mysqlmysqlbinlog等其他MySQL客户端. 例如,X 协议连接的这些连接参数指定全局会话需要压缩并且必须使用 LZ4 或 zstd 算法,请求的压缩级别为 5:

    $> mysqlsh --mysqlx -u user -h localhost -C required --compression-algorithms=lz4,zstd --compression-level=5
    
  • 如果您使用类似 URI 的连接字符串来指定连接参数,无论是从命令行,还是使用 MySQL Shell 的\connect命令,或者使用shell.connect(), shell.openSession(), mysqlx.getSession(), mysql.getSession(), 或 mysql.getClassicSession()函数,请使用compression查询字符串中的参数来指定是否需要压缩、首选或禁用。例如:

    mysql-js> \connect user@example.com?compression=preferred
    
    $> mysqlsh mysqlx://user@localhost:33060?compression=disabled
    

    与命令行选项一样, 使用参数选择压缩算法 compression-algorithms,并使用参数选择压缩级别 。compression-level(对于类似 URI 的连接字符串,没有特定于 zstd 的压缩级别参数。)您也可以使用 compression-algorithms不带compression参数的参数,包括或省略uncompressed 允许或禁止未压缩连接的选项。例如,这两组连接参数都指定压缩是首选但允许未压缩的连接,zlib 和 zstd 算法是可接受的,并且应该使用 4 的压缩级别:

    mysql-js> \connect user@example.com:33060?compression=preferred&compression-algorithms=zlib,zstd&compression-level=4
    
    mysql-js> \connect user@example.com:33060?compression-algorithms=zlib,zstd,uncompressed&compression-level=4
    
  • 如果您使用键值对指定连接参数,无论是使用 MySQL Shell 的 \connect命令还是使用 shell.connect()shell.openSession()mysqlx.getSession()mysql.getSession()mysql.getClassicSession()函数,请使用compression选项字典中的参数来指定压缩是必需的、首选的还是禁用的。例如:

    mysql-js>  var s1=mysqlx.getSession({host: 'localhost',
                                         user: 'root',
                                         password: 'password',
                                         compression: 'required'});
    

    使用参数选择压缩算法 compression-algorithms,使用参数选择压缩级别 compression-level,对于命令行和类似 URI 的连接字符串方法。(键值对没有特定于 zstd 的压缩级别参数。)您也可以使用 compression-algorithms不带compression参数的参数,包括或省略uncompressed 允许或禁止未压缩连接的选项。

4.3.7.2 MySQL Shell 8.0.14 到 8.0.19 的压缩控制

在 MySQL Shell 8.0.14 到 8.0.19 的版本中,只能为使用经典 MySQL 协议的连接请求压缩。默认是不请求压缩。这些版本中的压缩使用 zlib 压缩算法。您不能在这些版本中要求压缩,因此如果服务器不支持压缩,会话将回退到未压缩的连接。

在这些 MySQL Shell 版本中,压缩控制仅限于为连接启用(通过指定true)或禁用(通过指定)压缩。false如果您使用具有此压缩控制的 MySQL Shell 版本连接到 MySQL 8.0.18 或更高版本的服务器实例,其中支持压缩算法的客户端请求,启用压缩等同于提出算法集 zlibuncompressed

MySQL Shell 不能在 8.0.14 之前的版本中请求压缩。

要请求压缩 MySQL Shell 8.0.14 到 8.0.19 中的连接,请使用以下方法之一:

  • 如果从命令行启动 MySQL Shell 并使用单独的命令选项指定连接参数,请使用--compress ( -C) 选项,例如:

    $> mysqlsh --mysql -u user -h localhost -C
    
  • 如果您使用类似 URI 的连接字符串来指定连接参数,无论是从命令行、MySQL Shell 的\connect命令还是方法,请在查询字符串中 shell.connect()使用参数:compression=true

    mysql-js> \connect user@example.com?compression=true
    
    $> mysqlsh mysql://user@localhost:3306?compression=true
    
  • 如果您使用键值对指定连接参数,无论是使用 MySQL Shell 的 \connect命令还是方法 mysql.getClassicSession(),请使用compression选项字典中的参数:

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

文章被以下合辑收录

评论