본문 바로가기
DBMS/PostgreSQL

[PostgreSQL] pg_dump 파일에서 테이블명 변경하여 복구

by 드바 2024. 3. 12.

DBMS: PostgreSQL 14.9

 

pg_dump로 백업받은 파일에서 특정 테이블 이름을 변경하여 복구하고자 하는 경우

오라클의 datapump에서의 remap 기능을 현재 PostgreSQL은 지원하지 않습니다

- text format으로 받은 경우 스크립트 수정하여 실행
- custom format으로 받은 경우 스크립트 추출하여 내용 변경 후 실행
- pg_restore -t 옵션 사용 시 해당 오브젝트만 추출(관련 인덱스 등 안나옴)되므로 주의

명령어 예시
-- sk1.dmp 파일에서 tab1 테이블 tab2_all.sql 파일로 추출
pg_restore -f tab2_all.sql -n public -t tab1 sk1.dmp

 

이번 포스팅은 커스텀 포멧의 백업파일에서 스크립트 추출 후 테이블명 변경하여 생성하는 테스트 입니다

백업 파일에 있는 tab1 테이블 -> tab2 테이블로 이름 변경하여 복구

 

[목차여기]

 

참고

[PostgreSQL] 백업/복구(pg_dump, pg_restore)

 

pg_dump 백업 진행

-- 커스텀 포멧으로 pg_dump 백업
[postgres@svr1 dump]$ pg_dump -d sk1 -v -Fc -f /home/postgres/dump/sk1.dmp

-- 백업 파일 내용 확인
[postgres@svr1 dump]$ pg_restore -l -t tab1 sk1.dmp 
;
; Archive created at 2024-01-24 00:49:32 KST
;     dbname: sk1
;     TOC Entries: 2726
;     Compression: -1
;     Dump Version: 1.14-0
;     Format: CUSTOM
;     Integer: 4 bytes
;     Offset: 8 bytes
;     Dumped from database version: 14.9
;     Dumped by pg_dump version: 14.9
;
;
; Selected TOC Entries:
;
396; 1259 52359 TABLE public tab1 postgres
5911; 0 52359 TABLE DATA public tab1 postgres
[postgres@svr1 dump]$

 

백업파일에서 스크립트 추출

스크립트 추출의 여러가지 옵션

-- DDL문 추출
[postgres@svr1 dump]$ pg_restore -s -f tab2.sql -n public -t tab1 sk1.dmp
-- DDL + DATA 추출
[postgres@svr1 dump]$ pg_restore -f tab2_all.sql -n public -t tab1 sk1.dmp
-- DATA 추출
[postgres@svr1 dump]$ pg_restore -a -f tab2_dat.sql -n public -t tab1 sk1.dmp

 

백업 파일에서 추출한 스크립트를 열어보면 SQL문이 작성되어 있습니다

[postgres@svr1 dump]$ head -50 tab2_all.sql 
--
-- PostgreSQL database dump
--

-- Dumped from database version 14.9
-- Dumped by pg_dump version 14.9

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- Name: tab1; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.tab1 (
    schemaname name,
    tablename name,
    tableowner name,
    tablespace name,
    hasindexes boolean,
    hasrules boolean,
    hastriggers boolean,
    rowsecurity boolean
);


ALTER TABLE public.tab1 OWNER TO postgres;

--
-- Data for Name: tab1; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.tab1 (schemaname, tablename, tableowner, tablespace, hasindexes, hasrules, hastriggers, rowsecurity) FROM stdin;
biadm	lic_mst	postgres	\N	t	f	f	f
biadm	dead_tuple	postgres	\N	t	f	f	f
biadm	rel_size	postgres	\N	t	f	f	f
biadm	seq_mgmt	postgres	\N	t	f	f	f
biadm	sess_stat	postgres	\N	f	f	f	f

 

반응형

테이블명 변경

vi 등의 에디터로 파일을 열어 tab1 -> tab2로 변경한 후 저장해 주세요

[postgres@svr1 dump]$ vi tab2_all.sql 

--
-- Name: tab1; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.tab2 (
    schemaname name,
    tablename name,
    tableowner name,
    tablespace name,
    hasindexes boolean,
    hasrules boolean,
    hastriggers boolean,
    rowsecurity boolean
);


ALTER TABLE public.tab2 OWNER TO postgres;

--
-- Data for Name: tab2; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.tab2 (schemaname, tablename, tableowner, tablespace, hasindexes, hasrules, hastriggers, rowsecurity) FROM stdin;
biadm  lic_mst postgres        \N      t       f       f       f
biadm  dead_tuple   postgres        \N      t       f       f       f
biadm  rel_size     postgres        \N      t       f       f       f
biadm  seq_mgmt     postgres        \N      t       f       f       f
biadm  sess_stat    postgres        \N      f       f       f       f
biadm  stat_snapshot        postgres        \N      t       f       f       f

 

테이블 생성

테이블명을 변경한 스크립트를 실행 합니다

-- 스크립트 실행
[postgres@svr1 dump]$ psql -d sk1 -a -f tab2_all.sql 
--
-- PostgreSQL database dump
--
-- Dumped from database version 14.9
-- Dumped by pg_dump version 14.9
SET statement_timeout = 0;
SET
SET lock_timeout = 0;
SET
SET idle_in_transaction_session_timeout = 0;
SET
SET client_encoding = 'UTF8';
SET
SET standard_conforming_strings = on;
SET
SELECT pg_catalog.set_config('search_path', '', false);
 set_config 
------------
 
(1 row)

SET check_function_bodies = false;
SET
SET xmloption = content;
SET
SET client_min_messages = warning;
SET
SET row_security = off;
SET
SET default_tablespace = '';
SET
SET default_table_access_method = heap;
SET
--
-- Name: tab1; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.tab2 (
    schemaname name,
    tablename name,
    tableowner name,
    tablespace name,
    hasindexes boolean,
    hasrules boolean,
    hastriggers boolean,
    rowsecurity boolean
);
CREATE TABLE
ALTER TABLE public.tab2 OWNER TO postgres;
ALTER TABLE
--
-- Data for Name: tab2; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.tab2 (schemaname, tablename, tableowner, tablespace, hasindexes, hasrules, hastriggers, rowsecurity) FROM stdin;
COPY 954368
--
-- PostgreSQL database dump complete
--

 

psql 접속하여 tab2 테이블 조회

[postgres@svr1 dump]$ psql -d sk1
psql (14.9)
Type "help" for help.

sk1=# select count(*) from tab2 ;
 count  
--------
 954368
(1 row)

sk1=#

댓글