## 模块 1：连接到 TiDB Cloud 集群

{% if TIDB_ENVIRONMENT == 'TiDB Cloud Starter' %}

### 步骤 1. 登录远程 Linux

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

{% elif TIDB_ENVIRONMENT == 'TiDB Cloud Essential' %}

### 步骤 1. 创建新的 TiDB Cloud Essential 集群

> [!TIP]
> 如果你已经在项目 `tidblabs-project` 下拥有用于实验或评估的 TiDB Cloud Essential 集群，则可以跳过此步骤。

- 进入 [TiDB Cloud 控制台项目页面](https://tidbcloud.com/org-settings/projects/)。
- 点击 `Create New Project`，将新项目命名为 `tidblabs-project`，并点击 `Confirm`。请确保你的 TiDB Cloud 账号已绑定信用卡，或已申请足够的 TiDB Cloud Credits，否则无法创建新项目。

![create-tidblabs-project.jpg 85%](https://lab-static.pingcap.com/images/2025/11/12/a0d8440ea67b16e4d3b4d22fa522fb1f1014abe4.jpg)

- 点击项目名称进入项目页面。

![click-tidblabs-project.png 85%](https://lab-static.pingcap.com/images/2025/11/13/385a38090615446a95ad7aae6977fb20f804bd50.png)

- 在 `Clusters` 页面，点击 `Create Cluster` 按钮。该按钮位于页面中间或右上角。选择 `Essential`，Cloud Provider 选择 `${LAB:CLOUD_PROVIDER}`，Region 选择 `${LAB:REGION_NAME} (${LAB:REGION_CODE})`。

![choose-essential-cp-region.jpg 85%](https://lab-static.pingcap.com/images/2025/11/13/7c9f14094559f38023dbde0a45e144365bb8bd72.jpg)

- 将新集群命名为 `tidblabs`，容量、双层加密、高可用性均保持默认。点击右侧的 `Create`。该集群会根据负载自动在 RCU 2K 到 RCU 4K 间弹性扩缩容。关于 RCU 的详细信息请参见[文档](https://www.pingcap.com/tidb-cloud-essential-pricing-details/)。

![create-tidblabs-essential-cluster.png 85%](https://lab-static.pingcap.com/images/2025/11/13/62e0c238d48c9a6b5298e8d4e11636bcfcb67a65.png)

- 等待数秒，直到集群状态变为 active。

![tidblabs-essential-active.jpg 85%](https://lab-static.pingcap.com/images/2025/11/13/5358b8f697ad135498f08d69d7c58d1018c552b9.jpg)

- 点击右上角的 `Connect` 按钮。

![click-connect-for-essential.jpg 85%](https://lab-static.pingcap.com/images/2025/11/13/d40772019b0ae45bda91931ad0259f09f551f8d3.jpg)

- 在 `Connect` 面板确认 Connect Type 选择 `Public`，操作系统选择 `Debian/Ubuntu/Arch`，再点击 `Generate Password`。

![tidblabs-essential-password-connect-generate.jpg 85%](https://lab-static.pingcap.com/images/2025/11/13/999bc20961199e2a4322451d19a15d930d931050.jpg)

- 点击这里 - [终端 1](ssh://monitor1-ssh#1)，打开连接到为你分配的 Ubuntu 虚拟机的新终端。

- 在 `Connect` 面板复制 HOST、PORT、USERNAME、PASSWORD 四项信息，将下方命令行中的占位符（用 `<` 和 `>` 包裹）手动替换为实际值，并在 [终端 1](ssh://monitor1-ssh#1) 中运行，设置为环境变量。

![tidblabs-essential-four-info.jpg 85%](https://lab-static.pingcap.com/images/2025/11/13/a08ea9cdbbaa9de290fe5a413da7db71c4e20ac5.jpg)

```bash
export SERVERLESS_CLUSTER_HOST=<HOST>
export SERVERLESS_CLUSTER_PORT=<PORT>
export SERVERLESS_CLUSTER_USERNAME='<USERNAME>'
export SERVERLESS_CLUSTER_PASSWORD='<PASSWORD>'
```

{% endif %}

### 步骤 2. 检查与 TiDB Cloud 集群的连通性

{% if TIDB_ENVIRONMENT == 'TiDB Cloud Starter' %}

+ 以下操作均在远程虚拟机进行。用三种方式连接 TiDB Cloud Starter。（退出 MySQL 客户端时使用 `EXIT`）

+ A. SSL 连接：使用如下命令连接。

  ```bash
  mysql \
   --comments -u '${LAB:SERVERLESS_CLUSTER_USERNAME}' -p'${LAB:SERVERLESS_CLUSTER_PASSWORD}' \
   -h ${LAB:SERVERLESS_CLUSTER_HOST} -P ${LAB:SERVERLESS_CLUSTER_PORT} \
   --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/certs/ca-certificates.crt
  ```

  ```output
  mysql>
  ```

  ```sql
  EXIT;
  ```

+ B. SSL 连接（不指定 `--ssl-mode`）：如果不指定，默认是 `PREFERRED`，表示客户端将优先尝试建立 SSL 连接，失败时退回到非加密连接。

  ```bash
  mysql \
   --comments -u '${LAB:SERVERLESS_CLUSTER_USERNAME}' -p'${LAB:SERVERLESS_CLUSTER_PASSWORD}' \
   -h ${LAB:SERVERLESS_CLUSTER_HOST} -P ${LAB:SERVERLESS_CLUSTER_PORT}
  ```

  ```output
  mysql>
  ```

  ```sql
  EXIT;
  ```

+ C. 非 SSL 连接：改用 `--ssl-mode=DISABLED`，此时将报错。

  ```bash
  mysql \
   --comments -u '${LAB:SERVERLESS_CLUSTER_USERNAME}' -p'${LAB:SERVERLESS_CLUSTER_PASSWORD}' \
   -h ${LAB:SERVERLESS_CLUSTER_HOST} -P ${LAB:SERVERLESS_CLUSTER_PORT} \
   --ssl-mode=DISABLED
  ```

  ```output
  mysql: [Warning] Using a password on the command line interface can be insecure.
  ERROR 1105 (HY000): Connections using insecure transport are prohibited. See https://docs.tidb.io/tidbcloud/secure-connections-to-serverless-tier-clusters
  ```

{% elif TIDB_ENVIRONMENT == 'TiDB Cloud Essential' %}

+ 以下操作均在远程虚拟机进行。用三种方式连接 TiDB Cloud Essential。（退出 MySQL 客户端时使用 `EXIT`）

+ A. SSL 连接：使用如下命令连接。

  ```bash
  mysql \
   --comments -u ${SERVERLESS_CLUSTER_USERNAME} -p${SERVERLESS_CLUSTER_PASSWORD} \
   -h ${SERVERLESS_CLUSTER_HOST} -P ${SERVERLESS_CLUSTER_PORT} \
   --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/certs/ca-certificates.crt
  ```

  ```output
  mysql>
  ```

  ```sql
  EXIT;
  ```

+ B. SSL 连接（不指定 `--ssl-mode`）：如果不指定，默认是 `PREFERRED`，表示客户端将优先尝试建立 SSL 连接，失败时退回到非加密连接。

  ```bash
  mysql \
   --comments -u ${SERVERLESS_CLUSTER_USERNAME} -p${SERVERLESS_CLUSTER_PASSWORD} \
   -h ${SERVERLESS_CLUSTER_HOST} -P ${SERVERLESS_CLUSTER_PORT}
  ```

  ```output
  mysql>
  ```

  ```sql
  EXIT;
  ```

+ C. 非 SSL 连接：改用 `--ssl-mode=DISABLED`，此时将报错。

  ```bash
  mysql \
   --comments -u ${SERVERLESS_CLUSTER_USERNAME} -p${SERVERLESS_CLUSTER_PASSWORD} \
   -h ${SERVERLESS_CLUSTER_HOST} -P ${SERVERLESS_CLUSTER_PORT} \
   --ssl-mode=DISABLED
  ```

  ```output
  mysql: [Warning] Using a password on the command line interface can be insecure.
  ERROR 1105 (HY000): Connections using insecure transport are prohibited. See https://docs.tidb.io/tidbcloud/secure-connections-to-serverless-tier-clusters
  ```

{% endif %}

### 步骤 3. 基本数据库操作

{% if TIDB_ENVIRONMENT == 'TiDB Cloud Starter' %}

+ 连接 TiDB。

  ```bash
  mysql \
   --comments -u '${LAB:SERVERLESS_CLUSTER_USERNAME}' -p'${LAB:SERVERLESS_CLUSTER_PASSWORD}' \
   -h ${LAB:SERVERLESS_CLUSTER_HOST} -P ${LAB:SERVERLESS_CLUSTER_PORT} \
   --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/certs/ca-certificates.crt
  ```

  ```output
  mysql>
  ```

+ 创建新数据库。

  ```sql
  DROP DATABASE IF EXISTS ${LAB:SERVERLESS_CLUSTER_DATABASE_NAME};
  CREATE DATABASE ${LAB:SERVERLESS_CLUSTER_DATABASE_NAME};
  SHOW DATABASES\G
  ```

  ```output
  *************************** 1. row ***************************
  Database: INFORMATION_SCHEMA
  *************************** 2. row ***************************
  Database: PERFORMANCE_SCHEMA
  *************************** 3. row ***************************
  Database: ${LAB:SERVERLESS_CLUSTER_DATABASE_NAME}
  *************************** 4. row ***************************
  Database: mysql
  *************************** 5. row ***************************
  Database: test
  5 rows in set (0.02 sec)
  ```

+ 创建新表。

  ```sql
  USE ${LAB:SERVERLESS_CLUSTER_DATABASE_NAME};
  CREATE TABLE color (id INT AUTO_INCREMENT, name TEXT, Point INT, PRIMARY KEY (id));
  INSERT INTO color (name, Point) VALUES ('red', 1);
  INSERT INTO color (name, Point) VALUES ('orange', 1);
  INSERT INTO color (name, Point) VALUES ('yellow', 2);
  SELECT * FROM color;
  ```

  ```output
  Database changed
  Query OK, 0 rows affected (0.14 sec)

  Query OK, 1 row affected (0.04 sec)

  Query OK, 1 row affected (0.01 sec)

  Query OK, 1 row affected (0.01 sec)

  +----+--------+-------+
  | id | name   | Point |
  +----+--------+-------+
  |  1 | red    |     1 |
  |  2 | orange |     1 |
  |  3 | yellow |     2 |
  +----+--------+-------+
  3 rows in set (0.01 sec)
  ```

{% elif TIDB_ENVIRONMENT == 'TiDB Cloud Essential' %}

+ 连接 TiDB。

  ```bash
  mysql \
   --comments -u ${SERVERLESS_CLUSTER_USERNAME} -p${SERVERLESS_CLUSTER_PASSWORD} \
   -h ${SERVERLESS_CLUSTER_HOST} -P ${SERVERLESS_CLUSTER_PORT} \
   --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/certs/ca-certificates.crt
  ```

  ```output
  mysql>
  ```

+ 创建新数据库。

  ```sql
  DROP DATABASE IF EXISTS lab_demo_${LAB:LAB_INSTANCE_ID};
  CREATE DATABASE lab_demo_${LAB:LAB_INSTANCE_ID};
  SHOW DATABASES\G
  ```

  ```output
  *************************** 1. row ***************************
  Database: INFORMATION_SCHEMA
  *************************** 2. row ***************************
  Database: PERFORMANCE_SCHEMA
  *************************** 3. row ***************************
  Database: lab_demo_${LAB:LAB_INSTANCE_ID}
  *************************** 4. row ***************************
  Database: mysql
  *************************** 5. row ***************************
  Database: test
  5 rows in set (0.02 sec)
  ```

+ 创建新表。

  ```sql
  USE lab_demo_${LAB:LAB_INSTANCE_ID};
  CREATE TABLE color (id INT AUTO_INCREMENT, name TEXT, Point INT, PRIMARY KEY (id));
  INSERT INTO color (name, Point) VALUES ('red', 1);
  INSERT INTO color (name, Point) VALUES ('orange', 1);
  INSERT INTO color (name, Point) VALUES ('yellow', 2);
  SELECT * FROM color;
  ```

  ```output
  Database changed
  Query OK, 0 rows affected (0.14 sec)

  Query OK, 1 row affected (0.04 sec)

  Query OK, 1 row affected (0.01 sec)

  Query OK, 1 row affected (0.01 sec)

  +----+--------+-------+
  | id | name   | Point |
  +----+--------+-------+
  |  1 | red    |     1 |
  |  2 | orange |     1 |
  |  3 | yellow |     2 |
  +----+--------+-------+
  3 rows in set (0.01 sec)
  ```

{% endif %}

### 步骤 4. 检查 MySQL 兼容性

+ TiDB 并非 100% 兼容 MySQL。这里检查如窗口函数等 MySQL 8.x 特性，以及不支持的存储过程。更多兼容性说明请参阅：[https://docs.pingcap.com/tidb/stable/mysql-compatibility/](https://docs.pingcap.com/tidb/stable/mysql-compatibility/)。

+ 检查默认字符集和排序规则不同。

  ```sql
  SHOW CREATE TABLE color\G
  ```

  ```output
  *************************** 1. row ***************************
         Table: color
  Create Table: CREATE TABLE `color` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` text DEFAULT NULL,
    `Point` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001
  1 row in set (0.00 sec)
  ```

+ 窗口函数示例。

  ```sql
  SELECT
    id,
    name,
    Point,
    RANK() OVER w as 'rank'
  FROM color
  WINDOW w AS (ORDER BY Point);
  ```

  ```output
  +----+--------+-------+------+
  | id | name   | Point | rank |
  +----+--------+-------+------+
  |  1 | red    |     1 |    1 |
  |  2 | orange |     1 |    1 |
  |  3 | yellow |     2 |    3 |
  +----+--------+-------+------+
  3 rows in set (0.01 sec)
  ```

+ 存储过程（将失败，TiDB 不支持）。

  ```sql
  delimiter //
  CREATE PROCEDURE sample()
  BEGIN
  SELECT * FROM color;
  END //
  delimiter ;
  ```

  ```output
  ERROR 8108 (HY000): Unsupported type *ast.ProcedureInfo
  ```

- 保持数据库连接，继续下一个模块。
