LoginSignup
1
0

MySQL HeatWave で動作の制限・制約がある SQL 文 (2) データ型 (1)

Last updated at Posted at 2023-08-06

こちらの記事の続きです。

今回はデータ型の制限です。

3. BLOBBINARYおよびその関連データ型

前回は、

の中を見るだけで済んだのですが、今回はちょっとややこしいです。

の前に、

を見る必要があります(ここに書かれていないもの=サポート外)。

ページを見てみると、

  • BLOBLONGBLOBなどを含む)
  • BINARYVARBINARY

が存在しないのに気付くと思います。

実は、

というページがあり、サポート外の列はNOT SECONDARYで HeatWave へのロード対象から除外 する必要があります。

2023/8/6 時点(MySQL バージョン 8.1.0-u1-cloud)の情報です。
今後、結果などが変わる可能性があります。

BLOB列を除外せずに HeatWave にロードしてみる

まずは、BLOB列を持つテーブルを作って、いつものようにセカンダリエンジン(HeatWave)へのロードを試してみます。

mysql> CREATE DATABASE type_test;
Query OK, 1 row affected (0.01 sec)

mysql> USE type_test;
Database changed
mysql> CREATE TABLE blob_test (id INT NOT NULL AUTO_INCREMENT, val INT NOT NULL, bindata BLOB, PRIMARY KEY(id));
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO blob_test SET val = 100, bindata = 'aaaaa';
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO blob_test SET val = 200, bindata = 'bbbbb';
Query OK, 1 row affected (0.00 sec)

mysql> ALTER TABLE blob_test SECONDARY_ENGINE=RAPID;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

ここまでは普通に行けましたが、

mysql> ALTER TABLE blob_test SECONDARY_LOAD;
ERROR 3877 (HY000): Data type blob not supported by RAPID

やはりロードでエラー(ERROR 3877 (HY000): Data type blob not supported by RAPID)が出ました。

BLOB列を除外して HeatWave にロードしてみる

BLOB列をセカンダリエンジンへのロード対象から除外してロードします。

mysql> ALTER TABLE blob_test MODIFY bindata BLOB NOT SECONDARY;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE blob_test SECONDARY_LOAD;
Query OK, 0 rows affected (0.28 sec)

今度はうまく行きました。

4. 長い(65532 バイトを超える)TEXTおよびその関連データ型

なぜか前掲ページ(2.10)に補足事項として記されていないのに、こちらに記載があります。

Problem: A table load operation fails with “ERROR HY000: Error while running parallel scan.”

Solution: A TEXT-type column value larger than 65532 bytes is rejected during SECONDARY_LOAD operations. Reduce the size of the TEXT-type column value to less than 65532 bytes or exclude the column before loading the table. See Section 2.2.2.1, “Excluding Table Columns”.

Problem: Change propagation fails with the following error: “Blob/text value of n bytes was encountered during change propagation but RAPID supports text values only up to 65532 bytes.”

Solution: TEXT-type values larger than 65532 bytes are rejected during change propagation. Reduce the size of TEXT-type values to less than 65532 bytes. Should you encounter this error, check the change propagation status for the affected table. If change propagation is disabled, reload the table. See Section 2.2.7, “Change Propagation”.

65532 バイトのTEXT列を持つ行を HeatWave にロードしてみる

まずは 65532 バイトで試します。

mysql> CREATE TABLE text_test (id INT NOT NULL AUTO_INCREMENT, val INT NOT NULL, textdata TEXT, PRIMARY KEY(id));
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO text_test SET val = 110, textdata = REPEAT('a', 65532);
Query OK, 1 row affected (0.02 sec)

mysql> ALTER TABLE text_test SECONDARY_ENGINE=RAPID;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE text_test SECONDARY_LOAD;
Query OK, 0 rows affected (0.22 sec)

行けましたね。

65533 バイトのTEXT列を持つ行を追加してみる

この状態で 65533 バイトのTEXT列を持つ行を追加(挿入)します。

mysql> INSERT INTO text_test SET val = 210, textdata = REPEAT('b', 65533);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT id, LENGTH(textdata) FROM text_test;
+----+------------------+
| id | LENGTH(textdata) |
+----+------------------+
|  1 |            65532 |
|  2 |            65533 |
+----+------------------+
2 rows in set (0.00 sec)

特にエラーは出ませんね。

しかし、

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ id, LENGTH(textdata) FROM text_test;
ERROR 3889 (HY000): Secondary engine operation failed. Reason: "Table `type_test`.`text_test` is not loaded in HeatWave".

HeatWave でSELECTしてみると、エラー(ERROR 3889 (HY000): Secondary engine operation failed.)が出ました。

mysql> DELETE FROM text_test WHERE id = 2;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ id, LENGTH(textdata) FROM text_test;
ERROR 3889 (HY000): Secondary engine operation failed. Reason: "Table `type_test`.`text_test` is not loaded in HeatWave".

対象行をDELETEしただけではダメで、

mysql> ALTER TABLE text_test SECONDARY_UNLOAD;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE text_test SECONDARY_LOAD;
Query OK, 0 rows affected (0.25 sec)

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ id, LENGTH(textdata) FROM text_test;
+----+------------------+
| id | LENGTH(textdata) |
+----+------------------+
|  1 |            65532 |
+----+------------------+
1 row in set (0.09 sec)

アンロード→再ロードしてエラーが解消されました。

2.14 Troubleshooting に記されているとおり、(BLOB同様)列をセカンダリエンジンへのロード対象から除外する必要があるようですね。

今回はここでおしまい

結局、

記載事項の検証には入れませんでした(また次回以降で)。


2023/8/14 追記:
続きの記事を書きました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0