本文由Technology Hub同事Xin Zhang翻译。原文地址为:
https://qiita.com/sugimount/items/9ecf8800cd59ba2a635c
介绍

MySQL数据库服务(MDS)刚刚发布了HeatWave!HeatWave可以让您超级加速MySQL对工作负载的加载,提高大型数据分析和耗时SQL查询的速度。只要在控制台界面中打开MySQL数据库服务的HeatWave功能复选框,就可以使用HeatWave,所以您不需要对现有的应用程序进行任何更改。您不需要对应用端做任何改动,只要启用HeatWave就可以加快对工作负载的加载。
在本文中,我将向您展示如何创建一个新的MySQL数据库服务和HeatWave。
服务限额(Service Limit)

由于服务限额(Service Limit),HeatWave在默认情况下是不能使用的状态。首先,需要申请放宽服务限额。

从下拉菜单选择MySQL后,以下两个项目与HeatWave有关。服务限制的值为0,所以您可以通过页面顶部请求服务限制(request a service limit)链接请求放宽限额。
MySQL Analytics VM.Standard.E3 Nodes Count : HeatWave NodeMySQL Database for Analytics VM.Standard.E3 Nodes Count : MySQL本身
(译者注:2021年1月下旬,改名为MySQL Database for HeatWave VM.Standard.E3 Nodes Count)

需要申请以下两种类型。
MySQL Analytics VM.Standard.E3 Nodes Count,需要至少2个节点(Node)。
MySQL Database for Analytics VM.Standard.E3 Nodes Count,MySQL本身,需要至少1个。
我们把理由写成这样(日文应该也可以)。(译者注:这里仅是将日文翻译成中文,推荐大家尽量使用英文。)
HeatWave的每个Node可以存储400GB左右的数据,所以根据您要卸载(Offload)到HeatWave的数据量来调整您申请的Node数量。
我想验证一下HeatWave的操作,所以申请放宽限制。 MySQL Analytics VM.Standard.E3 Nodes Count : 3 Node MySQL Database for Analytics VM.Standard.E3 Nodes Count : 1 Node |

审批通过后,服务限额(Service Limit)将这样增加。

创建MySQL Database Service

服务限制被放宽后,我们将创建MySQL数据库服务+HeatWave,从MySQL中选择"数据库系统(DB Systems)"。

点击创建"MySQL数据库系统(Create MySQL DB System)"。

输入"名称(Name)"和"说明(Description)"后,点击 "更改配置(Change Shape)"。

选择可以使用HeatWave的配置(Shape)。目前,E3 Shape中只有MySQL.Analytics.VM.Standard.E3可以启用HeatWave。

输入"数据存储大小(Data Storage Size)"。

输入各个项目值,点击"下一步(Next)"。

点击"创建(Create)"创建MySQL数据库服务。

状态变成"正在创建(Creating)"。在我的环境中,状态变成"活动(Active)"用了不到10分钟。

状态变成"活动(Active)"了。让我们把HeatWave添加到MySQL数据库服务中。从左下角的菜单中选择"HeatWave"。

点击"添加 HeatWave 集群(Add HeatWave Cluster)"。

确保配置(Shape)是MySQL.Analytics.VM.Standard.E3 ,输入所需的"节点计数(Node Count)",然后点击"添加 HeatWave 集群(Add HeatWave Cluster)"。据悉,每个HeatWave Node可以存储约400GB的数据。

因为HeatWave被设为3个节点,所以可以看到HeatWave Nodes变成了3行"正在创建(Creating)"。

HeatWave集群变成"活动(Active)"用了不到10分钟。

创建1亿行测试数据

现在我们已经将HeatWave功能添加到MySQL数据库服务中。我们将在OCI计算实例上安装MySQL客户端并进行连接,以便创建1亿行测试数据。
激活MySQL安装库。
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
安装MySQL客户端。
sudo yum install mysql-community-client
依赖关系如下。
========================================================================================================================Package Arch Version Repository Size========================================================================================================================Installing:mysql-community-client x86_64 8.0.22-1.el7 mysql80-community 48 Mmysql-community-libs x86_64 8.0.22-1.el7 mysql80-community 4.6 Mreplacing mariadb-libs.x86_64 1:5.5.68-1.el7mysql-community-libs-compat x86_64 8.0.22-1.el7 mysql80-community 1.2 Mreplacing mariadb-libs.x86_64 1:5.5.68-1.el7Installing for dependencies:mysql-community-client-plugins x86_64 8.0.22-1.el7 mysql80-community 235 kmysql-community-common x86_64 8.0.22-1.el7 mysql80-community 616 kTransaction Summary========================================================================================================================
检查MySQL数据库服务的"端点(Endpoints)"。

从MySQL客户端连接,用户名和密码是您创建MySQL数据库服务时指定的。
mysql --host heatwave.mysqlsubnet01.vcn.oraclevcn.com -u admin -p
连接成功。
[opc@mysql-client01 ~]$ mysql --host heatwave.mysqlsubnet01.vcn.oraclevcn.com -u admin -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 259Server version: 8.0.22-u4-cloud MySQL Enterprise - CloudCopyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
检查数据库列表。
mysql> SHOW DATABASES;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys |+--------------------+4 rows in set (0.01 sec)mysql>
用一个适当的名字创建一个数据库。
CREATE DATABASE sugi01;
检查。
mysql> SHOW DATABASES;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sugi01 || sys |+--------------------+5 rows in set (0.00 sec)mysql>
切换到您创建的sugi01数据库。
mysql> USE sugi01;Database changedmysql>
没有任何表(Table)。
mysql> SHOW TABLES;Empty set (0.00 sec)mysql>
需要sample表,创建sample表并创建10行数据。
CREATE TABLE sample(id INT(11) NOT NULL AUTO_INCREMENT,value INT(5) NOT NULL DEFAULT 0,PRIMARY KEY (id));INSERT INTO sample(value)VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
创建一个account表来存储1亿行的测试数据。
CREATE TABLE account(id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(50) NOT NULL,subid INT(11) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id));
在创建的account表中创建1亿行数据。
使用包含10行数据的sample表,进行交叉连接(Cross Join),并将测试数据插入到account表。
在我的环境中,花了大约10分钟17秒。
INSERT INTO account(name, subid)SELECTCONCAT('NAME' , @rownum := @rownum + 1),@rownumFROMsample AS s1,sample AS s2,sample AS s3,sample AS s4,sample AS s5,sample AS s6,sample AS s7,sample AS s8,(SELECT @rownum := 0) AS v;
数据存储正确。
mysql> SELECT * FROM account LIMIT 10;+----+--------+-------+---------------------+---------------------+| id | name | subid | created_at | updated_at |+----+--------+-------+---------------------+---------------------+| 1 | NAME1 | 1 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 2 | NAME2 | 2 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 3 | NAME3 | 3 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 4 | NAME4 | 4 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 5 | NAME5 | 5 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 6 | NAME6 | 6 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 7 | NAME7 | 7 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 8 | NAME8 | 8 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 9 | NAME9 | 9 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 || 10 | NAME10 | 10 | 2020-12-26 01:53:45 | 2020-12-26 01:53:45 |+----+--------+-------+---------------------+---------------------+10 rows in set (0.00 sec)mysql>
1亿行测试数据存储正确。
mysql> SELECT COUNT(id) FROM account;+-----------+| COUNT(id) |+-----------+| 100000000 |+-----------+1 row in set (0.01 sec)mysql>
我们执行一个查询,会引起全表扫描,由于是全表扫描1亿行数据,所以会花费不少时间。(这里先不透露准确的秒数)。
mysql> SELECT * FROM account WHERE subid BETWEEN 100 and 110;+-----+---------+-------+---------------------+---------------------+| id | name | subid | created_at | updated_at |+-----+---------+-------+---------------------+---------------------+| 100 | NAME100 | 100 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 101 | NAME101 | 101 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 102 | NAME102 | 102 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 103 | NAME103 | 103 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 104 | NAME104 | 104 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 105 | NAME105 | 105 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 106 | NAME106 | 106 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 107 | NAME107 | 107 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 108 | NAME108 | 108 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 109 | NAME109 | 109 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 110 | NAME110 | 110 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 |+-----+---------+-------+---------------------+---------------------+11 rows in set (XX.XX sec)mysql>
我们来看看此时的执行计划。类型(type)为ALL,也就是全表扫描。
mysql> EXPLAIN SELECT * FROM account WHERE subid BETWEEN 100 and 110;+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------+| 1 | SIMPLE | account | NULL | ALL | NULL | NULL | NULL | NULL | 97926422 | 11.11 | Using where |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------+1 row in set, 1 warning (0.00 sec)mysql>
删除表。(此时不执行,最后如果需要删除时执行。)
DROP TABLE account;
HeatWave 同步进度率显示准备

我们要将1亿行数据同步到HeatWave中,要自动获取同步进度率,需要创建一个简单的Bash脚本。
如果用SQL执行,可以看到与HeatWave的数据同步进度。
SELECT VARIABLE_VALUEFROM performance_schema.global_statusWHERE VARIABLE_NAME = 'rapid_load_progress';
下面是一个运行的例子。现在,什么都没有同步,所以是0%。当同步完成后,该显示将为100%。
mysql> SELECT VARIABLE_VALUE-> FROM performance_schema.global_status-> WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 0.000000 |+----------------+1 row in set (0.00 sec)mysql>
您也可以使用SQL来生成已经同步的表的列表。
SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;
下面是一个执行的例子。由于现在没有任何同步,所以显示为空(Empty)。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;Empty set (0.00 sec)mysql>
一旦退出了MySQL客户端,我们将创建一个脚本,定期运行输出与HeatWave的数据同步进度。
mkdir ~/heatwavetest
创建一个简单的Bash脚本,在这个脚本中,您为您的环境指定mysql命令连接和密码。
cat <<'EOF' > ~/heatwavetest/GetHeatWaveProgress.sh#!/bin/bashwhile true; doecho "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";date;mysql --host heatwave.mysqlsubnet01.vcn.oraclevcn.com -u admin -p"your password" --execute="SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';";echo " ";sleep 10s;doneEOF
授予执行权限。
chmod +x ~/heatwavetest/GetHeatWaveProgress.sh
运行测试,验证progress.txt显示进度率是否有问题。
~/heatwavetest/GetHeatWaveProgress.sh >> ~/heatwavetest/progress.txt
我们会在后台运行它。
nohup ~/heatwavetest/GetHeatWaveProgress.sh >> ~/heatwavetest/progress.txt &
检查。
[opc@mysql-client01 ~]$ ps aux | grep heatopc 12272 0.0 0.0 113256 1308 pts/0 S 12:21 0:00 bin/bash home/opc/heatwavetest/GetHeatWaveProgress.shopc 12277 0.0 0.0 112780 684 pts/0 S+ 12:22 0:00 grep --color=auto heat[opc@mysql-client01 ~]$
HeatWave 同步开始

在开始同步到HeatWave之前,请检查包含1亿行数据的account表的使用容量。
容量检查SQL。
SELECTtable_name, engine, table_rows AS tbl_rows,avg_row_length AS rlen,floor((data_length+index_length)/1024/1024) AS ALL_MB, #总容量floor((data_length)/1024/1024) AS DATA_MB, #数据容量floor((index_length)/1024/1024) AS Index_MB #索引容量FROMinformation_schema.tablesWHEREtable_schema=database()ORDER BY(data_length+index_length) DESC;
执行示例。
我们使用的是4893MB。我们要将一张5GB左右的表同步到HeatWave。
+------------+--------+----------+------+--------+---------+----------+| TABLE_NAME | ENGINE | tbl_rows | rlen | ALL_MB | DATA_MB | Index_MB |+------------+--------+----------+------+--------+---------+----------+| account | InnoDB | 99785933 | 51 | 4893 | 4893 | 0 || sample | InnoDB | 10 | 1638 | 0 | 0 | 0 |+------------+--------+----------+------+--------+---------+----------+2 rows in set (0.00 sec)
SECONDARY_ENGINE里,定义了使用HeatWave(RAPID) 。我猜想,大概是为了将来出了RAPID以外的SECONDARY_ENGINE时,能够切换使用的引擎。在这个时候,同步还没有开始。
ALTER TABLE account SECONDARY_ENGINE = RAPID;
下面的命令将实际开始同步。(在同步完成之前,您不会收到提示)
ALTER TABLE account SECONDARY_LOAD;
执行示例。1亿行数据,约5GB的数据,同步耗时约1分38秒。
mysql> ALTER TABLE account SECONDARY_LOAD;Query OK, 0 rows affected (1 min 38.30 sec)mysql>
这是检查数据同步进度的命令,约为62%。
mysql> SELECT VARIABLE_VALUE-> FROM performance_schema.global_status-> WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 62.118067 |+----------------+1 row in set (0.00 sec)mysql>
您可以看到每个表的数据同步状态。同步中时,那就是"LOADING_RPDGSTABSTATE"。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;+----------------+-----------------------+| NAME | LOAD_STATUS |+----------------+-----------------------+| sugi01.account | LOADING_RPDGSTABSTATE |+----------------+-----------------------+1 row in set (0.00 sec)mysql>
同步完成后,进度百分比为100%。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 100.000000 |+----------------+1 row in set (0.00 sec)mysql>
以表为单位,状态为"AVAIL_RPDGSTABSTATE"。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;+----------------+---------------------+| NAME | LOAD_STATUS |+----------------+---------------------+| sugi01.account | AVAIL_RPDGSTABSTATE |+----------------+---------------------+1 row in set (0.00 sec)mysql>
HeatWave 执行测试

现在同步已经完成,我们可以测试HeatWave。首先,我们先来看看EXPLAIN中的执行计划。我们使用的是全表扫描SQL查询。
EXPLAIN SELECT * FROM account WHERE subid BETWEEN 100 and 110;
这里举个例子:类型是ALL,所以发生了全表扫描,但在Extra部分,可以看到显示Using secondary engine RAPID ,表示将卸载(Offload)到HeatWave。此外,您还可以通过Hint子句控制是否进行卸载(Offload)。
mysql> EXPLAIN SELECT * FROM account WHERE subid BETWEEN 100 and 110;+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+| 1 | SIMPLE | account | NULL | ALL | NULL | NULL | NULL | NULL | 97926422 | 11.11 | Using where; Using secondary engine RAPID |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+1 row in set, 1 warning (0.00 sec)mysql>
现在,让我们来看看它在对一张有1亿行数据的表进行全表扫描时的表现。
结果在0.02秒内返回,虽然没有透露禁用HeatWave时的秒数,但速度非常快。
在我的环境中,它的放大倍数变成了1500倍左右。请您也在您的环境中试试。
mysql> SELECT * FROM account WHERE subid BETWEEN 100 and 110;+-----+---------+-------+---------------------+---------------------+| id | name | subid | created_at | updated_at |+-----+---------+-------+---------------------+---------------------+| 109 | NAME109 | 109 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 110 | NAME110 | 110 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 104 | NAME104 | 104 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 100 | NAME100 | 100 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 101 | NAME101 | 101 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 102 | NAME102 | 102 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 103 | NAME103 | 103 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 105 | NAME105 | 105 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 106 | NAME106 | 106 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 107 | NAME107 | 107 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 108 | NAME108 | 108 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 |+-----+---------+-------+---------------------+---------------------+11 rows in set (0.02 sec)mysql>
附录1:带提示(Hint)的卸载控制(Offload Controll)

您可以在每个SQL查询的基础上控制卸载(Offload)到HeatWave,如下文所述,https://dev.mysql.com/doc/heatwave/en/heatwave-best-practices.html。
提示(Hint)的规范如下。
ON:使用HeatWave,因故障等原因不能使用HeatWave时,由MDS自行处理(与未指定提示时的操作相同)。
OFF:不使用HeatWave。
FORCED : 强制使用HeatWave,如果HeatWave因故障等原因无法使用,SQL查询会出现错误。
SELECT *+ SET_VAR(use_secondary_engine = ON) */ * FROM account WHERE subid BETWEEN 100 and 110;SELECT *+ SET_VAR(use_secondary_engine = OFF) */ * FROM account WHERE subid BETWEEN 100 and 110;SELECT *+ SET_VAR(use_secondary_engine = FORCED) */ * FROM account WHERE subid BETWEEN 100 and 110;
ON : 使用HeatWave,但如果不能使用,则由MDS自己处理(与未指定提示时的操作相同)。
EXPLAIN SELECT *+ SET_VAR(use_secondary_engine = ON) */ * FROM account WHERE subid BETWEEN 100 and 110;
执行计划。
mysql> EXPLAIN SELECT *+ SET_VAR(use_secondary_engine = ON) */ * FROM account WHERE subid BETWEEN 100 and 110;+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+| 1 | SIMPLE | account | NULL | ALL | NULL | NULL | NULL | NULL | 97926422 | 11.11 | Using where; Using secondary engine RAPID |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+1 row in set, 1 warning (0.00 sec)mysql>
OFF : 即使与HeatWave同步,也不会卸载(Offload)。
EXPLAIN SELECT *+ SET_VAR(use_secondary_engine = OFF) */ * FROM account WHERE subid BETWEEN 100 and 110;
执行计划。
mysql> EXPLAIN SELECT *+ SET_VAR(use_secondary_engine = OFF) */ * FROM account WHERE subid BETWEEN 100 and 110;+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------+| 1 | SIMPLE | account | NULL | ALL | NULL | NULL | NULL | NULL | 97926422 | 11.11 | Using where |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------+1 row in set, 1 warning (0.00 sec)mysql>
FORCED : 强制使用HeatWave。
EXPLAIN SELECT *+ SET_VAR(use_secondary_engine = FORCED) */ * FROM account WHERE subid BETWEEN 100 and 110;
执行计划。
mysql> EXPLAIN SELECT *+ SET_VAR(use_secondary_engine = FORCED) */ * FROM account WHERE subid BETWEEN 100 and 110;+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+| 1 | SIMPLE | account | NULL | ALL | NULL | NULL | NULL | NULL | 97926422 | 11.11 | Using where; Using secondary engine RAPID |+----+-------------+---------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------+1 row in set, 1 warning (0.00 sec)mysql>
当HeatWave被禁用时,它会立即返回一个错误信息。
mysql> SELECT *+ SET_VAR(use_secondary_engine = FORCED) */ * FROM account WHERE subid BETWEEN 100 and 110;ERROR 3889 (HY000): Secondary engine operation failed. use_secondary_engine is FORCED but query could not be executed in secondary engine.mysql>
附录2:HeatWave 解除链接

同步状态。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;+----------------+---------------------+| NAME | LOAD_STATUS |+----------------+---------------------+| sugi01.account | AVAIL_RPDGSTABSTATE |+----------------+---------------------+1 row in set (0.00 sec)mysql>
HeatWave可以在Alter Table中解除链接。
ALTER TABLE account SECONDARY_UNLOAD;
结果为EMPTY。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;Empty set (0.00 sec)mysql>
附录3:HeatWave 停止行为

可通过OCI控制台停止。

停止(Stop)。

所有的节点都变成"更新(Updating)"状态。
变成"更新(Updating)"状态时,数据同步率变为0%。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 0.000000 |+----------------+1 row in set (0.00 sec)mysql>
一段时间后,HeatWave的状态变为"不活动(Inactive)"。

附录4:HeatWave 启动行为

当从停止状态启动时,经过一定时间后就会变成"活动(Active)"状态。

但是,即使表变成"活动(Active)"状态,也不会自动同步。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 0.000000 |+----------------+1 row in set (0.00 sec)mysql>
您需要手动执行启动同步命令。
ALTER TABLE account SECONDARY_LOAD;
附录5:HeatWave 重启行为

重启(Restart)。

重启(Restart)。

变成"更新(Updating)"状态时,数据同步率变为0%。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 0.000000 |+----------------+1 row in set (0.00 sec)mysql>
与启动时一样,即使变成"活动(Active)"状态,表也不会自动同步。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 0.000000 |+----------------+1 row in set (0.00 sec)mysql>
您需要手动执行启动同步命令。
ALTER TABLE account SECONDARY_LOAD;
附录6:检查实时同步性

当前结果,与HeatWave同步。
mysql> SELECT * FROM account WHERE subid BETWEEN 100 and 110;+-----+---------+-------+---------------------+---------------------+| id | name | subid | created_at | updated_at |+-----+---------+-------+---------------------+---------------------+| 100 | NAME100 | 100 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 101 | NAME101 | 101 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 102 | NAME102 | 102 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 103 | NAME103 | 103 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 105 | NAME105 | 105 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 106 | NAME106 | 106 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 107 | NAME107 | 107 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 108 | NAME108 | 108 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 104 | NAME104 | 104 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 109 | NAME109 | 109 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 110 | NAME110 | 110 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 |+-----+---------+-------+---------------------+---------------------+11 rows in set (0.03 sec)mysql>
更新(UPDATE)。
UPDATE account SET name="NAME110_Updated" WHERE id = 110;
立即被更新。
mysql> SELECT * FROM account WHERE subid BETWEEN 100 and 110;+-----+-----------------+-------+---------------------+---------------------+| id | name | subid | created_at | updated_at |+-----+-----------------+-------+---------------------+---------------------+| 109 | NAME109 | 109 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 110 | NAME110_Updated | 110 | 2020-12-26 12:04:38 | 2020-12-26 12:04:38 || 104 | NAME104 | 104 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 100 | NAME100 | 100 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 101 | NAME101 | 101 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 102 | NAME102 | 102 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 103 | NAME103 | 103 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 105 | NAME105 | 105 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 106 | NAME106 | 106 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 107 | NAME107 | 107 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 || 108 | NAME108 | 108 | 2020-12-26 10:45:13 | 2020-12-26 10:45:13 |+-----+-----------------+-------+---------------------+---------------------+11 rows in set (0.05 sec)mysql>
附录7:启用HeatWave后,插入1亿行数据

test01.account 表的同步。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;+----------------+---------------------+| NAME | LOAD_STATUS |+----------------+---------------------+| sugi01.account | AVAIL_RPDGSTABSTATE || test01.account | AVAIL_RPDGSTABSTATE |+----------------+---------------------+2 rows in set (0.00 sec)mysql>
插入1亿行数据:10分46秒(与HeatWave不同步时的时间相差不大)。
mysql> INSERT INTO account(name, subid)-> SELECT-> CONCAT('NAME' , @rownum := @rownum + 1),@rownum-> FROM-> sample AS s1,-> sample AS s2,-> sample AS s3,-> sample AS s4,-> sample AS s5,-> sample AS s6,-> sample AS s7,-> sample AS s8,-> (SELECT @rownum := 0) AS v;Query OK, 100000000 rows affected, 2 warnings (10 min 46.39 sec)Records: 100000000 Duplicates: 0 Warnings: 2mysql>
附录8:添加同步表时的行为

只有一张表是同步的。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;+----------------+-----------------------+| NAME | LOAD_STATUS |+----------------+-----------------------+| sugi01.account | AVAIL_RPDGSTABSTATE |+----------------+-----------------------+1 rows in set (0.00 sec)mysql>
同步率100%。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 100.000000 |+----------------+1 row in set (0.00 sec)mysql>
test01.account 表开始同步。
ALTER TABLE account SECONDARY_LOAD;
同步率达到50%。
因为第一个表已经同步,第二个表正在同步中。
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'rapid_load_progress';+----------------+| VARIABLE_VALUE |+----------------+| 51.827686 |+----------------+1 row in set (0.00 sec)mysql>
状态。
mysql> SELECT NAME, LOAD_STATUS FROM performance_schema.rpd_tables, performance_schema.rpd_table_id WHERE rpd_tables.ID = rpd_table_id.ID;+----------------+-----------------------+| NAME | LOAD_STATUS |+----------------+-----------------------+| sugi01.account | AVAIL_RPDGSTABSTATE || test01.account | LOADING_RPDGSTABSTATE |+----------------+-----------------------+2 rows in set (0.00 sec)mysql>
在同步第二张表的同时,查询第一张表的返回速度很快(卸载(Offload)到HeatWave了)。
mysql> SELECT * FROM account WHERE subid BETWEEN 100 and 110;+-----+---------+-------+---------------------+---------------------+| id | name | subid | created_at | updated_at |+-----+---------+-------+---------------------+---------------------+| 104 | NAME104 | 104 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 109 | NAME109 | 109 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 110 | NAME110 | 110 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 100 | NAME100 | 100 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 101 | NAME101 | 101 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 102 | NAME102 | 102 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 103 | NAME103 | 103 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 105 | NAME105 | 105 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 106 | NAME106 | 106 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 107 | NAME107 | 107 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 || 108 | NAME108 | 108 | 2020-12-26 01:59:10 | 2020-12-26 01:59:10 |+-----+---------+-------+---------------------+---------------------+11 rows in set (0.03 sec)mysql>
参考网址

Performance
https://www.oracle.com/jp/mysql/heatwave/performance/
GitHub
https://github.com/oracle/heatwave-tpch
Document
https://docs.oracle.com/en-us/iaas/mysql-database/doc/heatwave1.html
HeatWave User Guide
https://dev.mysql.com/doc/heatwave/en/
使用SQL创建大量的测试数据
https://qiita.com/cobot00/items/8d59e0734314a88d74c7
本文封面图来自https://blogs.oracle.com/mysql/mysql-best-of-2020
编辑:萧宇





