본문으로 건너뛰기

데이터베이스 모델

플랫폼이 데이터를 어디에 무슨 모양으로 담는지 정리한 문서입니다. 백업 범위를 정하거나, 직접 조회해야 하거나, 보존 기간을 조정할 때 봅니다.

한 종류가 아닙니다

플랫폼은 데이터 성격에 따라 저장소를 나눠 씁니다(polyglot persistence). 어느 데이터가 어디 있는지 모르면 백업이 반쪽이 됩니다.

저장소담는 것규모
PostgreSQL마스터 데이터 · 설정 · 트랜잭션pp 스키마 169 테이블 + 현장 앱 pf 스키마
Aster TSDB (pp)시계열 · 이벤트 · 집계 · KPI125 테이블
Iceberg (spark.plantpulse)장기 보관 · 분석1 테이블

PostgreSQL — 마스터와 설정​

관계형 데이터가 들어갑니다. 스키마 변경은 Flyway 가 관리하며 이력은 flyway_schema_history_v2 에 남습니다.

테이블 이름은 mm_ 접두사(master/meta)가 159개로 대부분입니다. 묶음별 전체 목록은 아래에 있습니다.

묶음대표 테이블
조직·자산mm_asset_tree · mm_enterprise · mm_site · mm_area · mm_line · mm_equipment · mm_asset_class
수집 정의mm_opc · mm_tag · mm_point · mm_edge
알람mm_alarm · mm_alarm_config · mm_alarm_delivery · mm_alarm_suppressed · mm_alarm_shelve · mm_alarm_out_of_service
생산mm_order · mm_order_oee · mm_product · mm_shift · mm_calendar
정비·고장mm_maintenance_order · mm_maintenance_plan · mm_failure_record
사람·거래처mm_employee · mm_customer
보안mm_security · mm_token · user_login · user_login_session

관계 — 자산과 수집​

mm_asset_tree 한 표에 기업(E) → 사이트(S) → 구역(A) → 라인(L) → 설비(M) 다섯 층이 모두 들어갑니다. 이름·설명·설비 분류·운전 상태·외부 번호처럼 모든 층이 가진 칸은 트리에만 있습니다 — mm_site 에 site_name 이, mm_enterprise 에 enterprise_name 이 없습니다. 층마다 고유한 칸은 1:1 확장 표(mm_enterprise · mm_site · mm_area · mm_line · mm_equipment)에 있고, 트리 행을 지우면 함께 지워집니다.

규칙지키는 쪽
부모는 바로 위 층이고, 구역 아래로는 같은 사이트외래키 fk_mm_asset_tree_parent · fk_mm_asset_tree_parent_site
뿌리는 기업뿐이고 기업에는 site_id 가 없음, 사이트의 site_id 는 자기 자신CHECK 제약
층마다 ID 꼴 — 정식 접두 또는 옛 ASSET_CHECK chk_asset_id
설비만 받는 칸(워크오더·정비·달력 등)mm_equipment 를 가리키는 외래키

위치 경로는 뷰 mv_path 가 줍니다 — 노드마다 asset_type · depth(기업 0 ~ 설비 4) · enterprise_id · site_id · area_id · line_id · equipment_id · id_path · name_path.

관계 — 알람​

관계 — 생산과 사용자​

외래키가 무결성을 지킵니다

위 관계는 대부분 외래키로 선언돼 있습니다. 그래서 참조되는 행을 직접 DELETE 하면 거절되거나, 표에 따라 함께 지워집니다 (ON DELETE CASCADE). 지우는 일은 화면이나 API 로 하십시오.

전체 테이블 (169)​

묶음테이블
조직·자산 (29)mm_area · mm_area_function · mm_asset_class · mm_asset_class_iso_class · mm_asset_connection_status · mm_asset_document · mm_asset_health_status · mm_asset_layout · mm_asset_plan_generation · mm_asset_plan_segment · mm_asset_qr_access_audit · mm_asset_qr_token · mm_asset_relation · mm_asset_standard_profile · mm_asset_status · mm_asset_tree · mm_asset_type · mm_canvas · mm_enterprise · mm_equipment · mm_equipment_criticality · mm_image · mm_line · mm_line_kind · mm_operational_status · mm_site · mm_stats_site · mm_stats_system · mm_status
수집 정의 (11)mm_edge · mm_edge_status_snapshot · mm_opc · mm_opc_connection_status · mm_opc_latency_status · mm_opc_protocol · mm_opc_source_type · mm_point · mm_tag · mm_tag_java_type · mm_tag_type
알람 (16)mm_alarm · mm_alarm_cause · mm_alarm_config · mm_alarm_config_recipient · mm_alarm_config_revision · mm_alarm_delay · mm_alarm_delivery · mm_alarm_label_revision · mm_alarm_notification · mm_alarm_out_of_service · mm_alarm_resolution_guide · mm_alarm_resolution_guide_cause · mm_alarm_shelve · mm_alarm_signal_gap · mm_alarm_suppressed · mm_tag_alarm_recipient
설비 명령·스테이트먼트 (13)mm_asset_command · mm_asset_command_revision · mm_asset_statement · mm_asset_statement_deployment · mm_asset_statement_plugin · mm_asset_statement_revision · mm_command_area · mm_command_execution · mm_command_execution_event · mm_command_switch · mm_command_switch_audit · mm_event · mm_event_attributes
생산 (35)mm_calendar · mm_calendar_revision · mm_calendar_type · mm_defect_cause · mm_defect_record · mm_defect_record_revision · mm_holiday · mm_order · mm_order_ems · mm_order_flow · mm_order_note · mm_order_oee · mm_order_pause · mm_order_performance · mm_order_progress · mm_order_quantity_correction · mm_order_quantity_correction_revision · mm_order_ram · mm_order_revision · mm_process_segment · mm_process_segment_asset · mm_product · mm_product_route · mm_product_standard_profile · mm_production_target · mm_shift · mm_shift_override · mm_shift_pattern · mm_shift_pattern_asset · mm_shift_pattern_slot · mm_shift_schedule_revision · mm_shift_slot_break · mm_stop_cause · mm_stop_reason · mm_stop_reason_revision
정비·고장 (25)mm_failure_record · mm_failure_record_change · mm_failure_record_label · mm_failure_record_link · mm_fault_cause · mm_fault_cause_alarm_cause · mm_fault_code_map · mm_fault_code_map_history · mm_iso_detection_method · mm_iso_equipment_category · mm_iso_equipment_class · mm_iso_failure_cause · mm_iso_failure_mechanism · mm_iso_failure_mode · mm_iso_failure_mode_class · mm_iso_maintainable_item · mm_iso_maintainable_item_class · mm_iso_maintenance_activity · mm_maintenance_attachment · mm_maintenance_code_map · mm_maintenance_code_map_history · mm_maintenance_order · mm_maintenance_order_revision · mm_maintenance_plan · mm_maintenance_plan_revision
사람·거래처 (10)mm_app_account · mm_app_account_audit · mm_app_account_revision · mm_app_account_scope · mm_customer · mm_employee · mm_employee_audit · mm_employee_emergency_contact · mm_employee_photo · mm_employee_qualification
플로우 (5)mm_flow · mm_flow_health_status · mm_flow_link · mm_flow_node · mm_flow_snapshot
보안 (3)mm_security · mm_security_asset_scope · mm_token
기타 (22)mm_blob · mm_config · mm_diagnostic_code · mm_diagnostic_state · mm_metadata · mm_query_history · mm_reference_external_key · mm_reference_revision · mm_reference_text · mm_report · mm_schedule_fire_log · mm_schedule_watermark · dual · edge_active_flows · flow_snapshots · flyway_schema_history_v2 · metadata · node_component · user_login · user_login_session · version · version_history

Aster TSDB — 시계열과 이벤트​

키스페이스는 pp 입니다. 125개 테이블이 두 갈래로 나뉩니다.

접두사개수뜻
tm_117시계열·집계·통계·KPI (time series measurement)
ts_8범용 시계열 엔진 내부 구조

tm_ 은 대상별로 다시 갈립니다 — 태그 32 · KPI 26 · 자산 17 · 시스템 6 · 모니터 6 · 옵션 5 OPC 5 · 사이트 3 · blob 3 등.

핵심 테이블 — tm_tag_point​

원시 수집값이 들어가는 자리입니다. 나머지 태그 테이블은 대개 이것의 파생입니다.

PRIMARY KEY (tag_id, timestamp)
WITH CLUSTERING ORDER BY (timestamp DESC)
성질값
파티션 키tag_id — 태그 하나가 파티션 하나
클러스터링timestamp 내림차순 — 최신부터 읽는 것이 기본
기본 TTL315360000 초 = 3650일(10년) — 값의 정본은 storage.tag.point.ttl 입니다 (보존 기간 설정)
CompactionUnifiedCompactionStrategy (Cassandra 5.0+ 기능)
인덱스asset_id · opc_id 에 SAI(Storage Attached Index)
static 컬럼이 왜 있나

site_id · asset_id · line_id · area_id · opc_id · tag_name · type 은 static 입니다. 태그 하나(=파티션 하나) 안에서 값이 같으므로 파티션당 한 번만 저장합니다. 매 데이터 포인트마다 반복 저장하지 않아 용량이 크게 줄어듭니다.

파생 테이블 — 미리 계산해 둔다​

Aster TSDB 는 조회 시점 집계가 비싸므로 쓸 때 미리 만들어 둡니다. 그래서 테이블이 많습니다.

갈래예
집계tm_tag_point_aggregation_{1,5,10,30}_minutes · _1_hours
샘플링tm_tag_point_sampling_{10,30}_seconds · _{1,5,10,30}_minutes · _1_hours
카운트tm_tag_point_count · _by_date · _by_opc · _by_site
품질·검증tm_tag_point_validation · _by_timestamp · _validation_count
AI 분석tm_tag_point_anomalies · _forecasts
스냅샷·보관tm_tag_point_snapshot · tm_tag_point_archive

알람도 같은 방식입니다 — tm_tag_alarm 과 _count · _count_by_date · _count_by_opc _count_by_site · _duration · _on.

집계 테이블을 직접 지우지 마세요

원시 데이터에서 다시 만들어지지 않습니다. 지우면 그 구간의 화면·리포트가 비어 버리고 복구는 백업뿐입니다.

KPI 테이블 — OEE · RAM · EMS​

설비 KPI(OEE · RAM · EMS)는 tm_kpi_ 로 시작하는 26개 테이블에 담깁니다 — 도메인별로 tm_kpi_oee_* · tm_kpi_ram_* · tm_kpi_ems_* 입니다. 계산 잡이 약 10초마다 설비별로 값을 계산해 씁니다.

옛 tm_asset_oee* · tm_asset_ram* · tm_asset_ems* 테이블은 없습니다

KPI 는 이제 새 테이블에만 씁니다. 옛 이름으로 조회하던 쿼리·리포트는 새 테이블과 파티션 키에 맞게 고쳐야 합니다. 키가 바뀌었으므로 옛 조건을 그대로 옮기면 오류가 아니라 빈 결과가 나오기 쉽고, 그 빈 결과는 「데이터 없음」과 구별되지 않습니다.

테이블은 모양에 따라 네 갈래입니다.

갈래이름기본키한 행이 뜻하는 것
현재값tm_kpi_*_current(asset_id)설비의 지금 값 — 설비당 한 행, 계산할 때마다 덮어쓴다
오더별tm_kpi_oee_order · tm_kpi_ems_order(order_id)작업 오더 하나의 값 — 오더당 한 행, 오더가 끝나도 남는다
이력tm_kpi_*_history 등((asset_id, day), timestamp)계산 한 번(틱)의 값 — UTC 날짜별 파티션, 최신이 먼저
롤업tm_kpi_*_rollup((scope, scope_id, day), timestamp)라인 · 구역 · 사이트 · 기업 단위로 묶은 값
  • 버킷은 UTC 날짜입니다. day 는 yyyymmdd, month 는 yyyymm 정수이고, 행의 timestamp 를 UTC 로 본 날짜입니다 — 사이트 현지 자정이 아닙니다. 그래서 현지 하루는 UTC 버킷 두 개에 걸칩니다(한국 시간 00:00 ~ 08:59 의 행은 전날 UTC 버킷에 있습니다).
  • 드물게 생기는 데이터는 월 버킷입니다 — 설비 상태(tm_kpi_oee_status), 고장 (tm_kpi_ram_failure · _failure_rollup), 연료(tm_kpi_ems_fuel)는 month 로 파티션을 나눕니다.
  • 롤업의 scope 는 LINE · AREA · SITE · ENTERPRISE 중 하나이고, scope_id 는 그 라인·구역·사이트의 ID 입니다. 기업 단위는 scope_id = 'ALL' 입니다.
  • 원인 카운터 tm_kpi_oee_defect_cause · _stop_cause · _fault_cause 는 불량 · 정지 · 고장 원인별 일 누계입니다. 기본키는 ((asset_id, month), date, cause_code) 입니다.
  • 이력 행은 오더 누계입니다. *_history 의 한 행은 그 틱까지의 오더 전체 값(가동시간 · 생산수 · 에너지 등)입니다. 행을 더하지 마세요 — 기간 값이 필요하면 오더별로 마지막 행이나 *_order 행을 읽습니다.
  • 설비 상태의 지속시간은 저장하지 않습니다. tm_kpi_oee_status 는 상태가 바뀐 시각만 담고, 한 상태는 다음 행의 시각까지 이어집니다. 월 경계에서 자르지 말고 버킷을 이어서 읽습니다.
조회 — 파티션 키를 전부 주세요

asset_id 와 day(또는 month)를 모두 조건에 넣습니다. ALLOW FILTERING 은 쓰지 마세요. 기간을 조회할 때는 기간을 UTC 날짜 목록으로 펼쳐 버킷마다 한 번씩 읽습니다.

SELECT timestamp, oee, availability, performance, quality
FROM pp.tm_kpi_oee_history
WHERE asset_id = 'EQUIPMENT_000001' AND day = 20260925
AND timestamp >= '2026-09-25 00:00:00+0000';

사이트에 속한 설비별 값이 필요하면 설비 목록을 PostgreSQL 에서 얻고 설비마다 tm_kpi_*_current 를 읽습니다. 사이트 합계는 롤업 테이블의 scope = 'SITE' 입니다.

보존 기간은 5년입니다. 버킷이 있는 테이블(이력 · 이벤트 · 상태 · 롤업 등)의 기본 TTL 은 157680000 초(1825일)이고, 값의 정본은 storage.asset.kpi.ttl(없으면 storage.asset.standard.ttl) 입니다(보존 기간 설정). 현재값(*_current) · 오더별(*_order) · 원인 카운터는 TTL 이 없습니다. 이력성 테이블 14개는 매일 Iceberg 의 tw_kpi_* 로 옮겨 적어 두므로, 5년이 지나 Aster TSDB 에서 지워진 뒤에도 Iceberg 에서 조회할 수 있습니다.


어떻게 나뉘나 — 파티션 키가 곧 조회 축입니다​

Aster TSDB 에는 조인이 없습니다. 묻는 방식대로 표를 따로 만듭니다 — 그래서 표가 125개입니다. 같은 데이터가 여러 표에 다른 파티션 키로 들어 있는 것은 중복이 아니라 설계입니다.

파티션 키 모양무엇을 위한 것예
(tag_id) + timestamp한 태그의 시간축 조회tm_tag_point
(asset_id, date, hour) + timestamp한 설비의 하루·한 시간 구간tm_asset_data
(asset_id, day) + timestamp한 설비의 UTC 하루 KPItm_kpi_oee_history
(scope, scope_id, day) + timestamp라인·구역·사이트·기업의 UTC 하루 KPItm_kpi_oee_rollup
(site_id, year, month, day)사이트 단위 집계tm_site_summary
(id) 만현재값 — 시간축이 없어 만료도 없다*_count, *_last_update, tm_kpi_*_current

전체 테이블 (125)​

태그 · 포인트 (32)​

테이블기본키 (파티션 · 클러스터링)
tm_tag_alarmtag_id, alarm_seq
tm_tag_alarm_count``
tm_tag_alarm_count_by_datetag_id, year, month, day, hour, minute
tm_tag_alarm_count_by_opc(opc_id, tag_id), year, month, day, hour, minute
tm_tag_alarm_count_by_site(site_id, tag_id), year, month, day, hour, minute
tm_tag_alarm_durationalarm_config_id, alarm_seq
tm_tag_alarm_on``
tm_tag_pointtag_id, timestamp
tm_tag_point_aggregation_10_minutestag_id, timestamp
tm_tag_point_aggregation_1_hourstag_id, timestamp
tm_tag_point_aggregation_1_minutestag_id, timestamp
tm_tag_point_aggregation_30_minutestag_id, timestamp
tm_tag_point_aggregation_5_minutestag_id, timestamp
tm_tag_point_anomaliesjob_id, timestamp, tag_id
tm_tag_point_archive(site_id, year, month, day, hour), minute, second, tuuid
tm_tag_point_count``
tm_tag_point_count_by_datetag_id, year, month, day, hour, minute
tm_tag_point_count_by_opc``
tm_tag_point_count_by_site``
tm_tag_point_forecastsjob_id, timestamp, tag_id
tm_tag_point_map(year, month, day, hour, minute), timestamp
tm_tag_point_sampling_10_minutestag_id, timestamp
tm_tag_point_sampling_10_secondstag_id, timestamp
tm_tag_point_sampling_1_hourstag_id, timestamp
tm_tag_point_sampling_1_minutestag_id, timestamp
tm_tag_point_sampling_30_minutestag_id, timestamp
tm_tag_point_sampling_30_secondstag_id, timestamp
tm_tag_point_sampling_5_minutestag_id, timestamp
tm_tag_point_snapshot(site_id, snapshot_id, date), timestamp
tm_tag_point_validationtag_id, timestamp
tm_tag_point_validation_by_timestampyyyymmdd, timestamp, tag_id
tm_tag_point_validation_counttag_id, year, month, day, hour, minute

자산 (17)​

테이블기본키 (파티션 · 클러스터링)
tm_asset_aggregationasset_id, timestamp
tm_asset_alarmasset_id, alarm_seq
tm_asset_commandasset_id, timestamp
tm_asset_connection_statusasset_id, timestamp
tm_asset_contextasset_id, timestamp
tm_asset_data(asset_id, date, hour), timestamp
tm_asset_data_anomaliesjob_id, timestamp, asset_id, tag_id
tm_asset_data_based_dayasset_id, timestamp
tm_asset_data_based_hourasset_id, timestamp
tm_asset_data_based_minute(asset_id, date), timestamp
tm_asset_data_based_second(asset_id, date, hour), timestamp
tm_asset_data_based_timestamp(asset_id, date, hour), timestamp
tm_asset_data_forecastsjob_id, timestamp, asset_id, tag_id
tm_asset_eventasset_id, timestamp
tm_asset_health_statusasset_id, timestamp
tm_asset_statusasset_id, timestamp
tm_asset_timelineasset_id, timestamp, timeline_group, timeline_type

KPI — OEE · RAM · EMS (26)​

버킷 열의 「일」은 day(UTC yyyymmdd), 「월」은 month(UTC yyyymm) 입니다. 원인 카운터의 month 는 date 에서 얻습니다. 읽는 법은 KPI 테이블 절을 보세요.

테이블기본키 (파티션 · 클러스터링)버킷담는 것
tm_kpi_oee_currentasset_id—설비의 지금 OEE
tm_kpi_oee_orderorder_id—작업 오더 하나의 OEE
tm_kpi_oee_history(asset_id, day), timestamp일계산 틱마다의 OEE(오더 누계)
tm_kpi_oee_event(asset_id, day), timestamp일OEE 입력 이벤트
tm_kpi_oee_count(asset_id, day), timestamp일양품 · 불량 생산 수(로트 · 시리얼)
tm_kpi_oee_rolling(asset_id, day), timestamp일최근 N분 OEE
tm_kpi_oee_rollup(scope, scope_id, day), timestamp일라인 · 구역 · 사이트 · 기업 OEE
tm_kpi_oee_status(asset_id, month), timestamp월설비 상태 변경
tm_kpi_oee_status_currentasset_id—설비의 직전 상태
tm_kpi_oee_defect_cause(asset_id, month), date, cause_code월불량 원인 일 누계(카운터)
tm_kpi_oee_stop_cause(asset_id, month), date, cause_code월정지 원인 일 누계(카운터)
tm_kpi_oee_fault_cause(asset_id, month), date, cause_code월고장 원인 일 누계(카운터)
tm_kpi_ram_currentasset_id—설비의 지금 RAM
tm_kpi_ram_history(asset_id, day), timestamp일계산 틱마다의 RAM(오더 누계)
tm_kpi_ram_failure(asset_id, month), timestamp월고장 시작 · 종료 이벤트
tm_kpi_ram_failure_rollup(scope, scope_id, month), timestamp, asset_id월라인 · 구역 · 사이트 고장 이벤트
tm_kpi_ram_rolling(asset_id, day), timestamp일최근 N분 RAM
tm_kpi_ram_rollup(scope, scope_id, day), timestamp일라인 · 구역 · 사이트 · 기업 RAM
tm_kpi_ems_currentasset_id—설비의 지금 EMS
tm_kpi_ems_orderorder_id—작업 오더 하나의 EMS
tm_kpi_ems_history(asset_id, day), timestamp일계산 틱마다의 EMS(오더 누계)
tm_kpi_ems_power(asset_id, day), timestamp일전력 계량 이벤트(kW · kWh)
tm_kpi_ems_power_rollup(scope, scope_id, day), timestamp, asset_id일라인 · 구역 · 사이트 전력 이벤트
tm_kpi_ems_fuel(asset_id, month), timestamp월연료 계량 이벤트(스코프 1)
tm_kpi_ems_rolling(asset_id, day), timestamp일최근 N분 EMS
tm_kpi_ems_rollup(scope, scope_id, day), timestamp일라인 · 구역 · 사이트 · 기업 EMS

수집 · 사이트 (8)​

테이블기본키 (파티션 · 클러스터링)
tm_opc_connection_latency_historyopc_id, timestamp
tm_opc_connection_status_historyopc_id, timestamp
tm_opc_point_count``
tm_opc_point_count_by_dateopc_id, year, month, day, hour, minute
tm_opc_point_last_update``
tm_site_statussite_id, timestamp
tm_site_summarysite_id, year, month, day, hour, minute
tm_site_summary_total``

모니터링 (13)​

테이블기본키 (파티션 · 클러스터링)
tm_monitor_cep_metricstype, timestamp
tm_monitor_cluster_metricstype, ip, timestamp
tm_monitor_cluster_statustype, ip, timestamp
tm_monitor_nodestype, ip
tm_monitor_platform_healthtype, ip, timestamp
tm_monitor_platform_statustype, ip, timestamp
tm_system_health_statusapp_name, timestamp
tm_system_logapp_name, timestamp, seq
tm_system_log_count(app_name, level), year, month, day, hour, minute
tm_system_log_hourlyapp_name, bucket_start, instance_id, level
tm_system_propertiesproperty, timestamp
tm_system_start_date``
tm_system_trendyear, month, day, hour

배치 · 감사 (4)​

테이블기본키 (파티션 · 클러스터링)
tm_batch_audityyyymmdd, timestamp, id
tm_batch_job_runyyyymmdd, timestamp, id
tm_warehouse_audityyyymmdd, timestamp, id
tm_warehouse_storage_usage_dailyyear_bucket, day, table_name

시계열 엔진 (TSE 전용) (8)​

테이블기본키 (파티션 · 클러스터링)
ts_data_pointskey, column1
ts_row_key_indexkey, column1
ts_row_key_time_indexmetric, table_name, row_time
ts_row_keys(metric, table_name, row_time), data_type, tags
ts_service_index(service, service_key), key
ts_specspec_type, name
ts_string_indexkey, column1
ts_tag_indexed_row_keys(metric, table_name, row_time, single_tag_pair), data_type, tag_collection_hash, tags

그 밖 (17)​

테이블기본키 (파티션 · 클러스터링)
tm_blobblob_id, timestamp
tm_blob_count_and_size``
tm_blob_object``
tm_data_gateway_count``
tm_data_gateway_loglang, timestamp
tm_database_sizekeyspace_name, date
tm_diagnosticyear, timestamp
tm_diagnostic_countyear, level
tm_domain_change_history(domain_type, object_id), timestamp
tm_edge_status``
tm_option_eql_listener_result``
tm_option_eql_statement``
tm_option_eql_statement_historystmt_name, timestamp
tm_option_job_trigger_historyjob_name, context_fire_time
tm_option_listener_push_cacheurl, timestamp
tm_pipeline_exception_historybucket, timestamp, type, object_id
tm_trigger_resulttrigger_id, timestamp

Iceberg — 장기 보관​

아카이브 테이블(tm_tag_point_archive, 기본 365일)의 데이터를 오브젝트 스토리지에 쌓아 분석합니다. 원시 테이블에서 바로 넘어가는 것이 아니라 아카이브를 거칩니다.

항목값
카탈로그spark.plantpulse
테이블tw_tag_point — 태그 시계열. tw_asset_* · tw_blob 등 tw_ 로 시작하는 9종이 있습니다. KPI 는 tw_kpi_* 14종이 따로 있습니다
파티션site_id → year → month → day
포맷Iceberg v2 (row-level delete 지원)
압축Zstandard
실행Spark SQL

KPI 아카이브 — tw_kpi_*​

KPI 는 아카이브 테이블을 거치지 않고 tm_kpi_* 에서 바로 옮겨집니다. 매일 새벽 전날 하루치를 복사하므로, 최근 데이터는 Aster TSDB 와 Iceberg 양쪽에 있고 5년(TTL)이 지난 데이터는 Iceberg 에만 남습니다. Iceberg 쪽은 지우지 않습니다. 파티션은 year → month → day (월 버킷 테이블은 year → month)입니다.

Aster TSDBIceberg
tm_kpi_oee_history · _event · _count · _status · _rolluptw_kpi_oee_history · _event · _count · _status · _rollup
tm_kpi_ram_history · _failure · _rollup · _failure_rolluptw_kpi_ram_history · _failure · _rollup · _failure_rollup
tm_kpi_ems_history · _power · _fuel · _rollup · _power_rolluptw_kpi_ems_history · _power · _fuel · _rollup · _power_rollup

현재값(*_current · oee_status_current) · 오더별(*_order) · 최근 N분(*_rolling) · 원인 카운터(*_cause)는 옮기지 않습니다 — 이력이 아니거나 이력에서 다시 계산할 수 있는 값입니다.

보존 기간을 넘긴 데이터를 찾는다면

Aster TSDB 에는 없습니다. Iceberg 쪽을 조회하세요 → 분석 계층. 테이블별 보존 기간은 데이터 보존 기간(TTL) 설정 에 있습니다.


백업에서 놓치기 쉬운 것​

세 저장소가 각각 백업 대상입니다. PostgreSQL 만 받아 두고 안심하는 경우가 있는데, 그러면 시계열이 통째로 빠집니다.

저장소빠뜨리면
PostgreSQL설비·태그 정의, 사용자, 대시보드가 사라진다
Aster TSDB보존 기간 안의 시계열이 사라진다
Iceberg / 오브젝트 스토리지장기 이력이 사라진다

절차는 백업 및 복구 를 보세요.


관련 문서​