MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MySQL - MySQL Shellのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MySQL - MySQL Shell
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == MySQL Shell (mysqlsh) は、MySQL用の高度なコマンドラインクライアントおよびコードエディタである。<br> 従来のmysqlクライアントの後継として開発され、SQL、JavaScript、Pythonの3つの言語をサポートする対話型シェルおよびスクリプティング環境を提供する。<br> <br> MySQL Shellは、MySQLサーバへの接続、クエリ実行、データベース管理に加えて、以下の高度な機能を備えている。<br> AdminAPIによるInnoDB Cluster、InnoDB ClusterSet、InnoDB ReplicaSetの管理、X DevAPIによるドキュメントストア操作、データのダンプ・復元ユーティリティ、アップグレードチェッカー、プラグインシステムによる機能拡張が可能である。<br> <br> MySQL 8.0以降では、MySQL Shellが推奨される管理ツールとなっている。<br> 従来のmysqlクライアントに比べて、対話的な操作性、自動補完機能、構文ハイライト、複数言語サポート、高度な管理APIの面で優れている。<br> <br> MySQL Shellは、X Protocolとクラシック MySQL Protocolの両方をサポートする。<br> X Protocolは、MySQL 8.0で導入された新しいプロトコルであり、ドキュメントストア機能やRESTful操作を提供する。<br> <br> 主要な使用場面として、InnoDB Clusterの構築・運用管理、データベースの論理バックアップと復元、MySQL 5.7から8.0へのアップグレード準備、ドキュメント指向データベースとしてのMySQLの利用、スクリプトによる自動化処理がある。<br> <br> MySQL Shell 8.0以降では、VS Code統合拡張機能 (MySQL Shell for VS Code) も提供されており、GUI環境でのMySQL管理も可能である。<br> <br> 動作環境は、Linux、Windows、MacOSをサポートし、MySQL 5.7以降のサーバに接続可能である。<br> <br><br> == インストール == ==== Linux ==== ===== RHEL ===== MySQL Yumリポジトリを追加してインストールする。<br> <br> sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm sudo dnf install mysql-shell <br> ===== SUSE ===== MySQL公式リポジトリを追加してインストールする。<br> <br> # リポジトリを追加 sudo zypper addrepo https://dev.mysql.com/get/mysql84-community-release-sl15-1.noarch.rpm # リポジトリを更新 sudo zypper refresh # MySQL Shellをインストール sudo zypper install mysql-shell <br> ==== Windows ==== * MSIインストーラを使用する方法 *# MySQL公式Webサイト (https://dev.mysql.com/downloads/shell/) からMSIインストーラをダウンロードして実行する。 *# インストールウィザードの指示に従って進める。 *# デフォルトインストールパスは <u>C:\Program Files\MySQL\MySQL Shell 8.0</u> である。 * ZIP形式パッケージを使用する方法 *# MySQL公式WebサイトからZIPファイルをダウンロードする。 *# 任意のディレクトリに解凍する。 *# 解凍先の <u>bin</u> ディレクトリを環境変数PATHに追加する。 <br> 環境変数 <code>PATH</code> への追加方法を以下に示す。<br> <br> <syntaxhighlight lang="powershell"> # PowerShellを管理者として実行 # 環境変数PATHに追加 [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\MySQL\MySQL Shell 8.0\bin", [EnvironmentVariableTarget]::Machine) </syntaxhighlight> <br> ==== MacOS ==== MacOS環境でのインストール方法を以下に示す。<br> <br> * DMGファイルを使用する方法 *# MySQL公式Webサイト (https://dev.mysql.com/downloads/shell/) からDMGファイルをダウンロードする。 *# DMGファイルをマウントしてインストーラを実行する。 *# インストールウィザードの指示に従って進める。 * Homebrewを使用する方法 *# 以下に示すコマンドを実行する。 *#: <pre>brew install mysql-shell</pre> <br> ==== インストールの確認 ==== インストールが正常に完了したかを確認する方法を以下に示す。<br> <br> # バージョン確認 mysqlsh --version # 出力例 # mysqlsh Ver 8.0.35 for Linux on x86_64 - for MySQL 8.0.35 (MySQL Community Server (GPL)) <br> MySQL Shellの起動確認を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # MySQL Shellを起動 mysqlsh # 出力例 # MySQL Shell 8.0.35 # # Copyright (c) 2016, 2023, Oracle and/or its affiliates. # 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 JS > </syntaxhighlight> <br> プロンプトが表示されれば、インストールは成功している。<br> <code>\quit</code> または <code>\q</code> コマンドで終了できる。<br> <br><br> == 接続と認証 == MySQL Shellは、クラシックMySQL Protocol と X Protocolの2つの接続方式をサポートする。<br> 接続方法は、URIスキームまたはコマンドラインオプションで指定する。<br> <br> ==== 接続URI形式 ==== MySQL Shellでは、標準的なURI形式で接続先を指定できる。<br> <br> 基本的なURI形式を以下に示す。<br> <br> [scheme://][user[:[password]]@]host[:port][/schema][?attribute1=value1&attribute2=value2...] <br> 下表に、各要素の説明を示す。<br> <br> <center> {| class="wikitable" |+ MySQL 接続URIの構成要素 ! 要素 !! 説明 |- | scheme || <code>mysqlx</code> (X Protocol) または <code>mysql</code> (Classic Protocol) |- | user || MySQLユーザアカウント名 |- | password || パスワード (セキュリティ上、URIに含めないことを推奨) |- | host || ホスト名またはIPアドレス |- | port || ポート番号 (X Protocol: 33060、Classic: 3306) |- | schema || 接続後のデフォルトスキーマ |- | attribute || 接続オプション (ssl-mode、compression等) |} </center> <br> 接続URI例を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # X Protocol接続 (デフォルトポート33060) mysqlsh mysqlx://user_name@localhost:33060 # Classic Protocol接続 (デフォルトポート3306) mysqlsh mysql://root@192.168.1.100:3306/mydb # スキーマ指定あり mysqlsh mysqlx://user@localhost:33060/testdb # SSL接続を強制 mysqlsh mysqlx://user@localhost:33060/testdb?ssl-mode=REQUIRED # 複数の接続オプション指定 mysqlsh mysqlx://user@localhost:33060?ssl-mode=REQUIRED&compression=zstd </syntaxhighlight> <br> パスワードをURIに含める場合 (非推奨) の例を以下に示す。<br> <br> # パスワードをURIに含める (セキュリティリスクあり) mysqlsh mysql://root:password@192.168.1.100:3306/mydb <br> <u>ただし、セキュリティ上の理由から、パスワードは対話式で入力することを推奨する。</u><br> <br> ==== クラシックセッション (MySQL Protocol) ==== クラシックセッションは、従来のMySQL接続プロトコルを使用する。<br> SQL実行専用であり、X DevAPIは使用できない。<br> <br> クラシックセッションでの接続方法を以下に示す。<br> <br> # URI形式 mysqlsh mysql://user@localhost:3306 # コマンドラインオプション形式 mysqlsh --mysql -u user -h localhost -P 3306 # パスワードを対話式で入力 mysqlsh --mysql -u root -h localhost -p <br> 対話型モードでの接続例を以下に示す。<br> <br> # MySQL Shellを起動 mysqlsh # 対話型モードで接続 MySQL JS > \connect mysql://user@localhost:3306 Creating a Classic session to 'user@localhost:3306' Please provide the password for 'user@localhost:3306': **** <br> クラシックセッションの特徴を以下に示す。<br> <br> * 従来のMySQLプロトコル使用 * SQL文の実行のみサポート * MySQL 5.7以前のサーバにも接続可能 * デフォルトポート *: 3306 <br> ==== Xプロトコルセッション (X DevAPI) ==== Xプロトコルセッションは、MySQL X Pluginを使用した新しいプロトコルである。<br> SQL、JavaScript、Pythonでの実行が可能であり、ドキュメントストア機能もサポートする。<br> <br> Xプロトコルセッションでの接続方法を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # URI形式 mysqlsh mysqlx://user@localhost:33060 # コマンドラインオプション形式 mysqlsh --mysqlx -u user -h localhost -P 33060 # パスワードを対話式で入力 mysqlsh --mysqlx -u root -h localhost -p </syntaxhighlight> <br> Xプロトコルセッションの特徴を以下に示す。<br> <br> * 新しいMySQLプロトコル (MySQL X Plugin使用) * SQL、JavaScript、Pythonで実行可能 * JSON/ドキュメントストア機能対応 * CRUD操作のAPI提供 * デフォルトポート: 33060 <br> MySQL Serverで X Plugin が有効になっているかを確認する方法を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> -- X Pluginの状態確認 SHOW PLUGINS; -- X Pluginがインストールされているか確認 SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'mysqlx'; </syntaxhighlight> <br> X Pluginが無効の場合は、以下のコマンドで有効化する。<br> <br> <syntaxhighlight lang="mysql"> -- X Pluginをインストール INSTALL PLUGIN mysqlx SONAME 'mysqlx.so'; </syntaxhighlight> <br> <u>なお、MySQL 8.0以降では、X Pluginはデフォルトで有効化されている。</u><br> <br> ==== 接続オプション ==== 下表に、MySQL Shellの接続時に使用可能な主要なコマンドラインオプションを示す。<br> <br> <center> {| class="wikitable" |+ 接続関連オプション ! オプション !! 短縮形 !! 説明 |- | --host || -h || ホスト名またはIPアドレス |- | --port || -P || ポート番号 (X Protocol: 33060、Classic: 3306) |- | --user || -u || ユーザ名 |- | --password || -p || パスワード (値を指定しない場合は対話式入力) |- | --socket || -S || UNIXソケットファイルのパス |- | --ssl-mode || || SSL接続モード (DISABLED、PREFERRED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY) |- | --ssl-ca || || CA証明書ファイルのパス |- | --ssl-cert || || クライアント証明書ファイルのパス |- | --ssl-key || || クライアント秘密鍵ファイルのパス |- | --get-server-public-key || || サーバ公開鍵を取得 |- | --auth-method || || 認証方法を指定 |- | --mysql || -mc || クラシックセッションを使用 |- | --mysqlx || -mx || Xプロトコルセッションを使用 |} </center> <br> * SSL接続の例 *: <syntaxhighlight lang="text"> # SSL接続を強制 (証明書検証あり) mysqlsh --ssl-mode=REQUIRED --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem -u user -h localhost # URI形式でSSL接続を指定 mysqlsh mysqlx://user@localhost:33060?ssl-mode=REQUIRED&ssl-ca=/path/to/ca.pem </syntaxhighlight> *: <br> * 認証方式の指定例 *: <syntaxhighlight lang="text"> # 認証方式を指定 mysqlsh --auth-method=caching_sha2_password -u user -h localhost </syntaxhighlight> <br> ==== 接続の管理 ==== 対話型モード内での接続管理方法を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # MySQL Shellを起動 mysqlsh # MySQL Protocolで接続 MySQL JS > \connect mysql://user@localhost:3306 # X Protocolで接続 MySQL JS > \connect mysqlx://user@localhost:33060 # オプション付き接続 MySQL JS > \connect --mysql -u user -h localhost # セッション情報の確認 MySQL JS > \status # 接続を切断 MySQL JS > \disconnect </syntaxhighlight> <br> * JavaScriptモードでの接続管理 *: <syntaxhighlight lang="javascript"> // X Protocol接続 shell.connect('mysqlx://user@localhost:33060') // Classic Protocol接続 shell.connect('mysql://user@localhost:3306') // 現在のセッション情報を取得 session // セッションを閉じる session.close() </syntaxhighlight> *: <br> * Pythonモードでの接続管理 *: <syntaxhighlight lang="python"> # X Protocol接続 shell.connect('mysqlx://user@localhost:33060') # Classic Protocol接続 shell.connect('mysql://user@localhost:3306') # 現在のセッション情報を取得 session # セッションを閉じる session.close() </syntaxhighlight> <br><br> == モードの切り替え == MySQL Shellは、SQLモード、JavaScriptモード、Pythonモードの3つの言語モードをサポートする。<br> モードの切り替えは、<code>\sql</code>、<code>\js</code>、<code>\py</code> コマンドで行う。<br> <br> ==== SQLモード ==== SQLモードは、SQL文を直接実行するモードである。<br> 従来のmysqlクライアントと同様の操作が可能である。<br> <br> * SQLモードへの切り替え方法 *: <syntaxhighlight lang="text"> # SQLモードに切り替え MySQL JS > \sql Switching to SQL mode... Commands end with ; # プロンプトが変化する MySQL SQL > </syntaxhighlight> *: <br> * SQLモードでのクエリ実行例 *: <syntaxhighlight lang="mysql"> MySQL SQL > SHOW DATABASES; MySQL SQL > USE mydb; MySQL SQL > SELECT * FROM users LIMIT 10; MySQL SQL > CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(100)); </syntaxhighlight> <br> SQLモードの特徴を以下に示す。<br> <br> * SQL文の直接実行 * セミコロン (;) で文を終了 * 複数行にわたるSQL文の実行が可能 * MySQL Serverへの直接クエリ実行 <br> ==== JavaScriptモード ==== JavaScriptモードは、JavaScript言語でMySQLを操作するモードである。<br> MySQL Shellのデフォルトモードである。<br> <br> * JavaScriptモードへの切り替え方法 *: <syntaxhighlight lang="text"> # JavaScriptモードに切り替え MySQL SQL > \js Switching to JavaScript mode... # プロンプトが変化する MySQL JS > </syntaxhighlight> *: <br> * JavaScriptモードでの操作例 *: <syntaxhighlight lang="javascript"> // SQL実行 session.runSql('SHOW DATABASES') // データベース操作 db = session.getSchema('mydb') // テーブル操作 table = db.getTable('users') result = table.select().limit(10).execute() // AdminAPI操作 cluster = dba.getCluster() cluster.status() </syntaxhighlight> <br> JavaScriptモードの特徴を以下に示す。<br> <br> * JavaScript言語の完全サポート * AdminAPI、X DevAPI、ShellAPIの利用が可能 * オブジェクト指向のAPI * スクリプトファイルの実行が可能 <br> ==== Pythonモード ==== Pythonモードは、Python言語でMySQLを操作するモードである。<br> <br> * Pythonモードへの切り替え方法 *: <syntaxhighlight lang="text"> # Pythonモードに切り替え MySQL JS > \py Switching to Python mode... # プロンプトが変化する MySQL Py > </syntaxhighlight> *: <br> * Pythonモードでの操作例 *: <syntaxhighlight lang="python"> # SQL実行 session.run_sql('SHOW DATABASES') # データベース操作 db = session.get_schema('mydb') # テーブル操作 table = db.get_table('users') result = table.select().limit(10).execute() # AdminAPI操作 cluster = dba.get_cluster() cluster.status() </syntaxhighlight> <br> Pythonモードの特徴を以下に示す。<br> <br> * Python言語の完全サポート * AdminAPI、X DevAPI、ShellAPIの利用が可能 * Pythonライブラリとの統合が可能 * スクリプトファイルの実行が可能 <br> ==== デフォルトモードの設定 ==== MySQL Shell起動時のデフォルトモードを変更する方法を以下に示す。<br> <br> * コマンドラインオプションでモードを指定する方法 *: <syntaxhighlight lang="text"> # JavaScriptモードで起動 mysqlsh --js # Pythonモードで起動 mysqlsh --py # SQLモードで起動 mysqlsh --sql </syntaxhighlight> *: <br> * 永続的にデフォルトモードを変更する方法 *: <syntaxhighlight lang="javascript"> // デフォルトモードをJavaScriptに設定 shell.options.setPersist('defaultMode', 'js') // デフォルトモードをPythonに設定 shell.options.setPersist('defaultMode', 'py') // デフォルトモードをSQLに設定 shell.options.setPersist('defaultMode', 'sql') </syntaxhighlight> <br> 設定は、<u>~/.mysqlsh/mysqlsh.json</u> (Linux / MacOS) または <u>%APPDATA%\MySQL\mysqlsh\mysqlsh.json</u> (Windows) に保存される。<br> <br><br> == 基本操作 == ==== 対話型シェルの使用 ==== 対話型シェルは、コマンドを1つずつ実行するモードである。<br> <br> * MySQL Shellの起動方法 *: <syntaxhighlight lang="text"> # MySQL Shellを起動 mysqlsh # 接続と同時に起動 (X Protocol) mysqlsh mysqlx://user@localhost:33060 # 接続と同時に起動 (Classic Protocol) mysqlsh mysql://user@localhost:3306 # SQLモードで起動 mysqlsh --sql -u user -h localhost </syntaxhighlight> *: <br> * 対話型シェルでの基本コマンド *: <syntaxhighlight lang="text"> # ヘルプ表示 \help \? # 接続 \connect mysql://user@localhost:3306 # モード切り替え \sql \js \py # 接続状態確認 \status # 切断 \disconnect # 終了 \quit \q \exit </syntaxhighlight> <br> ==== バッチモード (スクリプト実行) ==== * スクリプトファイルを実行する方法 *: <syntaxhighlight lang="text"> # JavaScriptファイルを実行 mysqlsh --file script.js # Pythonファイルを実行 mysqlsh --file script.py # SQLファイルを実行 mysqlsh --file script.sql # 標準入力からSQL実行 mysqlsh --sql < query.sql # 接続先を指定してスクリプト実行 mysqlsh mysql://user@localhost:3306 --file backup.js </syntaxhighlight> *: <br> * 対話型モード内でのスクリプト実行 *: <syntaxhighlight lang="text"> # JavaScriptファイルを実行 MySQL JS > \source /path/to/script.js # Pythonファイルを実行 MySQL Py > \source /path/to/script.py # SQLファイルを実行 MySQL SQL > \source /path/to/query.sql </syntaxhighlight> <br> ==== コマンド履歴と自動補完 ==== MySQL Shellは、コマンド履歴と自動補完機能を提供する。<br> <br> コマンド履歴のナビゲーション方法を以下に示す。 * 矢印キー (上下) で過去のコマンドを呼び出し * [Ctrl] + [R]キーで履歴の逆方向検索 * [Ctrl] + [S]キーで履歴の順方向検索 <br> コマンド履歴は、以下のファイルに保存される。<br> <br> * Linux / MacOS *: <u>~/.mysqlsh/mysqlsh_history</u> * Windows *: <u>%APPDATA%\MySQL\mysqlsh\mysqlsh_history</u> <br> * 自動補完の使用方法 ** Tabキーで補完候補を表示 ** スキーマ名、テーブル名、カラム名の補完 ** コマンド、関数名の補完 *: <br> * 自動補完の設定変更を以下に示す。 *: <syntaxhighlight lang="javascript"> // 自動補完を無効化 shell.options.set('autocomplete.nameCache', false) // 履歴自動保存を無効化 shell.options.set('history.autoSave', false) </syntaxhighlight> <br> ==== ヘルプシステム ==== MySQL Shellのヘルプシステムの使用方法を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # 一般的なヘルプ表示 \help \? # コマンド一覧表示 \help commands # 特定の関数のヘルプ表示 \help dba.createCluster # AdminAPIのヘルプ \help dba # X DevAPIのヘルプ \help mysqlx </syntaxhighlight> <br> JavaScriptモードでのヘルプ表示を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // オブジェクトのヘルプ dba.help() // メソッドのヘルプ dba.help('createCluster') // シェルオブジェクトのヘルプ shell.help() </syntaxhighlight> <br> 出力フォーマットの設定を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // テーブル形式 (デフォルト) shell.options.set('resultFormat', 'table') // JSON形式 shell.options.set('resultFormat', 'json') // JSON形式 (整形) shell.options.set('resultFormat', 'json/pretty') // タブ区切り形式 shell.options.set('resultFormat', 'tabbed') // 縦形式 shell.options.set('resultFormat', 'vertical') </syntaxhighlight> <br><br> == AdminAPI == AdminAPIは、MySQL高可用性デプロイメントの管理を簡素化するAPI群である。<br> InnoDB Cluster、InnoDB ClusterSet、InnoDB ReplicaSetの構築・運用管理を自動化する。<br> <br> ==== AdminAPIとは ==== AdminAPIは、<code>dba</code> グローバルオブジェクトを通じて提供される。<br> 主要な機能として、InnoDB Clusterの作成・管理、InnoDB ReplicaSetの作成・管理、InnoDB ClusterSetの作成・管理、サーバ設定の検証・調整がある。<br> <br> 下表に、AdminAPIの主要オブジェクトを示す。<br> <br> <center> {| class="wikitable" |+ AdminAPI の主要オブジェクト ! オブジェクト !! 説明 |- | dba || AdminAPIのエントリポイント |- | Cluster || InnoDB Clusterオブジェクト |- | ReplicaSet || InnoDB ReplicaSetオブジェクト |- | ClusterSet || InnoDB ClusterSetオブジェクト |} </center> <br> ==== InnoDB Cluster ==== InnoDB Clusterは、Group Replicationベースの高可用性ソリューションである。<br> 自動フェイルオーバー、自動メンバー管理、読み書き分離をサポートする。<br> <br> ===== クラスタの作成 ===== InnoDB Clusterを作成する手順を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // サーバ設定の確認 dba.checkInstanceConfiguration('user@host1:3306') // サーバ設定の調整 (必要な場合) dba.configureInstance('user@host1:3306') // クラスタの作成 cluster = dba.createCluster('MyCluster') // クラスタの状態確認 cluster.status() </syntaxhighlight> <br> クラスタ作成時のオプション指定例を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // オプション指定 cluster = dba.createCluster('MyCluster', { multiPrimary: false, force: false, adoptFromGR: false, memberWeight: 50, consistency: 'EVENTUAL', expelTimeout: 5 }) </syntaxhighlight> <br> 下表に、主要なオプションの説明を示す。<br> <br> <center> {| class="wikitable" |+ dba.createCluster() オプション ! オプション !! 説明 |- | multiPrimary || マルチプライマリモード (デフォルト: false、シングルプライマリモード) |- | force || Group Replicationが既に実行中でも強制的にクラスタを作成 |- | adoptFromGR || 既存のGroup Replicationクラスタを採用 |- | consistency || 読み取り整合性レベル (EVENTUAL、BEFORE_ON_PRIMARY_FAILOVER、BEFORE、AFTER、BEFORE_AND_AFTER) |- | expelTimeout || メンバー除外タイムアウト (秒) |} </center> <br> ===== クラスタへのインスタンス追加 ===== クラスタにインスタンスを追加する方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // クラスタオブジェクトを取得 cluster = dba.getCluster() // インスタンスを追加 cluster.addInstance('user@host2:3306') // パスワード指定 cluster.addInstance('user@host3:3306', {password: 'pass'}) // クローン方式でリカバリ cluster.addInstance('user@host4:3306', {recoveryMethod: 'clone'}) </syntaxhighlight> <br> インスタンス追加時のオプション指定例を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> cluster.addInstance('user@host2:3306', { password: 'pass', recoveryMethod: 'clone', waitRecovery: 3, label: 'secondary-1', memberWeight: 25, autoRejoinTries: 3 }) </syntaxhighlight> <br> 下表に、主要なオプションの説明を示す。<br> <br> <center> {| class="wikitable" |+ cluster.addInstance() オプション ! オプション !! 説明 |- | recoveryMethod || リカバリ方式 (clone、incremental、auto) |- | waitRecovery || リカバリ完了を待つタイムアウト<br>0: 待たない<br>1〜3: 進捗表示レベル |- | label || インスタンスのラベル |- | autoRejoinTries || 自動再参加の試行回数 |} </center> <br> ===== クラスタのステータス確認 ===== クラスタの状態を確認する方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // クラスタオブジェクトを取得 cluster = dba.getCluster() // ステータス確認 cluster.status() // 詳細なステータス確認 cluster.status({extended: 1}) // さらに詳細なステータス確認 cluster.status({extended: 2}) </syntaxhighlight> <br> 出力例を以下に示す。<br> <br> <syntaxhighlight lang="json"> { "clusterName": "MyCluster", "defaultReplicaSet": { "name": "default", "primary": "host1:3306", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": { "host1:3306": { "address": "host1:3306", "mode": "R/W", "readReplicas": {}, "role": "HA", "status": "ONLINE" }, "host2:3306": { "address": "host2:3306", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "ONLINE" } } } } </syntaxhighlight> <br> ステータスの意味を以下に示す。<br> <br> <center> {| class="wikitable" |+ InnoDB Cluster インスタンスのステータス ! ステータス !! 説明 |- | ONLINE || インスタンスは正常に動作中 |- | RECOVERING || インスタンスはリカバリ中 |- | OFFLINE || インスタンスは到達不可 |- | ERROR || インスタンスはエラー状態 |- | MISSING || インスタンスはクラスタから削除済み |} </center> <br> ===== フェイルオーバーと高可用性 ===== InnoDB Clusterは、自動フェイルオーバーをサポートする。<br> プライマリインスタンスが停止すると、自動的に新しいプライマリが選出される。<br> <br> * 手動でのフェイルオーバー (プライマリ切り替え) *: <syntaxhighlight lang="javascript"> // 特定のインスタンスをプライマリに設定 cluster.setPrimaryInstance('user@host2:3306') </syntaxhighlight> *: <br> * クォーラムが失われた場合の対処方法 *: <syntaxhighlight lang="javascript"> // クォーラムを強制的に回復 (残存インスタンスを使用) cluster.forceQuorumUsingPartitionOf('user@host1:3306') // 失ったメンバーを再参加 cluster.rejoinInstance('user@host3:3306') </syntaxhighlight> <br> ==== InnoDB ReplicaSet ==== InnoDB ReplicaSetは、非同期レプリケーションベースの高可用性ソリューションである。<br> GTIDベースのレプリケーションを使用し、手動フェイルオーバーをサポートする。<br> <br> ===== ReplicaSetの作成と管理 ===== InnoDB ReplicaSetを作成する手順を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // サーバ設定の確認 dba.checkInstanceConfiguration('user@host1:3306') // サーバ設定の調整 dba.configureReplicaSetInstance('user@host1:3306') // ReplicaSetの作成 replicaSet = dba.createReplicaSet('MyReplicaSet') // インスタンスを追加 replicaSet.addInstance('user@host2:3306') replicaSet.addInstance('user@host3:3306') // ステータス確認 replicaSet.status() </syntaxhighlight> <br> ReplicaSetの特徴を以下に示す。<br> <br> * 非同期レプリケーション (GTIDベース) * 手動フェイルオーバー * シングルプライマリモード * InnoDB Clusterより軽量 <br> ===== プライマリの切り替え ===== * プライマリインスタンスを手動で切り替える方法 *: <syntaxhighlight lang="javascript"> // ReplicaSetオブジェクトを取得 replicaSet = dba.getReplicaSet() // プライマリを切り替え replicaSet.setPrimaryInstance('user@host2:3306') </syntaxhighlight> *: <br> * 強制的なプライマリ切り替え (元プライマリが停止している場合) *: <syntaxhighlight lang="javascript"> // 強制的にプライマリを切り替え replicaSet.forcePrimaryInstance('user@host2:3306') </syntaxhighlight> <br> ==== InnoDB ClusterSet ==== InnoDB ClusterSetは、複数のInnoDB Clusterを統合した災害復旧ソリューションである。<br> グローバルデプロイメントや災害対策に使用される。<br> <br> ===== ClusterSetの作成 ===== InnoDB ClusterSetを作成する手順を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // プライマリクラスタを取得 cluster = dba.getCluster() // ClusterSetを作成 clusterset = cluster.createClusterSet('MyClusterSet') // セカンダリクラスタを追加 clusterset.createReplicaCluster('user@replica-host1:3306', 'ReplicaCluster1') // ClusterSetのステータス確認 clusterset.status() </syntaxhighlight> <br> ===== 災害復旧とフェイルオーバー ===== ClusterSet全体のフェイルオーバー方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // ClusterSetオブジェクトを取得 clusterset = dba.getClusterSet() // セカンダリクラスタをプライマリに昇格 clusterset.setPrimaryCluster('ReplicaCluster1') // 強制的なフェイルオーバー (プライマリクラスタが停止している場合) clusterset.forcePrimaryCluster('ReplicaCluster1') </syntaxhighlight> <br><br> == ユーティリティ == MySQL Shellは、データベース管理のための豊富なユーティリティ関数を提供する。<br> <u>util</u> グローバルオブジェクトを通じてアクセスする。<br> <br> ==== データのエクスポート (util.dumpSchemas / util.dumpInstance) ==== データベースの論理バックアップを取得する方法を以下に示す。<br> <br> * スキーマ単位のダンプ *: <syntaxhighlight lang="javascript"> // 特定のスキーマをダンプ util.dumpSchemas(['schema1', 'schema2'], '/path/to/dump') // 全てのスキーマをダンプ (システムスキーマ除く) util.dumpSchemas([], '/path/to/dump', {includeSchemas: []}) // オプション指定 util.dumpSchemas(['mydb'], '/path/to/dump', { threads: 4, compression: 'zstd', chunking: true, bytesPerChunk: '64M', showProgress: true }) </syntaxhighlight> *: <br> * インスタンス全体のダンプ *: <syntaxhighlight lang="javascript"> // インスタンス全体をダンプ util.dumpInstance('/path/to/dump') // オプション指定 util.dumpInstance('/path/to/dump', { threads: 8, compression: 'zstd', excludeSchemas: ['mysql', 'sys', 'performance_schema'], ocimds: false, showProgress: true }) </syntaxhighlight> <br> 下表に、主要なオプションの説明を示す。<br> <br> <center> {| class="wikitable" |+ util.dumpSchemas() / util.dumpInstance() オプション ! オプション !! 説明 |- | threads || 並列スレッド数 (デフォルト: 4) |- | compression || 圧縮方式 (zstd、gzip、none) |- | chunking || 大きなテーブルを分割 |- | bytesPerChunk || チャンクサイズ |- | ocimds || Oracle Cloud Infrastructure MySQL Database Service向け最適化 |- | excludeSchemas || 除外するスキーマ |- | excludeTables || 除外するテーブル |} </center> <br> ==== データのインポート (util.loadDump) ==== ダンプファイルからデータを復元する方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // ダンプをロード util.loadDump('/path/to/dump') // オプション指定 util.loadDump('/path/to/dump', { threads: 8, ignoreVersion: true, resetProgress: false, deferTableIndexes: 'all', loadIndexes: true, progressFile: '/tmp/progress.json', showProgress: true }) </syntaxhighlight> <br> 下表に、主要なオプションの説明を示す。<br> <br> <center> {| class="wikitable" |+ util.loadDump() オプション ! オプション !! 説明 |- | threads || 並列スレッド数 (デフォルト: 4) |- | ignoreVersion || MySQLバージョンチェックを無視 |- | resetProgress || 進捗ファイルをリセット |- | deferTableIndexes || インデックス作成を遅延 (all、fulltext) |- | loadIndexes || 遅延したインデックスを作成 |- | progressFile || 進捗ファイルのパス |} </center> <br> 部分的なインポートの例を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // 特定のスキーマのみをロード util.loadDump('/path/to/dump', { includeSchemas: ['mydb', 'testdb'] }) // 特定のテーブルのみをロード util.loadDump('/path/to/dump', { includeTables: ['mydb.users', 'mydb.orders'] }) // 特定のテーブルを除外 util.loadDump('/path/to/dump', { excludeTables: ['mydb.logs', 'mydb.temp'] }) </syntaxhighlight> <br> ==== アップグレードチェッカー (util.checkForServerUpgrade) ==== MySQLサーバのアップグレード互換性をチェックする方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // アップグレードチェック util.checkForServerUpgrade() // ターゲットバージョンを指定 util.checkForServerUpgrade('user@localhost:3306', {targetVersion: '8.0.35'}) // オプション指定 util.checkForServerUpgrade('user@localhost:3306', { targetVersion: '8.0.35', outputFormat: 'JSON', configPath: '/etc/my.cnf' }) </syntaxhighlight> <br> チェック項目を以下に示す。<br> <br> * 非推奨機能の使用状況 * 予約語との衝突 * データ型の互換性 * ストレージエンジンの互換性 * テーブル構造の問題 * 文字セットと照合順序 * パーティショニングの互換性 * 外部キー制約の問題 <br> ==== JSONデータのインポート (util.importJson) ==== JSONファイルをMySQLにインポートする方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // JSONファイルをコレクションにインポート util.importJson('/path/to/file.json', { schema: 'mydb', collection: 'mycollection' }) // JSONファイルをテーブルにインポート util.importJson('/path/to/file.json', { schema: 'mydb', table: 'mytable', tableColumn: 'json_data' }) </syntaxhighlight> <br> ==== テーブルのインポート (util.importTable) ==== CSVファイルやTSVファイルをテーブルにインポートする方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // CSVファイルをインポート util.importTable('/path/to/file.csv', { schema: 'mydb', table: 'mytable', columns: ['id', 'name', 'email'], fieldsTerminatedBy: ',', fieldsEnclosedBy: '"', fieldsEscapedBy: '\\', linesTerminatedBy: '\n' }) // TSVファイルをインポート util.importTable('/path/to/file.tsv', { schema: 'mydb', table: 'mytable', fieldsTerminatedBy: '\t' }) </syntaxhighlight> <br> 下表に、主要なオプションの説明を示す。<br> <br> <center> {| class="wikitable" |+ util.importTable() オプション ! オプション !! 説明 |- | <code>columns</code> || カラム名のリスト |- | <code>fieldsTerminatedBy</code> || フィールド区切り文字 |- | <code>fieldsEnclosedBy</code> || フィールド囲み文字 |- | <code>fieldsEscapedBy</code> || エスケープ文字 |- | <code>linesTerminatedBy</code> || 行区切り文字 |- | <code>skipRows</code> || スキップする行数 |- | <code>replaceDuplicates</code> || 重複行を置換 |} </center> <br><br> == X DevAPI == X DevAPIは、MySQLのドキュメントストア機能を提供するAPIである。<br> NoSQL風のCRUD操作をサポートする。<br> <br> ==== X DevAPIとは ==== X DevAPIの主要な特徴を以下に示す。<br> <br> * JSON / ドキュメント指向データベースとしてのMySQL * NoSQL風のCRUD操作 (Create、Read、Update、Delete) * スキーマレスなデータモデル * リレーショナルテーブルとドキュメントコレクションの統合利用 * SQL操作も可能 <br> 下表に、X DevAPIの主要オブジェクトを示す。<br> <br> <center> {| class="wikitable" |+ X DevAPI の主要オブジェクト ! オブジェクト !! 説明 |- | mysqlx || X DevAPIのエントリポイント |- | Session || X Protocolセッション |- | Schema || データベーススキーマ |- | Collection || ドキュメントコレクション |- | Table || リレーショナルテーブル |} </center> <br> ==== コレクション操作 ==== ドキュメントコレクションの作成と管理方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // スキーマを取得 db = session.getSchema('mydb') // コレクションを作成 db.createCollection('mycollection') // コレクションを取得 collection = db.getCollection('mycollection') // コレクションの削除 db.dropCollection('mycollection') // コレクション一覧を取得 db.getCollections() </syntaxhighlight> <br> ==== CRUD操作 ==== ドキュメントのCRUD操作方法を以下に示す。<br> <br> * ドキュメントの作成 (Create) *: <syntaxhighlight lang="javascript"> // ドキュメントを追加 collection.add({ id: 1, name: 'Alice', email: 'alice@example.com', age: 30 }).execute() // 複数のドキュメントを追加 collection.add([ {id: 2, name: 'Bob', email: 'bob@example.com', age: 25}, {id: 3, name: 'Charlie', email: 'charlie@example.com', age: 35} ]).execute() </syntaxhighlight> *: <br> * ドキュメントの読み取り (Read) *: <syntaxhighlight lang="javascript"> // 全てのドキュメントを取得 collection.find().execute() // 条件指定で検索 collection.find('id = 1').execute() // バインド変数を使用 collection.find('name = :name').bind('name', 'Alice').execute() // 複雑な条件 collection.find('age > :minAge AND age < :maxAge') .bind('minAge', 20) .bind('maxAge', 40) .execute() // 射影 (特定フィールドのみ取得) collection.find().fields('name', 'email').execute() // ソート collection.find().sort('age DESC').execute() // 制限 collection.find().limit(10).execute() // オフセット指定 collection.find().limit(10).offset(20).execute() </syntaxhighlight> *: <br> * ドキュメントの更新 (Update) *: <syntaxhighlight lang="javascript"> // ドキュメントを更新 collection.modify('id = 1') .set('email', 'alice.new@example.com') .execute() // 複数フィールドを更新 collection.modify('id = 2') .set('email', 'bob.new@example.com') .set('age', 26) .execute() // フィールドを削除 collection.modify('id = 3') .unset('age') .execute() // 配列に要素を追加 collection.modify('id = 1') .arrayAppend('hobbies', 'reading') .execute() </syntaxhighlight> *: <br> * ドキュメントの削除 (Delete) *: <syntaxhighlight lang="javascript"> // ドキュメントを削除 collection.remove('id = 3').execute() // 条件に一致する全てを削除 collection.remove('age > 60').execute() // 全てのドキュメントを削除 collection.remove('true').execute() </syntaxhighlight> *: <br> * テーブル操作 (リレーショナル) *: <syntaxhighlight lang="javascript"> // テーブルを取得 table = db.getTable('users') // SELECT table.select(['id', 'name', 'email']).execute() // WHERE table.select().where('age > :age').bind('age', 30).execute() // INSERT table.insert(['id', 'name', 'email']).values(4, 'David', 'david@example.com').execute() // UPDATE table.update().set('email', 'eve.new@example.com').where('id = 5').execute() // DELETE table.delete().where('id = 6').execute() </syntaxhighlight> <br><br> == プラグイン == MySQL Shellは、プラグインシステムにより機能を拡張できる。<br> カスタムレポート、独自のコマンド、拡張オブジェクトの追加が可能である。<br> <br> ==== プラグインの作成とインストール ==== プラグインの基本構造を以下に示す。<br> <br> plugin_directory/ ├── init.js (または init.py) └── report.js (またはその他の拡張ファイル) <br> プラグインのインストール場所を以下に示す。<br> <br> * Linux / MacOS *: <u>~/.mysqlsh/plugins/</u> * Windows *: <u>%APPDATA%\MySQL\mysqlsh\plugins\</u> <br> * プラグインの例 *: <syntaxhighlight lang="javascript"> // ~/.mysqlsh/plugins/my_plugin/init.js var myPlugin = shell.createExtensionObject() myPlugin.hello = function(name) { println("Hello, " + name + "!") } shell.registerGlobal("myPlugin", myPlugin, { brief: "My custom plugin", details: ["This is a simple example plugin."] }) </syntaxhighlight> *: <br> * プラグインの使用方法 *: <syntaxhighlight lang="javascript"> // プラグインを使用 myPlugin.hello("World") // 出力: Hello, World! </syntaxhighlight> *: <br> * カスタムレポートの作成例 *: <syntaxhighlight lang="javascript"> // レポート関数を定義 function connectionReport(session) { var result = session.runSql("SHOW PROCESSLIST") var rows = result.fetchAll() return { report: rows } } // レポートを登録 shell.registerReport("connections", "list", connectionReport, { brief: "Shows current connections", details: ["Lists all active MySQL connections."] }) </syntaxhighlight> *: <br> * レポートの実行方法 *: <syntaxhighlight lang="sh"> # レポート一覧を表示 \show # カスタムレポートを実行 \show connections </syntaxhighlight> <br><br> == 設定とカスタマイズ == ==== 設定ファイル ==== MySQL Shellの設定ファイルの場所を以下に示す。<br> <br> * Linux/MacOS *: <u>~/.mysqlsh/mysqlsh.json</u> * Windows *: <u>%APPDATA%\MySQL\mysqlsh\mysqlsh.json</u> <br> 設定ファイルの例を以下に示す。<br> <br> <syntaxhighlight lang="json"> { "defaultMode": "js", "history.autoSave": true, "history.maxSize": 1000, "resultFormat": "table", "showWarnings": true, "logLevel": "info", "logSql": false, "autocomplete.nameCache": true, "devapi.dbObjectHandles": true } </syntaxhighlight> <br> ==== 永続設定 ==== 設定を永続化する方法を以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // オプションを永続化 shell.options.setPersist('resultFormat', 'json') // オプションを一時的に設定 (セッションのみ) shell.options.set('resultFormat', 'table') // オプションを取得 shell.options.get('resultFormat') // 全てのオプションを表示 shell.options </syntaxhighlight> <br> コマンドラインでのオプション指定を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # オプションを指定して起動 mysqlsh --result-format=json # 永続的にオプションを設定 \option resultFormat=json --persist </syntaxhighlight> <br> 主要なオプションを以下に示す。<br> <br> <center> {| class="wikitable" |+ 主要な設定オプション ! オプション !! 説明 |- | <code>defaultMode</code> || デフォルトモード (js、py、sql) |- | <code>resultFormat</code> || 結果セットのフォーマット (table、json、json/pretty、tabbed、vertical) |- | <code>history.autoSave</code> || 履歴の自動保存 |- | <code>history.maxSize</code> || 履歴の最大サイズ |- | <code>showWarnings</code> || 警告の表示 |- | <code>logLevel</code> || ログレベル (none、internal_error、error、warning、info、debug、debug2、debug3) |- | <code>logSql</code> || SQL文のログ記録 |} </center> <br> ==== プロンプトのカスタマイズ ==== プロンプトの外観をカスタマイズする方法を以下に示す。<br> <br> 設定ファイル (<code>~/.mysqlsh/prompt.json</code>) の例を以下に示す。<br> <br> <syntaxhighlight lang="json"> { "prompt": "\\u@\\h [\\d]> ", "segments": [ { "text": "\\u", "fg": "green" }, { "text": "@\\h", "fg": "cyan" }, { "text": " [\\d]> ", "fg": "white" } ] } </syntaxhighlight> <br> 使用可能なトークンを以下に示す。<br> <br> <center> {| class="wikitable" |+ プロンプトトークン ! トークン !! 説明 |- | <code>\u</code> || ユーザ名 |- | <code>\h</code> || ホスト名 |- | <code>\d</code> || スキーマ名 |- | <code>\P</code> || ポート番号 |- | <code>\m</code> || モード (JS、Py、SQL) |} </center> <br> 環境変数でプロンプトテーマを設定する方法を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # ダークテーマ export MYSQLSH_PROMPT_THEME=dark # ライトテーマ export MYSQLSH_PROMPT_THEME=light </syntaxhighlight> <br> ==== ロギング設定 ==== ログレベルの設定方法を以下に示す。<br> <br> # コマンドライン引数 mysqlsh --log-level=debug # デバッグログを有効化 mysqlsh --log-level=debug --log-sql <br> ログファイルの場所を以下に示す。<br> <br> * Linux/MacOS *: <u>~/.mysqlsh/mysqlsh.log</u> * Windows *: <u>%APPDATA%\MySQL\mysqlsh\mysqlsh.log</u> <br><br> == MySQL Shell for VS Code == MySQL Shell for VS Codeは、Visual Studio Code向けの統合拡張機能である。<br> GUI環境でのMySQL管理とMySQL Shellの機能を提供する。<br> <br> ==== 拡張機能のインストール ==== * VS Code Marketplaceからインストールする方法 *: <syntaxhighlight lang="text"> # コマンドライン code --install-extension Oracle.mysql-shell-for-vs-code </syntaxhighlight> *: <br> * VS Code内でのインストール手順 *# 拡張機能ビュー ([Ctrl] + [Shift] + [X]キー) を開く。 *# <u>"MySQL Shell for VS Code"</u> を検索する。 *# [インストール]ボタンを押下する。 <br> ==== 主な機能 ==== MySQL Shell for VS Codeの主要な機能を以下に示す。<br> <br> <center> {| class="wikitable" |+ MySQL Shell の主な機能 ! 機能 !! 説明 |- | 接続管理 | * 複数の接続プロファイルを保存・管理 * X ProtocolとClassic Protocolの両方をサポート * SSL/TLS接続設定 |- | SQLエディタ | * 構文ハイライト * シンタックス補完 (スキーマ、テーブル、カラム名) * クエリ実行と結果表示 * 実行計画 (EXPLAIN) の可視化 |- | スキーマブラウザ | * テーブル・ビュー・ストアドプロシージャの階層表示 * テーブル定義の確認 * データのブラウズと編集 |- | ノートブック機能 | * JavaScript/Pythonモードの統合 * セル単位でのコード実行 * 実行結果のインライン表示 |- | AdminAPI GUIダッシュボード | * InnoDB Clusterの可視化 * クラスタステータスのリアルタイム監視 * グラフィカルな管理操作 |} </center> <br><br> == セキュリティ == ==== SSL/TLS接続 ==== SSL/TLS接続を使用する方法を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # SSL/TLS接続を強制 mysqlsh --ssl-mode=REQUIRED --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem -u user -h localhost # URI形式 mysqlsh mysqlx://user@localhost:33060?ssl-mode=REQUIRED&ssl-ca=/path/to/ca.pem </syntaxhighlight> <br> 下表に、SSL/TLSモードの説明を示す。<br> <br> <center> {| class="wikitable" |+ SSL/TLSモード ! モード !! 説明 |- | DISABLED || SSL/TLS接続を無効化 |- | PREFERRED || 可能であればSSL/TLS接続を使用 (デフォルト) |- | REQUIRED || SSL/TLS接続を強制 (証明書検証なし) |- | VERIFY_CA || SSL/TLS接続を強制 + CA証明書検証 |- | VERIFY_IDENTITY || SSL/TLS接続を強制 + CA証明書検証 + ホスト名検証 |} </center> <br> ==== 認証方式 ==== MySQLの認証方式を以下に示す。<br> <br> <center> {| class="wikitable" |+ MySQL 認証方式 ! プラグイン !! 説明 |- | <code>caching_sha2_password</code> | * MySQL 8.0デフォルト * SHA-256ベースの認証 * サーバ側でキャッシュ |- | <code>mysql_native_password</code> | * レガシー認証方式 * MySQL 5.7以前のデフォルト |- | <code>sha256_password</code> | * SHA-256ベースの認証 * キャッシュなし |- | <code>authentication_pam</code> | * PAM認証 * LDAP、Kerberos等と統合可能 |} </center> <br> 認証方式を指定する方法を以下に示す。<br> <br> # 認証方式を指定 mysqlsh --auth-method=caching_sha2_password -u user -h localhost # サーバ公開鍵を取得 (caching_sha2_password使用時) mysqlsh --get-server-public-key -u user -h localhost <br> パスワードの安全な管理方法を以下に示す。<br> <br> # パスワードを対話式で入力 (推奨) mysqlsh -u user -h localhost -p # パスワードをURIに含めない (推奨) mysqlsh mysqlx://user@localhost:33060 # パスワードストアの使用 mysqlsh --save-passwords=always <br><br> == トラブルシューティング == ==== 接続エラー ==== 接続エラーの診断と対処方法を以下に示す。<br> <br> * <u>ERROR 2003: Can't connect to MySQL server</u> *: MySQLサーバが起動しているかを確認する *: ファイアウォール設定を確認する *: ポート番号が正しいかを確認する (X Protocol: 33060、Classic: 3306) *: ホスト名・IPアドレスが正しいかを確認する * <u>ERROR 2002: Can't connect through socket</u> *: Unixソケットファイルのパスが正しいかを確認する *: MySQLサーバが起動しているかを確認する *: <code>--socket</code> オプションで明示的にソケットパスを指定する * <u>ERROR 1045: Access denied</u> *: ユーザ名とパスワードが正しいかを確認する *: ユーザが存在するかを確認する (<code>SELECT user, host FROM mysql.user;</code>) *: ホストベースのアクセス制御を確認する <br> 診断コマンドの例を以下に示す。<br> <br> # MySQLサーバの状態確認 systemctl status mysqld # ポートの確認 netstat -an | grep 3306 netstat -an | grep 33060 # ファイアウォール設定の確認 (Linux) sudo firewall-cmd --list-all # MySQLサーバログの確認 tail -100 /var/log/mysql/error.log <br> ==== クラスタの問題 ==== InnoDB Clusterの一般的な問題と対処方法を以下に示す。<br> <br> * クォーラム喪失 *: 問題: 過半数のメンバーが停止し、クラスタが動作不可 *: 対処: <code>cluster.forceQuorumUsingPartitionOf('instance')</code> でクォーラムを強制回復 *: <br> * 通信エラー *: 問題: メンバー間の通信が失敗 *: 対処: ネットワーク設定とファイアウォールを確認 (ポート33061の通信許可) *: <br> * リカバリー状態 *: 問題: インスタンスがRECOVERING状態で停止 *: 対処: <code>cluster.rescan()</code> でクラスタ状態を再スキャン <br> クラスタのトラブルシューティングコマンドを以下に示す。<br> <br> <syntaxhighlight lang="javascript"> // クラスタの状態を確認 cluster = dba.getCluster() cluster.status({extended: 2}) // クォーラムを強制回復 cluster.forceQuorumUsingPartitionOf('user@host1:3306') // メンバーを再参加 cluster.rejoinInstance('user@host2:3306') // クラスタ設定を再スキャン cluster.rescan() // 問題のあるインスタンスを削除 cluster.removeInstance('user@host3:3306', {force: true}) </syntaxhighlight> <br> ==== よくある問題 ==== その他のよくある問題と解決策を以下に示す。<br> <br> * バージョン互換性エラー *: 問題: MySQLサーバとMySQL Shellのバージョン不一致 *: 対処: <code>util.checkForServerUpgrade()</code> で互換性を確認 *: 対処: MySQL ShellまたはMySQLサーバをアップグレード *: <br> * メモリ不足 *: 問題: ダンプ/ロード時にメモリ不足エラー *: 対処: <code>threads</code> オプションを減らす (例: <code>threads: 1</code>) *: 対処: <code>bytesPerChunk</code> を小さくする *: <br> * 接続タイムアウト *: 問題: 長時間のクエリ実行時に接続が切断される *: 対処: <code>--connect-timeout</code> オプションを増やす (例: <code>--connect-timeout=60</code>) *: 対処: MySQLサーバの <code>wait_timeout</code> 設定を確認 <br> デバッグログの有効化方法を以下に示す。<br> <br> <syntaxhighlight lang="sh"> # デバッグログを有効化 mysqlsh --log-level=debug --log-sql # ログファイルの確認 tail -f ~/.mysqlsh/mysqlsh.log </syntaxhighlight> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,MySQL,MySQL Shell,mysqlsh,AdminAPI,InnoDB Cluster,X DevAPI,Database,Shell,CLI,データベース,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - MySQLの高度なコマンドラインツールMySQL Shellに関する包括的なガイド | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:MySQL]]
MySQL - MySQL Shell
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse