はじめに
システムテーブルには、クラスタの状態や、テーブル、プロジェクション、ユーザ等の詳細な情報が格納されています。データベースの管理をする上でよく利用しますが、古いデータは消えてしまうので、注意が必要です。本稿では、システムテーブルの保存条件を変更する方法について、詳しく解説します。
システムテーブルの構成
システムテーブルの実体はビューのため、システムテーブルを構成している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で構成されています。
# ★は参照している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で構成されています。
# ★は参照している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のコンポーネントで構成されています。
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のコンポーネントで構成されています。
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」に設定されています。
※デフォルトは、保存期間が設定されていないため、ディスク上限値のサイズのみが閾値になります。
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関数を利用する場合は、以下のとおりです。
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」に設定されています。
※デフォルトは、保存期間が設定されていないため、ディスク上限値のサイズのみが閾値になります。
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関数を利用する場合は、以下のとおりです。
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日間に設定します。
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日間に設定します。
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」に変更されました。
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」に変更されました。
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 本記事を公開