41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

MySQL Technology Cafe #7 で『MySQL Shellを使ってみよう』を聞いてからのWindowsでの導入部分

MySQL Shell をWindowsに入れてみる

先日参加してきたMySQL Technology Cafe #7MySQL Shellって何?どんなことできるの? といった初心者向けの話がされるというので聞いて来ました。

今回はそこから学んだこと、およびハマってしまったWindowsでの設定について軽く触れておきます。

(普段LinuxなのでWindowsはすっかりわからんちんになってた…)

セッションで使われた資料

MySQL Shellを使ってみよう!

資料と当日の講義から感じた思いとしては

  • MySQL ShellってInnoDB Clusterの管理をするのに必要なものってイメージで、それを使わないなら必要ないと思われてる
  • でも、そもそものコンセプトとしてはMySQL Utilitiesから派生してできたもので、色々なことができるもの
    • それなのにMySQL大好きな人たちにすら前述の認知しかされてないのでもったいない!

もっと知ってもらいたい!

  • JavaScript,Python,SQLどんな形でも簡単にDBにつないで作業できる
  • MySQLのバージョンアップグレードチェッカー機能がある
  • XdevAPIでスキーマレスJSONドキュメントの操作ができる
  • パラレルデータインポートができる
  • JSONデータのインポートができる
  • データの出力形式を色々選べる
  • バッチとして使える
  • pluginを追加すればここにない機能が追加できる!
  • 最新機能のReplica Setの管理にも使える(構築・手動HAとか)
  • イメージとしてはこちらを参照

f:id:next4us-ti:20200119092236j:plain

今回の講義では、来ているメンバーが濃い目(笑)と思ったことからプラグイン部分とRepluca Setの部分に焦点をあてたらしい。

(実際はその濃い目の人たちもMySQL Shellって普段全然触らないから何それおいしいの?って感じで温度差があったのですが)

インストール前のおススメ

https://insidemysql.com/mysql-shell-8-0-19/ https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-configuring-options.html

最新のMySQL Shellを使う!

最新を使う理由としては新しいほうがより便利になっていっていることから。

実行履歴を保存しよう!

shell.options.setPersist を使って構成ファイルへ設定を保存することができる。

実行履歴を保存するのであれば、

MySQL JS > shell.options.set('history.maxSize', 5000)
MySQL JS > shell.options.setPersist('useWizards', 'true')
MySQL JS > shell.options.setPersist('history.autoSave', 1)
  1. MySQL Shellコード履歴に保存するエントリの最大数を5000にセットし、
  2. ウィザードモードを有効にして、構成ファイルへ設定を保存
  3. MySQL Shellを終了するときに、MySQL Shellコード履歴のエントリを保存(true)するように構成ファイルへ設定を保存

とやるらしい。

デフォルトのモードを設定しよう(defaultMode)

(後述のMySQL Shellのセットアップ終わってから戻ってきて試してみてください)

まず、現状を確認してみよう。

mysqlshと打ってMySQL Shellを起動。

shell.と打って、そのあとTabを二回たたくと候補が表示される

 MySQL  JS > shell.
addExtensionObjectMember()  options
connect()                   parseUri()
createExtensionObject()     prompt()
deleteAllCredentials()      reconnect()
deleteCredential()          registerGlobal()
disablePager()              registerReport()
dumpRows()                  reports
enablePager()               setCurrentSchema()
getSession()                setSession()
help()                      status()
listCredentialHelpers()     storeCredential()
listCredentials()           unparseUri()
log()

この中からとりあえずオプション(option)を選択して同様に二回Tabをタタンとたたく。

 MySQL  JS > shell.options.
autocomplete.nameCache          interactive
batchContinueOnError            logLevel
credentialStore.excludeFilters  oci.configFile
credentialStore.helper          oci.profile
credentialStore.savePasswords   outputFormat
dba.gtidWaitTimeout             pager
dba.logSql                      passwordsFromStdin
defaultCompress                 resultFormat
defaultMode                     sandboxDir
devapi.dbObjectHandles          showColumnTypeInfo
history.autoSave                showWarnings
history.maxSize                 useWizards
history.sql.ignorePattern       verbose

じゃあ、defaultModeを見てみよう。

 MySQL  JS > shell.options.defaultMode
none

今は何も設定されていないらしいのでSQLモードにしてみる。

 MySQL  JS > shell.options.setPersist('defaultMode', 'SQL')
 MySQL  JS > shell.options.defaultMode
sql

一回抜けて入りなおしてみる。

 MySQL  JS > \q
Bye!

C:\Users\takayuki>mysqlsh
MySQL Shell 8.0.19

Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
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.
 MySQL  SQL >

確かにSQLモードになった。

こんな感じで設定変更が色々できそうだ。

MySQLシェルオプション

他にも色々な設定変更ができるので以下参照。

optionName DefaultValue Type Effect
autocomplete.nameCache TRUE ブール値 自動補完のデータベース名のキャッシュを有効にします。
batchContinueOnError FALSE ブール値(読み取り専用) SQLバッチモードでは、エラーが見つかった場合、処理を強制的に続行します。
dba.gtidWaitTimeout 60 0より大きい整数 AdminAPI操作で必要な場合に、GTIDトランザクションが適用されるのを待機する秒単位のタイムアウトInnoDBクラスターの操作を参照 )
dba.logSql 0 0から2の範囲の整数 AdminAPI操作によって実行されるSQLステートメントをログに記録します(第8章「 MySQLシェルのロギングとデバッグ」を参照)。
defaultCompress FALSE ブール値 すべてのグローバルセッションで可能であれば、クライアントとサーバー間で送信される情報の圧縮を有効にします(クラシックMySQLプロトコル接続のみ)。
defaultMode None 文字列(sql、js、またはpy) MySQLシェルの起動時に使用するモード(SQLJavascript、またはPython)。
devapi.dbObjectHandles TRUE ブール値 DevAPI dbオブジェクトのテーブル名とコレクション名のハンドルを有効にします。
history.autoSave FALSE ブール値 MySQL Shellを終了するときに、MySQL Shellコード履歴のエントリを保存(true)またはクリア(false)します( セクション5.5「コード履歴」を参照)。
history.maxSize 1000 整数 MySQL Shellコード履歴に保存するエントリの最大数。
history.sql.ignorePattern IDENTIFIED : PASSWORD 文字列 これらのパターンに一致する文字列は、MySQL Shellコード履歴に追加されません。
interactive TRUE ブール値(読み取り専用) 対話モードを有効にします。
logLevel Requires a value 1から8の範囲の整数 アプリケーションログのログレベルを設定します(第8章「 MySQLシェルのログとデバッグ」を参照)。
pager None 文字列 指定された外部ポケットベルツールを使用して、テキストと結果を表示します。ツールのコマンドライン引数を追加できます(セクション4.6「ページャーの使用」を参照 )。
passwordsFromStdin FALSE ブール値 stdin端末の代わりにパスワードを読み取ります。
resultFormat table 文字列(table, 水平タブ区切り, 垂直タブ区切り, json json/pretty, ndjson | json/raw, json/array)|結果セットを印刷するためのデフォルトの出力形式( セクション5.7「出力形式」を参照)。
sandboxDir プラットフォームに依存 文字列 サンドボックスディレクトリ。デフォルトはWindowsでは C:\Users\MyUser\MySQL\mysql-sandboxes であり、Unixシステムでは $HOME/mysql-sandboxes です。
showColumnTypeInfo FALSE ブール値 SQLモードでは、結果セットの列メタデータを表示します。
showWarnings TRUE ブール値 SQLモードでは、SQL警告があれば自動的に表示します。
useWizards TRUE ブール値 ウィザードモードを有効にします。
verbose 1 0から4の範囲の整数 コンソールへの詳細出力を有効にし、詳細レベルを設定します(第8章「 MySQLシェルのロギングとデバッグ」を参照)。

参照:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-configuring-options.html

Windows でのMySQL Shellのセットアップ

さて、現場でちょっとハマったセットアップの話。

自分が使ったのはWindowsマシンだったのでその方法を以下記載。

1. インストーラをダウンロード

f:id:next4us-ti:20200119092319j:plain

ハマったのは以下のポイント

  • プラグインを試したい場合、%AppData%\MySQL\mysqlsh\pluginsフォルダを作ってそこに入れる
    • 資料のほうが%AppData% とMySQLの間の\が抜けててそれに最初気づけなかった
  • あ、俺のPC、今Git入れてないわ…。(ZIP方式に切り替え)

2. 確認

f:id:next4us-ti:20200119092411j:plain

3. 起動について(講義にはない。補足)

  • 起動スクリプトというものを用意することでJavaScriptPythonモードで起動した場合は実行環境をカスタマイズできる(9.1 Working With Startup Scripts
  • 起動スクリプトは以下のどこかに、Pythonならmysqlshrc.pyJavaScriptならmysqlshrc.jsという名前で置く(以下Windowsでの話にしているが、Unix/Linuxも同様)
    • 標準のグローバル構成パス:Windowsの場合: %PROGRAMDATA%\MySQL\mysqlsh\mysqlshrc.[js|py]
    • MYSQLSH_HOMEを作った場合:Windowsの場合: %MYSQLSH_HOME%\share\mysqlsh\mysqlshrc.[js|py]
    • mysqlshバイナリを含むフォルダー内:Windowsの場合: (mysqlsh binary path)\mysqlshrc.[js|py]
    • MYSQLSH_USER_CONFIG_HOMEを作った場合:Windowsの場合: %MYSQLSH_USER_CONFIG_HOME%\mysqlshrc.[js|py]
    • 標準ユーザー設定パス:Windowsの場合: %APPDATA%\MySQL\mysqlsh\mysqlshrc.[js|py]
    • 但し、あとで読み込まれたほうが優先されるので置き場所は注意!
  • 例えば、以下のようにして起動スクリプトのモジュール検索パスを追加できる

Python(mysqlshrc.py)

# Import the sys module
import sys

# Append the additional module paths
sys.path.append('~/custom/python')
sys.path.append('~/other/custom/modules')

JavaScript(mysqlshrc.js)

// Append the additional module paths
  sys.path = [...sys.path, '~/custom/js'];
  sys.path = [...sys.path, '~/other/custom/modules'];

9.2.2 Module Search Path Variable in Startup Scripts参照

次の段階

下準備はできたので、ここから以下を少しずつ進めてみたい。

  • 公式ドキュメントを一通り読んで触ってみる
  • 講義でやってたpluginを試す(起動スクリプトが置かれているフォルダの下にpluginsというフォルダを作ってそこに置く)
  • 同様に、Replica Setも触ってみる
  • 書籍を読む⇒Charles BellのIntroducing MySQL Shell
  • (余裕があれば)pluginを作る