PolarDB provisioned instanceからServerlessにupgrade

# 1. 目的と前提条件
コスト削減のために、開発テスト環境のPolarDB provisioned instanceをServerlessに変更してみたいです。
以前はAlibaba CloudのDTSサービスを利用して、データをProvisioned instanceからServerless instanceに移行するという方法がありました。DTSサービスは選択肢が多すぎて、かなりハードルが高かったです。
最近は簡単な方法がリリースされたので、一通りテストしてみます。
この方法も内部ではDTSが利用されていますが、一からDTSタスクを作成する必要がなく、自動的にDTSタスクを作成してくれるので、かなりハードルが下がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/008353b9-3d1d-af97-be0e-1e4424439452.png)

PolarDB Serverlessとは：

https://qiita.com/dennis_wang/items/31f564a76fbd10e9fa20#1-polardb%E3%81%AE%E7%A8%AE%E9%A1%9E

DTSとは：

https://qiita.com/dennis_wang/items/0762026a86ce66d47728#53-dts%E3%82%BF%E3%82%B9%E3%82%AF%E4%BD%9C%E6%88%90

詳細な手順はこちらのドキュメントをご参考ください。

https://www.alibabacloud.com/help/en/polardb/polardb-for-mysql/user-guide/procedure


# 2. 環境準備
## 2.1 PolarDB provisioned instanceを作成

## 2.2 ECSを立ち上げて、必要なコマンドのインストールとsample dataの準備
- ECSの作成については以下を参考：

https://qiita.com/dennis_wang/items/da0a43c2246ab997b7ee#312-ecs

- 以下のサンプルデータを利用：

https://github.com/datacharmer/test_db/blob/master/employees.sql

```
$ sudo apt update
$ apt install unzip
$ wget https://github.com/datacharmer/test_db/archive/refs/heads/master.zip

$ unzip master.zip
$ ls
  master.zip
  test_db-master
$ sudo apt install mysql-client-core-8.0 -y
```
- sample dataをPolarDB instanceにloadする
```
$ mysql -h ***.rwlb.japan.rds.aliyuncs.com < employees.sql -u dennis -p
Enter password: 
INFO
CREATING DATABASE STRUCTURE
INFO
storage engine: InnoDB
INFO
LOADING departments
INFO
LOADING employees
INFO
LOADING dept_emp
INFO
LOADING dept_manager
INFO
LOADING titles
INFO
LOADING salaries
data_load_time_diff
NULL


$  mysql -h ***.rwlb.japan.rds.aliyuncs.com -u dennis -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| __recycle_bin__    |
| employees          |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> use employees;
mysql> show tables;
+----------------------+
| Tables_in_employees  |
+----------------------+
| current_dept_emp     |
| departments          |
| dept_emp             |
| dept_emp_latest_date |
| dept_manager         |
| employees            |
| salaries             |
| titles               |
+----------------------+
```

- DTSで増分データを同期するため、PolarDBのbinlogを有効にする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/63c6cb58-8b78-d7bf-e3f7-a0f4a26a2cff.png)

## 2.3 新しいServerless instanceを作成
- PolarDBの購入画面で既存のPolarDB instanceから新しいServerless instanceのupdateを行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/4b1bca48-c28a-7db1-db6b-014c7109ca05.png)
※必要に応じてServerless instanceのnode数やPCU範囲を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/da82bb90-2a0a-485c-d25e-3bbea2ee85f9.png)
- 生成されたServerless instance(DTSタスクIDも確認できる。クリックするとDTSの画面に移動できる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/ca43343e-c080-180c-ffda-0daecc669f9f.png)
- DTS画面上でDTSタスクの詳細が確認できる。(確認は問題ありませんが、<font color="red">タスクの変更はしてはいいけません</font>)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/e12e6911-1ede-04af-0c1b-4653b12416ae.png)

## 2.4 realtime同期の動きを確認
- soure database(PolarDB providsioned instance)上で新しいrecordをinsertしてみる
    ```
    mysql> select count(*) from employees;
    +----------+
    | count(*) |
    +----------+
    |   300024 |
    +----------+
    
    mysql> select * from employees order by emp_no desc limit 5;
    +--------+------------+------------+-----------+--------+------------+
    | emp_no | birth_date | first_name | last_name | gender | hire_date  |
    +--------+------------+------------+-----------+--------+------------+
    | 499999 | 1958-05-01 | Sachin     | Tsukuda   | M      | 1997-11-30 |
    | 499998 | 1956-09-05 | Patricia   | Breugel   | M      | 1993-10-13 |
    | 499997 | 1961-08-03 | Berhard    | Lenart    | M      | 1986-04-21 |
    | 499996 | 1953-03-07 | Zito       | Baaz      | M      | 1990-09-27 |
    | 499995 | 1958-09-24 | Dekang     | Lichtner  | F      | 1993-01-12 |
    +--------+------------+------------+-----------+--------+------------+
    
    
    mysql> insert into employees (birth_date,first_name,last_name,gender,hire_date) values("2000-01-01","tanaka","yosuke","M", "2024-01-01");
    
    mysql> select count(*) from employees;
    +----------+
    | count(*) |
    +----------+
    |   300025 |
    +----------+
    
    mysql> select * from employees order by emp_no desc limit 5;
    +--------+------------+------------+-----------+--------+------------+
    | emp_no | birth_date | first_name | last_name | gender | hire_date  |
    +--------+------------+------------+-----------+--------+------------+
    | 499999 | 1958-05-01 | Sachin     | Tsukuda   | M      | 1997-11-30 |
    | 499998 | 1956-09-05 | Patricia   | Breugel   | M      | 1993-10-13 |
    | 499997 | 1961-08-03 | Berhard    | Lenart    | M      | 1986-04-21 |
    | 499996 | 1953-03-07 | Zito       | Baaz      | M      | 1990-09-27 |
    | 499995 | 1958-09-24 | Dekang     | Lichtner  | F      | 1993-01-12 |
    +--------+------------+------------+-----------+--------+------------+
    
    mysql> select * from employees where first_name = "tanaka";
    +--------+------------+------------+-----------+--------+------------+
    | emp_no | birth_date | first_name | last_name | gender | hire_date  |
    +--------+------------+------------+-----------+--------+------------+
    |      0 | 2000-01-01 | tanaka     | yosuke    | M      | 2024-01-01 |
    +--------+------------+------------+-----------+--------+------------+
    ```

- target database(PolarDB Serverlessのinstance)上でデータがrealtime同期されていることが確認できた
    ```
    mysql> select count(*) from employees;
    +----------+
    | count(*) |
    +----------+
    |   300025 |
    +----------+
    
    mysql> select * from employees where emp_no = 0;
    +--------+------------+------------+-----------+--------+------------+
    | emp_no | birth_date | first_name | last_name | gender | hire_date  |
    +--------+------------+------------+-----------+--------+------------+
    |      0 | 2000-01-01 | tanaka     | yosuke    | M      | 2024-01-01 |
    +--------+------------+------------+-----------+--------+------------+
    ```

## 2.5 databaseの切り替え
endpoint自動的に交換してくれるので、わざわざアプリケーション側のDatabaseへの接続endpointを修正する必要もありません。
- 以下のswitch overボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/88ac6589-e08a-01d9-4b20-d88c870fb20d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/1f823a0a-dd70-4107-d5f6-3358ed9f2468.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/a535c5f7-41a1-622a-df5b-08e513d6e48d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/f765563b-df35-858d-8b45-f6a24e4877fb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/52d4cc58-efe1-daf6-f3b8-e62018d7a1c3.png)



https://qiita.com/dennis_wang/items/f134d0e45fa5c5390317

## 2.6 upgradeを終わらせる(DTSタスクを自動的に削除してくれ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/076899b2-2e8f-cfe4-0d17-88d10045ce31.png)

- 新databaseのbinlogを無効にするかどうかを選択(無効にするとinstanceは自動的に再起動することになる。すぐ再起動したくない場合は、別途binlogを無効化にすればよい。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/8bad3d10-d891-a11f-68e3-54e07576890c.png)
::: note info
Binlogをオンにすると、SELECTクエリーのパフォーマンスには影響しませんが、書き込み更新（INSERT、UPDATE、DELETE）のパフォーマンスに影響します。
PolarDBではDTSによってデータを他のdatabaseに同期するためにbinlogが利用されます。それ以外はbinlog使わないので、無効にしたほうが無難でしょう。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/a99d4a5b-403e-91ac-ce20-b7830897127d.png)

## 2.7 provisioned instanceを削除
provisioned instanceはまだ残っている。最後に確認し、とくに問題なければ、手動でこのinstaceを削除すればよいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/b335e723-09da-5de1-14f4-cad8957080f4.png)

# 3. まとめ
1. 手動でDTSを利用するよりはだいぶ操作が楽になります
1. endpointまで自動的にきりかえてくれるので、とてもありがたいですね
1. この方法ではDTS同期の費用も無料になります