はじめに
システムテーブルには、クラスタの状態や、テーブル、プロジェクション、ユーザ等の詳細な情報が格納されています。データベースの管理をする上でよく利用しますが、古いデータは消えてしまうので、注意が必要です。本稿では、システムテーブルの保存条件を変更する方法について、詳しく解説します。システムテーブルの構成
システムテーブルの実体はビューのため、システムテーブルを構成しているDCテーブルの保存条件を変更する必要があります。DCテーブルは、Data Collectorテーブルの略称で、データベースの監視情報を保存します。DCテーブルの保存条件は、ディスク上限サイズと保存期間の閾値があり、コンポーネント単位で管理されています。[user_sessionsシステムテーブルの構成イメージ]
データコレクターとは
データコレクターは、データベースの監視情報を保存する機能で、以下の特長があります。・ディスク上限サイズ、保存期間で設定した閾値のいずれかに達した場合、古いデータから順番に削除する。
・ディスク上限サイズ、保存期間の両方の閾値を設定した場合、一番先に達した閾値を優先する。
・停止しているノードの情報は保存しない。
・データはカタログ領域配下にファイルとして、保存する。
【出力先】: /<カタログ領域>/<データベース名>/v_<データベース名>_<ノード名>_catalog/DataCollector/<コンポーネント名>_<シリアル番号>.log
【出力例】: /home/dbadmin/catalog/vdb/v_vdb_node0001_catalog/DataCollector/RuntimePriorityChanges_613580539629259.log
DCテーブルの保存条件は、データコレクターを使って、コンポーネントごとに変更をおこないます。
以下の例では、RuntimePriorityChangesコンポーネントのディスク上限サイズを1GB(1048576KB)、保存期間を7日間に変更しています。
[RuntimePriorityChangesコンポーネントの変更イメージ]
注意事項
DCテーブルの保存条件を変更する場合は、以下の点について、ご注意ください。| 項目 | 説明 | 
|---|---|
| カタログ領域のディスクサイズ増加 | 各DCテーブルの情報はカタログ領域に格納されます。蓄積される情報が増えて、カタログ領域のサイズも増加するので、ディスク溢れにご注意ください。 | 
| システムテーブルのSELECTパフォーマンス | 蓄積される情報が増えるため、各システムテーブルに対して、実行したSQLのパフォーマンスが、現在と比べて遅くなる可能性があります。 | 
| SYSDATAリソースプールのメモリ不足 | SYSDATAリソースプールはシステムテーブルの結果が格納されるリソースプールです。デフォルト値は、最大メモリサイズが1GBに設定されています。そのため、システムテーブルに対してのSELECT結果が大きい場合、メモリ不足エラーが発生する可能性があります。 | 
保存条件の変更方法
本番環境への実装前に、必要なデータが削除されないよう、事前にテストいただくことをお勧めします。手順
DCテーブルの保存条件を変更する場合は、以下の手順を実行します。【1】DCテーブルの確認
システムテーブルを構成しているDCテーブルを確認するために、vs_system_viewsテーブル(※1)を参照します。
【2】コンポーネントの確認
DCテーブルを構成しているコンポーネントを確認するために、data_collectorシステムテーブル(※2)を参照します。
【3】保存条件の確認
コンポーネントの保存条件を確認(※3)するために、data_collectorシステムテーブルを参照します。
【4】保存条件の変更
コンポーネントの保存条件を変更するために、set_data_collector_policy関数(※4)を実行します。
【5】変更後の保存条件を確認
変更されたコンポーネントの保存条件を確認するために、data_collectorシステムテーブルを参照します。
(※1) vs_system_viewsテーブル
| 項目 | 説明 | 
|---|---|
| view_schema | システムテーブルが格納されているスキーマ名 | 
| view_name | システムテーブル名 | 
| view_description | システムテーブルの説明 | 
| query_string | システムテーブルのDDL文 | 
(※2) data_collectorシステムテーブル
| 項目 | 説明 | 
|---|---|
| node_name | 情報が保持されているノード名 | 
| component | コンポーネント名 | 
| table_name | DCテーブル名 | 
| description | コンポーネントの説明 | 
| access_restricted | tの場合は、sysmonitorロールが付与されているDBユーザがアクセス可能、 fの場合は、すべてのDBユーザーからアクセス可能を示す。  | 
| memory_buffer_size_kb | メモリバッファのサイズ(KB) | 
| disk_size_kb | ディスクの上限サイズ(KB) ※DCテーブルの保存条件です。  | 
| interval_set | tの場合は、保存期間の閾値が有効であることを示す。 | 
| interval_time | 保存期間。無効の場合は、0が設定される。 ※DCテーブルの保存条件です。  | 
| record_too_big_errors | データがメモリに収まらなかった場合、1ずつカウンタアップする(データコレクターの保存ポリシーに基づく)。 | 
| lost_buffers | 失われたバッファの数 | 
| lost_records | 失われたレコード数 | 
| retired_files | 回収されたファイルの数 | 
| retired_records | 回収されたレコードの数 | 
| current_memory_records | メモリ内の現在の行数 | 
| current_disk_records | ディスクに格納されている現在の行数 | 
| current_memory_bytes | 現在使用されている合計メモリ(KB) | 
| current_disk_bytes | 現在使用されている合計ディスク容量(KB) | 
| first_time | 最初のレコードのタイムスタンプ | 
| last_time | 最後のレコードのタイムスタンプ | 
| kb_per_day | 1日に使用された合計(KB) | 
(※3) 保存条件は、get_data_collector_policy関数を利用した場合も確認できます。
| 項目 | 説明 | 
|---|---|
| データコレクターのコンポーネント名 | 指定されたコンポーネントの保存条件を表示します。 | 
(※4) set_data_collector_policy関数
| 項目 | 説明 | 
|---|---|
| データコレクターのコンポーネント名 | 指定されたコンポーネントの保存条件を設定します。 | 
| メモリサイズ | 保持するメモリサイズの上限値をKB単位で指定します。 ※DCテーブルの保存条件ではありません。本メモリサイズは、ディスクビジー等の理由でディスクへの書き込みが遅れてしまう際に、一時的に利用する領域です。  | 
| ディスクサイズの閾値 | ディスクサイズの上限値をKB単位で指定します。 | 
| 期間の閾値 | 指定されたコンポーネントをディスク上に保持する期間を指定します。保存期間を無制限にする場合は「-1」に設定します。 | 
実行例
user_sessionsシステムテーブルとquery_requestsシステムテーブルを例にあげて、解説します。【1】DCテーブルの確認
user_sessionsシステムテーブルは、dc_session_starts、dc_session_ends、dc_runtime_priority_changesで構成されています。
| 
					 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 43  | 
						# ★は参照しているDCテーブル dbadmin=> \x Expanded display is on. dbadmin=> select * from vs_system_views where view_name = 'user_sessions' ; -[ RECORD 1 ]----+------------------------------------------------------------------------------------------------- view_schema      | v_monitor view_name        | user_sessions view_description | User session history query_string     | create view "v_monitor"."user_sessions" as select ss.node_name, ss.user_name, ss.session_id,            vs.transaction_id,            vs.statement_id,        case when drpc.current_runtime_priority = '' then null            else drpc.current_runtime_priority        end as "runtime_priority",        ss.time as session_start_timestamp, se.time as session_end_timestamp,        (se.time IS NULL) as is_active,        ss.client_hostname,            ss.client_pid,            ss.client_label,        ss.ssl_state,            ss.authentication_method,            ss.client_type,            ss.client_version,            ss.client_os,            ss.client_os_user_name,            ss.requested_protocol,            ss.effective_protocol from v_internal.dc_session_starts★ ss          LEFT JOIN v_internal.dc_session_ends★ se USING (node_name, session_id)      LEFT JOIN v_internal.vs_sessions     vs USING (node_name, session_id)      left join (      select node_name,session_id,current_runtime_priority,transaction_id from          (          select node_name, session_id, current_runtime_priority, transaction_id, row_number() over (partition by node_name, session_id order by time desc) as rn          from v_internal.dc_runtime_priority_changes★          ) as sq0      where rn = 1      ) as drpc         on (ss.node_name      = drpc.node_name and             ss.session_id     = drpc.session_id and             vs.transaction_id = drpc.transaction_id)  where not ss.is_internal ;  | 
					
query_requestsシステムテーブルは、dc_requests_issued、dc_requests_completed、dc_errors、dc_resource_acquisitionsで構成されています。
| 
					 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56  | 
						# ★は参照しているDCテーブル dbadmin=> select * from vs_system_views where view_name = 'query_requests' ; -[ RECORD 1 ]----+------------------------------------------------------------------------------------------------- view_schema      | v_monitor view_name        | query_requests view_description | User-issued query requests query_string     | create view "v_monitor"."query_requests" as select ri.node_name,        ri.user_name,        ri.session_id,        ri.request_id,        ri.transaction_id,        ri.statement_id,        ri.request_type,        replace(replace(ri.request, E'\n', ' '), E'\t', ' ') as request,        ri.label as request_label,        ri.search_path,        round(ra.memory_mb, 2) as memory_acquired_mb,        rc.success,        de.error_count,        ri.time                                   as start_timestamp,        rc.time                                   as end_timestamp,        rc.time - ri.time                         as request_duration,        datediff('millisecond', ri.time, rc.time) as request_duration_ms,        rs.is_running IS NOT NULL AND rc.time IS NULL as is_executing from      v_internal.dc_requests_issued★ ri      LEFT OUTER JOIN (select node_name, session_id, request_id,                              reserved_extra_memory, time,                              processed_row_count, schema_name,                              table_name, command_tag, completion_tag,                              success                              FROM v_internal.dc_requests_completed★) rc                 USING (node_name, session_id, request_id)      LEFT OUTER JOIN (select node_name,                        session_id,                        request_id,                        count(*) as error_count                 from v_internal.dc_errors★                 where error_level >= 20                 group by 1,2,3) de USING (node_name, session_id, request_id)      LEFT OUTER JOIN (select node_name,                        transaction_id,                        statement_id,                        max(memory_kb)/1024::float as memory_mb                 from v_internal.dc_resource_acquisitions★                 where result = 'Granted'                 group by 1,2,3) ra                 USING (node_name, transaction_id, statement_id)      LEFT OUTER JOIN (select node_name,                        user_name,                        session_id,                        statement_id,                        true as is_running -- Is session still running? Always true if it's in vs_sessions                 from v_internal.vs_sessions                 group by 1,2,3,4) rs                 USING (node_name, user_name, session_id, statement_id);  | 
					
【2】コンポーネントの確認
user_sessionsシステムテーブルは、RuntimePriorityChanges、SessionEnds、SessionStartsのコンポーネントで構成されています。
| 
					 1 2 3 4 5 6 7  | 
						dbadmin=> select node_name,component,table_name,memory_buffer_size_kb,disk_size_kb,interval_set,interval_time from data_collector where table_name in ('dc_session_starts','dc_session_ends','dc_runtime_priority_changes') ;      node_name     |       component        |         table_name          | memory_buffer_size_kb | disk_size_kb | interval_set | interval_time -------------------+------------------------+-----------------------------+-----------------------+--------------+--------------+---------------  v_testdb_node0001 | RuntimePriorityChanges | dc_runtime_priority_changes |                  1000 |        10000 | f            | 0  v_testdb_node0001 | SessionEnds            | dc_session_ends             |                   100 |         5000 | f            | 0  v_testdb_node0001 | SessionStarts          | dc_session_starts           |                   200 |         5000 | f            | 0 (3 rows)  | 
					
query_requestsシステムテーブルは、Errors、RequestsCompleted、RequestsIssued、ResourceAcquisitionsのコンポーネントで構成されています。
| 
					 1 2 3 4 5 6 7 8  | 
						dbadmin=> select node_name,component,table_name,memory_buffer_size_kb,disk_size_kb,interval_set,interval_time from data_collector where table_name in ('dc_requests_issued','dc_requests_completed','dc_errors','dc_resource_acquisitions') ;      node_name     |      component       |        table_name        | memory_buffer_size_kb | disk_size_kb | interval_set | interval_time -------------------+----------------------+--------------------------+-----------------------+--------------+--------------+---------------  v_testdb_node0001 | Errors               | dc_errors                |                  1000 |        10000 | f            | 0  v_testdb_node0001 | RequestsCompleted    | dc_requests_completed    |                  2000 |        50000 | f            | 0  v_testdb_node0001 | RequestsIssued       | dc_requests_issued       |                  2000 |        50000 | f            | 0  v_testdb_node0001 | ResourceAcquisitions | dc_resource_acquisitions |                  1000 |        10000 | f            | 0 (4 rows)  | 
					
【3】保存条件の確認
user_sessionsシステムテーブルは、RuntimePriorityChangesが「disk_size_kb=10000, interval_set=f」、SessionEndsが「disk_size_kb=5000, interval_set=f」、SessionStartsが「disk_size_kb=5000, interval_set=f」に設定されています。
※デフォルトは、保存期間が設定されていないため、ディスク上限値のサイズのみが閾値になります。
| 
					 1 2 3 4 5 6 7  | 
						dbadmin=> select node_name,component,table_name,memory_buffer_size_kb,disk_size_kb,interval_set,interval_time from data_collector where table_name in ('dc_session_starts','dc_session_ends','dc_runtime_priority_changes') ;      node_name     |       component        |         table_name          | memory_buffer_size_kb | disk_size_kb | interval_set | interval_time -------------------+------------------------+-----------------------------+-----------------------+--------------+--------------+---------------  v_testdb_node0001 | RuntimePriorityChanges | dc_runtime_priority_changes |                  1000 |        10000 | f            | 0  v_testdb_node0001 | SessionEnds            | dc_session_ends             |                   100 |         5000 | f            | 0  v_testdb_node0001 | SessionStarts          | dc_session_starts           |                   200 |         5000 | f            | 0 (3 rows)  | 
					
参考)get_data_collector_policy関数を利用する場合は、以下のとおりです。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  | 
						dbadmin=> SELECT get_data_collector_policy('RuntimePriorityChanges');                           get_data_collector_policy -----------------------------------------------------------------------------  1000KB kept in memory, 10000KB kept on disk. Time based retention disabled. (1 row) dbadmin=> SELECT get_data_collector_policy('SessionEnds');                          get_data_collector_policy ---------------------------------------------------------------------------  100KB kept in memory, 5000KB kept on disk. Time based retention disabled. (1 row) dbadmin=> SELECT get_data_collector_policy('SessionStarts');                          get_data_collector_policy ---------------------------------------------------------------------------  200KB kept in memory, 5000KB kept on disk. Time based retention disabled. (1 row)  | 
					
query_requestsシステムテーブルは、Errorsが「disk_size_kb=10000, interval_set=f」、RequestsCompletedが「disk_size_kb=50000, interval_set=f」、
RequestsIssuedが「disk_size_kb=50000, interval_set=f」、ResourceAcquisitionsが「disk_size_kb=10000, interval_set=f」に設定されています。
※デフォルトは、保存期間が設定されていないため、ディスク上限値のサイズのみが閾値になります。
| 
					 1 2 3 4 5 6 7 8  | 
						dbadmin=> select node_name,component,table_name,memory_buffer_size_kb,disk_size_kb,interval_set,interval_time from data_collector where table_name in ('dc_requests_issued','dc_requests_completed','dc_errors','dc_resource_acquisitions') ;      node_name     |      component       |        table_name        | memory_buffer_size_kb | disk_size_kb | interval_set | interval_time -------------------+----------------------+--------------------------+-----------------------+--------------+--------------+---------------  v_testdb_node0001 | Errors               | dc_errors                |                  1000 |        10000 | f            | 0  v_testdb_node0001 | RequestsCompleted    | dc_requests_completed    |                  2000 |        50000 | f            | 0  v_testdb_node0001 | RequestsIssued       | dc_requests_issued       |                  2000 |        50000 | f            | 0  v_testdb_node0001 | ResourceAcquisitions | dc_resource_acquisitions |                  1000 |        10000 | f            | 0 (4 rows)  | 
					
参考)get_data_collector_policy関数を利用する場合は、以下のとおりです。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						dbadmin=> SELECT get_data_collector_policy('Errors');                           get_data_collector_policy -----------------------------------------------------------------------------  1000KB kept in memory, 10000KB kept on disk. Time based retention disabled. (1 row) dbadmin=> SELECT get_data_collector_policy('RequestsCompleted');                           get_data_collector_policy -----------------------------------------------------------------------------  2000KB kept in memory, 50000KB kept on disk. Time based retention disabled. (1 row) dbadmin=> SELECT get_data_collector_policy('RequestsIssued');                           get_data_collector_policy -----------------------------------------------------------------------------  2000KB kept in memory, 50000KB kept on disk. Time based retention disabled. (1 row) dbadmin=> SELECT get_data_collector_policy('ResourceAcquisitions');                           get_data_collector_policy -----------------------------------------------------------------------------  1000KB kept in memory, 10000KB kept on disk. Time based retention disabled. (1 row)  | 
					
【4】保存条件の変更
user_sessionsシステムテーブルのディスクサイズの上限値を1GBで設定し、保存期間を7日間に設定します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  | 
						dbadmin=> SELECT set_data_collector_policy('RuntimePriorityChanges','1000','1048576','7');  set_data_collector_policy ---------------------------  SET (1 row) dbadmin=> SELECT set_data_collector_policy('SessionEnds','100','1048576','7');  set_data_collector_policy ---------------------------  SET (1 row) dbadmin=> SELECT set_data_collector_policy('SessionStarts','200','1048576','7');  set_data_collector_policy ---------------------------  SET (1 row)  | 
					
query_requestsシステムテーブルのディスクサイズの上限値を1GBで設定し、保存期間を7日間に設定します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						dbadmin=> SELECT set_data_collector_policy('Errors','1000','1048576','7');  set_data_collector_policy ---------------------------  SET (1 row) dbadmin=> SELECT set_data_collector_policy('RequestsCompleted','2000','1048576','7');  set_data_collector_policy ---------------------------  SET (1 row) dbadmin=> SELECT set_data_collector_policy('RequestsIssued','2000','1048576','7');  set_data_collector_policy ---------------------------  SET (1 row) dbadmin=> SELECT set_data_collector_policy('ResourceAcquisitions','1000','1048576','7');  set_data_collector_policy ---------------------------  SET (1 row)  | 
					
【5】変更後の保存条件を確認
user_sessionsシステムテーブルは、RuntimePriorityChangesが「disk_size_kb=1048576, interval_time=7」、SessionEndsが「disk_size_kb=1048576, interval_time=7」、SessionStartsが「disk_size_kb=1048576, interval_time=7」に変更されました。
| 
					 1 2 3 4 5 6 7  | 
						dbadmin=> select node_name,component,table_name,memory_buffer_size_kb,disk_size_kb,interval_set,interval_time from data_collector where table_name in ('dc_session_starts','dc_session_ends','dc_runtime_priority_changes') ;      node_name     |       component        |         table_name          | memory_buffer_size_kb | disk_size_kb | interval_set | interval_time -------------------+------------------------+-----------------------------+-----------------------+--------------+--------------+---------------  v_testdb_node0001 | RuntimePriorityChanges | dc_runtime_priority_changes |                  1000 |      1048576 | t            | 7  v_testdb_node0001 | SessionEnds            | dc_session_ends             |                   100 |      1048576 | t            | 7  v_testdb_node0001 | SessionStarts          | dc_session_starts           |                   200 |      1048576 | t            | 7 (3 rows)  | 
					
query_requestsシステムテーブルは、Errorsが「disk_size_kb=1048576, interval_time=7」、RequestsCompletedが「disk_size_kb=1048576, interval_time=7」、RequestsIssuedが「disk_size_kb=1048576, interval_time=7」、ResourceAcquisitionsが「disk_size_kb=1048576, interval_time=7」に変更されました。
| 
					 1 2 3 4 5 6 7 8  | 
						dbadmin=> select node_name,component,table_name,memory_buffer_size_kb,disk_size_kb,interval_set,interval_time from data_collector where table_name in ('dc_requests_issued','dc_requests_completed','dc_errors','dc_resource_acquisitions') ;      node_name     |      component       |        table_name        | memory_buffer_size_kb | disk_size_kb | interval_set | interval_time -------------------+----------------------+--------------------------+-----------------------+--------------+--------------+---------------  v_testdb_node0001 | Errors               | dc_errors                |                  1000 |      1048576 | t            | 7  v_testdb_node0001 | RequestsCompleted    | dc_requests_completed    |                  2000 |      1048576 | t            | 7  v_testdb_node0001 | RequestsIssued       | dc_requests_issued       |                  2000 |      1048576 | t            | 7  v_testdb_node0001 | ResourceAcquisitions | dc_resource_acquisitions |                  1000 |      1048576 | t            | 7 (4 rows)  | 
					
参考情報
データコレクターについてData Collector
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/Glossary/DataCollector.htm
複数の保存条件を変更する場合のコマンド
SET_DATA_COLLECTOR_POLICY
https://www.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/VerticaFunctions/DataCollection/SET_DATA_COLLECTOR_POLICY.htm
保存期間のみを変更する場合のコマンド
SET_DATA_COLLECTOR_TIME_POLICY
https://www.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/VerticaFunctions/DataCollection/SET_DATA_COLLECTOR_TIME_POLICY.htm
現在の保存条件を確認する場合のコマンド
DATA_COLLECTOR
https://www.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/SystemTables/MONITOR/DATA_COLLECTOR.htm
GET_DATA_COLLECTOR_POLICY
https://www.vertica.com/docs/9.2.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/VerticaFunctions/DataCollection/GET_DATA_COLLECTOR_POLICY.htm
検証バージョン
この記事の内容はVertica 9.2で確認しています。更新履歴
2019/07/01 本記事を公開- 投稿タグ
 - システムテーブル, データ―コレクター, 保存期間, 保存条件, Data Collector
 

