BigAdmin System Administration Portal
MySQL에서 PostgreSQL 8.2로 데이터베이스 전환
Print-friendly VersionPrint-friendly Version

MySQL에서 PostgreSQL 8.2로 데이터베이스 전환

2007년 10월, Scott Fehrman

목차:

MySQL을 가끔 사용해 온 사용자 중 한 명으로서, Solaris 10 8/07 OS가 PostgreSQL에 대한 지원이 업데이트되어 공식적으로 출시되었으므로 이 제품을 사용해 보고 MySQL 사용자가 PostgreSQL을 시작하기 위해 무엇이 필요한지 알아보기로 했습니다.

이 Solaris 10 릴리스의 몇 가지 PostgreSQL 기능 및 개선 사항은 다음과 같습니다.

  • 성능 향상
  • SMF(Service Management Facility) 통합
  • DTrace(Dynamic Tracing) 프로브
  • RBAC 지원을 받는 사전 정의된 postgres 사용자
  • 번들된 JDBC 드라이버

이 Solaris 10 릴리스의 새로운 PostgreSQL 기능 및 개선 사항 목록은 아래를 참조하십시오. Sun PostgreSQL 공식 웹 페이지에서 보다 자세한 내용을 확인할 수 있습니다.

시작하기

기본적으로 PostgreSQL 서비스는 다음과 같이 사용할 수 없도록 설정되어 있습니다.

# svcs postgresql
STATE          STIME    FMRI
disabled       Sep_06   svc:/application/database/postgresql:version_81
disabled       Sep_06   svc:/application/database/postgresql:version_82
#

참고: 자세한 내용을 알아보기 전에 postgresql 서비스에는 두 가지 다른 인스턴스가 있다는 사실을 알아두시기 바랍니다. Solaris 10(8/07) OS는 새로운 PostgreSQL 8.2 버전과 이전의 PostgreSQL 8.1 버전을 모두 지원합니다. 이 문서에서는 PostgreSQL "8.2" 버전에 대해서만 다루겠습니다. 새로운 데이터베이스 프로젝트에서 작업하고 있는 경우 PostgreSQL 8.2 버전을 사용하는 것이 좋습니다. 자세한 내용은 Postgres 웹 사이트를 참조하십시오.

또한 Solaris 10 8/07 OS에는 미리 구성된 postgres 사용자가 있으며 이는 Solaris RBAC 기능을 사용하므로 이 사용자/역할은 SMF postgresql:version_82 서비스를 관리할 수 있습니다.

# grep postgres /etc/user_attr
postgres::::type=role;profiles=Postgres Administration,All
# su - postgres
$ id
uid=90(postgres) gid=90(postgres)
$ profiles
Postgres Administration
All
Basic Solaris User
$ profiles -l

    Postgres Administration:
        /usr/postgres/8.2/bin/initdb            uid=postgres
        /usr/postgres/8.2/bin/ipcclean          uid=postgres
        /usr/postgres/8.2/bin/pg_controldata    uid=postgres
        /usr/postgres/8.2/bin/pg_ctl            uid=postgres
        /usr/postgres/8.2/bin/pg_resetxlog      uid=postgres
        /usr/postgres/8.2/bin/postgres          uid=postgres
        /usr/postgres/8.2/bin/postmaster        uid=postgres
....
$

PostgreSQL을 사용하기 전에 먼저 설정해야 합니다. 다음과 같은 몇 가지 간단한 작업이 필요합니다.

  • 환경(일반적으로 쉽게 명령할 수 있도록 함), PATH, MANPATHPGDATA 설정
  • 데이터베이스 초기화
  • 데이터베이스 서비스 시작

환경 설정(8.2 버전)

  • PATH 변경

    앞에서 언급한 대로 Solaris는 PostgreSQL 8.1 버전과 8.2 버전을 모두 지원합니다. 기본 PATH 변수가 변경되지 않은 경우 /usr/bin의 Postgres 명령이 사용됩니다. PATH를 수정하고 다른 경로 이름 앞에 /usr/postgres/8.2/bin을 입력합니다. PATH는 사용자의 로그인 스크립트 또는 전역 로그인 스크립트(예: /etc/profile)에서 설정하거나 명령줄에서 다음과 같이 설정할 수 있습니다.
    # echo $PATH
    /usr/sbin:/usr/bin
    # PATH=/usr/postgres/8.2/bin:
    # export PATH
    # echo $PATH
    /usr/postgres/8.2/bin:/usr/sbin:/usr/bin
    
  • MANPATH 변경

    앞서 언급한 대로 Solaris는 PostgreSQL 8.1 버전과 8.2 버전을 모두 지원합니다. 기본 MANPATH 변수가 변경되지 않은 경우 /usr/man의 Postgres 매뉴얼 페이지가 사용됩니다. MANPATH를 변경하고 다른 경로 이름을 넣기 전에 /usr/postgres/8.2/man을 입력합니다. MANPATH는 사용자 로그인 스크립트 또는 전역 로그인 스크립트(예: /etc/profile)에서 설정하거나 명령줄에서 다음과 같이 설정할 수 있습니다.
    # echo $MANPATH
    /usr/man:/usr/sfw/man
    # MANPATH=/usr/postgres/8.2/man:
    # export MANPATH
    # echo $MANPATH
    /usr/postgres/8.2/man:/usr/man:/usr/sfw/man
    #
    
  • PGDATA 설정

    PostgreSQL 데이터베이스는 PGDATA라는 환경 변수를 활용할 수 있습니다. 이 변수는 많은 PostgreSQL 명령에서 사용됩니다. PGDATA가 사용될 경우 PostgreSQL 데이터 디렉토리가 있는 정규화된 경로 이름으로 설정되어야 합니다. PostgreSQL 데이터의 기본 위치는 /var/postgres/8.2/data입니다. 이 경로 또는 다른 위치로 PGDATA를 설정할 수 있으며 설정하고 나면 PostgreSQL 명령에 대해 데이터 디렉토리 경로 이름을 알아야 하는 -D 옵션을 사용할 필요가 없습니다.
    $ PGDATA=/var/postgres/8.2/data
    $ export PGDATA
    $ echo $PGDATA
    /var/postgres/8.2/data
    $
    

데이터베이스 초기화(8.2 버전)

PostgreSQL 데이터베이스를 시작하기 전에 "처음"으로 초기화해야 합니다. initdb 명령을 사용하여 데이터베이스를 초기화합니다. 자세한 내용은 initdb 매뉴얼 페이지를 참조하십시오. initdb 명령을 postgres 사용자로 실행합니다. 이 예에서 저는 initdb 명령 및 PostgreSQL 데이터 디렉토리에 정규화된 경로를 사용하고 있습니다. 여러분의 경우 PATHPGDATA 환경이 변수가 설정되어 있으면 다음과 같이 $ initdb만 실행하면 됩니다.

# su - postgres
$  /usr/postgres/8.2/bin/initdb -D /var/postgres/8.2/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale C.

fixing permissions on existing directory /var/postgres/8.2/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers/max_fsm_pages ... 32MB/204800
creating configuration files ... ok
creating template1 database in /var/postgres/8.2/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    /usr/postgres/8.2/bin/postgres -D /var/postgres/8.2/data
or
    /usr/postgres/8.2/bin/pg_ctl -D /var/postgres/8.2/data -l logfile start

$ 

참고: initdb 명령의 출력은 데이터베이스 시작 및 중지 방법을 알려 줍니다. 이러한 명령은 무시할 수 있습니다. 이제부터 Solaris Service Management Facility를 사용하여 PostgreSQL 데이터베이스를 관리할 것입니다.

데이터베이스 서비스 시작(8.2 버전)

PostgreSQL 데이터베이스를 시작할 준비가 되었습니다. svcssvcadm 명령을 postgres 사용자로 사용하여 서비스를 다음과 같이 시작, 중지 및 모니터링합니다.

# su - postgres

$ svcs postgresql
STATE          STIME    FMRI
disabled       Sep_06   svc:/application/database/postgresql:version_81
disabled       14:06:11 svc:/application/database/postgresql:version_82

$ svcadm -v enable -s postgresql:version_82
svc:/application/database/postgresql:version_82 enabled.

$ svcs -l postgresql:version_82
fmri         svc:/application/database/postgresql:version_82
name         PostgreSQL RDBMS
enabled      true
state        online
next_state   none
state_time   Fri Sep 14 14:23:49 2007
logfile      /var/svc/log/application-database-postgresql:version_82.log
restarter    svc:/system/svc/restarter:default
contract_id  379 
dependency   require_all/none svc:/milestone/network:default (online)
dependency   require_all/none svc:/system/filesystem/local:default (online)

$

Solaris Service Management Facility는 시스템이 부팅될 때 PostgreSQL 데이터베이스를 자동으로 시작합니다.

데이터베이스 사용(8.2 버전)

대화형, 명령줄, 작업을 위한 주 PostgreSQL 명령은 psql입니다. 자세한 내용은 psql 매뉴얼 페이지를 참조하십시오. --help 옵션의 출력은 다음과 같습니다. 저는 psql 명령에 정규화된 경로를 사용하고 있습니다. 여러분의 경우 PATH가 적절하게 설정되어 있으면 명령 이름만 사용하면 됩니다.

$ /usr/postgres/8.2/bin/psql --help
This is psql 8.2.4, the PostgreSQL interactive terminal.

Usage:
  psql [OPTIONS]... [DBNAME [USERNAME]]

General options:
  -d DBNAME       specify database name to connect to (default: "postgres")
  -c COMMAND      run only single command (SQL or internal) and exit
  -f FILENAME     execute commands from file, then exit
  -1 ("one")      execute command file as a single transaction
  -l              list available databases, then exit
  -v NAME=VALUE   set psql variable NAME to VALUE
  -X              do not read startup file (~/.psqlrc)
  --help          show this help, then exit
  --version       output version information, then exit

Input and output options:
  -a              echo all input from script
  -e              echo commands sent to server
  -E              display queries that internal commands generate
  -q              run quietly (no messages, only query output)
  -o FILENAME     send query results to file (or |pipe)
  -n              disable enhanced command line editing (readline)
  -s              single-step mode (confirm each query)
  -S              single-line mode (end of line terminates SQL command)
  -L FILENAME     send session log to file

Output format options:
  -A              unaligned table output mode (-P format=unaligned)
  -H              HTML table output mode (-P format=html)
  -t              print rows only (-P tuples_only)
  -T TEXT         set HTML table tag attributes (width, border) (-P tableattr=)
  -x              turn on expanded table output (-P expanded)
  -P VAR[=ARG]    set printing option VAR to ARG (see \pset command)
  -F STRING       set field separator (default: "|") (-P fieldsep=)
  -R STRING       set record separator (default: newline) (-P recordsep=)

Connection options:
  -h HOSTNAME     database server host or socket directory (default: "local socket")
  -p PORT         database server port (default: "5432")
  -U NAME         database user name (default: "postgres")
  -W              prompt for password (should happen automatically)

For more information, type "\?" (for internal commands) or "\help"
(for SQL commands) from within psql, or consult the psql section in
the PostgreSQL documentation.

Report bugs to .
$ 

대화형 터미널 모드에 들어가려면 psql 명령을 다음과 같이 옵션 없이 사용합니다.

$ /usr/postgres/8.2/bin/psql
Welcome to psql 8.2.4, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

postgres=# 

postgres=# 프롬프트는 PostgreSQL이 준비되었으며 명령을 기다리고 있음을 의미합니다. 인터넷에는 많은 종류의 PostgreSQL 자습서가 있으므로 PostgreSQL 사용 방법에 대한 상세한 내용은 다루지 않겠습니다. PostgreSQL 설명서 웹 사이트에서 완전한 사용 방법 및 참조 문서를 찾을 수 있습니다. 다음은 몇 가지 기본 작업을 테스트하는 데 사용되는 명령입니다.

테이블 만들기:

postgres=# CREATE TABLE location 
( 
CODE        VARCHAR(8) NOT NULL PRIMARY KEY,
DESCRIPTION VARCHAR(32) NOT NULL
);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "location_pkey" for table "location"
CREATE TABLE

테이블 설명:

postgres=# \dt
          List of relations
 Schema |   Name   | Type  |  Owner   
--------+----------+-------+----------
 public | location | table | postgres
(1 row)

테이블 채우기:

postgres=# INSERT INTO location ( CODE, DESCRIPTION ) VALUES
('loc30','Austin, Texas'),
('loc31','New York, New York'),
('loc32','Chicago, Illinois'),
('loc33','Dallas, Texas'),
('loc34','San Jose, California'),
('loc35','Atlanta, Georgia'),
('loc99','Denver, Colorado');
INSERT 0 7

테이블 선택:

postgres=# select * from location;
 code  |     description
-------+----------------------
 loc30 | Austin, Texas
 loc31 | New York, New York
 loc32 | Chicago, Illinois
 loc33 | Dallas, Texas
 loc34 | San Jose, California
 loc35 | Atlanta, Georgia
 loc99 | Denver, Colorado
(7 rows)

테이블 삭제:

postgres=# drop table location;
DROP TABLE

데이터베이스 중지(8.2 버전)

PostgreSQL 데이터베이스를 중지하려면 다음과 같이 Solaris Service Management Facility의 svcadm 명령을 사용합니다.

# su - postgres
$ svcadm disable -s postgresql:version_82
$ svcs postgresql:version_82
STATE          STIME    FMRI
disabled       15:11:38 svc:/application/database/postgresql:version_82

설명서

여러 매뉴얼 페이지를 통해 많은 정보를 얻을 수 있습니다. Solaris 구현에 관련된 PostgreSQL 기능을 다루는 postgres_82 매뉴얼 페이지에서 시작하는 것이 좋습니다. 제가 사용하는 몇 가지 매뉴얼 페이지는 다음과 같습니다.

매뉴얼 페이지 목록
매뉴얼 페이지
설명
postgres_82
Solaris용 PostgreSQL RDBMS 8.2 버전
initdb
새 PostgreSQL 데이터베이스 클러스터 만들기
psql
PostgreSQL 대화형 터미널
svcs
서비스 상태 보고
svcadm
서비스 인스턴스 조작
 

PostgreSQL 웹 사이트에서 다음과 같은 유용한 온라인 설명서를 참조할 수 있습니다.

관리 도구 사용

GUI(그래픽 사용자 인터페이스)를 사용하려는 경우 pgadmin3이 유용합니다. pgadmin 사이트로 이동하여 Solaris용 pgadmin을 다운로드합니다. SPARC 및 x86/x64 플랫폼용 패키지가 사전 제작되어 있습니다. 설치는 매우 간단합니다. tar.gz 파일을 다운로드하여 임시 위치에 저장합니다. /opt/bin에 바이너리가 설치됩니다.

# gunzip pgadmin3-1.6.3_x86.tar.gz
# tar xf pgadmin3-1.6.3_x86.tar
# pkgadd -d . pgadmin3
# /opt/bin/pgadmin3

MySQL에서 PostgreSQL로 SQL 스크립트 변환

저의 프로젝트 중 일부는 MySQL을 사용했으며 PostgreSQL을 사용할 때도 같은 기능이 필요했습니다. 아쉽게도 스크립트가 올바르게 작동하려면 약간의 수정이 필요했습니다. CREATE TABLE 명령과 관련하여 제가 수정한 사항은 다음과 같습니다. TABLESPACE, DATABASE 및 SCHEMA를 만드는 명령에서는 문제가 발생하지 않았습니다.

스크립트 변환
MySQL
PostgreSQL
참고
TIMESTAMP

DATETIME
TIMESTAMP(0) DEFAULT LOCALTIMESTAMP

TIMESTAMP(3)
PostgreSQL은 보다 많은 기능을 가진 타임스탬프를 사용하며, 사용자는 어떤 타임스탬프 정보를 원하는지 구체적으로 알아야 합니다.
AUTO_INCREMENT
SERIAL
AUTO_INCREMENT가 MySQL 기능으로 나타납니다. 제가 연구한 바에 따르면 SERIAL(일련화 프로그램) 기능이 좀 더 표준적인 SQL 기능인 것으로 나타났습니다.
BIGINT
NUMERIC(19,0)
PostgreSQL 문서마다 BIGINT를 사용할 수도 있었지만, NUMERIC(precision,scale) 옵션으로 변경하기로 결정했습니다.
MEDIUMTEXT
TEXT
PostgreSQL 문서마다 TEXT에 "변수 무제한 길이"가 있습니다.
 

요약

MySQL을 간단하게 PostgreSQL로 변환할 수 있었습니다. 다음과 같은 작업은 필요하지 않았습니다.

  • MySQL 5.x 설치
  • mysql 사용자/그룹 만들기
  • RBAC 설정 또는 SMF 서비스나 init 스크립트 만들기
  • JDBC 드라이버 얻기

Solaris 10 8/07 OS의 PostgreSQL 기능 및 개선 사항

이 Solaris 10 릴리스의 새로운 PostgreSQL 기능 및 개선 사항의 개요는 다음과 같습니다.

  • 오픈 소스가 Solaris 10 OS에 무료로 통합 및 포함되었습니다. PostgreSQL을 쉽게 확장 및 사용자 정의할 수 있으며, 라이센스 비용 지불 없이 높은 가치를 발휘할 수 있습니다.
  • 고유의 DTrace 프로브, Predictive Self-Healing 및 Solaris 컨테이너에 대한 지원과 함께 최신 Solaris 기술을 활용할 수 있도록 성능이 최적화 및 향상되었습니다.
  • Sun이 지원을 제공합니다. Sun은 연중 무휴의 엔터프라이즈급 지원을 포함하여 전세계적으로 Solaris용 PostgreSQL에 대한 포괄적인 서비스를 제공합니다.
  • MVCC(Multi-Version Currency Control), 포인트 인 타임 복구 및 ACID 완전 준수와 같은 기능을 통해 신뢰성 및 고가용성을 제공합니다. 이러한 기능은 작동 중지 시간 및 데이터 손실과 관련된 위험 및 비용을 제거하도록 설계된 Solaris Predictive Self-Healing 및 Solaris 컨테이너에 대한 지원을 통해 더욱 향상되었습니다.
  • 다중 인증 방법, ANSI 역할 및 권한, 암호화 기능에 대한 지원을 통해 기본적으로 보호되도록 제작되었습니다.
  • 로드가 많은 환경에서의 높은 성능 및 확장성 -- 많은 양의 데이터를 관리하고 많은 동시 사용자를 수용할 수 있습니다. Solaris 코어 코드용 PostgreSQL은 기본적으로 DTrace 프로브를 지원하여 성능 병목 현상의 가시성 및 해결 속도를 향상시킵니다.
  • 사전 정의된 postgres 사용자가 RBAC 지원을 받습니다.
  • JDBC 드라이버가 번들됩니다.

추가 정보

다음은 추가 리소스입니다.


Comments (latest comments first)

Discuss and comment on this resource in the BigAdmin Wiki

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin
  
 
BigAdmin Upgrade Hub