mysql shell

2020-12-30

MySQL Shell提供了一种交互式代码执行模式,可以用来维护innodb集群。MySQL Shell启动时,默认情况下处于JavaScript模式;在JavaScript和Python模式下,不需要使用分号终止命令

windows安装

方法1:
http://dev.mysql.com/downloads/shell/下载MySQL Installer安装,如果在未启用X插件的情况下安装了MySQL,则稍后要安装X插件
方法2:
将Zip文件的内容解压缩到MySQL产品目录C:\Program Files\MySQL\。将bin目录(C:\Program Files\MySQL\mysql-shell-1.0.8-rc-windows-x86-64bit\bin)添加到PATH系统变量中。

linux安装

如果mysql不是使用yum安装的,那么需要先获取mysql的rpm
yum install mysql-shell

会话类型

Session:使用此会话对象类型进行新的应用程序开发,可以使用X协议的MySQL Server实例进行通信,MySQL 8.0默认安装X插件,mysql5.7需要手动安装
ClassicSession:使用此会话对象类型与没有X协议可用的MySQL Server实例进行交互。该对象用于使用经典MySQL协议在服务器上运行SQL。可用于此类会话的开发API十分有限

Session或ClassicSession命令可以切换协议

启动选项

--mysqlx(--mx) 创建一个 Session对象,该对象使用X协议连接到MySQL Server实例。
--mysql(--mc) 创建一个 ClassicSession对象,该对象使用经典的MySQL协议连接到MySQL Server实例。
--uri 指定要连接的实例
--user(-u) 连接到服务器时要使用的MySQL用户名。
--host(-h) 要连接到服务器的主机地址/IP。
--port(-P) 要连接到服务器的主机端口
--schema或--database(-D) 使用的默认架构,mysqlx或mysql
--socket[=path],-S [path] 指定unix套接字连接服务器

  • 在Unix上,--socket指定的路径用于连接Unix套接字文件的名称。如果指定--socket没有值,没有等号或-S没有值,则使用适当协议的默认Unix套接字文件。
  • 在Windows上,路径是用于连接的命名管道的名称。管道名称不区分大小写。在Windows上,您必须指定路径,并且仅适用于经典MySQL协议会话。命名管道必须以字符\\.\为前缀

--ssl-ca=file_name:PEM格式的文​​件的路径,其中包含受信任的SSL证书颁发机构的列表。
--ssl-cert=file_name:PEM格式的SSL证书文件的名称,用于建立加密连接。
--ssl-key=file_name:PEM格式的SSL密钥文件的名称,用于建立加密连接。

使用unix套接字连接服务器
\connect user@localhost?socket=%2Ftmp%2Fmysql.sock
\connect user@localhost?socket=(/tmp/mysql.sock)

启动MySQL Shell,并建立与本地MySQL Server实例的X协议连接,该实例在端口33060上侦听
shell> mysqlsh --mysqlx -u user -h localhost -P 33060

使用类似URI的连接字符串来启动MySQL Shell并创建到本地MySQL服务器实例的经典MySQL协议连接,侦听端口3306;三种方式相同
shell> mysqlsh --uri mysql://user@localhost:3306
shell> mysqlsh mysql://user@localhost:3306
shell> mysqlsh --mysql --uri user@localhost:3306

加密连接
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"});

压缩连接

如果服务器支持压缩并且可以与MySQL Shell达成一致的压缩算法,则客户端和服务器之间发送的所有信息都将被压缩
对于X协议连接,默认设置是请求压缩,如果对压缩连接的协商未成功,则允许未压缩的连接。对于经典的MySQL协议连接,默认设置为禁用压缩
\status中的Compression Disabled表示禁用压缩或Enabled表示启用压缩

从MySQL Shell 8.0.20开始启动shel时指定 --compress(-C) 是否使用连接压缩,--compression-level或--zstd-compression-level选项配置压缩级别

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

使用--compression-algorithms 指定压缩算法
指定任何压缩算法或它们的组合会自动请求连接的压缩,不必使用单独的参数来指定是需要压缩
x协议连接支持的压缩算法:zlib,LZ4和zstd
mysql经典连接支持的压缩算法:zlib和zstd算法 只有zstd算法支持压缩级别
压缩级别通过mysqlx_deflate_max_client_compression_level变量配置,默认为5。服务器允许的最高级别为5

MySQL Shell无法在8.0.14之前的版本中压缩请求。从MySQL Shell 8.0.14到8.0.19的发行版中,只能对使用经典MySQL协议压缩连接请求。默认值为不请求压缩

shell> mysqlsh --mysqlx -u user -h localhost -C required --compression-algorithms=lz4,zstd --compression-level=5

mysql-js> \connect user@example.com:33060?compression=preferred&compression-algorithms=zlib,zstd&compression-level=4

shell> mysqlsh mysqlx://user@localhost:33060?compression=disabled

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

命令

#启动
mysqlsh
#退出
\quit  \q    \exit
#状态
\status  \s
#将执行模式切换为JavaScript
\js
#将执行模式切换为Python
\py
#将执行模式切换为SQL
\sql
#连接到MySQL服务器
\connect  \c
#重新连接到同一MySQL服务器
\reconnect
#查看和编辑命令行历史记录
\history
#帮助
\help  \h  \?
查看shell状态
shell.status()

连接服务器
mysql-js> shell.connect('mysqlx://user@localhost:33060')
mysql-js> shell.connect( {scheme:'mysqlx', user:'user', host:'localhost', port:33060} )

获取session对象

创建一个ClassicSession对象使用经典的MySQL协议连接服务器
mysql-js> var s1 = mysql.getClassicSession('user@localhost:3306', 'password');
mysql-js> s1
<ClassicSession:user@localhost:3306>

在python模式下使用打开X协议连接以及压缩连接
mysql-py> s2 = shell.open_session('mysqlx://user@localhost:33060?compression=required', 'password')
mysql-py> s2
<Session:user@localhost:33060>

获取session对象
mysql-js> var s3 = mysqlx.getSession('user@localhost:33060', 'password');
mysql-js> s3
<Session:user@localhost:33060

将已创建并分配给变量的会话对象设置为全局对象
mysql-js> shell.setSession(s3);

在JavaScript模式下创建的会话对象只能在JavaScript模式下使用,如果在Python模式下创建会话对象只能在Python模式下使用。不能在SQL模式下创建多个会话对象

可插拔密码

可以使用秘密存储(例如,钥匙串)为服务器连接保留密码,在交互方式输入连接的密码,该密码与服务器URL一起存储为连接的凭据
一旦存储了服务器URL的密码,每当MySQL Shell打开会话时,它都会从已配置的Secret Store Helper中检索密码,以登录到服务器,而无需交互输入密码。

始终存储密码
shell.options.credentialStore.savePasswords ="always"
不存储密码
shell.options.credentialStore.savePasswords ="never"
在交互方式下,如果服务器URL的值与shell.credentialStore.excludeFilters不匹配,则提示您是否应该存储密码
yes保存此密码,no不保存此密码(默认值)
shell.options.credentialStore.savePasswords ="never"

指定应从自动存储密码中排除哪些服务器URL
shell.options.credentialStore.excludeFilters = ["*@myserver.com:*"];

使用mysqlshell执行文件

shell> mysqlsh --sql < code.sql
shell> mysqlsh --sql < code.js
shell> mysqlsh --sql < code.py

从文件中加载语句以执行
shell> mysqlsh --file code.js

将代码输入到命令行然后执行命令
shell> mysqlsh < code.js

sql模式下,\启动多行语句;py和js模式下的代码块会自动启动多行模式
mysql-sql> \ 

输出格式

json或json/pretty
json格式, --result-format=value启动或shell.options.set('resultFormat','json')
ndjson或json/raw
带有换行符的json原始格式, --result-format=ndjson启动或shell.options.set('resultFormat','ndjson')
json/array
数组形式的json格式, --result-format=json/array启动或shell.options.set('resultFormat','json/array')
table
默认格式,表格边界,以--result-format=table启动,或shell.options.set('resultFormat','table')
tabbed
制表符间隔,以--result-format=table启动,或shell.options.set('resultFormat','tabbed')
vertical
垂直格式,类似\G,--result-format=vertical启动,或shell.options.set('resultFormat','vertical')

查询线程报告

\show threads

命令选项:

--foreground, --background,--all
仅列出前台线程,仅后台线程或所有线程。该报告显示用于线程类型选择的一组默认默认字段,除非您使用该--format选项指定自己选择的字段。
--format
定义要为每个线程显示的自定义信息集,并指定为以逗号分隔的列列表(如果需要,还可以显示名称)。报告帮助列出了您可以包括以自定义报告的所有列。
--where,--order-by, --desc,--limit
使用逻辑表达式(--where)过滤返回的结果,对选定的列进行排序(--order-by),以降序而不是升序排序--desc,或者限制返回的线程数(--limit)。
--tid, --cid
标识要报告的线程ID或连接ID。
--general
显示有关线程的基本信息。如果您不使用以下任何选项,则默认情况下将返回此信息。
--brief
在一行上显示线程的简要说明。
--client
显示有关客户端连接和客户端会话的信息。
--innodb
显示有关使用线程的当前InnoDB事务的信息(如果有)。
--locks
显示有关锁被线程阻塞和阻塞的信息。
--prep-stmts
显示有关为线程分配的准备好的语句的信息。
--status
显示有关线程的会话状态变量的信息。您可以指定要匹配的前缀列表,在这种情况下,仅显示匹配的变量。
--vars
显示有关线程的会话系统变量的信息。您可以指定要匹配的前缀列表,在这种情况下,仅显示匹配的变量。
--user-vars
显示有关线程的用户定义变量的信息。您可以指定要匹配的前缀列表,在这种情况下,仅显示匹配的变量。
--all
除简要说明外,显示以上所有信息。

实用程序

验证MySQL服务器实例是否已准备好进行升级

checkForServerUpgrade (ConnectionData connectionData, Dictionary options)

两个参数都是可选的。第一个参数为连接数据(如果连接尚不存在),第二个时选项字典,可用于指定以下选项

  • password:实例密码
  • targetVersion:要升级的mysql实例版本
  • configPath:实例的配置文件的本地路径
  • outputFormat:返回升级检查器实用程序的输出的格式。则默认值为TEXT,可选json
mysql-js> util.checkForServerUpgrade('user@example.com:3306', {"password":"password",
    "targetVersion":"8.0.11", "configPath":"C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"})

shell> mysqlsh --util checkForServerUpgrade user@localhost:3306 --target-version=8.0.21 --output-format=JSON --config-path=/etc/mysql/my.cnf

shell> mysqlsh --util check-for-server-upgrade { --user=user --host=localhost --port=3306 } --target-version=8.0.21 --output-format=JSON --config-path=/etc/mysql/my.cnf

导入JSON实用程序,可以将JSON文档导入到MySQL Server集合或表中。导入实用程序可以处理JSON文档中表示的BSON(二进制JSON)数据类型

importJSON (path, options)

path是用于指定要导入的JSON文档的文件的文件路径,options是导入选项的字典,如果为空,则可以省略

  • schema: "db_name"
  • 目标数据库的名称。如果省略,会尝试识别和使用当前会话使用的架构名称,无法识别将报错
  • collection: "collection_name"
  • 目标集合的名称。指定表和列的替代方法,如果不存在,将创建。
  • table: "table_name"
  • 目标表的名称,指定集合的​​替代方法,如果不存在,将创建。
  • tableColumn: "column_name"
  • JSON文档要导入到的目标表中的列的名称,如果表已经存在,则指定的列必须存在于表中
  • 如果指定 table选项但忽略该tableColumn选项,则使用默认列名。如果指定tableColumn选项但忽略table选项,则将提供的导入文件的名称(不带文件扩展名)用作表名。
  • convertBsonTypes: true
  • 识别并转换使用JSON格式扩展名表示的BSON数据类型。此选项的默认值为false
  • convertBsonOid: true
  • 识别并转换MongoDB ObjectID,这是一种12字节的BSON类型,用作_id文档的值,以MongoDB扩展JSON严格模式表示
  • extractOidTime: "field_name"
  • 在文档的字段中识别并提取MongoDB ObjectID中包含的时间戳记值 ,并将其放置在导入数据的单独字段中。
mysql-js> util.importJson("/europe/regions.json", {schema: "mydb", table: "regions", tableColumn: "jsondata", convertBsonTypes: true});

shell> mysqlsh user@localhost/mydb -- util importJson products.json --collection=products
shell> mysqlsh user@host:port/mydb --import <path> [target] [tableColumn] [options]
可以使用--collection,--table和--tableColumn选项指定目标集合或目标表和列

表导出实用程序,将MySQL关系表导出到数据文件中,预设选项可用于导出DOS或UNIX系统的CSV文件以及TSV文件。无法生成JSON数据;导出的目录必须在导出之前存在。如果导出的数据文件已经存在,则将其覆盖

util.exportTable(table, outputUrl[, options])

options选项:

  • dialect: [default|csv|csv-unix|tsv]:为导出的数据文件的格式指定一组字段和行处理选项。可以使用所选择的用于进一步定制的基极,通过同时指定的一个或多个linesTerminatedBy, fieldsTerminatedBy, fieldsEnclosedBy, fieldsOptionallyEnclosed,和 fieldsEscapedBy选项来改变设置;默认选项与SELECT...INTO OUTFILE语句的默认设置创建的数据文件匹配
  • linesTerminatedBy: "characters":用来终止导出数据文件中每一行,默认\n
  • fieldsTerminatedBy: "characters":用来终止导出的数据文件中的每个字段,默认\t
  • fieldsEnclosedBy: "character":将导出数据文件中的每个字段括起来,默认为空字符串
  • fieldsOptionallyEnclosed: [ true | false ]:是否为fieldsEnclosedBy给定的字符是要封装导出数据文件中的所有字段(false),还是仅当字段具有字符串数据类型(如CHAR、BINARY、TEXT或ENUM)时才封装字段(true),默认false
  • fieldsEscapedBy: "character":在导出的数据文件中表示转义序列的字符,默认\
  • maxRate: "string":导出期间每个线程每秒最大字节数,用于数据读取吞吐量。单位为K,MB,GB,默认为0,没有限制
  • showProgress: [ true | false ]:显示(true)或隐藏(false)导出进度信息,默认true
  • compression: "string":写入导出的数据文件时使用的压缩类型,默认不压缩,可食用(gzip,zstd)
  • defaultCharacterSet: "string":在由MySQL Shell打开到服务器进行导出的会话连接期间使用的字符集。默认值为utf8mb4
mysql-js> util.exportTable("hr.employees", "file:///home/hanna/exports/employees.txt")

并行表导入实用程序,用于拆分单个数据文件,并使用多个线程将块加载到MySQL表中

importTable (filename, options)

filename用于指定要导入的数据的文件的名称和路径。options是导入选项的字典,如果为空,则可以省略。

  • schema: "db_name":连接的MySQL服务器上目标数据库的名称。如果忽略此选项,则实用程序将尝试标识和使用当前MySQL Shell会话使用的架构名称,无法识别将报错
  • table: "table_name":目标关系表的名称。如果省略此选项,则实用程序将假定表名称是不带扩展名的数据文件的名称。目标表必须存在于目标数据库中。
  • columns: array of column names:包含导入文件中列名称的字符串数组,以它们映射到目标关系表中列的顺序给出。
  • decodeColumns: dictionary:键值对字典,它通过columns选项将捕获为用户变量的导入文件列分配给 目标表中的列
  • skipRows: number:在文件开头跳过此数据行数。默认值为不跳过任何行
  • replaceDuplicates: [true|false]:是否应该替换(true)或跳过(false)输入行的主键值或唯一索引与现有行的值相同。默认值为 false。
  • dialect: [default|csv|csv-unix|tsv|json]:使用适合于指定文件格式的一组字段和行处理选项。
  • linesTerminatedBy: "characters":用来终止导出数据文件中每一行,默认\n
  • fieldsTerminatedBy: "characters":用来终止导出的数据文件中的每个字段,默认\t
  • fieldsEnclosedBy: "character":将导出数据文件中的每个字段括起来,默认为空字符串
  • fieldsOptionallyEnclosed: [ true | false ]:是否为fieldsEnclosedBy给定的字符是要封装导出数据文件中的所有字段(false),还是仅当字段具有字符串数据类型(如CHAR、BINARY、TEXT或ENUM)时才封装字段(true),默认false
  • fieldsEscapedBy: "character":在导出的数据文件中表示转义序列的字符,默认\
  • characterSet: "charset":在MySQL Shell 8.0.21中添加。此选项指定字符集编码,在导入期间使用该字符集解释输入数据文件。
  • bytesPerChunk: "size":线程为每次LOAD DATA调用发送到目标服务器的字节数(加上到达行末尾所需的任何其他字节)。该实用程序将数据划分为该大小的块,以供线程拾取并发送到目标服务器。单位为K,MB,GB
  • threads: number:用于将输入文件中的数据发送到目标服务器的最大并行线程数。如果未指定线程数,则默认最大值为8。
  • maxRate: "string":导出期间每个线程每秒最大字节数,用于数据读取吞吐量。单位为K,MB,GB,默认为0,没有限制
  • showProgress: [ true | false ]:显示(true)或隐藏(false)导出进度信息,默认true
  • compression: "string":写入导出的数据文件时使用的压缩类型,默认不压缩,可食用(gzip,zstd)
  • defaultCharacterSet: "string":在由MySQL Shell打开到服务器进行导出的会话连接期间使用的字符集。默认值为utf8mb4

实例转储实用程序,模式转储实用程序和表转储实用程序,可以将所有模式,所选模式或所选表和视图从MySQL实例导出

util.dumpInstance(outputUrl[, options]) 
util.dumpSchemas(schemas, outputUrl[, options])
util.dumpTables(schema, tables, outputUrl[, options])

转储加载实用程序,可以将使用MySQL Shell的实例转储实用程序和模式转储实用程序转储的架构导入MySQL实例

loadDump()

日志

MySQL Shell应用程序日志文件的位置是用户配置路径,文件名为mysqlsh.log。默认情况下,MySQL Shell将日志记录级别5(错误,警告和参考消息)的日志记录信息发送到此文件

使用shell启动项修改日志信息

--log-level:指示日志等级
--verbose:日志消息发送到控制台

  • 0:没有讯息。相当于应用程序日志的日志记录级别为1。默认值
  • 1:内部错误,错误,警告和参考消息。相当于应用程序日志的日志记录级别5。
  • 2:添加debug消息。相当于应用程序日志的日志记录级别6。
  • 3:添加debug2消息。相当于应用程序日志的日志记录级别为7。
  • 4:添加debug3消息,即最高级别的详细信息。相当于应用程序日志的日志记录级别8。

--dba-log-sql:记录由AdminAPI操作执行的SQL语句

  • 0:不记录由AdminAPI操作执行的SQL语句。默认
  • 1:记录由AdminAPI操作执行的SQL语句,但SELECT语句,SHOW语句和沙箱操作执行的语句 除外 。
  • 2:完整记录由常规AdminAPI操作执行的SQL语句,包括 SELECT和 SHOW语句,但不记录由沙箱操作执行的语句。

Windows上的日志文件位置:%APPDATA%\MySQL\mysqlsh\mysqlsh.log
基于Unix的系统上的日志文件位置:~/.mysqlsh/mysqlsh.log

X协议插件安装

命令行
INSTALL PLUGIN myplugin SONAME 'mysqlx.so';

配置文件
[mysqld]
plugin_load_add='mysqlx.so'
X插件监听的端口,默认33060
mysqlx_port=33060
激活X协议插件
mysqlx=ON

 

{/if}