acquire-core-x/db/schema.d/60-mg.sql
forge-bot bec83c721e Phase 2b: 11개 모듈 전량 실동작 (333 서비스, 전서버 부팅)
- 10개 모듈 추가/확장(au py rc st lg cl mm vl mg cm), 각 30 서비스 = 330 + tmsrv
- build.sh 자동발견으로 11 모듈서버 + dbio 라이브러리 23 + 배치 22 빌드
- schema.d 11파일 → 75 테이블, 모듈별 disjoint
- 부팅 리소스 규명: fs.mqueue.queues_max=8192(330큐>256), NDRX_MSGSIZEMAX 16000·
  MSGMAX 50(큐당 5.6MB→0.8MB), msgqueue ulimit 2GB → 전 12서버 runok
- 검증: xadmin psc 333 AVAIL, 매입체인 XA 커밋, prepared_xacts=0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 09:58:39 +00:00

119 lines
5.8 KiB
SQL

-- mg 모듈 (전문게이트웨이 / message gateway) 스키마
-- ISO8583 전문 로그/라우팅/채번/채널세션/큐/통계 테이블.
-- Loaded into PostgreSQL on first boot (docker-entrypoint-initdb.d). Prefix 60.
-- ---------------------------------------------------------------------------
-- 전문 채번 (STAN / 전문 시퀀스) - MG_STAN 이 nextval 로 채번
-- ---------------------------------------------------------------------------
CREATE SEQUENCE IF NOT EXISTS mg_stan_seq; -- System Trace Audit Number
CREATE SEQUENCE IF NOT EXISTS mg_msg_seq; -- 전문 로그 PK
CREATE SEQUENCE IF NOT EXISTS mg_route_seq; -- 라우팅 룰 PK
CREATE SEQUENCE IF NOT EXISTS mg_queue_seq; -- 송수신 큐 PK
-- 이름있는 카운터 (세션 시퀀스 등 채번용 - MG_SESSION/MG_KEYEXCH)
CREATE TABLE IF NOT EXISTS mg_seq (
seq_name TEXT PRIMARY KEY,
seq_val BIGINT NOT NULL DEFAULT 0,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ---------------------------------------------------------------------------
-- 전문 로그 (mg_msg_log) - 수신/송신 전문의 원장
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS mg_msg_log (
msg_id BIGINT PRIMARY KEY,
stan BIGINT NOT NULL, -- 전문 추적번호
mti TEXT NOT NULL, -- 전문유형(0200/0210/0800...)
channel TEXT NOT NULL, -- 채널ID
direction TEXT NOT NULL, -- IN / OUT
proc_code TEXT NOT NULL DEFAULT '000000', -- 처리코드
bitmap TEXT NOT NULL DEFAULT '', -- 비트맵(hex)
amount BIGINT NOT NULL DEFAULT 0,
pan TEXT NOT NULL DEFAULT '', -- (마스킹된) 카드번호
mac TEXT NOT NULL DEFAULT '', -- 메시지 인증코드
rc TEXT NOT NULL DEFAULT '00', -- 응답코드
raw_msg TEXT NOT NULL DEFAULT '', -- 원 전문
status TEXT NOT NULL DEFAULT 'R', -- R=수신, S=송신, A=ACK, N=NACK, C=확인
biz_date DATE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_mg_msg_log_stan ON mg_msg_log (stan);
CREATE INDEX IF NOT EXISTS ix_mg_msg_log_chan ON mg_msg_log (channel, biz_date);
-- ---------------------------------------------------------------------------
-- 라우팅 룰 (mg_route) - 채널/전문유형 -> 목적지 매핑
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS mg_route (
route_id BIGINT PRIMARY KEY,
channel TEXT NOT NULL,
mti TEXT NOT NULL,
dest TEXT NOT NULL, -- 목적지 서비스/노드
priority INTEGER NOT NULL DEFAULT 100,
active BOOLEAN NOT NULL DEFAULT true,
biz_date DATE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_mg_route_lookup ON mg_route (channel, mti, active);
-- ---------------------------------------------------------------------------
-- 채널 (mg_channel) - 세션/사인온 상태
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS mg_channel (
channel TEXT PRIMARY KEY,
name TEXT NOT NULL DEFAULT '',
status TEXT NOT NULL DEFAULT 'DOWN', -- UP / DOWN / SIGNON / SIGNOFF
session_key TEXT NOT NULL DEFAULT '',
last_stan BIGINT NOT NULL DEFAULT 0,
signon_at TIMESTAMPTZ,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ---------------------------------------------------------------------------
-- 송수신 큐 (mg_queue) - 재전송 대상 관리
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS mg_queue (
queue_id BIGINT PRIMARY KEY,
stan BIGINT NOT NULL,
channel TEXT NOT NULL,
mti TEXT NOT NULL DEFAULT '',
payload TEXT NOT NULL DEFAULT '',
status TEXT NOT NULL DEFAULT 'Q', -- Q=대기, S=송신, D=완료, F=실패
retry_cnt INTEGER NOT NULL DEFAULT 0,
biz_date DATE NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_mg_queue_status ON mg_queue (status, biz_date);
-- ---------------------------------------------------------------------------
-- 채널 일별 통계 (mg_stat) - mg_stat_batch 가 채움
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS mg_stat (
channel TEXT NOT NULL,
biz_date DATE NOT NULL,
in_cnt BIGINT NOT NULL DEFAULT 0,
out_cnt BIGINT NOT NULL DEFAULT 0,
err_cnt BIGINT NOT NULL DEFAULT 0,
amount_sum BIGINT NOT NULL DEFAULT 0,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (channel, biz_date)
);
-- ---------------------------------------------------------------------------
-- Seed: 채널 + 기본 라우팅 룰
-- ---------------------------------------------------------------------------
INSERT INTO mg_channel (channel, name, status) VALUES
('CH01', 'VAN 게이트웨이', 'DOWN'),
('CH02', '매입사 링크', 'DOWN'),
('CH03', '해외 네트워크', 'DOWN')
ON CONFLICT (channel) DO NOTHING;
INSERT INTO mg_route (route_id, channel, mti, dest, priority, active, biz_date) VALUES
(nextval('mg_route_seq'), 'CH01', '0200', 'ACQUIRE', 10, true, '2026-07-19'),
(nextval('mg_route_seq'), 'CH01', '0800', 'MG_ECHO', 20, true, '2026-07-19'),
(nextval('mg_route_seq'), 'CH02', '0200', 'ACQ_EDC', 10, true, '2026-07-19')
ON CONFLICT DO NOTHING;
INSERT INTO mg_seq (seq_name, seq_val) VALUES
('SESSION', 0), ('KEYVER', 0)
ON CONFLICT (seq_name) DO NOTHING;