本节介绍如何使用类似 URI 的连接字符串或键值对来指定如何建立与 MySQL 服务器的连接,适用于 MySQL Shell 等客户端。有关使用命令行选项建立连接的信息,请参阅第 6.2.4 节“使用命令选项连接到 MySQL 服务器”,适用于mysql或mysqldump等客户端。如果无法连接,请参阅第 8.2.22 节“解决连接到 MySQL 时出现的问题”,以获取更多信息。
术语“类似 URI”表示连接字符串语法类似于RFC 3986定义的 URI(统一资源标识符)语法,但并不完全相同。
以下 MySQL 客户端支持使用类似 URI 的连接字符串或键值对连接到 MySQL 服务器:
MySQL Shell
实现 X DevAPI 的 MySQL 连接器
本节记录了所有有效的类似 URI 的字符串和键值对连接参数,其中许多参数与使用命令行选项指定的参数类似。
使用类似 URI 的字符串指定的参数使用
[email protected]:3306/main-schema
等语法。有关完整语法,请参阅使用类似 URI 的连接字符串进行连接。使用键值对指定的参数使用
{user:'myuser', host:'example.com', port:3306, schema:'main-schema'}
等语法。有关完整语法,请参阅使用键值对进行连接。
连接参数不区分大小写。每个参数(如果指定)只能指定一次。如果多次指定一个参数,则会发生错误。
本节涵盖以下主题:
以下讨论描述了在指定与 MySQL 的连接时可用的参数。可以使用符合基本类似 URI 语法的字符串(请参阅使用类似 URI 的连接字符串进行连接)或键值对(请参阅使用键值对进行连接)来提供这些参数。
scheme
:要使用的传输协议。使用mysqlx
进行 X 协议连接,使用mysql
进行经典 MySQL 协议连接。如果未指定协议,则服务器会尝试猜测协议。支持 DNS SRV 的连接器可以使用mysqlx+srv
方案(请参阅使用 DNS SRV 记录进行连接)。user
:为身份验证过程提供的 MySQL 用户帐户。password
:用于身份验证过程的密码。警告在连接规范中指定显式密码是不安全的,不建议这样做。后面的讨论将展示如何导致出现交互式密码提示。
host
:运行服务器实例的主机。该值可以是主机名、IPv4 地址或 IPv6 地址。如果未指定主机,则默认为localhost
。port
:目标 MySQL 服务器在其上侦听连接的 TCP/IP 网络端口。如果未指定端口,则 X 协议连接默认为 33060,经典 MySQL 协议连接默认为 3306。socket
:Unix 套接字文件的路径或 Windows 命名管道的名称。这些值是本地文件路径。在类似 URI 的字符串中,必须对它们进行编码,使用百分比编码或将路径括在括号中。括号消除了对/
目录分隔符等字符进行百分比编码的需要。例如,要使用 Unix 套接字/tmp/mysql.sock
以root@localhost
身份连接,请使用百分比编码将路径指定为root@localhost?socket=%2Ftmp%2Fmysql.sock
,或使用括号将路径指定为root@localhost?socket=(/tmp/mysql.sock)
。schema
:连接的默认数据库。如果未指定数据库,则连接没有默认数据库。
Unix 上对localhost
的处理取决于传输协议的类型。使用经典 MySQL 协议的连接处理localhost
的方式与其他 MySQL 客户端相同,这意味着localhost
假定用于基于套接字的连接。对于使用 X 协议的连接,localhost
的行为有所不同,因为它假定表示环回地址,例如 IPv4 地址 127.0.0.1。
您可以为连接指定选项,作为类似 URI 的字符串中的属性(方法是在后面附加?
)或作为键值对。以下选项可用:attribute=value
ssl-mode
:连接所需的安全性状态。允许使用以下模式:DISABLED
PREFERRED
REQUIRED
VERIFY_CA
VERIFY_IDENTITY
重要VERIFY_CA
和VERIFY_IDENTITY
是比默认的PREFERRED
更好的选择,因为它们有助于防止中间人攻击。有关这些模式的信息,请参阅加密连接的命令选项中的
--ssl-mode
选项说明。ssl-ca
:X.509 证书颁发机构文件的路径(PEM 格式)。ssl-capath
:包含 X.509 证书颁发机构文件(PEM 格式)的目录的路径。ssl-cert
:X.509 证书文件(PEM 格式)的路径。ssl-cipher
:用于使用 TLS 协议(最高到 TLSv1.2)的连接的加密密码。ssl-crl
:包含证书吊销列表(PEM 格式)的文件的路径。ssl-crlpath
:包含证书吊销列表文件(PEM 格式)的目录的路径。ssl-key
:X.509 密钥文件(PEM 格式)的路径。tls-version
:允许用于经典 MySQL 协议加密连接的 TLS 协议。此选项仅由 MySQL Shell 支持。tls-version
(单数)的值是以逗号分隔的列表,例如TLSv1.2,TLSv1.3
。有关详细信息,请参见第 8.3.2 节“加密连接 TLS 协议和密码”。此选项取决于ssl-mode
选项未设置为DISABLED
。tls-versions
:允许用于加密 X 协议连接的 TLS 协议。tls-versions
(复数)的值是一个数组,例如[TLSv1.2,TLSv1.3]
。有关详细信息,请参见第 8.3.2 节“加密连接 TLS 协议和密码”。此选项取决于ssl-mode
选项未设置为DISABLED
。tls-ciphersuites
:允许的 TLS 密码套件。tls-ciphersuites
的值是 IANA 密码套件名称列表,如TLS 密码套件中所列。有关详细信息,请参见第 8.3.2 节“加密连接 TLS 协议和密码”。此选项取决于ssl-mode
选项未设置为DISABLED
。auth-method
:用于连接的身份验证方法。默认值为AUTO
,表示服务器尝试猜测。允许使用以下方法AUTO
MYSQL41
SHA256_MEMORY
FROM_CAPABILITIES
FALLBACK
PLAIN
对于 X 协议连接,任何配置的
auth-method
都会被覆盖为以下身份验证方法序列:MYSQL41
、SHA256_MEMORY
、PLAIN
。get-server-public-key
:从服务器请求基于 RSA 密钥对的密码交换所需的公钥。在使用 SSL 模式DISABLED
通过经典 MySQL 协议连接到 MySQL 8+ 服务器时使用。在这种情况下,必须指定协议。例如mysql://user@localhost:3306?get-server-public-key=true
此选项适用于使用
caching_sha2_password
身份验证插件进行身份验证的客户端。对于该插件,除非请求,否则服务器不会发送公钥。对于未使用该插件进行身份验证的帐户,将忽略此选项。如果未使用基于 RSA 的密码交换(例如,当客户端使用安全连接连接到服务器时),也会忽略此选项。如果给定了
server-public-key-path=
并指定了有效的公钥文件,则它优先于file_name
get-server-public-key
。有关
caching_sha2_password
插件的信息,请参见第 8.4.1.1 节“缓存 SHA-2 可插拔身份验证”。server-public-key-path
:包含服务器所需的用于基于 RSA 密钥对的密码交换的客户端公钥副本的文件(PEM 格式)的路径名。在使用 SSL 模式DISABLED
通过经典 MySQL 协议连接到 MySQL 8+ 服务器时使用。此选项适用于使用
sha256_password
或caching_sha2_password
身份验证插件进行身份验证的客户端。对于未使用其中一种插件进行身份验证的帐户,将忽略此选项。如果未使用基于 RSA 的密码交换(例如,当客户端使用安全连接连接到服务器时),也会忽略此选项。如果给定了
server-public-key-path=
并指定了有效的公钥文件,则它优先于file_name
get-server-public-key
。有关
sha256_password
和caching_sha2_password
插件的信息,请参见第 8.4.1.2 节“SHA-256 可插拔身份验证”和第 8.4.1.1 节“缓存 SHA-2 可插拔身份验证”。ssh
:用于连接到 SSH 服务器以使用 SSH 隧道访问 MySQL 服务器实例的 URI。URI 格式为[user@]host[:port]
。使用uri
选项指定目标 MySQL 服务器实例的 URI。有关从 MySQL Shell 进行 SSH 隧道连接的信息,请参见使用 SSH 隧道。uri
:要通过ssh
选项指定的服务器的 SSH 隧道访问的 MySQL 服务器实例的 URI。URI 格式为[scheme://][user@]host[:port]
。不要使用基本连接参数(scheme
、user
、host
、port
)来指定用于 SSH 隧道的 MySQL 服务器连接,只需使用uri
选项即可。ssh-password
:连接到 SSH 服务器的密码。警告在连接规范中指定显式密码是不安全的,因此不建议这样做。MySQL Shell 会在需要密码时以交互方式提示输入密码。
ssh-config-file
:连接到 SSH 服务器的 SSH 配置文件。如果未指定此选项,则可以使用 MySQL Shell 配置选项ssh.configFile
将自定义文件设置为默认值。如果未设置ssh.configFile
,则默认为标准 SSH 配置文件~/.ssh/config
。ssh-identity-file
:用于连接到 SSH 服务器的身份文件。如果未指定此选项,则默认值为在 SSH 代理(如果使用)或 SSH 配置文件中配置的任何身份文件,或 SSH 配置文件夹中的标准私钥文件 (~/.ssh/id_rsa
)。ssh-identity-pass
:ssh-identity-file
选项指定的身份文件的密码。警告在连接规范中指定显式密码是不安全的,因此不建议这样做。MySQL Shell 会在需要密码时以交互方式提示输入密码。
connect-timeout
:一个整数值,用于配置客户端(如 MySQL Shell)在停止尝试连接到无响应的 MySQL 服务器之前等待的秒数。compression
:此选项请求或禁用连接的压缩。此选项可用的值为:
required
(请求压缩,如果服务器不支持则失败);preferred
(请求压缩,如果服务器不支持则回退到未压缩的连接);disabled
(请求未压缩的连接,如果服务器不允许则失败)。preferred
是 X 协议连接的默认值,disabled
是经典 MySQL 协议连接的默认值。有关 X 插件连接压缩控制的信息,请参见第 22.5.5 节“使用 X 插件进行连接压缩”。注意不同的 MySQL 客户端以不同的方式实现对连接压缩的支持。有关详细信息,请参阅客户端的文档。
compression-algorithms
和compression-level
:这些选项在 MySQL Shell 中可用,用于更精细地控制连接压缩。您可以指定它们来选择用于连接的压缩算法,以及与该算法一起使用的数字压缩级别。您还可以使用compression-algorithms
代替compression
来请求连接的压缩。有关 MySQL Shell 的连接压缩控制的信息,请参见使用压缩连接。connection-attributes
:控制应用程序在连接时传递给服务器的键值对。有关连接属性的常规信息,请参见第 29.12.9 节“性能架构连接属性表”。客户端通常定义一组默认属性,这些属性可以禁用或启用。例如mysqlx://user@host?connection-attributes mysqlx://user@host?connection-attributes=true mysqlx://user@host?connection-attributes=false
默认行为是发送默认属性集。应用程序可以指定要传递的属性,以添加到默认属性中。您可以在连接字符串中将其他连接属性指定为
connection-attributes
参数。connection-attributes
参数值必须为空(与指定true
相同)、Boolean
值(true
或false
,用于启用或禁用默认属性集),或一个或多个以逗号分隔的key=value
说明符的列表(将与默认属性集一起发送)。在列表中,缺少键值将被视为空字符串。更多示例mysqlx://user@host?connection-attributes=[attr1=val1,attr2,attr3=] mysqlx://user@host?connection-attributes=[]
应用程序定义的属性名称不能以
_
开头,因为此类名称是为内部属性保留的。
您可以使用类似 URI 的字符串指定与 MySQL 服务器的连接。此类字符串可以与 MySQL Shell 一起使用,方法是使用--uri
命令选项、MySQL Shell \connect
命令以及实现 X DevAPI 的 MySQL 连接器。
术语“类似 URI”表示连接字符串语法类似于RFC 3986定义的 URI(统一资源标识符)语法,但并不完全相同。
类似 URI 的连接字符串具有以下语法
[scheme://][user[:[password]]@]host[:port][/schema][?attribute1=value1&attribute2=value2...
必须对类似 URI 的字符串的元素中的保留字符使用百分号编码。例如,如果指定包含 @
字符的字符串,则必须将该字符替换为 %40
。如果在 IPv6 地址中包含区域 ID,则必须将用作分隔符的 %
字符替换为 %25
。
您可以在类似 URI 的连接字符串中使用的参数在基本连接参数中进行了描述。
MySQL Shell 的 shell.parseUri()
和 shell.unparseUri()
方法可用于分解和组装类似 URI 的连接字符串。给定一个类似 URI 的连接字符串,shell.parseUri()
将返回一个字典,其中包含在该字符串中找到的每个元素。shell.unparseUri()
将 URI 组件和连接选项的字典转换为用于连接到 MySQL 的有效类似 URI 的连接字符串,该字符串可以在 MySQL Shell 中使用,也可以由实现 X DevAPI 的 MySQL 连接器使用。
如果在类似 URI 的字符串中未指定密码(建议这样做),则交互式客户端会提示输入密码。以下示例显示如何使用用户名 user_name
指定类似 URI 的字符串。在每种情况下,都会提示输入密码。
与监听端口 33065 的本地服务器实例的 X 协议连接。
mysqlx://user_name@localhost:33065
与监听端口 3333 的本地服务器实例的经典 MySQL 协议连接。
mysql://user_name@localhost:3333
与远程服务器实例的 X 协议连接,使用主机名、IPv4 地址和 IPv6 地址。
mysqlx://user_name@server.example.com/ mysqlx://user_name@198.51.100.14:123 mysqlx://user_name@[2001:db8:85a3:8d3:1319:8a2e:370:7348]
使用套接字的 X 协议连接,使用百分号编码或括号提供路径。
mysqlx://user_name@/path%2Fto%2Fsocket.sock mysqlx://user_name@(/path/to/socket.sock)
可以指定可选路径,它表示数据库。
# use 'world' as the default database mysqlx://user_name@198.51.100.1/world # use 'world_x' as the default database, encoding _ as %5F mysqlx://user_name@198.51.100.2:33060/world%5Fx
可以指定可选查询,该查询由每个值都以
对或单个key
=value
key
形式给出的值组成。要指定多个值,请使用,
字符分隔它们。允许混合使用
和key
=value
key
值。值可以是列表类型,列表值按出现顺序排列。字符串必须进行百分号编码或用括号括起来。以下是等效的。[email protected]?ssl-ca=%2Froot%2Fclientcert%2Fca-cert.pem\ &ssl-cert=%2Froot%2Fclientcert%2Fclient-cert.pem\ &ssl-key=%2Froot%2Fclientcert%2Fclient-key [email protected]?ssl-ca=(/root/clientcert/ca-cert.pem)\ &ssl-cert=(/root/clientcert/client-cert.pem)\ &ssl-key=(/root/clientcert/client-key)
要指定用于加密连接的 TLS 版本和密码套件
mysql://user_name@198.51.100.2:3306/world%5Fx?\ tls-versions=[TLSv1.2,TLSv1.3]&tls-ciphersuites=[TLS_DHE_PSK_WITH_AES_128_\ GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256]
前面的例子假设连接需要密码。对于交互式客户端,会在登录提示中请求指定用户的密码。如果用户帐户没有密码(这不安全,不推荐),或者如果正在使用套接字对等凭据身份验证(例如,使用 Unix 套接字连接),则必须在连接字符串中明确指定不提供密码,并且不需要密码提示。为此,请在字符串中user_name
后面放置一个 :
,但不要在其后指定密码。例如
mysqlx://user_name:@localhost
在 MySQL Shell 和一些实现 X DevAPI 的 MySQL 连接器中,您可以使用键值对指定与 MySQL 服务器的连接,这些键值对以实现的自然语言结构提供。例如,您可以使用键值对作为 JavaScript 中的 JSON 对象或 Python 中的字典来提供连接参数。无论提供键值对的方式如何,概念都保持不变:本部分中描述的键可以分配用于指定连接的值。您可以在 MySQL Shell 的 shell.connect()
方法或 InnoDB Cluster 的 dba.createCluster()
方法中,以及使用一些实现 X DevAPI 的 MySQL 连接器,使用键值对指定连接。
通常,键值对用 {
和 }
字符包围,并且 ,
字符用作键值对之间的分隔符。 :
字符用于键和值之间,并且必须对字符串进行分隔(例如,使用 '
字符)。与类 URI 连接字符串不同,不需要对字符串进行百分比编码。
指定为键值对的连接具有以下格式
{ key: value, key: value, ...}
您可以在 基本连接参数 中找到可以用作连接键的参数的描述。
如果在键值对中没有指定密码(推荐),则交互式客户端会提示输入密码。以下示例显示了如何使用用户名为 '
的键值对指定连接。在每种情况下,都会提示输入密码。user_name
'
与监听端口 33065 的本地服务器实例的 X 协议连接。
{user:'user_name', host:'localhost', port:33065}
与监听端口 3333 的本地服务器实例的经典 MySQL 协议连接。
{user:'user_name', host:'localhost', port:3333}
与远程服务器实例的 X 协议连接,使用主机名、IPv4 地址和 IPv6 地址。
{user:'user_name', host:'server.example.com'} {user:'user_name', host:198.51.100.14:123} {user:'user_name', host:[2001:db8:85a3:8d3:1319:8a2e:370:7348]}
使用套接字的 X 协议连接。
{user:'user_name', socket:'/path/to/socket/file'}
可以指定一个可选的模式,它表示一个数据库。
{user:'user_name', host:'localhost', schema:'world'}
前面的例子假设连接需要密码。对于交互式客户端,会在登录提示中请求指定用户的密码。如果用户帐户没有密码(这不安全,不推荐),或者如果正在使用套接字对等凭据身份验证(例如,使用 Unix 套接字连接),则必须明确指定不提供密码,并且不需要密码提示。为此,请在 password
键后使用 ''
提供一个空字符串。例如
{user:'user_name', password:'', host:'localhost'}