一般に、OSS外部テーブルには、サイズの大きいコールドデータが格納されます。 1つのCSV形式のデータファイルが大きすぎる場合、クエリに時間がかかります。 PolarDBは、単一のテーブル機能に対する複数ファイルクエリを提供します。 単一のOSS外部テーブルのデータファイルを複数の小さなデータファイルに分割して、クエリを高速化できます。 このトピックでは、単一のOSS外部テーブルに対してマルチファイルクエリを実行する方法について説明します。
前提条件
PolarDBクラスターは、次のいずれかの要件を満たしています。
リビジョンバージョンが8.0.1.1.28以降のPolarDB for MySQL 8.0.1クラスター。
リビジョンバージョンが8.0.2.2.5.1以降のPolarDB for MySQL 8.0.2クラスター。
クラスターバージョンを確認する方法の詳細については、「エンジンバージョンの照会」をご参照ください。
手順
CSVファイルを分割します。
CSVファイルを行ごとに複数の小さなCSVファイルに分割できます。 1つのCSVファイルの推奨サイズは128 MB、最大サイズは1 GBです。
説明各データファイルの整合性を確保するために、1行のデータを2つのCSVファイルに分割することはできません。
ファイル名は、次の命名規則に準拠する必要があります。
OSS外部テーブルを作成するステートメントで
CONNECTION
パラメーターを使用して、ファイル名を指定できます。 パラメーターにファイル名が含まれていない場合、データファイル名は[現在のOSSテーブルの名前]
になります。 例:接続パラメータにファイル名が含まれます。
CREATE TABLE t1 (id int) engine=csv CONNECTION="server_name/a/b/c/d/t1";
上記の例では、OSS上のデータファイルのパスは
oss_prefix/a/b/c/d/
で、データファイル名はt1.CSV
です。接続パラメータにファイル名が含まれていません。
CREATE TABLE t1 (id int) engine=csv CONNECTION="server_name";
データファイル名は
t1.CSV
です。
元のデータファイルの名前-任意の番号. CSV
例:元データファイル名が
t1.CSV
の場合、分割データファイルはt1.CSV
,t1-1.CSV
,t1-2.CSV
となります。
分割データファイルをアップロードします。
データファイルを分割した後、分割したすべてのCSVファイルをOSSの同じパスに手動でアップロードする必要があります。 次の例では、ossutilツールを使用して一度にCSVファイルをアップロードします。 ossutilツールの詳細については、「ossutil」をご参照ください。
./ossutil64 cp localfolder/ oss:// examplebucket/desfolder/ -- include "*.CSV" -r
localfolder
はアップロードするCSVファイルのフォルダ名、oss:// examplebucket/desfolder/ はOSS上のCSVファイルのパスです。 実際のフォルダ名とパスに置き換えることができます。
OSS接続情報を追加します。
OSSサーバーを作成することで、OSS接続情報を追加できます。 構文:
CREATE SERVER <server_name> 外国データラッパーのオプション ( EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>" 、"oss_bucket": "<my_oss_bucket>" 、"oss_access_key_id": "<my_oss_access_access_keys_id>" 、"oss_st_st_secret" "token: <my_ss_secret" """ );
説明リビジョンバージョンが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
パラメーターを使用できます。DATABASE
パラメーターがサポートされています。 作成するOSSサーバーにDATABASE
パラメーターとmy_oss_prefix
パラメーターの両方が存在する場合、ファイルの最終パスはmy_oss_prefix/DATABASE
です。 これにより、ステートメントで指定されたデータファイルのパスが、分割ファイルをアップロードするOSS上のパスと同じになります。
次の表に、ARN形式のパラメーターを示します。
パラメーター
データ型
説明
server_name
String
OSSサーバーの名前。
説明名前はグローバルに一意である必要があります。 大文字と小文字は区別されません。 長さは最大 64 文字です。 64文字を超える名前は自動的に切り捨てられます。 OSSサーバー名を引用符で囲まれた文字列として指定できます。
my_oss_endpoint
String
OSSサーバーのエンドポイント。
説明Alibaba Cloudサーバーからデータベースにアクセスする場合は、インターナルエンドポイントを使用して、インターネットトラフィックの発生を回避します。 内部エンドポイントにはキーワードinternalが含まれます。
例:
oss-cn-xxx-internal.aliyuncs.com
。my_oss_bucket
String
データファイルが保存されているバケット。 データをインポートする前に、OSSを使用してバケットを作成する必要があります。
説明ネットワークの遅延を減らすために、PolarDBクラスターと同じゾーンにバケットをデプロイすることを推奨します。
my_oss_access_key_id
String
OSSへのアクセスに使用されるアカウントのAccessKey ID。
my_oss_access_key_secret
String
OSSへのアクセスに使用されるアカウントのAccessKeyシークレット。
my_oss_prefix
String
OSS上の現在のCSVデータファイルのパス。
my_oss_sts_token
String
OSSへのアクセスに使用される一時的な資格情報。 OSSへのアクセスに使用される一時的な資格情報を取得する方法については、「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権限を付与できます。特権アカウントを使用している場合は、
SELECT Server_name, Extra_server_info FROM mysql.servers;
ステートメントを実行して、作成したOSSサーバーの情報を表示できます。oss_access_key_id
およびoss_access_key_secret
パラメーターの値は、セキュリティ上の理由から暗号化されています。
OSS外部テーブルを作成します。 詳細については、「OSS外部テーブルの作成」をご参照ください。 外部テーブルが作成されると、PolarDBは指定されたパスに基づいてデータファイルを検索できます。
クエリデータ。
t1
テーブルは、以下の例で使用される。# t1テーブルのレコード数を照会します。 SELECTカウント (*) からt1; # 指定した範囲のレコードを照会します。 SELECT id FROM t1 WHERE id < 10 AND id > 1; # 指定されたレコードを照会します。 SELECT id FROM t1 id = 3; # 複数のテーブルを結合してレコードを照会します。 SELECT id FROM t1 left join t2 on t1.id = t2.id WHERは "% er %" のようにE t2.nameます。
次の表に、データを照会するときの一般的なエラーメッセージと原因を示します。
説明エラーメッセージが報告されていないが、データのクエリ時に警告メッセージが表示された場合は、
SHOW WARNINGS;
ステートメントを実行してエラーメッセージを表示する必要があります。エラーメッセージ
原因
解決策
OSSエラー: OSSエンジンに対応するデータファイルがありません。
データファイルがOSSにありません。
上記のルールに基づいて、OSS上の指定されたパスにデータファイルが存在するかどうかを確認します。
はいの場合、データファイルが命名規則に準拠しているかどうかを確認します。CSVファイル名は
OSS外部テーブル名. CSV
で、CSV拡張子は大文字でなければなりません。そうでない場合は、指定したパスにデータファイルをアップロードする必要があります。
OSS送信に十分なメモリ容量がありません。 現在要求されているメモリ % d。
OSSクエリのメモリ不足。
次のいずれかの方法を使用して、このエラーを修正できます。
コンソールの [パラメーター] ページで、
loose_csv_max_oss_threads
パラメーター値を変更して、より多くのOSSスレッドを実行できるようにします。flush tableステートメントを実行して、一部のOSSテーブルのスレッドを閉じます。
エラー8054 (HY000): OSSエラー: エラーメッセージ: サーバーに接続できませんでした。 失敗した接続t o aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80;
現在のクラスターはOSSサーバーに接続できません。
現在のクラスターがOSSバケットと同じゾーンにあるかどうかを確認します。
そうでない場合は、現在のクラスターとOSSバケットを同じゾーンに移動する必要があります。
同じゾーンにある場合は、クラスターのエンドポイントをパブリックエンドポイントに変更できます。 エンドポイントの変更後もエラーが続く場合は、Alibaba Cloudテクニカルサポートにお問い合わせください。
(オプション) 新しいデータファイルをアップロードします。
新しいデータファイルをアップロードし、
t1
テーブルからファイル内のデータを読み取る場合は、手順1を実行してファイルをアップロードします。 ファイルがアップロードされた後、新しくアップロードされたファイルのデータを照会する前に、t1
テーブルで次の文を実行します。フラッシュテーブルt1;
クエリの最適化
クエリ最適化機能は、次の要件のいずれかを満たすクラスターでサポートされています。
リビジョンバージョンが8.0.1.1.34以降のPolarDB for MySQL 8.0.1クラスター。
リビジョンバージョンが8.0.2.2.14以降のPolarDB for MySQL 8.0.2クラスター。
複数ファイルOSS外部テーブルが作成された後、PolarDBは事前にOSS上の現在のテーブルのデータファイルをスキャンしてテーブル内の行総数の見積もりを取得し、コストベースで複数のワーカーを開始し、複数のデータファイルを異なるワーカーに分散してスキャンプロセスを高速化します。 次の図は、この機能の動作を示しています。
複数のOSSデータファイルの並列スキャンの有効化
CSVエンジンの並列スキャンスイッチをオンにするには、loose_csv_max_oss_threads
パラメーターを1より大きい整数に指定します。 loose_csv_max_oss_threads
パラメーターの詳細については、「パラメーター」をご参照ください。 パラメーターの設定方法の詳細については、「クラスターとノードパラメーターの設定」をご参照ください。