PostgreSQL 의 XID PostgreSQL 에서 하나의 튜플은 xmin, xmax 의 2개의 트랜잭션 ID 를 가집니다. Tuple 이 생성된 시점은 xmin / Tuple 이 삭제되는 (이전의 값) 인 경우는 xmax 로 TID 를 저장합니다. 이 때 다른 세션에서 해당 데이터를 조회 시 사용되는 트랜잭션ID 가 xmin 과 xmax 사이라면 보여지고, 그렇지 않다면 보여지지 않도록 합니다. PostgreSQL 의 XID 제약조건 TID 는 40억개를 사용할 수 있으며 20억개는 older , 20억개는 newer 로 사용됩니다. 40억개가 다 사용되면 다시 1부터 시작됩니다. 여기서 중요한 문제가 발생합니다. 트랜잭션 ID 가 40억에서 새로운 데이터가 적재되어 xmin 이 40억인 최신의 데..
Database
Vacuum 사전적의미로 청소, 진공, 공백을 의미합니다. PostgreSQL 에서 Vacuum 은 MVCC 에 의해 현재 사용되지 않는 이전의 저장된 값들을 정리합니다. Vacuum 을 하는 이유 PostgreSQL 은 MVCC 에 의해 이전의 값들이 갱신되거나 삭제되더라도 새로운 데이터로 추가(갱신 경우)하고 기존의 데이터는 정리하지 않고 삭제표기만 남겨둡니다. 이렇게 사용하지 않는 값들로 인해 파일 사이즈가 커져 성능저하가 발생하게 되는걸 방지합니다. Transaction ID 가 겹침으로 인해 자료의 손실이 발생하는 것을 방지합니다. 이전의 데이터가 정리되면서 실행계획에서 사용할 통계치 정보를 최신으로 갱신해 줍니다. Visibility MAP ( VM = Dead Tuple 의 존재 여부를 표기..
MVCC 란 ( Multi Version Concurrency Control ) 하나의 트랜잭션에서 데이터에 접근하는 경우 데이터의 다중버전 상태 중 보장되는 버전에 맞는 값을 반환하여 처리하는 방법을 의미합니다. 데이터의 다중버전 상태 아래의 단계를 설명하겠습니다. Step 1. a 에는 30이라는 데이터가 저장되어 있습니다. Step 3. 트랜잭션1에서 a 는 50 으로 데이터를 갱신했습니다. 이 값을 commit 하기 전입니다. Step 4. 트랜잭션2에서 a 는 30 으로 데이터가 조회됩니다. 트랜잭션1에서 데이터를 갱신했지만, 트랜잭션 2는 여전히 이전의 값을 조회하고 있습니다. 어떻게 조회할 수 있는것일까요? 데이터를 다중버전 상태로 유지하고 있어 commit 전까지는 이전의 값을 undo 영..
PostgreSQL 백업 방법 PostgreSQL 은 장애시 복구를 위해 3가지 백업방법이 있습니다. 3가지 방법은 SQL 덤프 / 파일 시스템 기반 백업 / 아카이브 모드 백업입니다. 이 중 아카이브 모드 백업에 대해 다뤄보겠습니다. 아카이브 모드 백업 PostgreSQL 은 미리쓰기기로그 (WAL, Write ahead log) 을 pg_xlog 디렉터리에서 관리합니다. 이 로그는 데이터베이스에 대한 모든 조작 기록을 보관하고 있어, 서버가 갑자기 비정상적으로 종료된경우 데이터파일에 적용하지 못한 작업은 이 로그파일을 읽어서 복구할 수 있습니다. 이 로그를 다른 서버로 보내, 이 로그의 내용을 그대로 실행하여 원본 서버와 똑같이 만들수 있습니다. 또한 특정시점 까지만 실행하도록 하여, 특정시점으로 복..
PostgreSQL 백업 방법 PostgreSQL 은 장애시 복구를 위해 3가지 백업방법이 있습니다. 3가지 방법은 SQL 덤프 / 파일 시스템 기반 백업 / 아카이브 모드 백업입니다. 이 중 파일 시스템 기반 백업에 대해 다뤄보겠습니다. 파일시스템 백업 방법 말그대로 데이터파일을 압축해서 백업하는 방식입니다. 백업 전 PostgreSQL 을 중지해야 합니다. 1 tar -cvzf PostgreSQL.tar.gz /var/lib/postgresql/10/main cs 파일시스템 복원 방법 압축한 파일을 PostgreSQL 데이터경로에 풀어줍니다. 이 후 DB 를 재구동합니다. 버전과 아키텍처에 영향을 받습니다. 만약 복원경로가 변경되는 경우에는 pg_ctl 명령어를 사용하여 기본 디렉터리를 변경해 줍니다..
PostgreSQL 데이터베이스 경로 확인 방법 1. 데이터베이스의 기본 데이터파일 경로 확인 data_directory 를 확인합니다. 실제 데이터파일은 이 폴더경로의 base 폴더 하위에 있습니다. 1 2 3 4 postgres=# show data_directory; data_directory ----------------------------- /var/lib/postgresql/10/main cs 2. 각 데이터베이스의 oid 를 확인 이 oid 를 확인해 주는 이유는 위 data_directory 경로의 base 폴더에 database_id 값으로 폴더가 생성되기 때문입니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 postgres=# select oid as database..
PostgreSQL 백업 방법 PostgreSQL 은 장애시 복구를 위해 3가지 백업방법이 있습니다. 3가지 방법은 SQL 덤프 / 파일 시스템 기반 백업 / 아카이브 모드 백업입니다. 이 중 SQL 덤프에 대해 다뤄보겠습니다. SQL 덤프 백업방법 이 백업방식은 pg_dump 명령어로 진행합니다. pg_dump 를 실행하면 DB_NAME 데이터베이스에 생성된 객체와 데이터들을 SQL 구문 텍스트 형식으로 백업합니다. 기본적으로 표준출력이기 때문에 리다이렉션 기능을 사용하여 파일로 저장합니다. 1 $ pg_dump DB_NAME > postgres_DB_NAME_bak.sql cs pg_dump 에서 제공하는 연결 옵션 옵션을 보면 일반 클라이언트와 동일하게 원격으로 접속할 수 있는 옵션을 제공하고 있습..
PostgreSQL 접속 시 에러 OS 계정 명과 일치하지 않는 PostgreSQL 계정을 생성한 후 psql 명령어를 사용하여 접속하려고 하면 아래와 같은 에러메시지가 나옵니다. psql: FATAL: Peer authentication failed for user "psqluser" DB 사용자계정을 생성한 후 DB 에 접속하려고 하는데 접속할 수 없다고 나오며 제가 왜 OS 계정과 일치하지 않는다는 표현을 했을까요. 1 2 3 postgres@VirtualBox:~/10/main$ psql -U psqluser -W Password for user psqluser: psql: FATAL: Peer authentication failed for user "psqluser" cs PostgreSQL 에..
PostgreSQL 사용자란 PostgreSQL 의 Role 은 개념상 운영체제 사용자와 다릅니다. PostgreSQL 의 사용자는 소유하고 있는 DATABASE 안에 있는 객체의 권한을 제어할 수 있습니다. PostgreSQL 사용자 생성하는 방법 psql 에서 CREATE USER 구문으로 사용자를 생성합니다. psql 에서 ALTER USER 구문으로 사용자 비밀번호를 초기화 합니다. CREATE USER 구문에서 PASSWORD 옵션을 사용하여 비밀번호를 초기화를 합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 postgres=# CREATE USER psqluser; CREATE ROLE postgres=# SELECT * FROM PG_..
계정 로그인 postgres 계정으로 로그인을 해줍니다. PostgreSQL 은 postgres 계정에서 진행해 주어야 합니다. PostgreSQL 기본 디렉터리 확인 Ubuntu 기준 PostgreSQL 은 아래의 경로를 기본값으로 가집니다. 참고로 하위폴더 (예: 10) 는 버전에 따라 값이 달라질 수 있습니다. postgresql.conf 파일을 수정하여 환경설정 값을 변경할 수 있습니다. 용도 경로 데이터 파일 경로 /var/lib/postgresql/10/main/ HBA 파일 경로 /etc/postgresql/10/main/pg_hba.conf 환경설정 파일 경로 /etc/postgresql/10/main/postgresql.conf 소켓 경로 /var/run/postgresql/ Postgr..