こちらの記事の続きです。
今回はデータ型の制限です。
3. BLOB
・BINARY
およびその関連データ型
前回は、
- 2.16 Limitations(MySQL HeatWave User Guide)
の中を見るだけで済んだのですが、今回はちょっとややこしいです。
- 2.16.2 Data Type Limitations(MySQL HeatWave User Guide)
の前に、
- 2.10 Supported Data Types(MySQL HeatWave User Guide)
を見る必要があります(ここに書かれていないもの=サポート外)。
ページを見てみると、
-
BLOB
(LONGBLOB
などを含む) -
BINARY
・VARBINARY
が存在しないのに気付くと思います。
実は、
- 2.2.2.1 Excluding Table Columns(MySQL HeatWave User Guide)
というページがあり、サポート外の列は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)に補足事項として記されていないのに、こちらに記載があります。
- 2.14 Troubleshooting(MySQL HeatWave User Guide)
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
同様)列をセカンダリエンジンへのロード対象から除外する必要があるようですね。
今回はここでおしまい
結局、
- 2.16.2 Data Type Limitations(MySQL HeatWave User Guide)
記載事項の検証には入れませんでした(また次回以降で)。
2023/8/14 追記:
続きの記事を書きました。