## 模块 2：创建复制任务

### 步骤 1. 通过 `SSH` 连接到 PD1

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

  ```output
  ...
  Last login: Sun Oct 15 21:44:34 2023
  ...
  ```

### 步骤 2. 在 PD1 上启动 MySQL server

  ```bash
  sudo service mysqld start
  ```

### 步骤 3. 登录 MySQL

+ 使用密码 `q1w2e3R4_`，以 `root@'localhost'` 身份登录 3306 端口的 MySQL server。

  ```bash
  mysql -u root -p -h 127.0.0.1 -P 3306 -pq1w2e3R4_
  ```

### 步骤 4. 为变更 Capture 任务创建一个用户

  ```sql
  CREATE USER cdc_user@'%' IDENTIFIED BY 'q1w2e3R4_';
  ```

  ```output
  mysql> CREATE USER cdc_user@'%' IDENTIFIED BY 'q1w2e3R4_';
  Query OK, 0 rows affected (0.00 sec)
  ```

  ```sql
  GRANT ALL PRIVILEGES on *.* to cdc_user@'%';
  ```

  ```output
  mysql> GRANT ALL PRIVILEGES on *.* to cdc_user@'%';
  Query OK, 0 rows affected (0.00 sec)
  ```

  ```sql
  EXIT;
  ```

  ```output
  mysql> EXIT;
  ```

### 步骤 5. 为上游 MySQL 数据库加载时区

  ```bash
  mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -pq1w2e3R4_
  ```

  ```output
  mysql: [Warning] Using a password on the command line interface can be insecure.
  Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
  Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
  Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
  Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
  Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
  ```

### 步骤 6. 为下游 MySQL 准备数据

+ 通过 3306 端口连接到下游 MySQL 数据库，并创建一个名为 `test`的新数据库，以及一个名为 `T1`的表。`T1` 表应具有一个名为 `id` 的主键列和一个名为 `name` 的 `VARCHAR(20)` 列。然后退出 MySQL 客户端。

  ```bash
  mysql -u root -h 127.0.0.1 -P 3306 -pq1w2e3R4_
  ```

  ```sql
  DROP DATABASE IF EXISTS test;
  CREATE DATABASE test;
  CREATE TABLE test.T1(id INT PRIMARY KEY, name VARCHAR(20));
  SELECT * FROM test.T1;
  ```

  ```sql
  EXIT;
  ```

### 步骤 7. 打开第二个终端（终端 2），并在 TiDB 上准备数据

+ 点击这里 - [终端 2](ssh://monitor1-ssh#2) 打开一个新的终端，连接到为你的实践实验分配的虚拟机。

   ```bash
   mysql -h${HOST_DB1_PRIVATE_IP} -P4000 -uroot
   ```

   ```sql
   DROP DATABASE IF EXISTS test;
   CREATE DATABASE test;
   CREATE TABLE test.T1(id INT PRIMARY KEY, name VARCHAR(20));
   SELECT * FROM test.T1;
   EXIT;
   ```

### 步骤 8. 在终端 2 中，创建一个复制任务

+ 在[终端 2](ssh://monitor1-ssh#2) 的 `monitor1` 中, 执行 `cdc:v${LAB:TIDB_VERSION} cli` 命令来创建一个复制任务。请注意 `cdc:v${LAB:TIDB_VERSION}` 版本，如果你省略版本标签，最新版本可能与我们的 TiDB 集群不兼容。你可能会收到一条警告消息，指出某些表不符合复制条件，因为它们没有主键或或非空唯一键。这些是之前练习遗留的表。只需选择 `Y` 忽略这些表。

+ 以下是对命令的一些详细解释：
  + `--pd=http://${HOST_PD1_PRIVATE_IP}:2379`：其中一个 PD 节点的 IP 地址。
  + `--sink-uri="mysql://cdc_user:q1w2e3R4_@${HOST_PD1_PRIVATE_IP}:3306/"`：复制任务的下游地址为 ${HOST_PD1_PRIVATE_IP}，端口为 3306。
  + `--changefeed-id="replication-task-1" --sort-engine="unified"`: 复制任务的 ID。

  ```bash
  tiup cdc:v${LAB:TIDB_VERSION} cli changefeed create --pd=http://${HOST_PD1_PRIVATE_IP}:2379 \
     --sink-uri="mysql://cdc_user:q1w2e3R4_@${HOST_PD1_PRIVATE_IP}:3306/" \
     --changefeed-id="replication-task-1" --sort-engine="unified"
  ```

  ```output
  tiup cdc:v${LAB:TIDB_VERSION} cli changefeed create --pd=http://${HOST_PD1_PRIVATE_IP}:2379 \

  > --sink-uri="mysql://cdc_user:q1w2e3R4_@${HOST_PD1_PRIVATE_IP}:3306/" \
  > --changefeed-id="replication-task-1" --sort-engine="unified"
  Starting component `cdc`: /home/ec2-user/.tiup/components/cdc/v${LAB:TIDB_VERSION}/cdc cli changefeed create --pd=http://10.80.0.224:2379 --sink-uri=mysql://cdc_user:q1w2e3R4_@10.80.0.224:3306/ --changefeed-id=replication-task-1 --sort-engine=unified
  Create changefeed successfully!
  ID: replication-task-1
  Info: {"upstream-id":0,"sink-uri":"mysql://cdc_user:q1w2e3R4_@10.80.0.224:3306/","opts":{},"create-time":"2023-02-13T12:54:53.673149259Z","start-ts":439430124303286275,"target-ts":0,"admin-job-type":0,"sort-engine":"unified","sort-dir":"","config":{"case-sensitive":true,"enable-old-value":true,"force-replicate":false,"check-gc-safe-point":true,"filter":{"rules":["*.*"],"ignore-txn-start-ts":null},"mounter":{"worker-num":16},"sink":{"dispatchers":null,"protocol":"","column-selectors":null,"schema-registry":""},"cyclic-replication":{"enable":false,"replica-id":0,"filter-replica-ids":null,"id-buckets":0,"sync-ddl":false},"consistent":{"level":"none","max-log-size":64,"flush-interval":1000,"storage":""}},"state":"normal","error":null,"sync-point-enabled":false,"sync-point-interval":600000000000,"creator-version":"v6.1.0"}
  ```

### 步骤 9. 在终端 2 中，查询复制任务列表

  ```bash
  tiup cdc:v${LAB:TIDB_VERSION} cli changefeed list --pd=http://${HOST_PD1_PRIVATE_IP}:2379
  ```

  ```output
  Starting component `cdc`: /home/ec2-user/.tiup/components/cdc/v${LAB:TIDB_VERSION}/cdc cli changefeed list --pd=http://10.80.0.224:2379
  [
  {
     "id": "replication-task-1",
     "summary": {
     "state": "normal",
     "tso": 439430205069852673,
     "checkpoint": "2023-02-13 13:00:01.713",
     "error": null
     }
  }
  ]
  ```

### 步骤 10. 在终端 2 中，查询指定的复制任务

  ```bash
  tiup cdc:v${LAB:TIDB_VERSION} cli changefeed query --pd=http://${HOST_PD3_PRIVATE_IP}:2379 --changefeed-id=replication-task-1
  ```

  ```output
  Starting component `cdc`: /home/ec2-user/.tiup/components/cdc/v${LAB:TIDB_VERSION}/cdc cli changefeed query --pd=http://10.80.0.12:2379 --changefeed-id=replication-task-1
  {
     "upstream_id": 7231813390813770262,
     "namespace": "default",
     "id": "replication-task-1",
     "sink_uri": "mysql://cdc_user:xxxxx@10.90.3.188:3306/",
     "config": {
     "memory_quota": 1073741824,
     "case_sensitive": true,
     "enable_old_value": true,
     "force_replicate": false,
     "ignore_ineligible_table": false,
     "check_gc_safe_point": true,
     "enable_sync_point": false,
     "bdr_mode": false,
     "sync_point_interval": 600000000000,
     "sync_point_retention": 86400000000000,
     "filter": {
        "rules": [
           "*.*"
        ],
        "event_filters": null
     },
     "mounter": {
        "worker_num": 16
     },
     "sink": {
        "protocol": "",
        "schema_registry": "",
        "csv": {
           "delimiter": ",",
           "quote": "\"",
           "null": "\\N",
           "include_commit_ts": false
        },
        "column_selectors": null,
        "transaction_atomicity": "",
        "encoder_concurrency": 16,
        "terminator": "\r\n",
        "date_separator": "none",
        "enable_partition_separator": false
     },
     "consistent": {
        "level": "none",
        "max_log_size": 64,
        "flush_interval": 2000,
        "storage": ""
     }
     },
     "create_time": "2023-05-11 07:09:04.259",
     "start_ts": 441395168967655437,
     "resolved_ts": 441395195247853571,
     "target_ts": 0,
     "checkpoint_tso": 441395195247853571,
     "checkpoint_time": "2023-05-11 07:10:44.372",
     "sort_engine": "unified",
     "state": "normal",
     "error": null,
     "error_history": null,
     "creator_version": "",
     "task_status": [
     {
        "capture_id": "4399c858-e811-4d9e-9b08-fb5690c097ec",
        "table_ids": [],
        "table_operations": null
     },
     {
        "capture_id": "5982fa7d-c755-409a-88d5-03527c8a0fcd",
        "table_ids": [],
        "table_operations": null
     },
     {
        "capture_id": "1c15e075-1435-464c-af66-92ba0286a7fe",
        "table_ids": [
           80
        ],
        "table_operations": null
     }
     ]
  }
  ```

### 步骤 11. 在终端 2 中，向上游 TiDB 插入数据

  ```bash
  mysql -h${HOST_DB1_PRIVATE_IP} -P4000 -uroot
  ```

  ```sql
  SELECT * FROM test.T1;
  ```

  ```output
  mysql> SELECT * FROM test.T1;
  Empty set (0.01 sec)
  ```

  ```sql
  INSERT INTO test.T1 VALUES(1, 'Tom');
  ```

  ```output
  mysql> INSERT INTO test.T1 VALUES(1, 'Tom');
  Query OK, 1 row affected (0.00 sec)
  ```

  ```sql
  SELECT * FROM test.T1;
  ```

  ```output
  mysql> SELECT * FROM test.T1;
  +----+------+
  | id | name |
  +----+------+
  |  1 | Tom  |
  +----+------+
  1 row in set (0.00 sec)
  ```

  ```sql
  EXIT;
  ```

### 步骤 12. 检查下游 MySQL 中的结果

- 在 [终端 1](ssh://monitor1-ssh#2) 中，执行以下命令。

  ```bash
  mysql -u cdc_user -h 127.0.0.1 -P 3306 -pq1w2e3R4_
  ```

  ```sql
  SELECT * FROM test.T1;
  ```

  ```output
  mysql> SELECT * FROM test.T1;
  +----+------+
  | id | name |
  +----+------+
  |  1 | Tom  |
  +----+------+
  1 row in set (0.00 sec)
  ```

  ```sql
  EXIT;
  ```

  ```output
  mysql> EXIT;
  ```

+ 从 PD1 退出并返回控制机。

  ```bash
  exit
  ```
