目次
はじめに
Verticaで利用しているデータ領域が不足した場合等、何らかの理由でデータベース作成時に指定したデータ領域とは別にデータの保存先を作成したい場合、ストレージロケーション(STORAGE LOCATION)を作成することで新たなデータファイル保存先として利用することができます。ストレージロケーション(STORAGE LOCATION)とは
ストレージロケーションとは、データファイルや一時ファイル等の保存先(ノード名、絶対パス)情報を持つオブジェクトです。ストレージロケーションには複数のタイプが用意されており、用途に応じて使い分ける必要があります。ストレージロケーションのタイプ | 内容 |
---|---|
DATA | 永続データと一時テーブルの作成先 |
TEMP | 一時ファイルの作成先(ソート、結合、グループ化に使用) |
DATA,TEMP(デフォルト) | DATA、TEMPの作成先 |
USER | スーパーユーザ以外のファイルの読み書きや外部テーブルの作成先 |
DEPOT | Eonモードのデポ |
データファイルの保存先を追加する方法
ディスク容量が不足した際のディスク追加を例にデータファイルの保存先を追加する手順を記載していきます。追加したディスクをVerticaの新しいDATAストレージロケーションとして認識させ、該当ストレージロケーションへ特定スキーマ全体のデータを移動します。1.ノードに物理ディスクを追加
物理ディスクをVerticaノードに追加し、対象ディスクをフォーマットします。2.追加ディスクをマウント
追加ディスクをノードにマウントし、ストレージロケーション用のディレクトリを作成します。※複数ノード構成の場合、各ノードに作成するディレクトリは同一名にすることを推奨します。
※複数ノード構成の場合、ノード間で共有のディレクトリをストレージロケーションとすることはできません。
3.ストレージロケーションを作成
ストレージロケーションを作成します。また、作成したロケーションにラベルを付与します。/home/dbadmin/data2をdata_locというストレージロケーションで作成する例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* ストレージロケーション作成例 */ 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’] [, ‘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に保存する場合の例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/* オブジェクト配置ポリシー作成例 */ 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によるデータ移動は、一度に全てのデータを移動せず、徐々に移動していきます。
スキーマ、ノード毎のサイズを確認する例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* 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 Locationshttps://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