# 演習 2: TiDBに接続します

## 演習 2: 概要

### 概要
+ これらの演習では、MySQLクライアントとGUIツールを使ってTiDBに接続し、TiDB上でSQL文を実行し、現在のデータベースの接続状態を確認します
+ 以下は、TiDBクラスタの展開トポロジー図を示しています

  <img src="./diagram/TiDBClusterDeploymentTopologyExercise_aa_004_20220914.png" width="70%" align="top"/>

### ノート
+ TiUPを使用してTiDBクラスタをデプロイする演習1を完了することは、後続の演習を正常に完了するために必要です
+ 多くのステップでコマンドを入力する必要があるため、ターミナルウィンドウを起動して開いた状態にしておくと便利かもしれません
+ あなたの環境は、`IP`、`port`、`username`、`password`、および`directory`を含め、これらの演習と異なる場合があります
+ あなたの端末ウィンドウの`$`はOSのプロンプトです
+ あなたの端末ウィンドウにある"`tidb>`"または"`mysql>`"はSQLコマンドプロンプトです
+ これらの演習では、同じネットワークに接続された8つのマシンが必要です。環境変数で表される`Role`と`IP Address`は以下の通りです：
    | `Node Role`        | `IP Address`                                              |
    | :----------------- | :-------------------------------------------------------- |
    | `Control Machine`  | `${HOST_CM_PRIVATE_IP}, ${HOST_CM_PUBLIC_IP}`             |
    | `TiDB server 1`    | `${HOST_DB1_PRIVATE_IP}, ${HOST_DB1_PUBLIC_IP}`           |
    | `TiKV server 1`    | `${HOST_KV1_PRIVATE_IP}, ${HOST_KV1_PUBLIC_IP}`           |
    | `TiKV server 2`    | `${HOST_KV2_PRIVATE_IP}, ${HOST_KV2_PUBLIC_IP}`           |
    | `TiKV server 3`    | `${HOST_KV3_PRIVATE_IP}, ${HOST_KV3_PUBLIC_IP}`           |
    | `PD server 1`      | `${HOST_PD1_PRIVATE_IP}, ${HOST_PD1_PUBLIC_IP}`           |
    | `PD server 2`      | `${HOST_PD2_PRIVATE_IP}, ${HOST_PD2_PUBLIC_IP}`           |
    | `PD server 3`      | `${HOST_PD3_PRIVATE_IP}, ${HOST_PD3_PUBLIC_IP}`           |
    | `TiFlash server 1` | `${HOST_TIFLASH1_PRIVATE_IP}, ${HOST_TIFLASH1_PUBLIC_IP}` |
    | `Alertmanager`     | `${HOST_MONITOR_PRIVATE_IP}, ${HOST_MONITOR_PUBLIC_IP}`   |
    | `Grafana`          | `${HOST_MONITOR_PRIVATE_IP}, ${HOST_MONITOR_PUBLIC_IP}`   |
    | `Prometheus`       | `${HOST_MONITOR_PRIVATE_IP}, ${HOST_MONITOR_PUBLIC_IP}`   |

### 前提条件
+ 演習環境のユーザー認証情報（例：プライベートキー）が与えられます
+ You are given access to 8 machines that have been set up.
+ "演習 1: Deploying a TiDB Cluster Using TiUP"の演習で活動を完了し、端末ウィンドウを開いています
+ あなたの環境には、TiDBクラスタが展開され、実行されています

## 演習2-1：MySQLクライアントを使用してTiDBに接続し、SQLステートメントを実行します
### 概要
+ この演習では、TiDBに接続してSQLステートメントを実行します。すべてのタスクは`Control Machine`で実行します

### 所要時間
+ この演習には約20分かかるはずです

### タスク
1. ユーザー`ec2-user`として、`Control Machine`（`${HOST_CM_PUBLIC_IP}`）にログインします。
2. TiDBクラスタを開始します。
3. MySQLクライアントを使ってTiDBに接続します。
4. データベースのバージョンをクエリーします
5. TiDB上のデータベースを表示します
6. `tidb`という新しいデータベースを作成します。
7. 現在のデータベースを`tidb`に変更します
8. `tab_tidb`という名前のテーブルを作成します。`tab_tidb`テーブルには、`id`という自動増分のプライマリキーカラム、`name`というvarchar（20）カラム、`age`というint（11）カラム、および`version`というvarchar（20）カラムが必要です。
9. `tab_tidb`テーブルに1行挿入します
10. `tab_tidb`テーブルのデータをクエリします。
11. `SHOW PROCESSLIST`ステートメントを実行してセッション状態を表示します。
12. クライアントからログアウトし、開いているすべての端末ウィンドウを閉じます

### ステップ
1. ユーザー`ec2-user`として`Control Machine`（`${HOST_CM_PUBLIC_IP}`）にログインします。ターミナルプロンプトで次のコマンドを入力し、表示された結果を受け取ります。
   ```
   $ ssh -i {path_to_your_key} -A ec2-user@{HOST_CM_PUBLIC_IP}

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

   https://aws.amazon.com/amazon-linux-2/
   ```

2. TiDBクラスタを開始します
   ```
   $ ./start-cluster.sh 
   tiup is checking updates for component cluster ..
   ...
   + [ Serial ] - UpdateTopology: cluster=tidb-test
   Started cluster `tidb-test` successfully
   ```

3. MySQLクライアントを使用してTiDBに接続してください。`root`にパスワードがある場合は、オプション`-p`を提供する必要があります。それ以外の場合は、`-p`オプションを省略できます。（`${HOST_DB1_PRIVATE_IP}`の取得方法がわからない場合は、講師に質問してください）。ターミナルプロンプトで次のコマンドを入力し、表示された結果を受け取ってください。
   ```
   $ mysql -h ${HOST_DB1_PRIVATE_IP} --port 4000 -u root -p<your_password>
   ```

4. データベースバージョンのクエリ。ターミナルプロンプトで以下のコマンドを入力し、表示された結果を受け取ります。
   ```sql
   SELECT tidb_version()\G
   ```
   ```
   tidb> SELECT tidb_version()\G
   *************************** 1. row ***************************
   tidb_version(): Release Version: v6.1.0
   Edition: Community
   Git Commit Hash: 1a89decdb192cbdce6a7b0020d71128bc964d30f
   Git Branch: heads/refs/tags/v6.1.0
   UTC Build Time: 2022-06-05 05:15:11
   GoVersion: go1.18.2
   Race Enabled: false
   TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
   Check Table Before Drop: false
   1 row in set (0.00 sec)
   ```


5. TiDB 上のデータベースを表示します。次のコマンドをターミナルプロンプトに入力して、表示された結果を受け取ります：
   ```sql
   SHOW DATABASES;
   ```
   ```
   tidb> SHOW DATABASES;
   +--------------------+
   | Database           |
   +--------------------+
   | INFORMATION_SCHEMA |
   | METRICS_SCHEMA     |
   | PERFORMANCE_SCHEMA |
   | mysql              |
   | test               |
   +--------------------+
   5 rows in set (0.00 sec)
   ```

6. 「`tidb`」という新しいデータベースを作成します。ターミナルプロンプトで次のコマンドを入力し、表示される結果を受け取ります。
   ```sql
   CREATE DATABASE tidb;
   ```
   ```
   tidb> CREATE DATABASE tidb;
   Query OK, 0 rows affected (0.08 sec)
   ```

7. 現在のデータベースを`tidb`に変更します。端末プロンプトで次のコマンドを入力し、表示された結果を受け取ります。
   ```sql
   USE tidb;
   ```
   ```
   tidb> USE tidb;
   Database changed
   ```


8. 「`tab_tidb`」というテーブルを作成してください。「`tab_tidb`」テーブルには、自動増分の主キーカラムである「`id`」、カラム「`varchar(20)`」と「`name`」のある「`int(11)`」カラム、そしてカラム「`varchar(20)`」と「`version`」のある「`age`」を持たせてください。ターミナルプロンプトで以下のコマンドを入力して、表示された結果を受け取ってください。
   ```sql
   CREATE TABLE `tab_tidb` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(20) NOT NULL DEFAULT '',
   `age` int(11) NOT NULL DEFAULT 0,
   `version` varchar(20) NOT NULL DEFAULT '',
   PRIMARY KEY (`id`),
   KEY `idx_age` (`age`));
   ```
   ```
   tidb> CREATE TABLE `tab_tidb` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(20) NOT NULL DEFAULT '',
   `age` int(11) NOT NULL DEFAULT 0,
   `version` varchar(20) NOT NULL DEFAULT '',
   PRIMARY KEY (`id`),
   KEY `idx_age` (`age`));
   Query OK, 0 rows affected (0.09 sec)
   ```


9. `1`を`id`のカラムの値として持つ行を`tab_tidb`テーブルに挿入し、`TiDB`を`name`のカラムの値として、`6`を`age`のカラムの値として、`TiDB-v6.1.0`を`version`のカラムの値として使用します。ターミナル プロンプトで次のコマンドを入力し、表示された結果を受け取ります。
   ```sql
   INSERT INTO `tab_tidb` VALUES (1,'TiDB',6,'TiDB-v6.1.0');
   ```
   ```
   tidb> INSERT INTO `tab_tidb` VALUES (1,'TiDB',6,'TiDB-v6.1.0');
   Query OK, 1 row affected (0.01 sec)
   ```

10. `tab_tidb`テーブルのデータをクエリしてください。ターミナルプロンプトで以下のコマンドを入力し、表示された結果を受け取ります。
    ```sql
    SELECT * FROM tab_tidb;
    ```
    ```
    tidb> SELECT * FROM tab_tidb;
    +----+------+-----+-------------+
    | id | name | age | version     |
    +----+------+-----+-------------+
    |  1 | TiDB |   6 | TiDB-v6.1.0 |
    +----+------+-----+-------------+
    1 row in set (0.00 sec)
    ```

11. `SHOW PROCESSLIST`ステートメントを実行してセッションの状態を表示します。端末プロンプトで以下のコマンドを入力して、表示された結果を受け取ります。
    ```sql
    SHOW processlist;
    ```
    ```
    tidb> SHOW processlist;
    +---------------------+------+-------------------+------+---------+------+------------+------------------+
    | Id                  | User | Host              | db   | Command | Time | State      | Info             |
    +---------------------+------+-------------------+------+---------+------+------------+------------------+
    | 6156387705266635215 | root | 172.31.0.106:4208 | tidb | Query   |    0 | autocommit | show processlist |
    +---------------------+------+-------------------+------+---------+------+------------+------------------+
    1 row in set (0.00 sec)
    ```

12. クライアントからログアウトして、すべての開いている端末ウィンドウを閉じます。

## 演習2-2：GUIツールを使用してTiDBに接続します

### 概要
+ この演習では、macOS上の`MySQL Workbench`を使用してTiDBに接続します

### Note
+ もし、あなたがWindowsあるいはLinuxなどのオペレーティングシステムを使用している場合、この演習の*解決手順*は異なる可能性があります

### 所要時間
+ この演習は、完了するのに約10分かかるはずです

### タスク
1. https://dev.mysql.com/downloads/workbench/にアクセスします。オペレーティングシステムを選択して、インストールパッケージを選択した後、`Download`をクリックします。
2. 次のページで、新しいアカウントを作成するか、既存のアカウントにログインするか、または`No thanks, just start my download`ボタンをクリックしてこれをスキップすることができます。
3. ダウンロードインストールパッケージを完了したら、`MySQL Workbench`をインストールします。
4. `MySQL Workbench`を開き、その中のホームウィンドウで`+`をクリックします。
5. `Setup New Connection`のウィンドウに、`Connection Name`を追加します。`Parameters`セクションで、`Hostname`フィールドに`${HOST_CM_PUBLIC_IP}`を入力し、`tidb`ユーザーの`Port`、`Username`、`Password`を構成します。その後、`OK`をクリックします。
6. `MySQL Workbench`ホームウィンドウで、新しいインスタンスをクリックしてTiDBに接続します。

### ステップ

1. https://dev.mysql.com/downloads/workbench/ にアクセスします。自分のオペレーティングシステムを選択して、インストールパッケージを選択したら、`Download` をクリックします。
   
   <img src="./diagram/DownloadMySQLWorkbenchen_aa_001_20221010.png" width="70%" align="top"/>

2. 次のページで、新しいアカウントを作成したり、既存のアカウントにログインしたり、または下部の`No thanks, just start my download`ボタンをクリックしてスキップすることができます。
   
   <img src="./diagram/DownloadMySQLWorkbenchen2_aa_001_20221010.png" width="70%" align="top"/>
   
3. ダウンロードインストールパッケージが完了したら、`MySQL Workbench`をインストールします。
   
   <img src="./diagram/InstallMySQLWorkbenchen_aa_001_20221010.png" width="70%" align="top"/>
   
4. `MySQL Workbench` を開き、`MySQL Workbench` ホームウィンドウで `+` をクリックします。
   
   <img src="./diagram/AddMySQLWorkbenchenConnection_aa_001_20221010.png" width="70%" align="top"/>
   
5. `Setup New Connection`のウィンドウに`Connection Name`を追加します。`Parameters`セクションで、`Hostname`フィールドに`${HOST_DB1_PUBLIC_IP}`を入力し、`tidb`ユーザーの`Port`、`Username`、および`Password`を設定します。その後、`OK`をクリックします。
   
   <img src="./diagram/SetupNewConnection_aa_001_20221010.png" width="70%" align="top"/>
   
6. `MySQL Workbench`ホームウィンドウで、新しいインスタンスをクリックしてTiDBに接続します。
   
   <img src="./diagram/ConnectingTiDBUsingGUI_aa_001_20221010.png" width="70%" align="top"/>




