PostgreSQL 데이터베이스를 dump 명령등을 사용해서 파일로 저장하면 이전에 insert 해놓은 자료들을 찾아보기가 어렵습니다. 이런 경우는 DB의 이름을 변경해서 그대로 복사해 놓으면 자료를 찾아보기도 쉽고 작업하기도 편리 합니다.  

postgresqldatabase를 복사하기 위한 작업을 해보겠습니다.

 

먼저 알고 있는 명령어를 사용해서 작업을 시작해 봅니다.

 

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 TestDB    | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 postgres  | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 template0 | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

 

리스트에 나오는 TestDB를 다른 이름으로 복사하는 명령어는 아래와 같습니다.

 

CREATE DATABASE [new database] WITH TEMPLATE [old database] OWNER [owner];

 

TestDBTestDB2022라는 DB로 복사하려면

 

CREATE DATABASE TestDB2022 WITH TEMPLATE TestDB OWNER postgres;

 

이렇게 명령어를 입력하면 되겠네요.

 

 

postgres=# CREATE DATABASE TestDB2022 WITH TEMPLATE TestDB OWNER postgres;
오류:  "TestDB" 템플릿 데이터베이스 없음
postgres=#

 

그렇지만 대부분 오류가 발생하게 됩니다.

이유는 오류 내용과 같이 템플릿 데이터베이스가 아니기 때문 입니다.

 

postgres=# select datname, datistemplate from pg_database;
  datname  | datistemplate
-----------+---------------
 postgres  | f
 TestDB    | f
 template1 | t
 template0 | t
(4 rows)

 

TestDBdatistemplate 값이 f(false)입니다.

true로 변경을 합니다.

 

postgres=# ALTER DATABASE "TestDB" WITH IS_TEMPLATE = true;
ALTER DATABASE
postgres=#

 

이제 다시 TestDB를 복사해 봅니다.

 

postgres=# CREATE DATABASE "TestDB2022" WITH TEMPLATE "TestDB";
CREATE DATABASE
postgres=# \l
                                  List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
------------+----------+----------+-------------+-------------+-----------------------
 TestDB     | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 TestDB2022 | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 postgres   | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 template0  | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres
 template1  | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres
(5 rows)

 

 

복사가 잘 진행 되었습니다.

명령문에 CREATE DATABASE "TestDB2022" WITH TEMPLATE "TestDB";

쌍따옴표를 붙인 이유는 대소문자에 따라 Database 이름을 찾지 못하는 경우가 있습니다.

 

ALTER DATABASE "TestDB" WITH IS_TEMPLATE = false;

 

복사가 완료되면 기존 데이터베이스는 다시 templatefalse로 변경해 놓으면 작업은 완료 됩니다.

 

- copy coding -

 

linux에서 postgresql을 사용하기 위해 psql 명령어를 사용하는데 접속이 되지 않고 아래처럼 오류가 발생하였습니다.

 

[postgres@500115801534 postgresql]$ psql
psql: could not connect to server: 그런 파일이나 디렉터리가 없습니다
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

 

 

이런 오류는 postgres를 실행하지 않아서 발생한다고 되어 있는데 명령어로 확인해 보면

 

$ ps -ef | grep postgres

 

 

프로세스가 잘 실행되고 있습니다.

 

다음으로는 .s.PGSQL.5432 파일이 없어서 그렇다고 하는데 오류에 나와있는 폴더를 찾아가서 확인해 봅니다.

 

$ cd /var/run/postgresql/

$ ls -al

srwxrwxrwx.  1 postgres postgres   0  5 25 16:32 .s.PGSQL.5532

 

파일도 있습니다그렇지만 파일명이 좀 다른것을 확인할 수 있습니다.

 

저의 경우는 postgresqlport 번호를 변경해서 서비스를 하려고 하는 경우 이므로 위에서 시도한 방법으로는 해결이 될 수 없고 옵션을 사용해야 하는 경우 입니다.

 

$ psql -U postgres -p 5532

 

이렇게 psql을 실행할 때 옵션을 추가하면 데이터베이스에 접속이 가능 합니다.

 

여기서 비밀 번호를 요청하는데 postgres의 비밀번호를 입력하면 됩니다.

 

- copy coding -

 

쿼리를 이용하여 DB LINK를 만들기 위한 방법을 기록해 봅니다.
수정할 부분은 아래 두개의 쿼리에 붉은색 내용만 작업 하려는 시스템에 맞도록 수정하면 됩니다.

 

- 연결 서버 생성


EXEC sp_addlinkedserver  
       @server='REMOTEDB_DBLINK',  -- DB LINK할 서버의 별칭. 마음대로 기입.
       @srvproduct = '', -- 공백.
       @provider = 'SQLOLEDB', -- SQL 서버.
       @datasrc = '192.168.0.111', -- DB LINK할 서버의 IP.        
       @provstr='',   -- 공백.
       @catalog='REMOTEDB'   -- DB LINK할 DataBase 명칭.

 

- 연결 계정 생성


EXEC sp_addlinkedsrvlogin

      @rmtsrvname='REMOTEDB_DBLINK',  -- DB LINK할 서버의 별칭. 마음대로 기입.
      @useself= 'false',
      @rmtuser = 'userid', -- 연결할 DB의 계정
      @rmtpassword = 'password12@#' -- 연결할 DB의 계정 비밀번호

 

DB LINK가 완료 되면 링크된 디비를 조회해 봅니다.

 

REMOTEDB_DBLINK.REMOTEDB.dbo.TB_member;

 

대괄호로 묶기도 하는데 결과는 동일합니다.

 

SELECT * FROM [REMOTEDB_DBLINK].[REMOTEDB].[dbo].[TB_member];

 

검색 결과가 나왔다면 성공 입니다.

 

- copy coding -

 

전에 PostgreSQL을 설치하면서 PostGIS도 같이 설치를 하였는데 이번에는 PostgreSQLDatabase를 생성하여 PostGIS를 이용해 shp(shapefile)를 업로드 하는 작업을 해봅니다.

 

설치관련 내용은 아래 링크를 참조 하세요.

Windows 10 Postgresql 13.2 과 PostGIS 3.1 설치

 

1. PostGISDB 생성

 

shp 파일 내용을 저장할 databasePostgreSQL에 생성하기 위해 윈도우 시작 버튼을 클릭 하고

 

 

pgAdmin 4를 선택 합니다.

 

pgAdmin 좌측의 Servers를 확장하여 GIS용 데이터 베이스를 하나 새로 생성을 해서 진행을 하도록 하겠습니다.

 

 

Databases에 마우스를 놓고 우클릭 하여 Create > Database... 를 선택 합니다.

 

 

 

 

Database 이름을 적당히 입력해 주고 [Save] 버튼을 클릭 합니다.

 

 

 

TestDB1 데이터베이스가 생성 되었습니다. 

새로 생성된 TestDB1을 선택한 상태에서 상단 아이콘에서 디스크 모양의 Query Tool 아이콘을 클릭 하면 쿼리 입력 창이 나타납니다.

 

 

 

쿼리 입력 창에서 선택된 데이터베이스에 확장 기능을 추가해 주어야 GIS 정보를 담을 수 있는 데이터베이스가 됩니다.

CREATE EXTENSION postgis;

명령어를 입력 하고 실행 버튼 또는 F5 키를 이용하여 쿼리를 실행해 줍니다.

 

postgis 기능 반영이 잘 되었는지는 다음 명령어를 입력해서 실행해 봅니다.

SELECT postgis_full_version();

 

 

 

쿼리 결과도 잘 나오고 좌측 Extensions에도 postgis가 추가 된 것을 확인 할 수 있습니다.

 

 

2. SHP 파일 업로드

 

 

shp 파일 업로드는 PostGIS를 통해서 PostgreSQL에 입력합니다.

 

 

 

시작 버튼에서 PostGIS를 확장하여

PostGIS Bundle 3 for PostgreSQL ... Shapefile... 을 클릭 합니다.

 

 

 

파일을 찾기 위하여 [Add File]을 클릭 합니다.

 

 

 

좌측과 상단에 있는 폴더 기능을 이용하여 SHP 파일이 위치한 곳을 찾아 선택 한 후 [Open] 버튼을 클릭하여 추가해 줍니다.

 

 

 

선택한 파일이 추가 되면 만약 파일에 한글이 들어있는 경우 [Options...] 버튼을 클릭 합니다.

 

 

 

여기에서 UTF-8EUC-KR로 변경해 주어야 한글이 입력 됩니다.

 

 

 

한글이 없다면 상단의 [View connection details...] 버튼을 클릭 합니다.

 

 

 

shp파일을 저장할 PostgreSQL에 접속하는 정보를 입력하는 창으로 Database와 기타 필요한 정보를 입력하고 [OK] 버튼을 클릭 합니다.

 

 

 

하단 Log Window에 연결이 성공 되었다고 나오는 군요.

 

이제 마지막 작업으로 [Import] 버튼을 클릭 합니다.

잠시 후 Log Window[Shapefile import completed.] 가 나오면 입력 성공입니다.

 

다시 PostgreSQL로 돌아가 DB에서 Table을 확장하면

 

 

 

테이블이 새로 생성이 되고 데이터가 추가 된 것을 확인 할 수 있습니다.

import시 오류가 발생 한다면 shp 파일이 위치한 폴더 명에 한글이 있거나 shp 파일 명에 한글이 있는 경우 오류가 발생 하니 꼭 영문으로 해야 하고 shp 파일 내부에 한글이 있다면 options에서 EUC-KR로 해주면 별 문제없이 import 할 수 있습니다.

 

- copy coding -


12345···7

+ Recent posts