第 4 章 MySQL Shell 入门
目录
本节介绍如何开始使用 MySQL Shell,解释如何连接到 MySQL 服务器实例,以及如何选择会话类型。
重要的
建议您始终使用可用的最新版本。最新版本的 MySQL Shell 可以与任何版本的 MySQL 5.7 或 8.0 一起使用。
4.1 启动MySQL Shell
安装 MySQL Shell 后,您可以 使用mysqlsh命令。打开终端窗口(Windows 上的命令提示符)并通过发出以下命令启动 MySQL Shell:
> mysqlsh
这将在默认情况下以 JavaScript 模式打开 MySQL Shell 而无需连接到服务器。\sql您可以使用、\py和 命令更改模式 \js。
4.2 MySQL Shell 会话
- 4.2.1
Session启动 MySQL Shell 时创建全局对象 Session4.2.2启动MySQL Shell后创建全局对象- 4.2.3 JavaScript 和 Python 模式下的脚本会话
在 MySQL Shell 中,与 MySQL Server 实例的连接由会话对象处理。以下类型的会话对象可用:
Session:使用此会话对象类型进行新的应用程序开发,以便与 X 协议可用的 MySQL 服务器实例进行通信。X 协议提供了与 MySQL 服务器的最佳集成。要使 X 协议可用,必须在 MySQL 服务器实例上安装并启用 X 插件,这是 MySQL 8.0 的默认设置。在 MySQL 5.7 中,必须手动安装 X Plugin。有关详细信息,请参阅 X 插件。X Plugin 监听 指定的端口mysqlx_port,默认为 33060,因此使用Session.ClassicSession:使用此会话对象类型与没有可用 X 协议的 MySQL 服务器实例进行交互。此对象用于使用经典 MySQL 协议对服务器运行 SQL。可用于此类会话的开发 API 非常有限。例如,没有任何 X DevAPI CRUD 操作,没有集合处理,不支持绑定。对于开发,Session尽可能选择对象。
重要的
ClassicSession特定于 MySQL Shell,不能与 X DevAPI 的其他实现一起使用,例如 MySQL 连接器。
当您与 MySQL 服务器实例建立第一个连接时(可以在启动 MySQL Shell 时或之后完成),将 session创建一个名为 MySQL Shell 的全局对象来表示此连接。这个特定的会话对象是全局的,因为一旦创建,它就可以在所有 MySQL Shell 执行模式中使用:SQL 模式、JavaScript 模式和 Python 模式。它所代表的连接因此被称为全局会话。该变量session持有对此会话对象的引用,并且可以在 JavaScript 模式和 Python 模式下的 MySQL Shell 中使用以处理连接。
根据您在连接到 MySQL 服务器实例时选择的协议,全局对象可以是会话对象的类型或会话对象 的session类型 Session。 ClassicSession您可以使用命令选项选择协议,从而选择会话对象类型,或者将其指定为您提供的连接数据的一部分。要查看有关当前全局会话的信息,请发出:
mysql-js []> session
<ClassicSession:user@example.com:3330>
连接全局会话时,显示会话对象类型和全局会话连接到的 MySQL Server 实例的地址。
如果您在建立连接时显式选择协议或隐式指示它,MySQL Shell 会尝试使用该协议创建连接,如果失败则返回错误。如果您的连接参数未指明协议,MySQL Shell 首先尝试使用 X 协议建立连接(返回Session会话对象的类型),如果失败,则尝试使用经典 MySQL 协议建立连接(返回ClassicSession会话类型目的)。
要验证连接尝试的结果,请使用 MySQL Shell 的\status命令或 shell.status()方法。这些显示连接协议和有关由全局对象表示的连接的其他信息session,或者如果 全局对象未连接到 MySQL 服务器,则返回“未连接” 。session例如:
mysql-js []> shell.status()
MySQL Shell version 8.0.18
Session type: X Protocol
Connection Id: 198
Current schema:
Current user: user@example.com
SSL: Cipher in use: TLS_AES_256_GCM_SHA384 TLSv1.3
Using delimiter: ;
Server version: 8.0.18 MySQL Community Server - GPL
Protocol version: X Protocol
Client library: 8.0.18
Connection: TCP/IP
TCP port: 33060
Server characterset: utf8mb4
Schema characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
Compression: Enabled (zstd)
Uptime: 31 min 42.0000 sec
Threads: 8 Questions: 2622 Slow queries: 0 Opens: 298 Flush tables: 3 Open tables: 217 Queries per second avg: 1.378
本节重点解释表示与 MySQL 服务器实例的连接的会话对象,以及 session全局对象。有关本节中提到的连接到 MySQL 服务器实例的每种方法的完整说明和示例,以及可用于连接的其他选项,请参阅第 4.3 节,“ MySQL Shell 连接”。
4.2.1启动 MySQL Shell 时创建全局对象
从命令行启动 MySQL Shell 时,可以使用单独的命令选项为每个值指定连接参数,例如用户名、主机和端口。有关以这种方式启动 MySQL Shell 并连接到 MySQL Server 实例的说明和示例,请参阅 第 4.3.1 节,“使用单个参数连接”。当您使用此连接方法时,您可以添加以下选项之一来选择在启动时创建的会话对象类型作为全局对象session:
--mysqlx(--mx) 创建一个Session对象,它使用 X 协议连接到 MySQL 服务器实例。--mysql(--mc) 创建一个ClassicSession对象,它使用经典的 MySQL 协议连接到 MySQL 服务器实例。
例如,此命令启动 MySQL Shell 并建立到侦听端口 33060 的本地 MySQL 服务器实例的 X 协议连接:
$> mysqlsh --mysqlx -u user -h localhost -P 33060
如果您以 SQL 模式启动 MySQL Shell,则 --sqlx和 --sqlc选项包括会话对象类型的选择,因此您可以指定其中之一,而不是让 MySQL Shell 使用 X 协议或经典 MySQL 协议进行连接。有关所有mysqlsh命令行选项的 参考 ,请参阅第 A.1 节,“mysqlsh — MySQL Shell”。
作为使用单个选项指定连接参数的替代方法,您可以使用类似 URI 的连接字符串来指定它们。您可以在从命令行启动 MySQL Shell 时传入此字符串,使用或不使用可选--uri命令选项。使用此连接方法时,您可以 scheme在类似 URI 的连接字符串的开头包含该元素,以选择要创建的会话对象的类型。mysqlx使用 X 协议创建一个 Session对象,或者 mysql创建一个 ClassicSession使用经典 MySQL 协议的对象。例如,这些命令中的任何一个都使用类似 URI 的连接字符串来启动 MySQL Shell 并创建一个经典的 MySQL 协议连接到侦听端口 3306 的本地 MySQL Server 实例:
$> mysqlsh --uri mysql://user@localhost:3306
$> mysqlsh mysql://user@localhost:3306
您还可以将连接协议指定为一个选项,而不是作为类似 URI 的连接字符串的一部分,例如:
$> mysqlsh --mysql --uri user@localhost:3306
有关以这种方式连接到 MySQL 服务器实例的说明和示例,请参阅 使用类似 URI 的字符串或键值对连接到服务器。
您可以省略连接协议,让 MySQL Shell 根据您的其他连接参数自动检测它。例如,如果您指定端口 33060 并且没有说明连接协议的选项,则 MySQL Shell 会尝试使用 X 协议建立连接。如果您的连接参数未指明协议,MySQL Shell 首先尝试使用 X 协议建立连接,如果失败,则尝试使用经典 MySQL 协议建立连接。
4.2.2启动MySQL Shell后创建全局对象
如果您在没有连接到 MySQL 服务器实例的情况下启动 MySQL Shell,则可以使用 MySQL Shell 的\connect 命令或shell.connect()方法来启动连接并创建session 全局对象。或者,该 shell.getSession()方法返回 session全局对象。
MySQL Shell 的\connect命令与类似 URI 的连接字符串一起使用,如上文和 使用类似 URI 的字符串或键值对连接到服务器中所述。您可以scheme在类似 URI 的连接字符串的开头包含该元素,以选择要创建的会话对象的类型,例如:
mysql-js> \connect mysqlx://user@localhost:33060
或者,您可以省略该scheme 元素并使用命令的--mysqlx ( ) 选项使用 X 协议 --mx创建 对象,或( )使用经典 MySQL 协议创建 对象。例如: Session``--mysql``--mc``ClassicSession
mysql-js> \connect --mysqlx user@localhost:33060
该shell.connect()方法可以在 MySQL Shell 中用作 \connect创建 session全局对象的命令的替代方法。此连接方法可以使用类似 URI 的连接字符串,并将选定的协议指定为元素scheme。例如:
mysql-js> shell.connect('mysqlx://user@localhost:33060')
通过该shell.connect()方法,您还可以使用键值对指定连接参数,在 JavaScript 中作为 JSON 对象或在 Python 中作为字典提供。所选协议(mysqlx或 mysql)被指定为密钥的值 scheme。例如:
mysql-js> shell.connect( {scheme:'mysqlx', user:'user', host:'localhost', port:33060} )
有关以这些方式连接到 MySQL 服务器实例的说明和示例,请参阅 使用类似 URI 的字符串或键值对连接到服务器。
您可以省略连接协议,让 MySQL Shell 根据您的其他连接参数自动检测它,例如为协议指定默认端口。要验证用于连接的协议,请使用 MySQL Shell 的\status命令或 shell.status()方法。
如果在全局对象已经存在时(在启动期间或之后创建)使用\connect命令或 shell.connect()方法创建新连接session,则 MySQL Shell 将关闭由 session全局对象表示的现有连接。shell.connect()即使您将方法创建的新会话对象分配给不同的变量也是如此 。全局对象的值session(由变量引用session)仍会使用新的连接详细信息进行更新。如果您希望有多个并发连接可用,请使用中描述的替代函数创建这些连接 第 4.2.3 节,“JavaScript 和 Python 模式下的脚本会话”。
4.2.3 JavaScript 和 Python 模式下的脚本会话
您可以使用 JavaScript 和 Python 模式下可用的函数来创建所选类型的多个会话对象并将它们分配给变量。这些会话对象允许您建立和管理并发连接,以使用多个 MySQL Server 实例,或从单个 MySQL Shell 实例以多种方式使用同一实例。
mysqlx创建会话对象的函数在JavaScriptmysql 和 Python 模块 中可用 。这些模块必须在使用前导入,这是在以交互模式使用 MySQL Shell 时自动完成的。该函数 mysqlx.getSession()使用指定的连接数据打开到 MySQL 服务器实例的 X 协议连接,并返回一个Session对象来表示连接。函数 mysql.getClassicSession()并 mysql.getSession()使用指定的连接数据打开到 MySQL 服务器实例的经典 MySQL 协议连接,并返回一个ClassicSession 对象来表示连接。有了这些函数,MySQL Shell 使用的连接协议被内置到函数中,而不是使用单独的选项来选择,因此您必须选择合适的函数来为端口匹配正确的协议。
从 MySQL Shell 8.0.20 开始,MySQL Shell 在全局对象中提供了自己的 openSession()方法 shell,可以在 JavaScript 或 Python 模式下使用。 shell.openSession()适用于 X 协议和经典 MySQL 协议。您将连接协议指定为连接数据的一部分,或者让 MySQL Shell 根据您的其他连接参数(例如协议的默认端口号)自动检测它。
所有这些函数的连接数据都可以指定为类似 URI 的连接字符串,或键值对字典。您可以使用分配给它的变量访问返回的会话对象。此示例显示如何使用函数打开经典 MySQL 协议连接 mysql.getClassicSession(),该函数返回一个ClassicSession对象来表示连接:
mysql-js> var s1 = mysql.getClassicSession('user@localhost:3306', 'password');
mysql-js> s1
<ClassicSession:user@localhost:3306>
此示例显示如何 shell.openSession()在 Python 模式下使用连接所需的压缩打开 X 协议连接。Session返回 一个对象:
mysql-py> s2 = shell.open_session('mysqlx://user@localhost:33060?compression=required', 'password')
mysql-py> s2
<Session:user@localhost:33060>
使用这些函数在 JavaScript 模式下创建的会话对象只能在 JavaScript 模式下使用,如果会话对象是在 Python 模式下创建的,也会发生同样的情况。您不能在 SQL 模式下创建多个会话对象。尽管您只能在创建它们的模式下使用分配给会话对象的变量来引用会话对象,但您可以 shell.setSession()在任何模式下使用该方法将已创建并分配给变量的会话对象设置为全局对象。session例如:
mysql-js> var s3 = mysqlx.getSession('user@localhost:33060', 'password');
mysql-js> s3
<Session:user@localhost:33060>
mysql-js> shell.setSession(s3);
<Session:user@localhost:33060>
mysql-js> session
<Session:user@localhost:33060>
mysql-js> shell.status();
MySQL Shell version 8.0.18
Session type: X Protocol
Connection Id: 5
Current schema:
Current user: user@localhost
...
TCP port: 33060
...
s3现在可以使用全局对象使用 会话对象session,因此可以从任何 MySQL Shell 模式访问它所代表的 X 协议连接:SQL 模式、JavaScript 模式和 Python 模式。现在也可以使用 方法显示此连接的详细信息shell.status(),该方法仅显示全局对象表示的连接的详细信息 session。如果 MySQL Shell 实例有一个或多个打开的连接,但没有一个被设置为session全局对象,则该 shell.status()方法返回“ Not Connected ”。
您设置的会话对象 shell.setSession()将替换任何已设置为session 全局对象的现有会话对象。mysqlx如果替换的会话对象最初是使用或mysql函数之一创建并分配给变量的 shell.openSession(),则它仍然存在并且其连接保持打开状态。你可以在最初创建它的 MySQL Shell 模式下继续使用这个连接,你可以session 随时使用 shell.setSession(). 如果被替换的会话对象是用shell.connect() 方法和赋值给一个变量,同样如此。如果被替换的session对象是在启动MySQL Shell时创建的,或者是使用命令创建的\connect,或者是使用方法创建的, shell.connect()但没有赋值给变量,那么它的连接是关闭的,如果要再次使用,就必须重新创建session对象。




