postgresql.config
파일의 shared_buffers
변수에 정해진 고정된 값의 메모리가 서버가 시작될 때 할당된다DB의 데이터 변경
$\to$ WAL 버퍼와 Data 버퍼 쓰기
$\to$ COMMIT 발생
$\to$ WAL 버퍼의 데이터를 디스크로 flush
$\to$ CHECKPOINT 발생
$\to$ 모든 데이터 버퍼를 디스크로 flush
WAL(Write-Ahead Log)
? 말 그대로 로그를 남기고 데이터를 저장한다는 의미WAL Buffer
? 데이터베이스의 변경 사항을 잠시 저장하는 버퍼CHECKPOINT
CHECKPOINT
?
CHECKPOINT
발생 시점?
CHECKPOINT
명령어 실행CHECKPOINT
를 필요로 하는 명령 실행(pg_start_backup
, pg_ctl start|restart
등)checkpoint_timeout
시간에 도달max_wal_size
가 가득찬 경우CHECKPOINT
발생 시 DB는 다음 세 단계 수행
fsync()
checkpoint_timeout
조회postgres=# SHOW checkpoint_timeout;
checkpoint_timeout
--------------------
5min
(1개 행)
checkpoint_completion_target
checkpoint_timeout
이 5min, checkpoint_completion_target
가 0.5면?
fsync()
는 그만큼 비용이 저렴해지고 빨라진다max_wal_size
조회postgres=# SHOW max_wal_size;
max_wal_size
--------------
1GB
(1개 행)
Dynamic WAL Switching
단일 WAL 파일이 가득 차고(기본 16MB) 남은 디스크 공간이 부족해질 때까지 WAL log 쓰기
$\to$ 다음 쓰기를 위해 오래된 WAL 파일 사용
[root@vultr ~]# systemctl status postgresql-13
● postgresql-13.service - PostgreSQL 13 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-13.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2021-07-22 23:26:23 KST; 2s ago
Docs: https://www.postgresql.org/docs/13/static/
Process: 3794307 ExecStartPre=/usr/pgsql-13/bin/postgresql-13-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 3794313 (postmaster)
Tasks: 8 (limit: 49532)
Memory: 30.6M
CGroup: /system.slice/postgresql-13.service
├─3794313 /usr/pgsql-13/bin/postmaster -D /var/lib/pgsql/13/data/
├─3794314 postgres: logger
├─3794316 postgres: checkpointer
├─3794317 postgres: background writer
├─3794318 postgres: walwriter
├─3794319 postgres: autovacuum launcher
├─3794320 postgres: stats collector
└─3794321 postgres: logical replication launcher
[root@vultr ~]# pstree -p 3794313
postmaster(3794313)─┬─postmaster(3794314)
├─postmaster(3794316)
├─postmaster(3794317)
├─postmaster(3794318)
├─postmaster(3794319)
├─postmaster(3794320)
└─postmaster(3794321)
Postmaster
postgres
의 alias라고 한다[root@vultr ~]# ll /usr/pgsql-13/bin/postmaster
lrwxrwxrwx. 1 root root 8 5월 18 22:23 /usr/pgsql-13/bin/postmaster -> postgres
postgres
postgres
는 공통된 파일 시스템 경로(“data area”)에 저장되는 데이터베이스 집합인 데이터베이스 클러스터 한 개를 관리postgres
인스턴스가 한 시스템에서 실행될 수 있다-D
옵션 또는 PGDATA
환경변수로 반드시 data area 영역이 지정되어야 한다postgres
가 하는 일?Background
logger
checkpointer
background writer
wal writer
autovacuum launcer
Vacuum
필요 시점에 autovacuum worker
를 forkarchiver
stats collector
pg_stat_activity
: 세션 수행 정보pg_stat_all_tables
: 테이블 사용 통계 정보Backend
max_connections
파라미터로 최대 개수 설정 가능work_mem
파라미터maintenance_work_mem
파라미터Vacuum
CREATE INDEX
ALTER TABLE ADD FOREIGN KEY
등temp_buffers
파라미터temp_buffers
의 값에 따라 임시 버퍼를 할당BLCKSZ
바이트인 블록으로 받아들여지며, BLCKSZ
는 일반적으로 8kB(8192 bytes)(즉, 단위가 블록이 된다는 의미인 듯)BLCKSZ
가 8kB가 아니면 기본값은 그 값에 비례하여 조정된다Client
initdb()
수행 시 template0
, template1
, postgres
데이터베이스 생성template0
, template1
?template0
, template1
의 테이블 목록은 같다template1
데이터베이스에는 사용자가 필요한 오브젝트 생성 가능template1
사용하여 사용자 데이터베이스 생성initdb()
수행 직후 pg_default
, pg_global
테이블스페이스 생성된다pg_default
pg_default
에 저장$PGDATA/base
pg_global
pg_global
에 저장$PGDATA/global
$PGDATA/tblspc
OID
OID_fsm
OID_vm
OID
OID_fsm
OID
= pg_class.relfilenode
Truncate
, CLUSTER
, Vacuum Full
, REINDEX
등) 수행 $\to$ 영향받은 오브젝트의 relfilenode
값 변경 $\to$ 파일명도 relfilenode
값으로 변경pg_relation_filepath('오브젝트명')
명령어로 파일 위치와 이름 쉽게 확인 가능OID
OID_fsm
OID_vm
template0
, template1
postgres
데이터베이스pg_database
뷰 조회SELECT
oid,
datname,
datistemplate,
datallowconn
FROM pg_database
ORDER BY 1;
oid | datname | datistemplate | datallowconn
-------+-----------+---------------+--------------
1 | template1 | t | t
13437 | template0 | t | f
13438 | postgres | f | t
(3개 행)
datistemplate
? 사용자 데이터베이스 생성 위한 template용 데이터베이스 의미datallowconn
? 데이터베으스 접속 가능 여부template0
: 초기 상태 템플릿을 제공template1
: tmplate0
+ 사용자 추가 오브젝트postgres
?
template1
이용해서 생성된 기본 데이터베이스.postgres
데이터베이스로 접속pg_default
테이블스페이스에 저장되며, 물리적 위치는 $PGDATA/base
다SELECT
a.oid,
a.datname,
a.datistemplate,
a.datallowconn,
a.datconnlimit,
a.dattablespace,
b.spcname
FROM pg_database a
JOIN pg_tablespace b
ON b.oid = a.dattablespace;
oid | datname | datistemplate | datallowconn | datconnlimit | dattablespace | spcname
-------+-----------+---------------+--------------+--------------+---------------+------------
13438 | postgres | f | t | -1 | 1663 | pg_default
1 | template1 | t | t | -1 | 1663 | pg_default
13437 | template0 | t | f | -1 | 1663 | pg_default
$PGDATA/base
내용을 보면 OID
와 일치하는 디렉토리가 있음을 볼 수 있다.# systemctl show -p Environment postgresql-13.service
Environment=PGDATA=/var/lib/pgsql/13/data/ PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj PG_OOM_ADJUST_VALUE=0
[root@vultr ~]# ll /var/lib/pgsql/13/data/base/
합계 12
drwx------. 2 postgres postgres 4096 7월 21 21:31 1
drwx------. 2 postgres postgres 4096 7월 21 21:31 13437
drwx------. 2 postgres postgres 4096 7월 24 01:07 13438
tmplate0 tmplate1 사용자db
[template0] [template0] [template1]
[템플릿추가] [사용자 오브젝트]
– template
데이터베이스에 접속하여 사용자 테이블 t1
을 생성
postgres=# \c template1
접속정보: 데이터베이스="template1", 사용자="postgres".
template1=# CREATE TABLE t1 (c1 INTEGER);
CREATE TABLE
template1=# \d+ t1
"public.t1" 테이블
필드명 | 종류 | Collation | NULL허용 | 초기값 | 스토리지 | 통계수집량 | 설명
--------+---------+-----------+----------+--------+----------+------------+------
c1 | integer | | | | plain | |
접근 방법: heap
template1
에서 생성했던 t1
테이블 복제된 것 확인 가능postgres=# CREATE DATABASE db_aimpugn;
CREATE DATABASE
postgres=# \c db_aimpugn
접속정보: 데이터베이스="db_aimpugn", 사용자="postgres".
db_aimpugn=# \dt+
릴레이션(relation) 목록
스키마 | 이름 | 종류 | 소유주 | Persistence | 크기 | 설명
--------+------+--------+----------+-------------+---------+------
public | t1 | 테이블 | postgres | permanent | 0 bytes |
(1개 행)
pg_global
테이블스페이스데이터베이스 클러스터
레벨에서 관리해야 할 데이터들을 저장. 어떤 db에서 조회해도 동일 정보 제공.
pg_database
pg_authid
등[root@vultr home]# mkdir /home/data
[root@vultr home]# chown -R postgres:postgres /home/data
-- 경로는 절대경로 지정해야 한다
postgres=# CREATE TABLESPACE tspc_aimpugn LOCATION '/home/data';
CREATE TABLESPACE
$PGDATA/pg_tblspce
에 심볼릭 링크가 생성[root@vultr home]# ll $PGDATA/pg_tblspc
합계 0
lrwxrwxrwx. 1 postgres postgres 10 7월 25 17:38 16396 -> /home/data
postgres
데이터베이스db_aimpugn=# \c postgres
접속정보: 데이터베이스="postgres", 사용자="postgres".
postgres=# CREATE TABLE t1 (c1 INTEGER) TABLESPACE tspc_aimpugn;
CREATE TABLE
postgres=# SELECT oid FROM pg_class WHERE relname = 't1';
oid
-------
16398
(1개 행)
db_aimpugn
데이터베이스-- 이미 t1 테이블 있음
db_aimpugn=# CREATE TABLE t1 (c1 INTEGER) TABLESPACE tspc_aimpugn;
오류: "t1" 이름의 릴레이션(relation)이 이미 있습니다
db_aimpugn=# \d+ t1
"public.t1" 테이블
필드명 | 종류 | Collation | NULL허용 | 초기값 | 스토리지 | 통계수집량 | 설명
--------+---------+-----------+----------+--------+----------+------------+------
c1 | integer | | | | plain | |
접근 방법: heap
db_aimpugn=# DROP TABLE t1;
DROP TABLE
db_aimpugn=# CREATE TABLE t1 (c1 INTEGER) TABLESPACE tspc_aimpugn;
CREATE TABLE
db_aimpugn=# \d+ t1
"public.t1" 테이블
필드명 | 종류 | Collation | NULL허용 | 초기값 | 스토리지 | 통계수집량 | 설명
--------+---------+-----------+----------+--------+----------+------------+------
c1 | integer | | | | plain | |
테이블스페이스: "tspc_aimpugn"
접근 방법: heap
-- OID 확인
db_aimpugn=# SELECT oid FROM pg_class WHERE relname = 't1';
oid
-------
16401
(1개 행)
tspc_aimpugn
테이블스페이스의 공간인 /home/data
을 확인해 보면[root@vultr data]# tree
.
└── PG_13_202007201
├── 13438 // postgres
│ └── 16398 // t1
└── 16397 // db_aimpugn
└── 16401 // t1
테이블스페이스 > DB > 테이블
뎁스로 형성됨을 확인할 수 있다 oid | datname | datistemplate | datallowconn | datconnlimit | dattablespace | spcname
-------+------------+---------------+--------------+--------------+---------------+------------
13438 | postgres | f | t | -1 | 1663 | pg_default
1 | template1 | t | t | -1 | 1663 | pg_default
13437 | template0 | t | f | -1 | 1663 | pg_default
16397 | db_aimpugn | f | t | -1 | 1663 | pg_default
볼류 매니저
이용systemctl stop postgresql-13
cp -rp /home/data/PG* <새경로>
ll $PGDATA/pg_tblpsc
rm 12345
ln -s <새경로> 12345
ll $PGDATA/pg_tblpsc
systemctl start postgresql-13
VACUUM
항목 | ORACLE | PostgreSQL |
---|---|---|
MVCC 모델 구현 방식 |
UNDO 세그먼트 | 블록 내에 이전 레코드 저장 |
Shared Pool 존재 여부 | 존재 | 존재하지 않음 |
MVCC
모델의 차이점MVCC
?