## 模块 1：基于现有 MySQL 数据库容量规划 TiDB 存储层规模

### 步骤 1. 连接到远程 Linux 机器

+ 点击此处 - [终端 1](ssh://monitor1-ssh#1) 打开一个连接到实验机器的新终端，然后连接到 MySQL 服务器并运行查询以获取 `sbtest` 数据库的数据大小。

+ 登录后显示的信息如下：

### 步骤 2. 了解现有 MySQL 数据库的数据量概况

+ 连接到 MySQL server 节点。如有提示，回答 `yes`。

   ```bash
   ssh -i /home/ec2-user/.ssh/pe-class-key-${LAB:REGION_NAME}.pem rocky@${HOST_MYSQL1_PRIVATE_IP}
   ```

   ```output
   Last login: Thu Aug  1 11:58:47 2024 from 10.90.4.90
   [rocky@ip-10-90-1-235 ~]$
   ```

+ 以数据库用户 `root` 连接到 MySQL server。

   ```bash
   mysql -h localhost -P 3306 -u root -pq1w2e3R4_ --connect-expired-password
   ```

   ```output
   mysql> 
   ```

+ 检查 `sbtest` 数据库中的表和数据。`sbtest` 数据库已由 Sysbench 填充数据。

   ```sql
   SHOW DATABASES;
   ```

   ```output
   +--------------------+
   | Database           |
   +--------------------+
   | information_schema |
   | mysql              |
   | performance_schema |
   | sbtest             |
   | sys                |
   +--------------------+
   5 rows in set (0.01 sec)
   ```

   ```sql
   SHOW TABLES FROM sbtest;
   ```

   ```output
   +------------------+
   | Tables_in_sbtest |
   +------------------+
   | sbtest1          |
   | sbtest2          |
   | sbtest3          |
   | sbtest4          |
   | sbtest5          |
   | sbtest6          |
   +------------------+
   6 rows in set (0.00 sec)
   ```

+ 查看表 `sbtest.sbtest1` 的架构和行数，、`sbtest2`, `sbtest3`, `sbtest4`, `sbtest5`和 `sbtest6` 情况类似。这大约需要 1 分钟。

   ```sql
   DESC sbtest.sbtest1;
   ```

   ```output
   +-------+-----------+------+-----+---------+----------------+
   | Field | Type      | Null | Key | Default | Extra          |
   +-------+-----------+------+-----+---------+----------------+
   | id    | int       | NO   | PRI | NULL    | auto_increment |
   | k     | int       | NO   | MUL | 0       |                |
   | c     | char(120) | NO   |     |         |                |
   | pad   | char(60)  | NO   |     |         |                |
   +-------+-----------+------+-----+---------+----------------+
   4 rows in set (0.00 sec)
   ```

   ```sql
   SELECT COUNT(id) FROM sbtest.sbtest1;
   ```

   ```output
   +-----------+
   | COUNT(id) |
   +-----------+
   |  10000000 |
   +-----------+
   1 row in set (32.49 sec)
   ```

+ 对数据库 `sbtest` 执行 `ANALYZE` 命令。

   ```sql
   ANALYZE TABLE sbtest.sbtest1, sbtest.sbtest2, sbtest.sbtest3, sbtest.sbtest4, sbtest.sbtest5, sbtest.sbtest6;
   ```

   ```output
   +----------------+---------+----------+----------+
   | Table          | Op      | Msg_type | Msg_text |
   +----------------+---------+----------+----------+
   | sbtest.sbtest1 | analyze | status   | OK       |
   | sbtest.sbtest2 | analyze | status   | OK       |
   | sbtest.sbtest3 | analyze | status   | OK       |
   | sbtest.sbtest4 | analyze | status   | OK       |
   | sbtest.sbtest5 | analyze | status   | OK       |
   | sbtest.sbtest6 | analyze | status   | OK       |
   +----------------+---------+----------+----------+
   6 rows in set (40.95 sec)
   ```

+ 获取数据大小。`sbtest` 数据库的数据大小应该在 `13.43GB` 左右。

   ```sql
   SELECT CONCAT(ROUND(SUM((data_length + index_length)/1024/1024/1024),2), 'GB') AS data
   FROM information_schema.tables
   WHERE table_schema='sbtest';
   ```

   ```output
   +---------+
   | data    |
   +---------+
   | 13.43GB |
   +---------+
   1 row in set (0.00 sec)
   ```

+ 使用操作系统命令验证数据大小。检索 `sbtest` 数据库的 `datadir` 路径。

   ```sql
   SHOW GLOBAL VARIABLES LIKE "%datadir%";
   ```

   ```output
   +---------------+-----------------+
   | Variable_name | Value           |
   +---------------+-----------------+
   | datadir       | /var/lib/mysql/ |
   +---------------+-----------------+
   1 row in set (0.00 sec)
   ```

+ 退出到操作系统提示符。

   ```sql
   EXIT
   ```

   ```output
   bye
   ```

+ 列出`sbtest`数据库中表的数据文件。总数据大小应约为`14GB`。

   ```bash
   sudo ls -lh /var/lib/mysql/sbtest
   ```

   ```output
   total 14G
   -rw-r-----. 1 mysql mysql 2.3G Jul 23 06:22 sbtest1.ibd
   -rw-r-----. 1 mysql mysql 2.3G Jul 23 06:22 sbtest2.ibd
   -rw-r-----. 1 mysql mysql 2.3G Jul 23 06:22 sbtest3.ibd
   -rw-r-----. 1 mysql mysql 2.3G Jul 23 06:22 sbtest4.ibd
   -rw-r-----. 1 mysql mysql 2.3G Jul 23 06:22 sbtest5.ibd
   -rw-r-----. 1 mysql mysql 2.3G Jul 23 06:22 sbtest6.ibd
   ```

### 步骤 3. 估算 TiDB 的存储容量

+ 我们将 SQL 查询的结果作为 MySQL 数据库中 `sbtest` 的大小。这是大小调整工具的数据量输入，为 `13.43GB`。

+ 使用估算工具估算 TiDB 中 `sbtest` 数据库的存储大小。

+ 数据大小计算公式为：`TiKV 数据量 = （现有数据大小） x （压缩率） x （TiKV 副本数）`。压缩率根据不同的数据类型和内容而不同。压缩率无法提前计算，只能在数据真正导入 TiKV 集群后才能确定。切记以 35% 到 50% 的范围作为起点。

  + 预估 TiKV 数据量 = （现有数据大小） x （压缩率） x （TiKV 副本数）
  + 预估 TiKV 数据量 = (13.43 GB) x (35% ~ 50%) x (3)
  + 预估 TiKV 数据量 = 14.10 GB ~ 20.15 GB

+ TiKV 所需的数据存储预估在 14.10 GB 到 20.15 GB 之间。您将在迁移步骤完成后进行验证。
