OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

データファイルの保存先を追加する方法(STORAGE LOCATION)

公開日:
更新日:
基本操作
#データファイル

はじめに

Verticaで利用しているデータ領域が不足した場合等、何らかの理由でデータベース作成時に指定したデータ領域とは別にデータの保存先を作成したい場合、ストレージロケーション(STORAGE LOCATION)を作成することで新たなデータファイル保存先として利用することができます。

ストレージロケーション(STORAGE LOCATION)とは

ストレージロケーションとは、データファイルや一時ファイル等の保存先(ノード名、絶対パス)情報を持つオブジェクトです。ストレージロケーションには複数のタイプが用意されており、用途に応じて使い分ける必要があります。

ストレージロケーションのタイプ内容
DATA永続データと一時テーブルの作成先
TEMP一時ファイルの作成先(ソート、結合、グループ化に使用)
DATA,TEMP(デフォルト)DATA、TEMPの作成先
USERスーパーユーザ以外のファイルの読み書きや外部テーブルの作成先
DEPOTEonモードのデポ

データファイルの保存先を追加する方法

ディスク容量が不足した際のディスク追加を例にデータファイルの保存先を追加する手順を記載していきます。追加したディスクをVerticaの新しいDATAストレージロケーションとして認識させ、該当ストレージロケーションへ特定スキーマ全体のデータを移動します。

1.ノードに物理ディスクを追加

物理ディスクをVerticaノードに追加し、対象ディスクをフォーマットします。

2.追加ディスクをマウント

追加ディスクをノードにマウントし、ストレージロケーション用のディレクトリを作成します。
 ※複数ノード構成の場合、各ノードに作成するディレクトリは同一名にすることを推奨します。
 ※複数ノード構成の場合、ノード間で共有のディレクトリをストレージロケーションとすることはできません。

3.ストレージロケーションを作成

ストレージロケーションを作成します。また、作成したロケーションにラベルを付与します。

/home/dbadmin/data2をdata_locというストレージロケーションで作成する例)

/* ストレージロケーション作成例 */
dbadmin=> CREATE LOCATION '/home/dbadmin/data2' ALL NODES USAGE 'DATA' LABEL 'data_loc2';
CREATE LOCATION

/* 確認例 */
dbadmin=> SELECT node_name,location_path,location_usage,location_label FROM STORAGE_LOCATIONS;
   node_name    |             location_path             | location_usage | location_label
----------------+---------------------------------------+----------------+----------------
 v_vdb_node0001 | /home/dbadmin/vdb/v_vdb_node0001_data | DATA,TEMP      |
 v_vdb_node0002 | /home/dbadmin/vdb/v_vdb_node0002_data | DATA,TEMP      |
 v_vdb_node0003 | /home/dbadmin/vdb/v_vdb_node0003_data | DATA,TEMP      |
 v_vdb_node0001 | /home/dbadmin/data2                   | DATA           | data_loc2
 v_vdb_node0002 | /home/dbadmin/data2                   | DATA           | data_loc2
 v_vdb_node0003 | /home/dbadmin/data2                   | DATA           | data_loc2
(6 rows)

4.オブジェクト配置ポリシーを作成

先ほど作成したストレージロケーションへtestスキーマのデータを移動させるため、SET_OBJECT_STORAGE_POLICY関数でオブジェクト配置ポリシーを作成します。
オブジェクト配置ポリシーには、オブジェクトのデータをどのストレージロケーションへ格納するかのポリシーを設定することができます。

SET_OBJECT_STORAGE_POLICY関数の構文

SET_OBJECT_STORAGE_POLICY (
‘[[database.]schema.]object‑name’, ‘location‑label’
[,’key‑min’, ‘key‑max’] [, ‘enforce‑storage‑move’ ] )
パラメータ説明
[database.]schemaスキーマを指定
object‑nameオブジェクトを指定
「データベース」、「スキーマ」、「テーブル」単位で指定可能
location‑labelストレージロケーションのラベルを指定
key‑min
key‑max
パーティションキーの範囲を指定
※object‑nameに「テーブル」を指定する場合のみ有効
enforce‑storage‑moveストレージロケーションへデータを移動するタイミングを指定
alse(デフォルト):すべてのマージアウトタスクが完了後に移動
true:すべてのデータを即時移動


※オブジェクト配置ポリシーを作成する前に、移動先のストレージロケーションに十分な空き容量があるか、
必ず確認してください。オブジェクトのサイズは、 projection_storageシステムテーブルのused_bytes列で確認できます。

testスキーマのデータは全てdata_loc2に保存する場合の例)

/* オブジェクト配置ポリシー作成例 */
dbadmin=> SELECT set_object_storage_policy('test','data_loc2', true);
set_object_storage_policy
-------------------------------------------------------------------------
Object storage policy set.
Task: moving storages
(Table: test.CUSTOMER) (Projection: test.CUSTOMER_DBD_1_seg_comp3_b0)
(Table: test.CUSTOMER) (Projection: test.CUSTOMER_DBD_1_seg_comp3_b1)
(Table: test.LINEORDER) (Projection: test.LINEORDER_DBD_2_seg_comp3_b0)
(Table: test.LINEORDER) (Projection: test.LINEORDER_DBD_2_seg_comp3_b1)
(1 row)
/* 確認例 */
dbadmin=> SELECT schema_name, node_name, projection_name, storage_type, location_label
dbadmin-> FROM v_monitor.storage_containers ORDER BY 1,2,3;
schema_name | node_name | projection_name | storage_type | location_label
-------------+----------------+------------------------------+--------------+----------------
public | v_vdb_node0001 | CUSTOMER_DBD_3_seg_comp3_b0 | ROS |
public | v_vdb_node0001 | CUSTOMER_DBD_3_seg_comp3_b1 | ROS |
public | v_vdb_node0001 | LINEORDER_DBD_4_seg_comp3_b0 | ROS |
public | v_vdb_node0001 | LINEORDER_DBD_4_seg_comp3_b1 | ROS |
public | v_vdb_node0002 | CUSTOMER_DBD_3_seg_comp3_b0 | ROS |
public | v_vdb_node0002 | CUSTOMER_DBD_3_seg_comp3_b1 | ROS |
public | v_vdb_node0002 | LINEORDER_DBD_4_seg_comp3_b0 | ROS |
public | v_vdb_node0002 | LINEORDER_DBD_4_seg_comp3_b1 | ROS |
public | v_vdb_node0003 | CUSTOMER_DBD_3_seg_comp3_b0 | ROS |
public | v_vdb_node0003 | CUSTOMER_DBD_3_seg_comp3_b1 | ROS |
public | v_vdb_node0003 | LINEORDER_DBD_4_seg_comp3_b0 | ROS |
public | v_vdb_node0003 | LINEORDER_DBD_4_seg_comp3_b1 | ROS |
test  | v_vdb_node0001 | CUSTOMER_DBD_1_seg_comp3_b0 | ROS | data_loc2
test  | v_vdb_node0001 | CUSTOMER_DBD_1_seg_comp3_b1 | ROS | data_loc2
test  | v_vdb_node0001 | LINEORDER_DBD_2_seg_comp3_b0 | ROS | data_loc2
test  | v_vdb_node0001 | LINEORDER_DBD_2_seg_comp3_b1 | ROS | data_loc2
test  | v_vdb_node0002 | CUSTOMER_DBD_1_seg_comp3_b0 | ROS | data_loc2
test  | v_vdb_node0002 | CUSTOMER_DBD_1_seg_comp3_b1 | ROS | data_loc2
test  | v_vdb_node0002 | LINEORDER_DBD_2_seg_comp3_b0 | ROS | data_loc2
test  | v_vdb_node0002 | LINEORDER_DBD_2_seg_comp3_b1 | ROS | data_loc2
test  | v_vdb_node0003 | CUSTOMER_DBD_1_seg_comp3_b0 | ROS | data_loc2
test  | v_vdb_node0003 | CUSTOMER_DBD_1_seg_comp3_b1 | ROS | data_loc2
test  | v_vdb_node0003 | LINEORDER_DBD_2_seg_comp3_b0 | ROS | data_loc2
test  | v_vdb_node0003 | LINEORDER_DBD_2_seg_comp3_b1 | ROS | data_loc2
(24 rows)
※testスキーマのlocation_labelが「data_loc2」に設定される。

5.オブジェクトの移動

オブジェクト配置ポリシーに設定したロケーションへのデータ移動は、Mergeout処理の中で行われます。
Mergeout処理は10分間隔で自動実行されます。
※Mergeoutによるデータ移動は、一度に全てのデータを移動せず、徐々に移動していきます。

スキーマ、ノード毎のサイズを確認する例)

/* Mergeoutによるデータ移動完了後、ノード1でOS上のディレクトリサイズ(KB)を確認 */
$ du -sk /home/dbadmin/
1806364 /home/dbadmin/vdb
1804660 /home/dbadmin/data2

/* Vertica内でスキーマ、ノード毎のサイズを確認(KB) */
dbadmin=> SELECT s.location_label, p.anchor_table_schema, p.node_name,
dbadmin -> round(sum(p.used_bytes)/1024,0) as used_kb
dbadmin -> FROM projection_storage p, storage_containers s
dbadmin -> WHERE p.anchor_table_schema = s.schema_name
dbadmin -> AND p.node_name = s.node_name
dbadmin -> AND p.projection_name = s.projection_name
dbadmin -> GROUP BY s.location_label, p.anchor_table_schema, p.node_name
dbadmin -> ORDER BY 1,2,3;
location_label | anchor_table_schema | node_name | used_kb
----------------+---------------------+----------------+----------------------------
         | public | v_vdb_node0001 | 1799362.000000000000000000
         | public | v_vdb_node0002 | 1799611.000000000000000000
         | public | v_vdb_node0003 | 1799129.000000000000000000
data_loc2    | test  | v_vdb_node0001 | 1799362.000000000000000000
data_loc2    | test  | v_vdb_node0002 | 1799611.000000000000000000
data_loc2    | test  | v_vdb_node0003 | 1799129.000000000000000000
(6 rows)

以降は作成したオブジェクト配置ポリシーに従い、データが投入されていきます。
上記例の場合、testスキーマに作成するテーブルおよび投入データは、全てdata_loc2ロケーション
(/home/dbadmin/data2)のディレクトリ配下に格納されます。

参考情報

・Managing Storage Locations
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/AdministratorsGuide/StorageLocations/CreatingAndConfiguringStorageLocations.htm

・Creating Storage Locations
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/AdministratorsGuide/StorageLocations/AddingStorageLocations.htm

・SET_OBJECT_STORAGE_POLICY
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/Functions/VerticaFunctions/SET_OBJECT_STORAGE_POLICY.htm

検証バージョン

この記事の内容はVertica 9.3で確認しています。

更新履歴

2020/03/05 本記事を公開