## Module 1: Set Up MySQL And TiDB For SQL Workloads Replay

+ Setup upstream MySQL and downstream TiDB environment, and install `sql-replay` and `tshark` tools.

### Step 1. Log into a Linux machine

+ Click here - [Terminal 1](ssh://monitor1-ssh#1) to open a new terminal connected to the virtual machine assigned for your hands-on lab.

### Step 2. Install `sql-replay`

+ Install `sql-replay` tool.

   ```bash
   mkdir ~/replay
   cd ~/replay
   wget https://github.com/Bowen-Tang/sql-replay/releases/download/v0.3.3/0.3.3.zip
   unzip 0.3.3.zip
   ```

   ```output
   --2024-08-06 09:07:09--  https://github.com/Bowen-Tang/sql-replay/releases/download/0.3.3/0.3.3.zip
    Resolving github.com (github.com)... 140.82.116.3
    Connecting to github.com (github.com)|140.82.116.3|:443... connected.
    HTTP request sent, awaiting response... 302 Found
    ...
    Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
    Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... connected.
    HTTP request sent, awaiting response... 
    200 OK
    Length: 7015215 (6.7M)
    Saving to: ‘0.3.3.zip’
    100%======================================================================================================================================================================> 7,015,215   --.-K/s   in 0.06s   

    2024-08-06 09:07:09 (119 MB/s) - ‘0.3.3.zip’ saved [7015215/7015215]

    $    unzip 0.3.3.zip
    Archive:  0.3.3.zip
      inflating: sql-replay              
   ```

+ Create a directory for saving files.

   ```bash
   mkdir ~/sql-replay
   cd ~/sql-replay
   ```

### Step 3. Install `parse-tshark`

+ Connect to MySQL server node. If prompted, answer `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 ~]$
   ```

+ Install `wireshark` and `parse-tshark` tools.

   ```bash
   sudo yum install -y wireshark
   ```

   ```output
   ...
   Complete!
   ```

+ Add user `rocky` to `wireshark` user group and grant `dump` path access permission.

   ```bash
   sudo usermod -a -G wireshark rocky
   sudo chmod +x /usr/bin/dumpcap
   mkdir ~/parse-tshark
   cd ~/parse-tshark
   wget https://github.com/Bowen-Tang/parse-tshark/releases/download/0.1.2/parse-tshark-v0.1.2.zip
   unzip parse-tshark-v0.1.2.zip
   export PATH=/home/rocky/parse-tshark:$PATH
   ```

   ```output
    [ec2-user@ip-10-90-4-205 replay]$ mkdir ~/parse-tshark
    [ec2-user@ip-10-90-4-205 replay]$    cd ~/parse-tshark
    [ec2-user@ip-10-90-4-205 parse-tshark]$    wget https://github.com/Bowen-Tang/parse-tshark/releases/download/0.1.2/parse-tshark-v0.1.2.zip
    --2024-08-06 09:11:36--  https://github.com/Bowen-Tang/parse-tshark/releases/download/0.1.2/parse-tshark-v0.1.2.zip
    Resolving github.com (github.com)... 140.82.116.3
    Connecting to github.com (github.com)|140.82.116.3|:443... connected.
    HTTP request sent, awaiting response... 302 Found
    ...
    Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.110.133, 185.199.111.133, ...
    Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 5162087 (4.9M) [application/octet-stream]
    Saving to: ‘parse-tshark-v0.1.2.zip’
    100%======================================================================================================================================================================> 5,162,087   10.1MB/s   in 0.5s   

    2024-08-06 09:11:37 (10.1 MB/s) - ‘parse-tshark-v0.1.2.zip’ saved [5162087/5162087]
    $ unzip parse-tshark-v0.1.2.zip
    Archive:  parse-tshark-v0.1.2.zip
    inflating: parse-tshark            
   ```

### Step 4. Prepare MySQL for SQL workloads capture

+ Connect to MySQL server as database user `root`.

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

  ```output
  mysql> 
  ```

+ Create database user `test`.

  ```sql
  DROP USER IF EXISTS 'test'@'%';
  CREATE USER 'test'@'%' 
  IDENTIFIED BY 'q1w2e3R4_';
  GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;
  FLUSH PRIVILEGES;
  ```

+ Set up the slow log parameters in MySQL.

  ```sql
  SET GLOBAL slow_query_log = on;
  SET GLOBAL slow_query_log_file='/var/lib/mysql/local-slow.log';
  SET GLOBAL long_query_time = 0;
  ```

  ```sql
  EXIT
  ```

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

+ Verify the parameters are correct.

  ```sql
  SHOW VARIABLES LIKE 'slow_query_log';
  SHOW VARIABLES LIKE 'slow_query_log_file';
  SHOW VARIABLES LIKE 'long_query_time';
  ```

  ```output
  mysql> SHOW VARIABLES LIKE 'slow_query_log';
  +----------------+-------+
  | Variable_name  | Value |
  +----------------+-------+
  | slow_query_log | ON    |
  +----------------+-------+
  1 row in set (0.00 sec)

  mysql> SHOW VARIABLES LIKE 'slow_query_log_file';
  +---------------------+----------------------------------------+
  | Variable_name       | Value                                  |
  +---------------------+----------------------------------------+
  | slow_query_log_file | /var/lib/mysql/local-slow.log          |
  +---------------------+----------------------------------------+
  1 row in set (0.00 sec)

  mysql> SHOW VARIABLES LIKE 'long_query_time';
  +-----------------+----------+
  | Variable_name   | Value    |
  +-----------------+----------+
  | long_query_time | 0.000000 |
  +-----------------+----------+
  1 row in set (0.00 sec)
  ```

+ Create `sbtest` database

   ```sql
   DROP DATABASE IF EXISTS sbtest;
   CREATE DATABASE sbtest;
   ```

+ Exit to monitor OS command line.

   ```sql
   EXIT
   ```

   ```output
   Bye
   ```

+ Add read privilege on slow query log files.

   ```bash
   sudo chmod -R +r /var/lib/mysql/local-slow.log
   ```

+ Return to the Linux bastion server.

   ```bash
   exit
   ```

   ```output
   logout
   Connection to 10.90.1.130 closed.
   ```

### Step 5. Prepare TiDB for SQL workloads replay

+ Set up downstream TiDB environment.

+ Prepare replay target database, and create `replay_info` table for recording SQLs' execution info.

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

   ```output
   mysql> 
   ```

   ```sql
   DROP DATABASE IF EXISTS sbtest;
   CREATE DATABASE sbtest;
   ```

   ```output
   Query OK, 0 rows affected (0.11 sec)
   ```

+ You have installed `sql-replay` and `parse-tshark` tools, and finished set up the source and target database for replaying SQL workloads. Proceed to the next module.
