TiDBを使ってみる その１

その１ この記事
その２ https://qiita.com/ssugimoto/items/17a0609d8990ef85e5f1

## サーバーレスのRDB TiDB
- 知ったきっかけは、Serverless days 2023(https://tokyo.serverlessdays.io/)
- [TiDB](https://pingcap.co.jp/)
    - [GitHub TiDB](https://github.com/pingcap/tidb)
    - [ロードマップ](https://docs.pingcap.com/tidb/dev/tidb-roadmap)
    - [TiDB Storage](https://docs.pingcap.com/tidb/dev/tidb-storage)
    - 行志向のOLTP、列志向のOLAP

### TiDBの特徴で気になった点を少しだけ
- DBaasの１つ、昨今mysqlやpostgresのDBaasは増えており、RDBのサーバーレスやデータウェアハウスの用途
- NewSQLの時代、幕開け
    - RDB + NoSQLそんないいところ取りできるのか？
- `Amazon DynamoDB + Amazon Redshift` -> TiDBというデータベース移行事例が上がってるのを見るとそれなりに性能も良いんだろうと想像してしまう

### TiDBの種類、提供されるもの
- TiDB cluster
    - ローカル等でデータベースクラスターそのもの動かす , https://docs.pingcap.com/tidb/stable/quick-start-with-tidb, https://docs.pingcap.com/tidb/v5.3/quick-start-with-tidb
    - Mac, Linuxのみサポート？
#### ツール類
- https://docs.pingcap.com/tidb/stable/download-ecosystem-tools
- k8sへのデプロイ
- TiDBにCSVでのインポート
- MySQL、Auroraからインポート
- MySQL、Auroraからマイグレーション
- TiDBバックアップ
- 他

#### Docker
- 単純なローカル環境でdockerコンテナとして動かす方法はあるのか？
- docker hub にコンテナイメージはある https://hub.docker.com/r/pingcap/tidb
- GitHub https://github.com/pingcap/tidb-docker-compose
    - docker compose用のyamlもある https://github.com/pingcap/tidb-docker-compose/blob/master/docker-compose.yml
- 従来のmysqlのようにコンテナ１つではない（ホストのメモリやCPU不足が懸念）

## TiDB TiDB Cloud（TiDB クラウド版）
ここからは クラウド上にあるTiDBの利用についてのいくつかの情報です

### mysql-clinetとして接続
- Windowsから使う場合では手間かもしれない
- mysql-clinetが動かせる環境からTLS接続する

#### CLIとして接続
- mysqlコマンドが使える環境ならばコマンドラインで接続、SQL実行が可能
    - mysql docker コンテナを利用できる

#### UIとして接続
- VS Codeから https://docs.pingcap.com/tidb/stable/dev-guide-gui-vscode-sqltools
- MySQL Workbench https://docs.pingcap.com/tidb/stable/dev-guide-gui-mysql-workbench
    -  DataGrip、DBeaver、VS Code SQLToolsなど、TiDBを公式にサポートしている他のGUIツールを使用することを推奨
- CA証明書が必要
- TiDBのWeb画面で Cluster選択 -> Overview -> 画面右上「Connetct」ボタンを押すと

```
Download the CA cert for server certificate verification and replace <CA_PATH> with your local path.
```
で「CA cert」リンクを押すとpemファイルをダウンロードできる

### TiDBクラウドへのmysql-clientで接続
- 手っ取り早くmysql データベースが動くdocker イメージをコンテナ起動して使う。 mysqlクライアントだけ使いたいけど、それだけ入ったイメージがすぐに見つからず。

- データベースのローカルは（使わないので）値が入っていれば良いです
```compose.yml
version: '3.8'
services:
  mysql8-db:
    image: mysql:8.0.34
    container_name: tidb-mysql-clinet-8.0.34
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      - default
    volumes:
      - ./data/database:/var/lib/mysql
    # restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: test
      MYSQL_USER: user1
      MYSQL_PASSWORD: user1
    ports:
      - 13306:3306
```

- localhostからのポートを3306にすると、他のmysqlのコンテナと衝突するかもしれないので、コンテナ内のポートとホストのポート番号のうち、ホストのポート番号を変える

```
"<Host IP>:<Host Port>:<Container Port>"

例
ホストのポートを13306、コンテナ内のポートを3306
- 13306:3306
```

#### 1. mysqlコンテナを起動
```
cd compose.ymlを置いた場所
docker compose up -d
```

- Operating SystemでコンテナのOSを確認
mysql8の場合では

```
# cat /etc/*-release
```

```
Oracle Linux Server release 8.8
NAME="Oracle Linux Server"
VERSION="8.8"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="8.8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Oracle Linux Server 8.8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:8:8:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://github.com/oracle/oracle-linux"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 8"
ORACLE_BUGZILLA_PRODUCT_VERSION=8.8
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=8.8
Red Hat Enterprise Linux release 8.8 (Ootpa)
Oracle Linux Server release 8.8
```

#### 2. TiDB Cloudでconnect方法を確認する

2-1. TiDBクラウドの画面で、Clusterを選ぶと、Overviewの画面が表示される
![FireShot Capture 065 - TiDB Cloud - tidbcloud.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/00d06747-6c0f-8b06-2cb6-876a21d3fcdc.png)

2-2. 画面右上の「Connect」ボタンを押す
![FireShot Capture 066 - TiDB Cloud - tidbcloud.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/b1d98f79-9d09-8584-23a9-dce72173c4c2.png)


- CentOS/RedHat系をプルダウンで選ぶ（OSでssl-caの証明書の場所が異なってくる）
- 次に、Connect With のプルダウンで、 MySQL CLI をエラー選ぶと myslのcliを使った接続文字列が取得できる

```
mysql --comments -u 'XXXX.root' -h xxxxtidbcloud.com -P 4000 -D 'test' --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/pki/tls/certs/ca-bundle.crt -p'<PASSWORD>'
```

|値  |説明  |--  |
|---|---|---|
|XXXX.root  |自分自身のものに、Web画面では値が入った状態になっている|  |
|xxxxtidbcloud.com  |自分自身のものに、Web画面では値が入った状態になっている |  |
|'\<PASSWORD\>'|DB接続のパスワード、-pの後はスペース等はなく、そのまま続けて入力する|



#### 3. mysqlコマンドを実行
```
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1230978
Server version: 5.7.25-TiDB-Serverless TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

Copyright (c) 2000, 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 '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

##### 3-1. データベースのバージョンを表示
```
mysql> select version();
+-------------------------------+
| version()                     |
+-------------------------------+
| 5.7.25-TiDB-v6.6.0-serverless |
+-------------------------------+
1 row in set (0.00 sec)
```


##### 3-2. データベース一覧
```
mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| INFORMATION_SCHEMA  |
| PERFORMANCE_SCHEMA  |
| fortune500          |
| game                |
| lightning_task_info |
| mysql               |
| test                |
+---------------------+
8 rows in set (0.01 sec)

```

##### 3-3. 接続先データベース変更
```
mysql> use game;
Database changed
```

##### 3-4. データベース内のテーブル一覧
```
mysql> SHOW TABLES;

+--------------------+
| Tables_in_game     |
+--------------------+
| all_audio_language |
| category           |
| company            |
| developer          |
| game_category      |
| game_genre         |
| game_tag           |
| games              |
| genre              |
| language           |
| publisher          |
| supported_language |
| tag                |
+--------------------+
13 rows in set (0.99 sec)
```

##### 3-5. select 等の実行
```
mysql> select count(1) from company;
+----------+
| count(1) |
+----------+
|    48276 |
+----------+
1 row in set (0.02 sec)

mysql> desc company;
+--------------+--------------+------+------+---------+----------------+
| Field        | Type         | Null | Key  | Default | Extra          |
+--------------+--------------+------+------+---------+----------------+
| company_id   | int(11)      | NO   | PRI  | NULL    | auto_increment |
| company_name | varchar(256) | YES  |      | NULL    |                |
+--------------+--------------+------+------+---------+----------------+
2 rows in set (0.01 sec)

mysql> 
```

レスポンスさくさく動いて比較的高速かなと思う


### VSCodeの拡張機能から使う
- Windows環境では、VSCodeからの接続が最も手軽と思われる
-- TiDBでの説明 - https://docs.pingcap.com/tidb/stable/dev-guide-gui-vscode-sqltools
-- 使用するExtension、https://marketplace.visualstudio.com/items?itemName=mtxr.sqltools-driver-mysql
-- CA証明書は空（指定しない）
![VSCode-mysql-connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/cc45fe29-30d1-a34c-3c2b-38b518b8dbfe.png)

- 使用例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/ef533476-9a61-e87e-ac53-bfc312158774.png)


#### A5:SQL Mk-2から接続を試してみたのですが、接続できず
 ![A5-mysql-connect-error-alert40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/037ffd3d-04a2-9bea-dae5-e84d4a911763.png)