すべてのプロダクト
Search
ドキュメントセンター

PolarDB:OSS 外部テーブルを使用した OSS データへのアクセス

最終更新日:May 14, 2025

PolarDB では、Object Storage Service (OSS) 外部テーブルを使用して、OSS に保存されている CSV 形式のデータを直接クエリできます。これにより、ストレージコストを効果的に削減できます。このトピックでは、OSS 外部テーブルを使用して OSS データにアクセスする方法について説明します。

前提条件

お使いの PolarDB クラスタが、次のいずれかの要件を満たしている必要があります。

  • MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.25.4 以降である。

  • MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.1 以降である。

クラスタバージョンの確認方法の詳細については、「エンジンバージョンのクエリ」をご参照ください。

仕組み

OSS 外部テーブルを使用して、CSV 形式のコールドデータを OSS バケットに保存し、クエリと分析を行うことができます。コールドデータとは、アクセス頻度の低いデータのことです。次の図は、そのプロセスを示しています。OSS外表

制限事項

  • OSS 外部テーブルを使用してクエリできるのは、CSV 形式のデータのみです。

  • OSS 外部テーブルで実行できる操作は、CREATE、SELECT、および DROP のみです。

    説明

    DROP 操作では、PolarDB 内のテーブル情報のみが削除され、OSS に保存されているデータファイルには影響しません。

  • OSS 外部テーブルでは、インデックス作成、パーティション分割、またはトランザクションはサポートされていません。

  • CSV 形式のデータには、数値、日付と時刻、文字列値、および NULL 値を含めることができます。次の表に、サポートされているデータ型を示します。

    説明
    • 地理空間データ型はサポートされていません。

    • CSV 形式の圧縮ファイルをクエリすることはできません。

    • NULL 値は、次のいずれかの要件を満たすクラスタでサポートされています。

      • MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.28 以降である。

      • MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.5 以降である。

    数値型

    データ型

    サイズ

    データ範囲(符号付き)

    データ範囲(符号なし)

    説明

    TINYINT

    1 バイト

    -128~127

    0~255

    小さい整数値

    SMALLINT

    2 バイト

    -32768~32767

    0~65535

    整数値

    MEDIUMINT

    3 バイト

    -8388608~8388607

    0~16777215

    整数値

    INT または INTEGER

    4 バイト

    -2147483648~2147483647

    0~4294967295

    整数値

    BIGINT

    8 バイト

    -9,223,372,036,854,775,808~9223372036854775807

    0~18446744073709551615

    大きい整数値

    FLOAT

    4 バイト

    -3.402823466 E+38~-1.175494351E-38; 0; 1.175494351E-38~3.402823466351E+38

    0; 1.175494351E-38~3.402823466E+38

    単精度浮動小数点値

    DOUBLE

    8 バイト

    -2.2250738585072014E-308~-1.7976931348623157E+308; 0; 1.7976931348623157E+308~2.2250738585072014E-308

    0; 1.7976931348623157E+308~2.2250738585072014E-308

    倍精度浮動小数点値

    DECIMAL

    DECIMAL(M,D) の場合、M>D の場合は M+2 です。それ以外の場合は D+2 です。

    M と D の値によって異なります。

    M と D の値によって異なります。

    10 進値

    日付と時刻のデータ型

    データ型

    サイズ

    データ範囲

    フォーマット

    説明

    DATE

    3 バイト

    1000-01-01~9999-12-31

    YYYY-MM-DD

    日付値

    TIME

    3 バイト

    -838:59:59~838:59:59

    HH:MM:SS

    時刻値または期間

    YEAR

    1 バイト

    1901~2155

    YYYY

    DATETIME

    8 バイト

    1000-01-01 00:00:00~9999-12-31 23:59:59

    YYYY-MM-DD HH:MM:SS

    日付と時刻の組み合わせ

    説明

    この型の月と日には、2 桁の数字が必要です。たとえば、2020 年 1 月 1 日は、2020-1-1 ではなく 2020-01-01 と記述する必要があります。 2020-1-1 が OSS にプッシュダウンされた場合、クエリは期待どおりに実行されません。

    TIMESTAMP

    4 バイト

    1970-01-01 00:00:00~2038-01-19 03:14:07

    YYYY-MM-DD HH:MM:SS

    タイムスタンプ(日付と時刻の組み合わせ)値

    説明

    この型の月と日には、2 桁の数字が必要です。たとえば、2020 年 1 月 1 日は、2020-1-1 ではなく 2020-01-01 と記述する必要があります。 2020-1-1 が OSS にプッシュダウンされた場合、クエリは期待どおりに実行されません。

    文字列型

    データ型

    サイズ

    説明

    CHAR

    0~255 バイト

    固定長文字列

    VARCHAR

    0~65535 バイト

    可変長文字列

    TINYBLOB

    0~255 バイト

    最大 255 文字の小さいバイナリラージオブジェクト

    TINYTEXT

    0~255 バイト

    短い文字列

    BLOB

    0~65535 バイト

    標準のバイナリラージオブジェクト

    TEXT

    0~65535 バイト

    標準の文字列

    MEDIUMBLOB

    0~16777215 バイト

    中程度のバイナリラージオブジェクト

    MEDIUMTEXT

    0~16777215 バイト

    中程度の文字列

    LONGBLOB

    0~4294967295 バイト

    長いバイナリラージオブジェクト

    LONGTEXT

    0~4294967295 バイト

    長い文字列

    NULL 値

    NULL 値の挿入

    • OSS 外部テーブルに NULL 値を挿入します。

      OSS 外部テーブルに NULL 値を挿入するには、テーブルの作成時に NULL_MARKER を設定する必要があります。 OSS 外部テーブルの場合、NULL_MARKER のデフォルト値は NULL です。 SHOW CREATE TABLE 文を実行して、NULL_MARKER の値を確認できます。

      SHOW CREATE TABLE t1;

      結果例:

      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | Table | Create Table                                                                                                                                                                      |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | t1    | CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL
      ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='server_name' |
      +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      1 row in set (0.00 sec)
    • CSV ファイルに NULL 値を挿入します。

      CSV ファイルのフィールドに NULL_MARKER の値を二重引用符(")で囲まずに挿入すると、PolarDB はその値を NULL として識別します。

      説明
      • NULL_MARKER の値を二重引用符(")で囲むと、PolarDB はその値を文字列として識別します。つまり、is_null 文では、その値を NULL として識別できません。 CSV ファイルで NULL 値が割り当てられているフィールドのデータ型が、OSS 外部テーブルの対応するフィールドのデータ型と一致しない場合は、エラーが報告されます。

      • NULL_MARKER 値には数字のみを含めることはできず、空にすることもできません。また、次の 4 文字を含めることはできません。

        "\n\r、または ,

      次の文を実行して、OSS 外部テーブルを作成します。

      CREATE TABLE `t1` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `time` timestamp NULL DEFAULT NULL
      ) ENGINE=CSV NULL_MARKER='NULL' CONNECTION='server_name';

      この例では、データファイルには次のデータが含まれています。

      1,"xiaohong","2022-01-01 00:00:00"
      NULL,"xiaoming","2022-02-01 00:00:00"
      3,NULL,"2022-03-01 00:00:00"
      4,"xiaowang",NULL

      OSS 外部テーブルをクエリすると、次の OSS データが取得されます。

      SELECT * FROM t1;
      +------+----------+---------------------+
      | id   | name     | time                |
      +------+----------+---------------------+
      |    1 | xiaohong | 2022-01-01 00:00:00 |
      | NULL | xiaoming | 2022-02-01 00:00:00 |
      |    3 | NULL     | 2022-03-01 00:00:00 |
      |    4 | xiaowang | NULL                |
      +------+----------+---------------------+

    NULL 値の読み取り

    • CSV ファイルからデータを読み取るときに、CSV ファイルのフィールドの値が NULL で、OSS 外部テーブルの対応する値を NULL に設定できる場合、フィールドは直接 NULL に設定されます。

    • CSV ファイルからデータを読み取るときに、CSV ファイルのフィールドの値が NULL であるにもかかわらず、OSS 外部テーブルの対応する値が NOT NULL に設定されている場合、CSV ファイルのデータは OSS 外部テーブルで指定されたデータと競合します。この場合、指定された構文検証ルールに応じて異なる結果が返されます。

      • sql_modeSTRICT_TRANS_TABLES に設定すると、エラーが報告されます。

      • sql_modeSTRICT_TRANS_TABLES 以外の値に設定し、現在のフィールドにデフォルト値がある場合、現在のフィールドの値はデフォルト値に設定されます。現在のフィールドにデフォルト値がない場合、現在のフィールドには、フィールド型に基づいて MySQL のデフォルト値が割り当てられます。詳細については、データ型のデフォルト値 を参照してください。警告メッセージが表示された場合は、SHOW WARNINGS; 文を実行して、警告メッセージの詳細を表示できます。

    説明

    SHOW VARIABLES LIKE "sql_mode"; 文を実行して、現在の構文検証ルールを表示できます。[PolarDB コンソール] にログインし、[設定と管理] > [パラメーター] に移動して sql_mode の値を変更することで、構文検証ルールを変更できます。詳細については、「パラメーターを変更する」をご参照ください。

    t という名前の OSS 外部テーブルを作成し、id フィールドを NOT NULL に設定し、デフォルト値を設定しません。

    CREATE TABLE `t` (
      `id` int(11) NOT NULL
    ) ENGINE=CSV 
    CONNECTION="server_name";

    この例では、t.csv ファイルには次のデータが含まれています。

    NULL
    2

    OSS 外部テーブルを使用して CSV ファイルからデータを読み取ると、次のいずれかのシナリオが発生します。

    • sql_modeSTRICT_TRANS_TABLES に設定されていて、次の文を実行して CSV ファイルのデータをクエリする場合:

      SELECT * FROM t;

      次のエラーメッセージが報告されます。

      ERROR 1364 (HY000): Field 'id' doesn't have a default value
    • sql_modeSTRICT_TRANS_TABLES 以外の値に設定されていて、次の文を実行して CSV ファイルのデータをクエリする場合:

      SELECT * FROM t;

      結果例:

      +----+
      | id |
      +----+
      |  0 |
      |  2 |
      +----+
      2 rows in set, 1 warning (0.00 sec)

      0 は MySQL のデフォルト値です。次の文を実行して、警告メッセージの詳細を表示します。

      SHOW WARNINGS;

      結果例:

      +---------+------+-----------------------------------------+
      | Level   | Code | Message                                 |
      +---------+------+-----------------------------------------+
      | Warning | 1364 | Field 'id' doesn't have a default value |
      +---------+------+-----------------------------------------+
      1 row in set (0.00 sec)

パラメータ

PolarDB コンソール にログオンします。[クラスタ] ページでクラスタを見つけ、[設定と管理] > [パラメータ] ページに移動してパラメータを変更します。

パラメータ

レベル

説明

loose_csv_oss_buff_size

セッション

OSS スレッドが占有するメモリのサイズ。デフォルト値: 134217728。単位: バイト。

有効な値: 4096~134217728。

loose_csv_max_oss_threads

グローバル

実行が許可されている OSS スレッドの数。デフォルト値: 1。

有効な値: 1~100。

OSS の最大メモリは、loose_csv_max_oss_threads * loose_csv_oss_buff_size です。

説明

OSS を使用する場合、OSS の合計メモリ使用量を現在のノードのメモリ容量の 5% に制限することをお勧めします。そうしないと、メモリ不足の問題が発生する可能性があります。

手順

OSS サーバーの作成

OSS サーバーを作成して OSS 接続情報を追加し、OSS に接続します。

説明

セキュリティリスクのため、OSS に接続する他の方法は無効になっています。 OSS サーバーを作成して OSS 接続情報を追加し、OSS に接続することのみ可能です。

新しいバージョンのクラスタ用のステートメント

クラスタが次の要件を満たしている場合、このセクションの作成構文が適用されます。

  • MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.28 以降である。

  • MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.5 以降である。

CREATE SERVER <server_name> 
FOREIGN DATA WRAPPER oss OPTIONS 
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id": "<my_oss_access_key_id>","oss_access_key_secret": "<my_oss_access_key_secret>","oss_prefix":"<my_oss_prefix>","oss_sts_token":"<my_oss_sts_token>"}'
);
説明
  • DATABASE パラメータはオプションです。このパラメータは、oss_prefix パラメータと同じように機能します。 oss_prefix を使用することをお勧めします。

  • oss_sts_token パラメータは、次の要件を満たすクラスタでサポートされています。

    • MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.29 以降である。

    • MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.6 以降である。

次の表に、構文のパラメータを示します。

パラメータ

データ型

必須

説明

server_name

STRING

はい

OSS サーバー名。

説明

名前はグローバルに一意である必要があります。名前は最大 64 文字の長さで、大文字と小文字は区別されません。 64 文字を超える名前は自動的に切り詰められます。OSS サーバー名を引用符で囲んだ文字列として指定できます。

my_database_name

String

いいえ

CSV ファイルの OSS ディレクトリ。

説明

作成した OSS サーバーに DATABASE パラメータと my_oss_prefix パラメータの両方が存在する場合、ファイルの最終的なパスは my_oss_prefix/DATABASE になります。 DATABASE パラメータの設定方法の詳細については、以下のセクションを参照してください。

my_oss_endpoint

STRING

はい

OSS サーバーのエンドポイント。

説明

Alibaba Cloud サーバーからデータベースにアクセスする場合は、インターネットトラフィックが発生しないように、内部エンドポイントを使用してください。内部エンドポイントには、「internal」というキーワードが含まれています。

たとえば、中国 (杭州) リージョンの OSS ノードの内部エンドポイントは、oss-cn-xxx-internal.aliyuncs.com です。

my_oss_bucket

STRING

はい

データファイルが保存されているバケット。データをインポートする前に、OSS バケットを作成する必要があります。

説明

ネットワークレイテンシを PolarDB クラスタと同じゾーンにバケットをデプロイすることをお勧めします。

my_oss_access_key_id

STRING

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID

my_oss_access_key_secret

STRING

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret

my_oss_prefix

String

いいえ

CSV ファイルの OSS ディレクトリ。

my_oss_sts_token

String

いいえ

Security Token Service (STS) によって提供される一時的なアクセス認証情報。

説明
  • このパラメータは、STS によって提供される一時的なアクセス認証情報を使用して OSS にアクセスする 場合に必須です。

  • my_oss_sts_token パラメータにはデフォルトの有効期限があります。 my_oss_sts_token 値の有効期限が切れた場合は、次の文を実行してすべての EXTRA_SERVER_INFO 値をリセットする必要があります。

    ALTER SERVER server_name OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
    "oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
    "oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');

以前のバージョンのクラスタ用のステートメント

クラスタが次の要件を満たしている場合、このセクションの作成構文が適用されます。

  • MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.25.4~8.0.1.1.28 である。

  • MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.1~8.0.2.2.5 である。

CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
  [DATABASE '<my_database_name>',]
  EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id":"<my_oss_access_key_id>","oss_access_key_secret":"<my_oss_access_key_secret>"}'
);                  
説明

oss_prefix パラメータと oss_sts_token パラメータはサポートされていません。

次の表に、構文のパラメータを示します。

パラメータ

データ型

必須

コンポーネント

server_name

STRING

はい

OSS サーバー名。

説明

名前はグローバルに一意である必要があります。名前は最大 64 文字の長さで、大文字と小文字は区別されません。 64 文字を超える名前は自動的に切り詰められます。OSS サーバー名を引用符で囲んだ文字列として指定できます。

my_database_name

String

いいえ

CSV ファイルの OSS ディレクトリの名前。

my_oss_endpoint

STRING

はい

OSS サーバーのエンドポイント。

説明

Alibaba Cloud サーバーからデータベースにアクセスする場合は、インターネットトラフィックが発生しないように、内部エンドポイントを使用してください。内部エンドポイントには、「internal」というキーワードが含まれています。

例: oss-cn-xxx-internal.aliyuncs.com

my_oss_bucket

STRING

はい

データファイルが保存されているバケット。データをインポートする前に、OSS バケットを作成する必要があります。

my_oss_access_key_id

STRING

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID

my_oss_access_key_secret

STRING

はい

RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret

説明

OSS サーバーを作成するには、SERVERS_ADMIN 権限が必要です。 SHOW GRANTS FOR username; 文を実行して、現在のユーザーに SERVERS_ADMIN 権限があるかどうかを確認できます。特権アカウントはデフォルトで SERVERS_ADMIN 権限を持っており、標準アカウントに SERVERS_ADMIN 権限を付与できます。

  • SERVERS_ADMIN 権限がない場合は、Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation というエラーメッセージが表示されます。

  • SERVERS_ADMIN 権限のない標準アカウントを使用している場合は、特権アカウントを使用して GRANT SERVERS_ADMIN ON *.* TO `users`@`%` WITH GRANT OPTION 文を実行できます。

  • SERVERS_ADMIN 権限のない特権アカウントを使用している場合は、アカウントの権限をリセットできます。そのためには、[PolarDB コンソール] でクラスターを見つけ、クラスター ID または名前をクリックしてクラスター詳細ページに移動します。左側のナビゲーションウィンドウで、[設定と管理] > [アカウント] を選択します。 [ユーザーアカウント] タブで、管理する特権アカウントを見つけ、 [アクション] 列の [権限のリセット] をクリックします。権限がリセットされるまで待ちます。その後、特権アカウントは SERVERS_ADMIN 権限を持ちます。

  • 特権アカウントを使用している場合は、SELECT Server_name, Extra_server_info FROM mysql.servers; 文を実行して、作成した OSS サーバーの情報を表示できます。セキュリティ上の理由から、oss_access_key_id パラメータと oss_access_key_secret パラメータの値は暗号化されています。

データのアップロード

ossutil ツール を使用して、ローカルの CSV ファイルをリモートの OSS バケットにアップロードできます。

説明
  • CSV ファイルの OSS ディレクトリは、OSS サーバーの DATABASE ディレクトリまたは oss_prefix ディレクトリである必要があります。

  • CSV ファイル名は OSS 外部テーブル名.CSV である必要があり、CSV 拡張子はすべて大文字にする必要があります。たとえば、OSS 外部テーブル名が t1 の場合、CSV ファイル名は t1.CSV である必要があります。

  • CSV ファイルのデータフィールドは、OSS 外部テーブルのフィールドと一致する必要があります。たとえば、OSS 外部テーブル t1INT 型のフィールド id のみがある場合、CSV ファイルには INT 型のフィールドが 1 つだけ存在できます。

  • ローカルの MySQL データファイルを直接アップロードし、テーブル定義に基づいて OSS 外部テーブルを作成することをお勧めします。

OSS 外部テーブルの作成

OSS サーバーを定義したら、PolarDB 上に OSS 外部テーブルを作成して OSS に接続できます。例:

CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";

connection_string の値は、スラッシュ(/)で区切られた次の項目で構成されます。

  • OSS サーバー名。

  • オプション。OSS 内のデータファイルのパス。

    説明

    クラスタが次の要件を満たしている場合、OSS 内のデータファイルのパスを設定できます。

    • MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.28 以降である。

    • MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.5 以降である。

  • (オプション)データファイル名。

    説明
    • データファイル名には、.CSV 拡張子を含めることはできません。

    • データファイル名を指定しない場合、現在のテーブルに対応する OSS ファイルは 現在のテーブルの名前.CSV です。データファイル名を指定した場合、現在のテーブルに対応する OSS ファイルは 指定されたデータファイル名.CSV です。

    • OSS 内のデータファイルのパスを設定する場合は、ファイル名を指定する必要があります。そうしないと、システムがデータファイルを検索するときに、パスの最後のセグメントがファイル名と見なされます。

OSS 外部テーブルの表示

OSS 外部テーブルを作成したら、show create table 文を実行して OSS 外部テーブルを表示できます。作成されたテーブルのエンジンが CSV(ENGINE=CSV)であるかどうかを確認します。そうでない場合、PolarDB クラスタのバージョンが古く、OSS をサポートしていません。詳細については、前提条件 を参照してください。

CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";

上記のサンプルコードでは、connection_string は次の要素で構成されています。

  • OSS サーバー名: server_name

  • OSS 内のデータファイルのパス: oss_prefix/a/b/c/d/

  • データファイル: t1。実際のデータファイルは t1.CSV です。パラメータの要件に基づいて、.CSV サフィックスは省略されています。

説明

データファイル名のみを使用して、OSS 外部テーブルに対応するデータファイルを指定できます。たとえば、次の文は、OSS の oss_prefix パスにある t2.CSV ファイルをクエリします。

CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";

データのクエリ

次の例では、t1 テーブルを使用します。

# t1 テーブルのデータレコード数をクエリします。
SELECT count(*) FROM t1;

# 指定された範囲のレコードをクエリします。
SELECT id FROM t1 WHERE id < 10 AND id > 1;

# 指定されたレコードをクエリします。
SELECT id FROM t1 where id = 3;

# 複数のテーブルを結合してレコードをクエリします。
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";

次の表に、データのクエリ時に発生する一般的なエラーメッセージとその原因を示します。

説明

エラーメッセージは報告されなかったものの、データのクエリ時に警告メッセージが表示された場合は、SHOW WARNINGS; 文を実行してメッセージを表示する必要があります。

エラーメッセージ

原因

解決策

OSS エラー: OSS エンジンに対応するデータファイルがありません。

指定されたデータファイルが OSS に見つかりません。

上記のルールに基づいて、指定されたパスにデータファイルが OSS に存在するかどうかを確認します。

  • 存在する場合は、データファイルが次の命名規則に準拠しているかどうかを確認します。データファイル名は 外部テーブル名.CSV 形式で、.CSV 拡張子はすべて大文字です。

  • 存在しない場合は、指定されたパスにデータファイルをアップロードする必要があります。

OSS 伝送用のメモリ領域が不足しています。現在要求されているメモリ %d。

OSS クエリ用のメモリが不足しています。

次のいずれかの方法を使用して、このエラーを修正できます。

  • コンソールの [パラメータ] ページで、loose_csv_max_oss_threads パラメータの値を変更して、より多くの OSS スレッドを実行します。

  • flush table 文を実行して、一部の OSS テーブルのスレッドを閉じます。

ERROR 8054 (HY000): OSS エラー: エラーメッセージ: サーバーに接続できませんでした。 aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80 への接続に失敗しました;

現在のクラスタは OSS サーバーに接続できません。

現在のクラスタが OSS バケットと同じゾーンにあるかどうかを確認します。

  • そうでない場合は、現在のクラスタと OSS バケットを同じゾーンに移動する必要があります。

  • 同じゾーンにある場合は、クラスタのエンドポイントをパブリックエンドポイントに変更できます。エンドポイントを変更してもエラーが解決しない場合は、Alibaba Cloud テクニカルサポートにお問い合わせください。

クエリの最適化

クエリプロセス中に、クエリエンジンは特定の条件を持つクエリをリモート OSS バケットにプッシュダウンして、クエリ効率を高めることができます。この最適化は、エンジン条件プッシュダウン と呼ばれます。エンジン条件プッシュダウン機能には、次の制限があります。

  • UTF-8 エンコードされた CSV ファイルのみがサポートされています。

  • SQL 文では、次の種類の演算子のみがサポートされています。

    • 比較演算子: ><>=<=、および ==

    • 論理演算子: LIKEINAND、および OR

    • 算術演算子: +-*、および /

  • SQL 文を使用する場合、クエリできるファイルは 1 つだけです。JOIN、ORDER BY、GROUP BY、および HAVING 句はサポートされていません。

  • WHERE 句には集約条件を含めることはできません。たとえば、WHERE max(age) > 100 は許可されていません。

  • SQL 文には最大 1,000 列を指定できます。SQL 文の列名は最大 1,024 バイトの長さにすることができます。

  • LIKE 句では最大 5 つのワイルドカード(%)がサポートされています。

  • IN 句では最大 1,024 の定数がサポートされています。

  • CSV オブジェクトの最大列サイズと最大行サイズは 256 KB です。

  • SQL 文の最大サイズは 16 KB です。WHERE 句の後には最大 20 の式を追加できます。各文は最大 100 の集約操作をサポートします。

説明

デフォルトでは、エンジン条件プッシュダウン機能は無効になっています。この機能を有効にするには、SET SESSION optimizer_switch='engine_condition_pushdown=on'; 文を実行します。

上記の条件を満たすクエリは、リモート OSS バケットにプッシュダウンされます。OSS 外部テーブルの実行計画を使用して、リモート OSS バケットにプッシュダウンされたクエリを表示できます。

  • EXPLAIN 文を実行して、OSS 外部テーブルの実行計画を表示します。例:

    EXPLAIN SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra                                                                                                                            |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 15000 |     1.23 | Using where; With pushed engine condition ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Using temporary; Using filesort |
    +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    With pushed engine condition の後の条件を持つクエリは、リモート OSS バケットにプッシュダウンできます。 `name` LIKE "%1%%%%%" および GROUP BY `id` ORDER BY `id` DESC の条件を持つクエリは、ローカル OSS サーバーでのみ実行できます。

  • tree 形式で OSS 外部テーブルの実行計画を表示します。例:

    EXPLAIN FORMAT=tree  SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" Y `id` ORDER BY `id` DESC;
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                           |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | -> Sort: <temporary>.id DESC
        -> Table scan on <temporary>
            -> Aggregate using temporary table
                -> Filter: (t1.`name` like '%1%%%%%')  (cost=1690.00 rows=185)
                    -> Table scan on t1, extra ( engine conditions: ((t1.id > 5) and (t1.id < 100)) )  (cost=1690.00 rows=15000)
     |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    engine conditions: の後の条件を持つクエリは、リモート OSS バケットにプッシュダウンできます。 `name` LIKE "%1%%%%%" および GROUP BY `id` ORDER BY `id` DESC の条件を持つクエリは、ローカル OSS サーバーでのみ実行できます。

    説明

    データをクエリするには、PolarDB for MySQL 8.0.2 クラスタを使用する必要があります。 エンジンバージョン5.6、5.7、8.0 で、クラスタバージョンを確認できます。

  • JSON 形式で OSS 外部テーブルの実行計画を表示します。例:

    EXPLAIN FORMAT=json  SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | {
      "query_block": {
        "select_id": 1,
        "cost_info": {
          "query_cost": "1875.13"
        },
        "ordering_operation": {
          "using_filesort": false,
          "grouping_operation": {
            "using_temporary_table": true,
            "using_filesort": true,
            "cost_info": {
              "sort_cost": "185.13"
            },
            "table": {
              "table_name": "t1",
              "access_type": "ALL",
              "rows_examined_per_scan": 15000,
              "rows_produced_per_join": 185,
              "filtered": "1.23",
              "engine_condition": "((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100))",
              "cost_info": {
                "read_cost": "1671.49",
                "eval_cost": "18.51",
                "prefix_cost": "1690.00",
                "data_read_per_join": "146K"
              },
              "used_columns": [
                "id",
                "name"
              ],
              "attached_condition": "(`test`.`t1`.`name` like '%1%%%%%')"
            }
          }
        }
      }
    } |
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)

    engine conditions: の後の条件を持つクエリは、リモート OSS バケットにプッシュダウンできます。 `name` LIKE "%1%%%%%" および GROUP BY `id` ORDER BY `id` DESC の条件を持つクエリは、ローカル OSS サーバーでのみ実行できます。

次のエラーが発生した場合、現在の OSS データファイルの一部の文字がエンジン条件プッシュダウンの要件を満たしていません。

OSS エラー: 現在のクエリはエンジン条件プッシュダウンをサポートしていません。 NO_ECP() ヒントを使用するか、optimizer_switch = 'engine_condition_pushdown=OFF' を設定して、条件プッシュダウン機能をオフにする必要があります。

ヒントまたは optimizer_switch 変数を使用して、エンジン条件プッシュダウン機能を手動で無効にすることができます。

  • ヒント

    ヒントを使用して、クエリのエンジン条件プッシュダウン機能を無効にします。次の例では、t1 テーブルのエンジン条件プッシュダウン機能が無効になっています。

    SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10;
  • optimizer_switch

    optimizer_switch 変数を使用して、現在のセッションのすべてのクエリのエンジン条件プッシュダウン機能を無効にします。

    SET SESSION optimizer_switch='engine_condition_pushdown=off'; # engine_condition_pushdown パラメータを off に設定します。この場合、現在のセッションのすべてのクエリのエンジン条件プッシュダウン機能が無効になります。

    次の文を実行して、optimizer_switch 変数の値に基づいて、現在のセッションのすべてのクエリのエンジン条件プッシュダウン機能が有効になっているかどうかを確認できます。

    select @@optimizer_switch;

複数ノード間での OSS サーバー情報の同期

PolarDB クラスタのプライマリノードと読み取り専用ノードは、同じ OSS サーバーを共有します。これにより、これらのノードが OSS データにアクセスできるようになります。これらのノード間の OSS サーバー情報の同期はロックフリーであるため、これらのノードでの操作は独立しています。

OSS サーバー情報を変更すると、変更はロックフリー方式で読み取り専用ノードに同期されます。読み取り専用ノードのスレッドが OSS サーバーのロックを保持している場合、OSS サーバー情報の同期が遅れる可能性があります。この場合、/*force_node='pi-bpxxxxxxxx'*/ flush privileges; 文または /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; 文を実行して、読み取り専用ノードの OSS サーバー情報を手動で更新できます。