A. 레퍼런스

이 장을 마치면: 옵션, 설정, SQL 함수, 로그 파일, 디렉토리, 진단 쿼리, 용어를 한곳에서 찾는다.

A.1 명령 · 옵션

  • 설치 옵션의 정본은 2장 2.1의 표다.

gritdb-start와 gritdb-stop 옵션:

명령 옵션 뜻
gritdb-start (없음) 기동한다(4.1). 운영에 쓰는 옵션은 없다
gritdb-start -h, --help 사용법을 보인다
gritdb-stop (없음) 정상 정지(4.2)
gritdb-stop -q, --quick 즉시 정지(4.2). 사용법 글(--help)의 SIGKILL to Engine과 달리 GritDB 엔진도 먼저 SIGQUIT를 받는다. 그래서 core 파일이 생길 수 있다(9.6). 60초 안에 끝나지 않은 프로세스만 강제 종료한다
gritdb-stop -h, --help 사용법을 보인다
  • gritdb-start 사용법에 나오는 그 밖의 옵션(--asan, --valgrind, --crash-policy)은 개발용과 시험용이므로 쓰지 않는다. --crash-policy를 주면 기동에 실패한다.
  • gritdb-start는 모르는 옵션을 받으면 Unknown option: <옵션>을 내고 기동하지 않는다.
  • gritdb-stop은 모르는 옵션을 무시하고 정상 정지를 한다. 그래서 즉시 정지를 할 때는 철자(--quick, -q)를 확인한다.
  • 두 명령 모두 끝날 때까지 기다리는 시한이 없다(4.1, 4.2).

종료 코드:

명령 종료 코드 뜻
gritdb-start 0 GritDB started successfully!는 접속을 받을 준비가 끝났다는 뜻이다(4.1)
gritdb-start 1 기동하지 않았다. 원인: 설치되지 않은 경로(Run install_gritdb.sh first., QuickStart GDB-BOOT-001), 이미 실행 중(GritAdmin is already running, QuickStart GDB-BOOT-002), 기동 중 감독 프로세스 종료(GritAdmin process exited unexpectedly during startup, QuickStart GDB-BOOT-005), 모르는 옵션
gritdb-stop 0 끝까지 진행했다. GritDB가 이미 멈춰 있었거나 기동 중이었어도 0이다. 그래서 멈췄는지는 4.2와 4.5로 판정한다
gritdb-stop 1 설치되지 않은 경로(Run install_gritdb.sh first.)
  • 기동이 끝난 뒤의 비정상 종료는 gritdb-start 종료 코드에 나오지 않는다. 그래서 4.1의 20초 뒤 재확인을 한다.

환경 변수:

  • 고객이 정할 환경 변수는 없다. GritDB 명령은 GRITDB_HOME, PGDATA, PGPORT를 읽지 않고, 실행 파일이 있는 자리에서 설치 경로를 찾는다.
  • PG로 시작하는 환경 변수와 LD_LIBRARY_PATH가 없는 셸에서 기동한다(4.1).
  • 기동한 셸의 TMPDIR 값이 GritDB 엔진의 임시 파일 자리가 된다(1.4, 7.6).
구분 bin/ 명령
쓴다 gritdb-start, gritdb-stop, psql, pg_isready, pg_dump, pg_dumpall, grit_instance_id(설치본이 여럿일 때, 2.9)
직접 실행하지 않는다 grit_admin, grit_admin_client, grit_catalog_process, grit_surfer_process, postgres(단일 사용자 모드 포함, 기동은 4.1), initdb(재초기화는 3.1)
쓰지 않는다 pg_ctl, pg_upgrade, pg_resetwal, pg_rewind, pg_basebackup(백업 용도), clusterdb, vacuumdb --full, pg_createsubscriber(분석계는 6.4), pg_checksums(GritDB와 함께 시험하지 않았다)
지원이 요청할 때만 gritdb_cf
  • 이 표에 없는 bin/ 명령(createdb, pg_controldata, pg_waldump 등)은 PostgreSQL 17 문서대로 쓴다. 등록 테이블을 다시 쓰는 작업은 하지 않는다(6.7).

A.2 설정

이름 자리 기본값 범위와 단위 반영 바꾸는 법
shared_preload_libraries 관리 블록의 필수 블록 'gritsurfer' — 재기동 바꾸지 않는다
wal_level 관리 블록의 필수 블록 logical — 재기동 바꾸지 않는다
search_path 관리 블록의 필수 블록 '"$user", public, gritdb' — reload 바꾸지 않는다. 서비스 계정은 스키마를 붙여 만든다(11.5)
port 관리 블록 설치 때 값(기본 5432) 1~65535 재기동 install_gritdb.sh --pgport(2.5)
shared_buffers 관리 블록의 튜닝 블록 설치 때 계산(5.5) — 재기동 superuser, ALTER SYSTEM(5.3)
wal_buffers 관리 블록의 튜닝 블록 64MB — 재기동 superuser, ALTER SYSTEM
max_wal_size 관리 블록의 튜닝 블록 64GB — reload superuser, ALTER SYSTEM
min_wal_size 관리 블록의 튜닝 블록 2GB — reload superuser, ALTER SYSTEM
checkpoint_timeout 관리 블록의 튜닝 블록 1h — reload superuser, ALTER SYSTEM
bgwriter_lru_maxpages 관리 블록의 튜닝 블록 1000 — reload superuser, ALTER SYSTEM
effective_cache_size 관리 블록의 튜닝 블록 설치 때 계산(5.5) — reload superuser, ALTER SYSTEM
work_mem 관리 블록의 튜닝 블록 설치 때 계산(5.5) — reload superuser, ALTER SYSTEM. 세션에서는 SET
restart_after_crash PostgreSQL(GritDB가 고정) off — — 바꿀 수 없다. postgresql.conf에 쓰면 기동하지 않는다(5.3)
grit_surfer.catalog.read_threads config/grit_surfer.config 4 1~64개 재기동 서비스 계정, 파일(5.6)
grit_surfer.channel.shm_limit_mb config/grit_surfer.config 512 16~65536 MB 재기동 서비스 계정, 파일(5.6)
grit_burst.session.connect_timeout_ms config/grit_burst.config 300000 1~3600000 ms 재기동 서비스 계정, 파일(5.6)
grit_unify.delta.log_level, grit_plug.consumer.log_level, grit_burst.query.log_level config/grit_unify.config, grit_plug.config, grit_burst.config info — 1.1에서 쓰지 않는다(9.2) 지우지 않는다
grit_unify.delta.log_file_max_byte config/grit_unify.config 10485760 바이트 1.1에서 쓰지 않는다(9.2) 지우지 않는다
gritsurfer_session_mode 확장 설정 pg pg, surfer 접속할 때만 모든 계정, 접속 옵션(6.6). 전역 설정하지 않는다
gritsurfer_session_fallback 확장 설정 on on, off 세션(SET) 모든 계정
gritsurfer_write_visibility_guard 확장 설정 on on, off 세션 superuser만

A.3 SQL 함수

함수 반환 하는 일 절
register_gritsurfer_table(schema_name text, table_name text) void 테이블을 등록한다 6.3
unregister_gritsurfer_table(schema_name text, table_name text) void 등록을 해제한다 6.3
gritsurfer_version() text 확장 SQL 버전이며 판 번호가 아니다. 판 번호는 0장을 본다 6.5
get_gritsurfer_*()(아래 표) 표 상태를 SQL로 가공할 표로 돌려준다 6.5
show_gritsurfer_tables(), show_gritsurfer_coldfiles(), show_gritsurfer_unify_checkpoints(), show_gritsurfer_active_queries(), show_gritsurfer_query_history(max_rows integer DEFAULT NULL, since timestamptz DEFAULT NULL) SETOF text 같은 내용을 사람이 읽는 글로 돌려준다 6.5
  • 설치 기본값에서는 모든 계정이 이 함수들을 실행할 수 있다. 실행 권한은 11.5에서 좁힌다. 등록 함수와 해제 함수는 서비스 계정만 쓰므로 역할에 주지 않는다. 11.5를 마친 뒤에는 역할에 줘도 일반 계정은 실행할 수 없다.
  • 조회 함수는 접속한 데이터베이스의 것만 돌려준다. get_gritsurfer_unify_checkpoints()만 모든 데이터베이스에 공통이다.
  • 이력 함수의 인자는 설치 파일 판마다 다를 수 있으므로 쓰기 전에 \df get_gritsurfer_query_history로 확인한다(3.5, 6.5).
  • 6장 6.3과 6.5의 표가 정본이다.
함수 출력 열
get_gritsurfer_tables() 16개 열: table_id, extra_id, table_type, schema_name, table_name, column_count, constraint_count, index_count, register_ts, partition_strategy, is_partition, parent_table_id, partition_key_attnums, partition_bound, space_id, file_id
get_gritsurfer_columns(), get_gritsurfer_constraints(), get_gritsurfer_indexes() 각각 28개, 15개, 12개 열. PostgreSQL 카탈로그의 열, 제약, 인덱스 정보(table_id로 묶는다)
get_gritsurfer_coldfiles() 17개 열: table_oid, cold_group_id, type, schema_name, table_name, stem, num_cold_chunks, num_cold_segments, row_count, file_size_bytes, committed_lsn, min_lsn, max_commit_ts, schema_version, min_cold_group_id, max_cold_group_id, status
get_gritsurfer_unify_checkpoints() 3개 열: ckpt_lsn, ckpt_ts, created_at
get_gritsurfer_active_queries(), get_gritsurfer_query_history(max_rows, since) 17개 열: seq, pid, query_start_time, query_hash, q_seq, session_start_time, query_text(앞 1024자), status, 단계 시간 9개(dispatched_time, burst_received_time, coord_started_time, exec_started_time, worker_taken_time, first_chunk_time, pg_first_recv_time, burst_end_time, pg_end_time)

자주 쓰는 열:

함수 열 뜻
get_gritsurfer_tables() table_id 테이블 OID(pg_class.oid와 같다)
get_gritsurfer_tables() register_ts 등록한 시간. 함께 등록된 TOAST 테이블도 한 행으로 나온다
get_gritsurfer_coldfiles() (행) 행 하나가 파일 하나다. cold file(GritDB 엔진이 분석 조회용으로 열 단위로 저장한 파일) 한 묶음은 type이 다른 3행이다. 묶음 단위로 보려면 show_gritsurfer_coldfiles()를 쓴다
get_gritsurfer_coldfiles() status STAGED, ACTIVE, FROZEN, INACTIVE(6.5)
get_gritsurfer_coldfiles() row_count, file_size_bytes 파일의 행 수와 바이트
get_gritsurfer_unify_checkpoints() ckpt_lsn unify checkpoint의 WAL 위치. unify checkpoint는 GritDB 엔진이 영구 반영을 마친 WAL 위치이며, PostgreSQL checkpoint와 다르다. 반영 확인에 쓴다(6.6.1)
get_gritsurfer_unify_checkpoints() created_at 기록한 시간. 나이는 now() - max(created_at)으로 구한다(A.6)
질의 두 함수 pid 질의를 보낸 세션의 PID. pg_stat_activity.pid와 맞춘다(6.9)
질의 두 함수 query_text 질의 원문 앞 1024자. 전문은 datafiles/query_text_archive.jsonl에 있다
질의 두 함수 단계 시간 9개 query_start_time과의 차로 기다린 시간과 실행 시간을 본다(6.9)
질의 두 함수 seq 이력에서는 이력의 행 번호, 실행 중에는 결과의 행 번호

질의 상태(status):

값 뜻
CREATED 받았고 실행을 기다린다
EXECUTING GritDB 엔진이 실행하고 있다
EXECUTION_DONE GritDB 엔진 실행이 끝나 결과를 넘기고 있다
COMPLETED PostgreSQL까지 결과를 넘겼다
FAILED 오류로 끝났다. PostgreSQL로 다시 실행한 조회도 이 값이다(6.6)
CANCELLED 취소되었다
UNKNOWN 알 수 없는 값
  • 이 절에 없는 gritdb 스키마의 함수는 GritDB 내부용이므로 부르지 않는다. 실행 권한은 11.5에서 거둔다.

A.4 로그 파일

  • 9장 9.1의 표가 정본이다.

A.5 디렉토리

설치 경로(~/gritdb1):

디렉토리와 파일 내용 종류
bin/ 명령(A.1) 설치 파일
lib/ 공유 라이브러리 설치 파일
share/ PostgreSQL 공유 파일, 확장, share/gritdb/manifest.json(설치 판과 파일 목록) 설치 파일
etc/ 경로 스크립트와 설정 틀(templates/) 설치 파일
include/, licenses/, docs/ 헤더, 오픈소스 라이선스, RELEASE-NOTES.md 설치 파일
config/ GritDB 엔진 설정 파일 4개(grit_burst, grit_plug, grit_surfer, grit_unify의 .config). 처음 설치 때만 만든다(5.6) 설정
datafiles/ 데이터(아래 표). 재배치하면 심링크다(2.4) 상태
log/ 로그(9.1) 상태
run/ 실행 중 파일(아래 표) 상태
.gritdb_installed 설치 완료 표식. 없으면 기동하지 않는다(QuickStart GDB-BOOT-001) 상태
  • 설치 파일은 설치와 업그레이드가 바꾼다. 설정과 상태는 업그레이드가 그대로 둔다(3.5).
  • 개발용 패키지면 run/gritdb/, tools/, .bashrc, build/가 더 있다(0장).

datafiles/ 안:

자리 내용
pgdata/ PostgreSQL 데이터, WAL(pg_wal), 복구용 복제 슬롯, postgresql.conf, pg_hba.conf
checkpoint/ unify checkpoint 위치(grit_unify.cp). 지우거나 고치지 않는다(QuickStart 6.1의 금지 2)
queue/ GritDB 엔진의 대기열 파일. 겉보기 크기가 크고 빈 공간이 많다. 복사는 8.2를 본다
cold_file/ cold file. 행이 반영된 등록 테이블마다 디렉토리가 하나 있다. 이름 끝은 _<데이터베이스 OID>_<테이블 OID>다. 해제나 DROP 뒤에는 GritDB가 지운다(7.6). 이름 끝이 _0_0_<숫자>인 디렉토리는 GritDB 내부 테이블 몫이며, 등록 목록에 없다
buffer_spill/ GritDB 엔진 메모리를 넘친 임시 파일. 정상 정지 때 지운다(7.6)
query_text_archive.jsonl 분석 세션 조회의 원문 전체(한 건에 한 줄). 자동으로 지우지 않는다(9.5, 11.1)
  • 재배치 심링크(2.4): datafiles → --datafiles 실경로, datafiles/pgdata → --pgdata 실경로
  • readlink -f ~/gritdb1/datafiles를 실행해 설치 때 정한 실경로가 나오는지 확인한다.

run/ 안:

파일 내용
gritdb.lock 실행 중 잠금. 지우지 않는다(4.5)
grit_admin.pid 기동이 끝난 뒤 생긴다. PID:, ENGINE_PID:, BASE_DB_PID:, CATALOG_PID: 4줄이다(4.5)
grit_admin.sock 정지 명령 소켓. 쓸 수 있는 사용자는 GritDB를 멈출 수 있다(11.7)
grit_admin_clean_shutdown 정상 정지 표식(CLEAN_SHUTDOWN, 8.2)

A.6 진단 쿼리

서비스 계정으로 연 ~/gritdb1/bin/psql -p 5432 -d <db>에 복사해서 쓴다. “데이터베이스마다”가 붙지 않은 쿼리는 어느 데이터베이스에서나 같다.

복구용 복제 슬롯 보존량:

SELECT slot_name, active, wal_status,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_replication_slots WHERE slot_name = 'gritsurfer_slot';

cold file 상태별 개수와 크기(데이터베이스마다):

SELECT schema_name, table_name, status, count(*) AS files,
       pg_size_pretty(sum(file_size_bytes)) AS size
FROM get_gritsurfer_coldfiles()
GROUP BY schema_name, table_name, status
ORDER BY schema_name, table_name, status;
  • STAGED가 늘기만 하지 않고 INACTIVE가 곧 사라지면 정상이다(7.8).

unify checkpoint 나이:

SELECT max(ckpt_lsn) AS ckpt_lsn, now() - max(created_at) AS age
FROM get_gritsurfer_unify_checkpoints();
  • age가 짧게 유지되면 정상이다(7.2). 파일에서도 stat -c '%y' ~/gritdb1/datafiles/checkpoint/grit_unify.cp로 같은 것을 본다. 이 값은 unify checkpoint가 마지막으로 나아간 시간이다.

긴 트랜잭션:

SELECT pid, usename, application_name, state,
       now() - xact_start AS xact_age, left(query, 60) AS query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL AND pid <> pg_backend_pid()
ORDER BY xact_start LIMIT 10;
  • 오래 열린 트랜잭션과 idle in transaction이 없으면 정상이다. 있으면 그 응용 프로그램에서 끝낸다.

남은 prepared transaction(PREPARE TRANSACTION):

SELECT gid, prepared, owner, database FROM pg_prepared_xacts;

등록 테이블 목록(데이터베이스마다):

SELECT schema_name, table_name, register_ts FROM get_gritsurfer_tables() ORDER BY 1, 2;
  • 함께 등록된 TOAST 테이블도 나온다.

최근 분석 질의(데이터베이스마다, 인자는 판마다 확인, 6.5):

SELECT query_start_time, status, pg_end_time - query_start_time AS total,
       left(query_text, 60) AS query
FROM get_gritsurfer_query_history(100, now() - interval '1 hour')
ORDER BY query_start_time DESC;

재기동 흔적:

SELECT pg_postmaster_start_time();
  • 지난번 점검과 같은 값이면 정상이다. 바뀌었으면 재기동이 있었다(7.9). 함수 설명은 pg_postmaster_start_time()에 있다.

그 밖의 쿼리:

볼 것 자리
반영 확인(pg_current_wal_lsn() 대 max(ckpt_lsn)) 6.6.1
GritDB 작업자와 내부 접속 7.1
분석계 subscription(운영 DB 쪽 슬롯과 GritDB 쪽 상태) 7.5
트랜잭션 ID 나이와 죽은 행 7.8
보안 점검 11.10

A.7 Oracle · Tibero 대응

아는 것 GritDB
startup, tbboot gritdb-start
shutdown normal, tbdown gritdb-stop. 남은 세션이 있으면 즉시 정지로 넘어간다(4.2)
shutdown immediate, tbdown immediate 남은 세션 끊기(4.2, pg_terminate_backend) → gritdb-stop
shutdown abort, tbdown abort gritdb-stop --quick
alert log log/grit_admin_main.log와 log/postgresql.log
init 파라미터, ALTER SYSTEM ALTER SYSTEM, 관리 블록, config/grit_*.config
V$ 동적 뷰 pg_stat_*, get_gritsurfer_*()
In-Memory 대상 지정(ALTER TABLE … INMEMORY) register_gritsurfer_table
  • 이 표는 QuickStart 1.3의 표를 이어 쓴다.

A.8 용어

용어 뜻
설치 경로 GritDB를 설치한 디렉토리(~/gritdb1)
감독 프로세스 grit_admin — postgres, grit_surfer_process, grit_catalog_process를 띄우고 지켜보는 프로세스
트랜잭션 엔진 · GritDB 엔진 트랜잭션 엔진은 PostgreSQL이다. GritDB 엔진은 분석을 맡는 엔진(PLUG, UNIFY, BURST)이며, 홈페이지 아키텍처 쪽의 분석 엔진과 같은 대상이다
등록 테이블 register_gritsurfer_table로 GritDB 관리에 넣은 테이블
일반 세션 · 분석 세션 일반 세션은 모든 쿼리를 PostgreSQL이 실행하는 접속이다. 분석 세션은 등록 테이블 조회를 GritDB 엔진으로 보내는 접속이다
분석계 · 운영 DB · 내장 복제 분석계는 운영 DB의 변경을 받아 분석을 맡는 구성이다. 운영 DB는 고객이 업무에 쓰는 데이터베이스다. 내장 복제는 PostgreSQL 논리 복제다
cold file GritDB 엔진이 등록 테이블 데이터를 분석 조회용으로 열 단위로 저장한 파일. 보이는 곳: datafiles/cold_file/, get_gritsurfer_coldfiles()(6.5)
compaction 작은 cold file을 큰 cold file로 합치는 GritDB 엔진의 일. 바꾸는 설정은 없다. 보이는 곳: 로그 grit_unify_cold_store_compactor_gc_processor.log(9.1), cold file 상태 ACTIVE(6.5)
unify checkpoint GritDB 엔진이 영구 반영을 마친 WAL 위치. PostgreSQL checkpoint와 다르다. 보이는 곳: get_gritsurfer_unify_checkpoints()(6.5), datafiles/checkpoint/grit_unify.cp
복구용 복제 슬롯 gritsurfer_slot — GritDB 엔진이 WAL을 이어받는 자리
관리 블록 postgresql.conf 끝의 GritDB 전용 설정 구역
인스턴스 ID 설치 경로마다 정해지는 식별자. 공유 메모리 이름의 접미사다
재초기화 데이터를 새로 만드는 작업. 기존 데이터는 이름을 바꿔 보존한다
복제 키 (replica identity) 운영 DB가 수정하거나 삭제할 행을 가리키려고 WAL에 남기는 열(기본 키, 고유 인덱스, 행 전체)
초기 복사 subscription을 만들거나 테이블을 넣을 때 그 테이블의 지금 행을 처음 한 번 옮기는 일
반영 확인 방금 commit한 변경이 분석 세션에 보이는지 WAL 위치로 확인하는 일(6.6.1)
반영 지연 방금 commit한 변경이 분석 세션의 조회에 보이기까지 걸리는 시간
작업자 칸 PostgreSQL이 띄울 수 있는 백그라운드 작업자 수(max_worker_processes)
publication · subscription publication은 운영 DB에서 내보낼 테이블 묶음이다. subscription은 GritDB가 그 묶음을 받는 설정이다(PostgreSQL 논리 복제, 6.4)
다시 받기 분석계에서 테이블 하나 또는 전체를 운영 DB에서 초기 복사부터 다시 받는 일(6.4.2, 8.6)
보안 장벽 뷰 (security barrier view) security_barrier를 켠 뷰. 1.1 분석 세션은 적용하지 않는다(11.6)
중요도 점검을 거르면 생길 수 있는 영향의 크기(7.3). 구독 계약의 장애 등급과 다르다
설치 스크립트 install_gritdb.sh — 설치, 업그레이드, 재초기화, 정리를 하는 스크립트(2장과 3장)
지원 문의 0장의 문의 경로(Datagrit, 총판, 파트너)