## 模块 2：从两个 MySQL 实例迁移数据 (数据准备)

### 步骤 1. 在 PD1 上设置数据源 MySQL 实例

+ 以 ec2-user 用户身份登录到 PD1。返回的消息可能与这里显示的略有不同。如果有提示，回答 `yes`。

  ```bash
     ./ssh-to-pd1.sh
  ```

+ 在 `PD1` 上启动 MySQL 实例。

  ```bash
  sudo service mysqld start
  ```

  ```output
  Redirecting to /bin/systemctl start mysqld.service
  ```

+ 使用 `root@'localhost'` 用户连接到 PD1 上的 MySQL server。

  ```bash
  mysql -h localhost -P 3306 -uroot -pq1w2e3R4_
  ```

  ```output
  Enter password:
  ...
  Server version: 5.7.41-log
  ...
  mysql>
  ```

+ 创建一个新用户 `dm_user@'%'`，并授予该用户权限：

  ```sql
  CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
  ```

  ```output
  mysql> CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
  Query OK, 0 rows affected (0.00 sec)
  ```

  ```sql
  GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
  ```

  ```output
  mysql> GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
  Query OK, 0 rows affected (0.00 sec)
  ```

+ 开启 `show_compatibility_56`：

  ```sql
  SET @@global.show_compatibility_56=ON;
  ```

  ```output
  mysql> SET @@global.show_compatibility_56=ON;
  Query OK, 0 rows affected (0.00 sec)
  ```

+ 退出终端并返回控制机 (monitor1_address)：

  ```sql
  EXIT
  ```

  ```output
  mysql> EXIT
  Bye
  ```

  ```bash
  exit
  ```

  ```output
  logout
  Connection to XX.XX.XX.XX closed.
  ```

### 步骤 2. 在 PD2 上设置数据源 MySQL 实例

+ 以 ec2-user 用户身份登录到 PD2。返回的消息可能与这里显示的略有不同。

  ```bash
  ./ssh-to-pd2.sh
  ```

+ 在 `PD2` 上启动 MySQL 实例。

  ```bash
  sudo service mysqld start
  ```

  ```output
  Redirecting to /bin/systemctl start mysqld.service
  ```

+ 使用 `root@'localhost'` 用户连接到 PD2 上的 MySQL server。

  ```bash
  mysql -h localhost -P 3306 -uroot -pq1w2e3R4_
  ```

  ```output
  Enter password:
  ...
  Server version: 5.7.41-log
  ...
  mysql>
  ```

+ 创建一个新用户 `dm_user@'%'`，并授予该用户权限。

  ```sql
  CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
  ```

  ```output
  mysql> CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
  Query OK, 0 rows affected (0.00 sec)
  ```

  ```sql
  GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
  ```

  ```output
  mysql> GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
  Query OK, 0 rows affected (0.00 sec)
  ```

+ 开启 `show_compatibility_56`。

  ```sql
  SET @@global.show_compatibility_56=ON;
  ```

  ```output
  mysql> SET @@global.show_compatibility_56=ON;
  Query OK, 0 rows affected (0.00 sec)
  ```

+ 退出终端并返回控制机。

  ```sql
  EXIT
  ```

  ```output
  mysql> EXIT
  Bye
  ```

  ```bash
  exit
  ```

  ```output
  logout
  Connection to XX.XX.XX.XX closed.
  ```

### 步骤 3. 向两个 MySQL 实例导入数据

+ 确保示例数据已解压。

  ```bash
  unzip -u stage/tidb-admin-dataset-v2.zip -d stage/
  ```

+ 将 `user`、 `store`、 `log` 和 `salesdb` 数据库导入到 PD1 的 MySQL 中。

  ```bash
  mysql -udm_user -pq1w2e3R4_ -h ${HOST_PD1_PRIVATE_IP} -P3306 < stage/TiDB-Administration-exercise-data-v2/exercise-dm/3306db.sql
  ```

+ 将 `user`、 `store`、 `log` 和 `salesdb` 数据库导入到 PD2 的 MySQL 中。

  ```bash
  mysql -udm_user -pq1w2e3R4_ -h ${HOST_PD2_PRIVATE_IP} -P3306 < stage/TiDB-Administration-exercise-data-v2/exercise-dm/3307db.sql
  ```

### 步骤 4. 设置目标 TiDB 集群数据

+ 连接到 TiDB：

  ```bash
  mysql -h ${HOST_DB1_PRIVATE_IP} -P 4000 -uroot
  ```

  ```output
  Welcome to the MySQL monitor.  Commands end with ; or \g.
  Your MySQL connection id is 405
  Server version: 5.7.25-TiDB-v7.5.1 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible
  ...
  mysql>
  ```

+ 创建一个名为 `dm_user` 的新用户，并授予该用户权限。

  ```sql
  CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
  ```

  ```output
  mysql> CREATE USER dm_user@'%' identified by 'q1w2e3R4_';
  Query OK, 0 rows affected (0.04 sec)
  ```

  ```sql
  GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
  ```

  ```output
  mysql> GRANT ALL PRIVILEGES ON *.* TO dm_user@'%';
  Query OK, 0 rows affected (0.02 sec)
  ```

+ 在 TiDB 上创建一个名为 `user_north` 的数据库，其包含名为 `information` 和 `trace` 的表。`information` 表应具有一个名为 `id` 的主键列和一个名为 `info` 的 `VARCHAR(64)` 列。 `trace` 表应具有一个名为 `id` 的主键列和一个名为 `content` 的 `VARCHAR(64)` 列。

  ```sql
  CREATE DATABASE user_north;
  CREATE TABLE user_north.information(id INT PRIMARY KEY, info VARCHAR(64));
  CREATE TABLE user_north.trace(id INT PRIMARY KEY, content VARCHAR(64));
  ```

  ```output
  mysql> CREATE DATABASE user_north;
  Query OK, 0 rows affected (0.08 sec)
  ...
  mysql> CREATE TABLE user_north.trace(id INT PRIMARY KEY, content VARCHAR(64));
  Query OK, 0 rows affected (0.09 sec)
  ```

+ 在 TiDB 上创建一个名为 `user_east`的数据库，其包含名为 `information` 和 `trace` 的表。`information` 表应具有一个名为 `id` 的主键列和一个名为 `info` 的 `VARCHAR(64)` 列。 `trace` 表应具有一个名为 `id` 的主键列和一个名为 `content` 的 `VARCHAR(64)` 列。

  ```sql
  CREATE DATABASE user_east;
  CREATE TABLE user_east.information(id INT PRIMARY KEY, info VARCHAR(64));
  CREATE TABLE user_east.trace(id INT PRIMARY KEY, content VARCHAR(64));
  ```

  ```output
  mysql> CREATE DATABASE user_east;
  Query OK, 0 rows affected (0.08 sec)
  ...
  mysql> CREATE TABLE user_east.trace(id INT PRIMARY KEY, content VARCHAR(64));
  Query OK, 0 rows affected (0.09 sec)

+ 在 TiDB 上创建一个名为 `store` 的数据库，其包含名为 `store_bj`, `store_tj`, `store_sh` 和 `store_suzhou` 的表。`store_bj` 表应具有一个名为 `id`的主键列和一个名为 `pname` 的 `VARCHAR(64)` 列。`store_tj` 表应具有一个名为 `id` 的主键列和一个名为 `pname` 的 `VARCHAR(64)` 列。`store_sh` 表应具有一个名为 `id` 的主键列和一个名为 `pname` 的 `VARCHAR(64)` 列。`store_suzhou`表应具有一个名为 `id` 的主键列和一个名为 `pname` 的`VARCHAR(64)` 列。

  ```sql
  CREATE DATABASE store;
  CREATE TABLE store.store_bj(id INT PRIMARY KEY, pname VARCHAR(64));
  CREATE TABLE store.store_tj(id INT PRIMARY KEY, pname VARCHAR(64));
  CREATE TABLE store.store_sh(id INT PRIMARY KEY, pname VARCHAR(64));
  CREATE TABLE store.store_suzhou(id INT PRIMARY KEY, pname VARCHAR(64));
  ```

  ```output
  mysql> CREATE DATABASE store;
  Query OK, 0 rows affected (0.09 sec)
  ...
  mysql> CREATE TABLE store.store_suzhou(id INT PRIMARY KEY, pname VARCHAR(64));
  Query OK, 0 rows affected (0.09 sec)
  ```

+ 在 TiDB 上创建一个名为 `salesdb`的数据库，其包含一个名为 `sales`的表。`sales` 表应具有一个名为 `id` 的主键列，一个名为 `pname` 的 `VARCHAR(20)`列和一个名为 `cnt` 的 `int` 列。

   ```sql
   CREATE DATABASE salesdb;
   CREATE TABLE salesdb.sales(id INT PRIMARY KEY, pname VARCHAR(20), cnt int);
   ```

   ```output
   mysql> CREATE DATABASE salesdb;
   Query OK, 0 rows affected (0.09 sec)
   mysql> CREATE TABLE sales.sales(id INT PRIMARY KEY, pname VARCHAR(20), cnt int);
   Query OK, 0 rows affected (0.09 sec)
   ```

+ 在 TiDB 上创建一个名为 `log` 的数据库，包含一个名为 `messages` 的表。 `messages` 表应具有一个名为 `id` 的主键列和一个名为 `msg` 的 `VARCHAR(64)` 列。然后退出会话。

   ```bash
   CREATE DATABASE log;
   CREATE TABLE log.messages(id INT PRIMARY KEY, msg VARCHAR(64));
   ```

   ```output
   mysql> CREATE DATABASE log;
   Query OK, 0 rows affected (0.08 sec)
   mysql> CREATE TABLE log.messages(id INT PRIMARY KEY, msg VARCHAR(64));
   Query OK, 0 rows affected (0.08 sec)
   ```

   ```sql
   EXIT
   ```

   ```output
   mysql> EXIT
   Bye
   ```
