논리적 복제를 사용하여 Amazon RDS for PostgreSQL DB 인스턴스 간에 테이블을 복제하려면 어떻게 해야 합니까?
논리적 복제를 사용하여 Amazon Relational Database Service(Amazon RDS) for PostgreSQL DB 인스턴스에서 데이터베이스 간에 테이블을 복제하려고 합니다. 확장 프로그램은 사용하고 싶지 않습니다.
해결 방법
Amazon RDS for PostgreSQL은 PostgreSQL 10.4 이상에서 논리적 복제를 지원합니다. Amazon Aurora PostgreSQL 호환 에디션 버전 2.2.0 이상은 PostgreSQL 10.6 이상에서 논리적 복제를 지원합니다.
자세한 내용은 Amazon RDS for PostgreSQL의 논리적 복제 수행을 참조하십시오.
다음 해결 방법은 소스 테이블 두 개를 대상 테이블 두 개에 복제합니다.
논리적 복제 활성화
다음 단계를 완료하십시오.
- 사용자 지정 파라미터 그룹을 만들고 rds.logical_replication 파라미터를 1로 설정합니다.
참고: rds.logical_replication 파라미터는 정적 파라미터이므로 DB 인스턴스를 재부팅해야 합니다. DB 인스턴스를 재부팅하면 wal_level 파라미터가 logical로 변경됩니다. - 파라미터 그룹을 DB 인스턴스에 연결합니다.
- 다음 쿼리를 실행하여 wal_level이 logical이고 rds.logical_replication이 활성화되어 있는지 확인합니다.
예상 출력:SELECT name,setting FROM pg_settings WHERE name IN ('wal_level','rds.logical_replication');name | setting -------------------------+--------- rds.logical_replication | on wal_level | logical (2 rows)
소스 테이블 만들기 및 데이터 삽입
PostgreSQL DB 인스턴스에 연결한 후 소스 데이터베이스에서 다음 단계를 완료하십시오.
-
다음 명령을 실행하여 소스 테이블을 만듭니다.
CREATE TABLE reptab1 (slno int primary key); CREATE TABLE reptab2 (name varchar(20)); -
다음 명령을 실행하여 소스 테이블에 데이터를 추가합니다.
INSERT INTO reptab1 VALUES (generate_series(1,1000)); INSERT INTO reptab2 SELECT SUBSTR ('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',((random()*(36-1)+1)::integer),1) FROM generate_series(1,50);
소스 테이블에 대한 게시 만들기
소스 데이터베이스에서 다음 단계를 완료하십시오.
-
다음 명령을 실행하여 두 테이블의 게시를 만듭니다.
CREATE PUBLICATION testpub FOR TABLE reptab1, reptab2; -
다음 쿼리를 실행하여 게시 세부 정보가 올바른지 확인합니다.
SELECT * FROM pg_publication;예상 출력:
oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot --------+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ 115069 | testpub | 16395 | f | t | t | t | t | f (1 row) -
다음 쿼리를 실행하여 소스 테이블이 게시에 있는지 확인합니다.
SELECT * FROM pg_publication;예상 출력:
pubname | schemaname | tablename ---------+------------+----------- testpub | public | reptab1 testpub | public | reptab2 (2 rows)
대상 데이터베이스에 연결 및 대상 테이블 만들기
대상 데이터베이스에서 다음 단계를 완료하십시오.
-
다음 명령을 실행하여 대상 테이블을 만듭니다.
CREATE TABLE reptab1 (slno int primary key); CREATE TABLE reptab2 (name varchar(20));참고: 소스 테이블과 동일한 이름을 사용합니다.
-
다음 쿼리를 실행하여 대상 테이블에 데이터가 없는지 확인합니다.
테이블 1:SELECT count(*) FROM reptab1;예상 출력:
count ------- 0 (1 row)테이블 2:
SELECT count(*) FROM reptab2;예상 출력:
count ------- 0 (1 row)
대상 데이터베이스에서 구독 만들기
구독을 만들기 전에 다음 명령을 실행하여 데이터베이스 로그에 사용자 이름과 암호의 일반 텍스트 버전을 저장하지 않았는지 확인합니다.
SET log_min_messages to 'PANIC'; SET log_statement to NONE;
대상 데이터베이스에서 구독을 만들려면 다음 단계를 완료하십시오.
-
다음 명령을 실행하여 구독을 만듭니다.
CREATE SUBSCRIPTION testsub CONNECTION 'host=source RDS/host endpoint port=5432 dbname=source_db_name user=user password=password' PUBLICATION testpub;참고: source RDS/host endpoint를 소스 DB 인스턴스의 엔드포인트로 바꾸고 source_db_name을 DB 인스턴스 이름으로 바꾸십시오. user를 사용자 이름으로, password를 암호로 바꾸십시오.
-
다음 쿼리를 실행하여 구독이 활성 상태인지 확인합니다.
SELECT oid,subname,subenabled,subslotname,subpublications FROM pg_subscription;예상 출력:
oid | subname | subenabled | subslotname | subpublications -------+---------+------------+-------------+----------------- 16434 | testsub | t | testsub | {testpub} (1 row) -
다음 쿼리를 실행하여 데이터가 대상 테이블에 있는지 확인합니다.
테이블 1:SELECT count(*) FROM reptab1;예상 출력:
count ------- 1000 (1 row)테이블 2:
SELECT count(*) FROM reptab2;예상 출력:
count ------- 50 (1 row)
소스 데이터베이스의 복제 슬롯 세부 정보 확인
대상 데이터베이스에서 구독을 만들면 대상 데이터베이스가 소스 데이터베이스에 복제 슬롯을 생성합니다.
복제 슬롯의 세부 정보를 확인하려면 소스 데이터베이스에서 다음 쿼리를 실행합니다.
SELECT * FROM pg_replication_slots;
예상 출력:
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size ----------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+--------------- testsub | pgoutput | logical | 115048 | source | f | t | 846 | | 6945 | 58/B4000568 | 58/B40005A0 | reserved | (1 row)
소스 테이블에서 복제 테스트
소스 데이터베이스에서 다음 단계를 완료하십시오.
-
다음 명령을 실행하여 소스 테이블에 행을 추가합니다.
INSERT INTO reptab1 VALUES(generate_series(1001,2000)); INSERT INTO reptab2 SELECT SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',((random()*(36-1)+1)::integer),1) FROM generate_series(1,50); -
다음 쿼리를 실행하여 소스 테이블에서 데이터가 변경되었는지 확인합니다.
테이블 1:SELECT count(*) FROM reptab1;예상 출력:
count ------- 2000 (1 row)테이블 2:
SELECT count(*) FROM reptab2;예상 출력:
count ------- 100 (1 row)
소스 테이블의 데이터가 대상 테이블에 복제되었는지 확인
대상 데이터베이스에서 다음 쿼리를 실행하여 소스 테이블의 데이터가 대상 테이블에 복제되었는지 확인합니다.
테이블 1:
SELECT count(*) FROM reptab1;
예상 출력:
count ------- 2000 (1 row)
테이블 2:
SELECT count(*) FROM reptab2;
예상 출력:
count ------- 100 (1 row)
복제 슬롯 지우기 및 논리적 복제 비활성화
복제가 완료된 후 더 이상 필요하지 않으면 슬롯을 지우고 논리적 복제를 비활성화합니다. 비활성 복제 슬롯으로 인해 미리 쓰기 로깅(WAL) 파일이 소스 DB 인스턴스에 누적됩니다. WAL 파일은 스토리지를 가득 채워 가동 중지 시간이 발생할 수 있습니다.
다음 단계를 완료하십시오.
-
대상 데이터베이스에서 다음 명령을 실행하여 구독을 제거합니다.
DROP SUBSCRIPTION testsub; -
대상 데이터베이스에서 다음 쿼리를 실행하여 구독이 제거되었는지 확인합니다.
SELECT * FROM pg_subscription;예상 출력:
oid | subdbid | subname | subowner | subenabled | subconninfo | subslotname | subsynccommit | subpublications ----+---------+---------+----------+------------+-------------+-------------+---------------+----------------- (0 rows)참고: 대상 데이터베이스에서 구독을 제거하면 대상 데이터베이스는 소스 데이터베이스의 복제 슬롯도 제거합니다.
-
소스 데이터베이스에서 다음 쿼리를 실행하여 소스 데이터베이스에서 복제 슬롯이 제거되었는지 확인합니다.
SELECT * FROM pg_replication_slots;예상 출력:
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size ----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+-------------- (0 rows) -
소스 데이터베이스에서 다음 명령을 실행하여 게시를 제거합니다.
DROP PUBLICATION testpub; -
소스 데이터베이스에서 다음 쿼리를 실행하여 게시가 제거되었는지 확인합니다.
SELECT * FROM pg_publication; SELECT * FROM pg_publication_tables;예상 출력:
oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot -----+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ (0 rows) pubname | schemaname | tablename ---------+------------+----------- (0 rows) -
DB 인스턴스의 사용자 지정 파라미터 그룹에서 rds.logical_replication 파라미터를 0으로 설정합니다.
참고: 변경 사항을 적용하려면 DB 인스턴스를 재부팅합니다. -
사용량을 기준으로 max_replication_slots, max_wal_senders, max_logical_replication_workers, max_worker_processes, max_sync_workers_per_subscription 파라미터를 검토합니다.
-
다음 쿼리를 실행하여 비활성 복제 슬롯이 있는지 여부와 슬롯 크기를 확인합니다.
SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots; -
(선택 사항) 다음 명령을 실행하여 복제 슬롯을 제거합니다.
SELECT pg_drop_replication_slot('Your_slotname_name')
관련 정보
PostgreSQL 웹 사이트의 복제
PostgreSQL 웹 사이트의 논리적 복제
