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

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

最終更新日:Aug 27, 2024

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

前提条件

PolarDBクラスターは、次のいずれかの要件を満たしています。

  • PolarDB for MySQL 8.0.1クラスターを使用する場合、クラスターのリビジョンバージョンは8.0.1.1.25.4以降である必要があります。

  • PolarDB for MySQL 8.0.2クラスターを使用する場合、クラスターのリビジョンバージョンは8.0.2.2.1以降である必要があります。

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

制御ポリシー機能の動作

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

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

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

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

  • NULL値は、リビジョンバージョンが8.0.1.1.28以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.5以降のPolarDB for MySQL 8.0.2クラスターでサポートされています。

  • 数値型

    データ型

    サイズ

    データ範囲 (署名済み)

    データ範囲 (符号なし)

    説明

    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進値

  • 日付と時刻のタイプ

    データ型

    サイズ

    データ範囲

    Format

    説明

    日付

    3バイト

    1000-01-01 ~ 9999-12-31

    YYYY-MM-DD

    日付値

    時間

    3バイト

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

    HH:MM:SS

    時間値または期間

    YEAR

    1バイト

    1901 ~ 2155

    YYYY

    年の価値

    日付時刻

    8 バイト

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

    YYYY-MM-DD HH:MM:SS

    日付と時刻の組み合わせ値

    説明

    このタイプの月と日付は2桁でなければなりません。 たとえば、1月1日、2020は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桁でなければなりません。 たとえば、1月1日、2020は2020-1-1ではなく2020-01-01として記述する必要があります。 2020-1-1がOSSにプッシュされた場合、クエリは期待どおりに実行できません。

  • 文字列型

    データ型

    サイズ

    説明

    CHAR

    0 ~ 255バイト

    固定長の文字列

    VARCHAR

    0 ~ 65535バイト

    可変長文字列A variable-length string

    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値を挿入するには、OSS外部テーブルの作成時にNULL_MARKERを指定する必要があります。 OSS外部テーブルのNULL_MARKERのデフォルト値はNULLです。 show create tableステートメントを実行して、NULL_MARKERの値を確認できます。

        show create table t1;

        結果:

        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外部テーブルの対応するフィールドのデータ型と一致しない場合、エラーが報告されます。

        • の値は、数字のみで構成することも、空のままにすることもできません。 さらに、次の文字を含めることはできません。

          "\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                |
        +------+----------+---------------------+
        4 rows in set (0.00 sec)
    • NULL値を読み取ります。

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

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

        • sql_modeパラメーターをSTRICT_TRANS_TABLESに設定すると、エラーが報告されます。

        • sql_modeパラメーターをSTRICT_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_modeパラメーターをSTRICT_TRANS_TABLESに設定し、次のステートメントを実行してCSVファイル内のデータを照会した場合:

          select * from t;

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

          ERROR 1364 (HY000): Field 'id' doesn't have a default value
        • sql_modeパラメーターをSTRICT_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)

制限事項

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

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

    説明

    DROP操作は、OSSに保存されているデータファイルに影響を与えずに、PolarDBのテーブル情報のみを削除します。

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

パラメーター

コンソールの [パラメーター] ページで、次のパラメーターを表示または変更できます。

パラメーター

カテゴリ

説明

loose_csv_oss_buff_size

Sessionパラメータ

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

有効な値: 4096〜134217728。

loose_csv_max_oss_threads

グローバルパラメーター

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

設定可能な値は 1~100 です。

次の式を使用して、OSSの合計メモリ使用量を計算できます。OSSの合計メモリ使用量=loose_csv_max_oss_threadsパラメーターの値 × loose_csv_oss_buff_sizeパラメーターの値

説明

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

手順

  1. CSVファイルをOSSにアップロードします。

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

    説明
    • CSVファイルがアップロードされるOSSディレクトリは、ossサーバーのmy_database_nameまたはOSS_prefixパラメーターで指定されたディレクトリと同じである必要があります。

    • アップロードされるCSVファイルの名前は、Foreign table name.CSV形式である必要があります。CSV拡張子は大文字である必要があります。 たとえば、作成されたOSS外部テーブルの名前がt1の場合、アップロードされるCSVファイルの名前はt1.CSVでなければなりません。

    • CSVファイルのデータフィールドは、OSS外部テーブルのフィールドと一致する必要があります。 たとえば、作成されたOSS外部テーブルt1に1つのフィールドidしか含まれておらず、そのフィールドがINTタイプの場合、アップロードされたCSVファイルにはINTタイプのフィールドが1つだけ含まれている必要があります。

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

  2. OSS接続情報を追加します。

    OSSサーバーを作成することで、OSS接続情報を追加できます。

    説明

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

    • リビジョンバージョンが8.0.1.1.28以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.5以降のPolarDB for MySQL 8.0.2クラスターを使用する場合、次の構文を使用してOSSサーバーを作成できます。

      CREATE SERVER <server_name> 
      FOREIGN DATA WRAPPER oss 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>"}'
      );
      説明
      • リビジョンバージョンが8.0.1.1.29以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.6以降のPolarDB for MySQL 8.0.2クラスターでは、my_oss_sts_tokenパラメーターを使用できます。

      • my_database_nameパラメーターは構文でサポートされています。 作成したOSSサーバーにmy_database_nameパラメーターとmy_oss_prefixパラメーターの両方が存在する場合、ファイルの最終パスはmy_oss_prefix/my_database_nameです。 my_database_nameパラメーターの指定方法の詳細については、次のテキストをご参照ください。

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

      パラメーター

      データ型

      必須

      説明

      server_name

      String

      課金されます

      OSSサーバー名。

      説明

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

      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

      課金されます

      Resource Access Management (RAM) ユーザーまたはAlibaba CloudアカウントのAccessKey ID。

      AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。

      my_oss_access_key_secret

      String

      課金されます

      RAMユーザーまたはAlibaba CloudアカウントのAccessKeyシークレット。

      AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。

      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>"}'); 
      説明
      • OSSサーバーを作成するときは、SERVERS_ADMIN権限が必要です。 SHOW GRANTS FOR the current userステートメントを実行して、現在のユーザーにSERVERS_ADMIN権限があるかどうかを確認できます。 特権アカウントにはデフォルトでSERVERS_ADMIN権限があり、標準アカウントにSERVERS_ADMIN権限を付与できます。

      • SERVERS_ADMIN権限を持っていない場合、エラーメッセージアクセスが拒否されました。この操作にはSERVERS_ADMINまたはSUPER権限が必要です (少なくとも1つ) が表示されます。

      • SERVERS_ADMIN権限を持たない標準アカウントを使用する場合、特権アカウントを使用して次のステートメントを実行できます。GRANT SERVERS_ADMIN ON * * to 'users @ '%' WITH GRANT OPTION SERVERS_ADMIN権限を持たない特権アカウントを使用する場合、アカウントの権限をリセットできます。 これを行うには、コンソールでクラスターを見つけ、クラスターIDまたは名前をクリックしてクラスターの詳細ページに移動します。 左側のナビゲーションウィンドウで、[設定と管理]> [アカウント] を選択します。 [ユーザーアカウント] タブで、管理する特権アカウントを見つけ、[操作] 列の [権限のリセット] をクリックします。 権限がリセットされるまで待ちます。 特権アカウントにはSERVERS_ADMIN権限があります。

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

    • リビジョンバージョンが8.0.1.1.25.4から8.0.1.1.28までのPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.1から8.0.2.2.5までのPolarDB for MySQL 8.0.2クラスターを使用する場合、次の構文を使用してOSSサーバーを作成できます。

      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パラメーターは、構文ではサポートされていません。

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

      パラメーター

      データ型

      必須

      説明

      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。

      AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。

      my_oss_access_key_secret

      String

      課金されます

      RAMユーザーまたはAlibaba CloudアカウントのAccessKeyシークレット。

      AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。

  3. OSS外部テーブルを作成します。

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

    create table t1 (id int) engine=csv connection="connection_string";

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

    • OSSサーバー名。

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

      説明

      リビジョンバージョンが8.0.1.1.28以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.5以降のPolarDB for MySQL 8.0.2クラスターを使用する場合、OSSでデータファイルのパスを設定できます。

    • オプションです。 データファイル名。

      説明

      データファイル名には、. CSV拡張子を使用します。

    例:

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

    この例では、OSSのデータファイルのパスはoss_prefix/a/b/c/d/ で、データファイルの名前はt1.CSVです。

    説明
    • OSS外部テーブルに対応するデータファイルを指定するには、データファイル名のみを使用できます。 たとえば、create table t1 (id int) engine=csv connection="server_name/t2" ステートメントを実行すると、PolarDBはossのoss_prefixパラメーターで指定されたディレクトリでt2.CSVファイルを検索します。

    • OSSのデータファイルのパスをconnection_stringに追加する場合は、データファイルの名前を追加する必要があります。 それ以外の場合、PolarDBがデータファイルを検索するときに、パスの最後のセグメントがファイル名と見なされます。

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

    OSS外部テーブルの作成後、show create tableステートメントを実行してテーブルを表示できます。 作成したテーブルのエンジンがCSVかどうかを確認します。 そうでない場合、現在のPolarDBクラスターのバージョンが古いため、OSSをサポートしていません。

  4. データの照会

    この例では、前の手順で説明したt1テーブルを使用して、データのクエリ方法を示します。

    # Query the number of data records in the t1 table.
    SELECT count(*) FROM t1;
    
    # Query data records in the specified range.
    SELECT id FROM t1 WHERE id < 10 AND id > 1;
    
    # Query a specific record.
    SELECT id FROM t1 where id = 3;
    
    # Query records by joining multiple tables.
    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テーブルのスレッドを閉じます。

    エラー8054 (HY000): OSSエラー: エラーメッセージ: サーバーに接続できませんでした。o 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)

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

  • 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)

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

    説明

    データのクエリには、PolarDB for MySQL 8.0.2クラスターを使用する必要があります。 バージョン番号を照会して、クラスターバージョンを確認できます。

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

    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)

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

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

OSS error: The current query does not support engine condition pushdown. You need to use NO_ECP() hint or set optimizer_switch = 'engine_condition_pushdown=OFF' to turn off the condition push down function.

ヒントまたは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'; # Set the engine_condition_pushdown parameter to off. In this case, the engine condition pushdown feature is disabled for all queries in the current session.

    次のステートメントを実行して、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サーバー情報を手動で更新できます。