MySQL Shell 中的提示符的样式和格式可以根据使用者的需求进行定制。我们可以配置提示符以显示有关数据库连接和使用的模式的不同或简化信息。本文将展示如何添加视觉提示,让您知道何时连接到生产数据库。

设置步骤

既然您正在阅读关于自定义 MySQL Shell 的内容,您应该已经安装了它。如果没有,请在继续之前下载并安装它。

提示主题文件

自定义 MySQL Shell 提示符的最简单方法是复制现有的提示主题文件。MySQL Shell 包含了几个提示文件。这些文件位于以下目录:

Windows - %programfiles%\MySQL\MySQL Shell 8.0\share\mysqlsh\prompt\

MacOs - /usr/local/mysql-shell/share/mysqlsh/prompt/

Linux - /usr/share/mysqlsh/prompt/

这些文件夹中的文件列表将类似于:

README.prompt

prompt_16.json

prompt_256.json

prompt_256inv.json

prompt_256pl+aw.json

prompt_256pl.json

prompt_classic.json

prompt_dbl_256.json

prompt_dbl_256pl+aw.json

prompt_dbl_256pl.json

prompt_nocolor.json

要了解不同文件包含的信息,请查看 README.prompt。

我们将要用作基础的提示文件复制到以下位置:

Linux and OS X:

Cp /usr/share/mysqlsh/prompt/prompt_256.json  ~/.mysqlsh/prompt.json   #注意目录文件名一定要是prompt.json

Windows - %AppData%\Roaming\MySQL\mysqlsh\

MacOS 和 Linux - ~/.mysqlsh/

我将在此演示中使用 cat ~/.mysqlsh/prompt.json,因为我喜欢 Powerline 字体的美学。以下是默认 JSON 的外观。

如果 MySQL Shell 已经打开,我们必须重新启动它才能添加主题。当我们使用这个文件启动 MySQL Shell 时,我们将看到以下内容:

自定义 MySQL Shell 提示符_json

以上提示符由六个部分组成:

状态:系统是否为生产系统,连接是否已丢失。

MySQL:提醒您正在使用 MySQL 数据库。

连接:您连接的主机以及使用 SSL 的端口。

模式:您正在使用的模式:JS = JavaScript,PY = Python 和 SQL = SQL。

结尾:提示符以 > 结尾。

提示背景颜色

当我使用这个提示主题时,我首先注意到提示的背景颜色与我的终端背景颜色不同。

这种颜色差异让我感到不舒服。由于我没有将黑色作为终端的背景颜色,我需要更改提示的背景颜色。是的,我可以将终端的背景更改为黑色,但那样你就学不到如何更改提示的背景颜色了。

管理提示背景颜色的 JSON 代码块(大约在第 102 行附近)是:

"prompt": {

   "text": "\ue0b0 ",

   "cont_text": "%linectx%\ue0b0 ",

   "bg": "0"  #删除加红加粗的字符串

 }

bg 属性控制提示的背景颜色。在这种情况下,它被设置为 0,即黑色。我可以通过试错来找到接近背景颜色的颜色,但如果我那样做,如果我将来为终端选择了不同的背景颜色,我就需要再次更改颜色。因此,解决这种颜色差异的简单方法是移除该设置。我将提示块更改为:

"prompt": {

   "text": "\ue0b0 ",

   "cont_text": "%linectx%\ue0b0 "

 }

当我重新启动 MySQL Shell 时,我们可以看到提示的背景颜色现在与终端背景匹配。

如果我更改终端主题,我将不需要再次更改提示的背景。

更新提示文本

接下来让我感到困扰的是主机信息有点长,因为它包括了 SSH 主机和数据库主机。我更喜欢较短的提示文本,因此我们将对此进行缩短。我们将修改的 JSON 代码块位于传输变量定义的第 94 行左右。

"transport": {

     "match": {

       "pattern": "%ssh_host%",

       "value": ""

     },

     "if_true": "%target%",

     "if_false": "%ssh_host% \u2192 %target%"

   }

这个代码块告诉 MySQL Shell,如果 %ssh_host% 的值是一个空字符串,将传输变量的值设置为 %target% 变量的值——通常这个值是由主机和端口用冒号(:)分隔的。

如果 %ssh_host% 的值不是空字符串,传输变量的值将设置为 %ssh_host% 的值,后面跟着一个右箭头的字符值,最后以 %target% 变量的值结束。

对于我的需求来说,端口号并不是必要的。我也不喜欢箭头周围的额外空格。为了解决这个问题,我将 if_false 行更改为以下内容:

"if_false": "%ssh_host%\u2192%host%"

当我重新启动 MySQL Shell 并再次连接到数据库时,提示看起来如下图所示。请注意,端口不再显示,箭头周围的空格已被移除。

自定义 MySQL Shell 提示符_json_02

生产环境的视觉提示

我经常同时运行多个数据库连接。因此,我希望添加一个视觉提示,让我知道何时连接到了生产数据库。我们已经在我们的 JSON 中有一个名为 is_production 的变量。该变量的定义大约在第 72 行附近,看起来像下面的 JSON。

"is_production": {

     "match": {

       "pattern": "*;%host%;*",

       "value": ";%env:PRODUCTION_SERVERS%;"

     },

     "if_true": "production",

     "if_false": ""

   }

默认定义会查找一个名为 PRODUCTION_SERVERS 的环境变量,以查看其值是否与 %host% 变量的值匹配。如果匹配,is_production 的值将设置为 production。如果不匹配,is_production 的值将设置为空字符串。

为了这个演示,首先在环境变量中定义PRODUCTION_SERVERS这个变量值:

[root@centos7 ~]# cat .bash_profile  

export PRODUCTION_SERVERS="172.16.1.233"

然后再修改/root/.mysqlsh/prompt.json中的数据如下:

"variables": {

   "is_production": {

     "match": {

       "pattern": "%env:PRODUCTION_SERVERS%",

       "value": "172.16.1.233"

     },

     "if_true": "production",

     "if_false": ""

   },

重新通过mysqlsh登录就是下面这样的了:

自定义 MySQL Shell 提示符_json_03

更改类值

这个提示更好了,但文本颜色应该是白色。我不确定为什么不是白色,但我认为这是因为无障碍性问题,颜色对比度不够。要更改生产标签的颜色,我们查看大约在第65行附近的生产类。

"production": {

     "text": " PRODUCTION ",

     "bg": "red",

     "fg": "white"

   }

我将改变背景和前景颜色以增加对比度。我还将把文本值从“PRODUCTION”改为“PROD”,因为我们刚刚在提示符上腾出了一些空间,现在又失去了一些。我的新的 JSON 代码块如下:

"production": {

   "text": " PROD ",

   "bg": 124,

   "fg": 15

}

我重新启动 MySQL Shell 并重新连接以查看更改。

自定义 MySQL Shell 提示符_MySQL_04

移动一个段落

在我们的提示符中,显示不同信息的部分被称为“段落”。我们可以在主题中添加、移除和移动段落。我想把“PROD”标签移到提示符的末尾,以便更容易引起我的注意。

在我们的 JSON 文件中,段落是用类似下面文本的 JSON 对象数组来定义的。

"segments": [

   {

     "classes": [

       "disconnected%host%",

       "%is_production%"

     ]

   },

   {

     "text": " My",

     "bg": 254,

     "fg": 23

   },

   {

     "separator": "",

     "text": "SQL ",

     "bg": 254,

     "fg": 166

   },

   {

     "classes": [

       "disconnected%host%",

       "%ssl%host%session%"

     ],

     "shrink": "truncate_on_dot",

     "bg": 237,

     "fg": 15,

     "weight": 10,

     "padding": 1

   },

   {

     "classes": [

       "noschema%schema%",

       "schema"

     ],

     "bg": 242,

     "fg": 15,

     "shrink": "ellipsize",

     "weight": -1,

     "padding": 1

   },

   {

     "classes": [

       "%session%trx%trx%%autocommit%"

     ],

     "weight": -1

   },

   {

     "classes": [

       "%Mode%"

     ],

     "text": "%Mode%",

     "padding": 1

   }

 ]

为了移动生产环境,我们首先从段落数组的第一个元素的 classes 属性中移除 "%is_production%"。

"segments": [

{

    "classes": [

       "disconnected%host%",

       "%is_production%" #删除加粗标红的部分

    ]

   },

删除之后如下所示:

{

 "classes": [

   "disconnected%host%"

 ]

}

接下来,在最后一个段落之前,我们创建一个新的 JSON 对象,其中在 classes 数组中有一个元素,其值为 %Mode%。我们创建一个 classes 属性作为一个数组,并将 %is_production% 添加为一个元素。最后三个段落的元素应该类似于下面的 JSON。

    "classes": [

      "%session%trx%trx%%autocommit%"

     ],

    "weight": -1

   },

{

 "classes": [

   "%is_production%"

 ]

},  #加粗的部分是新添加的

   {

      "classes": [

        "%Mode%"

      ],

      "text": "%Mode%",

      "padding": 1

    }

  ]

}

当我们重新启动 MySQL Shell 并重新连接时,PROD 标签更靠近提示的末尾,使其更容易看到。

自定义 MySQL Shell 提示符_MySQL_05

总结:

在 MySQL Shell 中自定义提示可以让我们展示我们想要的信息并隐藏我们不想要的信息。我们还可以添加视觉提示,以便在连接到生产服务器时让我们知道,并且我们可以移动不同的段落,使它们更符合我们的需求。要了解更多关于在 MySQL Shell 中自定义提示的内容,请查阅文档,同时也可以查看 README.prompt 文件的内容。



 作者:阮胜昌

拥有:MySQL8.0 OCP、Oracle OCP,Kingbase KCP,软考中级数据库系统工程师、RHCE7.0等行业认证

擅长主流数据库MySQL、Oracle、PostgreSQL的备份恢复,SQL调优、监控运维、故障应急处理等

可提供技术业务:

1.DB故障处理/疑难杂症远程支援

2.Mysql/PG/Oracle/SQLSERVER数据库技术服务

欢迎关注我的公众号:数库信息技术 第一时间一起学习新知识!