Database 126

[PostgreSQL] Replica Identity

개요2026.01.06-[PostgreSQL] 복제 (Replication)에서 Logical Replication에서 Replica Identity가 필요하다는 것을 알게 되었다. 이번 글에서는 Replica Identity 설정값과 조회 방법 등에 대해서 좀 정리한다. Replica Identitypublication이란 테이블 또는 테이블 그룹에서 생성된 변경 사항의 집합이며, 변경 집합 또는 복제 집합이라고 할 수 있다. publication은 스키마와 다르며 테이블 접근 방식에 영향을 미치지 않고, 하나의 테이블에 여러 publication을 추가할 수 있기도 하다. 그리고 게시된 테이블은 갱신하거나 삭제할 행을 식별할 수 있도록 Replica Indentity가 구성되어 있어야 한다.Repl..

Database 2026.01.08

[PostgreSQL] 복제 (Replication)

개요PostgreSQL에서 발생하는 변경점에 대한 CDC를 구성하다 공식 문서 안내에 따라 테이블에 아래와 같은 설정을 주게 되었다.ALTER TABLE table_name REPLICA IDENTITY FULL;덕분에 의도대로 동작하는 것을 좋지만 해당 설정이 어떤 의미인지를 몰라서 이번 기회에 정리해보려고 한다. 복제 (Replication)데이터베이스에서 복제란 데이터를 한 인스턴스에서 다른 인스턴스로 복사하는 것을 말한다.동일한 데이터베이스를 여러 대 운영함으로써 부하를 분산하거나, 장애 발생 시의 Failover를 통한 고가용성, 데이터 백업 등을 위해 사용한다. 일반적으로 데이터베이스 복제는 Master-Slave 관계(Primary-Replica)에서 많이 사용된다. WALPos..

Database 2026.01.07

CDC (Change Data Capture) 란

CDC CDC (Change Data Capture) 란 데이터베이스에서 발생하는 데이터 변경(삽입, 수정, 삭제)을 실시간 또는 준실시간으로 감지하고 추적하여 다른 시스템으로 전달하는 기술 및 데이터 통합 패턴을 의미한다.전체 데이터 대신 변경된 데이터만 처리하기 때문에 시스템 부하를 줄이면서 데이터의 실시간 동기화, 복제, 분석 등에 활용할 수 있어 데이터 마이그레이션, 실시간 DW 구축 등에 필수적이다. 방법론CDC를 구현하는 방법은 여러 가지가 존재한다. 로그 기반 변경 데이터 캡처(Log-based Change Data Capture)데이터베이스가 변경 사항을 기록하는 트랜잭션 로그를 사용해 변경 사항을 추적하여 처리한다.로그 기반 방식은 데이터베이스 처리 속도가 느려지면 안 되는 시스템에 적..

Database 2025.12.31

[DataGrip] 테이블 복사

개요데이터베이스 작업을 하다 보면 안전 상 테이블을 백업해 두고 작업하거나 다른 데이터베이스로 넘겨야 할 때가 발생한다. 기존에는 테이블을 CSV 형식 등으로 내려받아 INSERT 하는 등의 방법으로 진행했는데, DataGrip은 테이블 복사 기능을 제공하고 있어서 보다 쉽게 작업을 수행할 수 있다.방법을 적어둔다. 방법1. 복사할 테이블 우클릭 > 가져오기/내보내기 > 다음으로 테이블 복사 선택 2. 대상 스키마 선택이 글에서는 같은 데이터베이스, 같은 스키마 내로 복사하도록 설정했는데 선택할 수 있는 값을 보면 다른 데이터베이스, 다른 스키마로도 복사할 수 있는 것 같다. 3. 테이블 명 지정다른 스키마로 복사하면 테이블명을 유지하는데, 그렇지 않으면 자동으로 {테이블명}_2로 변경되도록 하는 것 ..

Database 2025.12.03

[PostgreSQL] 두 날짜 사이의 차이 계산

개요PostgreSQL에서 두 날짜 간 차이를 계산할 일이 조금 있어서 방법을 적어둔다. 빼기 연산가장 직관적인 방법으로 빼기 연산을 사용할 수 있다. 기본적으로 일, 시, 분, 초 기간에 대한 정보를 출력하는 것 같다. AGEAGE 함수를 사용하는 방법도 있다. AGE 함수를 사용하는 경우에는 일보다 큰 단위의 정보도 출력한다.AGE(datetime, datetime) 참고 문서https://ysyblog.tistory.com/136

Database 2025.11.26

[PostgreSQL] RANDOM - 난수 발생

개요데이터베이스 학습 목적으로 더미 데이터를 만들 때, 무작위로 데이터를 생성하거나 선택할 난수를 활용할 때가 많다. 관련하여 PostgreSQL에서 난수를 생성하는 RANDOM 함수의 사용과 활용법을 적어둔다. RANDOMRANDOM 함수는 난수 값을 발생시키는데, 0부터 1 사이의 난수 값을 반환한다.RANDOM()-- 예시SELECT random();사용법 자체는 아주 단순하다. 이제 이 값을 활용한 방법을 몇 가지 적어둔다. 활용법1. 0 ~ N 사이의 임의 정수random 값에 N을 곱한 후 소수점 미만의 값을 버리면, 0부터 N-1까지의 값 사이의 값을 얻을 수 있다.floor(random() * N);-- 예시SELECT floor(random() * 10);위의 예시는 0부터 9 사..

Database 2025.11.25

[PostgreSQL] UNNEST - 배열을 행(row)으로 EXPAND

개요Database 내 데이터를 다루다 보면 필요에 의해 배열 데이터를 다루게 되는데, PostgreSQL은 MySQL과 달리 array라는 데이터 유형을 지원하고 있어 비교적 다루기 편한 것 같다.이번 글에서는 한 행에 저장되어 있는 데이터를 여러 행으로 EXPAND 하는 UNNEST이라는 함수에 대해 기록 차 적어두려고 한다. UNNESTunnest 함수는 배열을 행 집합으로 확장하는 함수로, 배열에 저장된 순서대로 확장된다.unnest ( anyarray ) 사용 예시 )SELECT unnest(ARRAY[1,2])SELECT unnest(ARRAY[['foo','bar'],['baz','quux']])2차원 배열도 단일 열로 펼쳐진다. 참고 문서https://www.postgresql.org/..

Database 2025.11.24

[PostgreSQL] array 데이터 타입 다루기

개요프로그래밍을 하다 보면 당연히 배열 데이터를 많이 다루게 되는데, 간혹 배열 형식 데이터 자체를 데이터베이스에 저장할 필요가 있기도 하다. MySQL을 사용할 때는 문자열 형식으로 저장한 뒤 애플리케이션 영역에서 처리하는 방식으로 사용했는데, PostgreSQL의 경우에는 배열 형식의 데이터 타입이 존재하고 있었다.이번 글에서는 PostgreSQL에서 배열 형식의 데이터를 다뤄보도록 한다. 선언배열 타입은 데이터 타입 옆에 대괄호를 붙이거나 ARRAY 키워드를 사용해 선언한다.CREATE TABLE sal_emp ( name text, pay_by_quarter integer ARRAY, schedule text[][]);예시 쿼리의 경우에는 1차..

Database 2025.10.28

[PostgreSQL] :: - 형변환

개요일반적으로 데이터베이스에서 데이터 형을 변환할 때 CAST(value AS type)을 사용하는데, 최근 쿼리를 보니 PostgreSQL에서 제공하는 형변환 방법이 별도로 있는 것 같다.적어둔다. ::PostgreSQL은 :: 연산자를 사용해 간결하게 데이터 형변환을 수행할 수 있다.SELECT value::type# 예시SELECT CAST('2025-10-11 09:00:00' AS date) , '2025-10-11 09:00:00'::date;보면 CAST 결과와 :: 연산자의 결과가 동일한 모습을 확인할 수 있다. 참고 문서https://brownbears.tistory.com/309

Database 2025.10.27

[PostgreSQL] EXPLAIN - 2

개요2025.09.19-[PostgreSQL] EXPLAIN - 1에서 EXPLAIN에 대한 기초적인 부분을 살펴봤다. 이어서 이번 글에서는 다른 절이 추가됨에 따라 달라지는 실행 계획을 살펴보려고 한다. LIMITLIMIT을 추가하면 플래너는 모든 행을 검색할 필요가 없도록 수행할 작업을 변경한다. Index Scan 노드가 완료될 때까지 실행되는 것처럼 표시되지만 Limit 노드는 해당 행 중 3개 행만 검색한 후에 중지될 것이라 예상한다. 때문에 총비용도 그만큼 감소하게 된다.EXPLAINSELECT *FROM license_integratedWHERE collect_status = 'DONE'ORDER BY license_idLIMIT 3; JOIN - Nested LoopJoin의 경우에는..

Database 2025.09.23