그냥 뭐.. | Posted by 고기킬러 2011. 2. 22. 11:30

킬존3 샤프슈터 구입!!!



겨우 구했다!!!

내가 이걸 위해서 얼마나 투자를 했는지 ㅋㅋㅋㅋㅋ

킬존3 타이틀은 오늘 도착하고~ 오옝~

담주 연차쓰고 하루종일 고고싱 해볼까 생각중... ㄷㄷㄷ

'그냥 뭐..' 카테고리의 다른 글

강심장 재밌죠???  (0) 2009.10.27
카테고리 없음 | Posted by 고기킬러 2010. 10. 25. 16:24

ㅋㅋㅋ6


프로그래밍.../PostgreSQL | Posted by 고기킬러 2010. 1. 8. 16:05

PostgreSQL 설치 및 기본 사용법

설치 및 기본 사용법

한동훈

1997년 11월 리눅스월드에서 발췌한 내용입니다.
다른 곳에 사용하실 때는 분명히 리눅스월드의 기사임을 밝혀주십시오

1. 들어가는말

요즘은 한참 RDBMS가 유행이다 눈만 뜨면 일어나 데이터 베이스 솔루션이니 뭐니 하면서 RDBMS를 모르면 마치 이 세상을 살아 갈수 없는 것처럼 만든다. 적어도 그 대상을 프로그래머로 국한을 시키더라고 말이다.

하지만 아직도 자그마한 중소기업에서는 클리퍼나 DB+ 같은 것을 사용하여 만든 데이터 베이스 프로그램을 사용하기도 한다 무릇 어떠한 필요성이 어떠한 발명이나 발전을 있게 하는 것 같다. 요즘은 데이터 베이스 분야에도 관계형 개념은 넘어 객체지향 개념이나 분산개념이 도입되기도 한다. 가면 갈수록 세상을 빠르게 변하는 것 같고 , 더욱 더 많은 능력을 프로그래머에게 요구하는 것 같다.

우리가 일반적으로 알고 있는 RDBMS 중에는 오라클, 인포믹스 같은 수백만원을 호가하는 본격 상용 데이터 베이스 시스템이 많이 알려져 있다. 하지만 이에 못지 않은 데이터 베이스 시스템이 공개용으로 여러분 가까이에 있다고 하면 어떻게 할 것인가 ?

리눅스 사용자라면 PostgreSQL이라는 강력한 RDBMS 있다는 것을 알고 있을 것이다.

물론 PostgreSQL이외에도 쓸 만한 데이터 베이스 시스템으로 mSQL과 mySQL이라는 것도 있다.
PostgreSQL는 정말 중간규모 정도의 기업에서 대용량 데이터 베이스를 처리하기에도 충분한 기능을 가지고 있다. 이제 PostgreSQL의 중요특징을 살펴보도록 하자 .

2.PostgreSQL 의 개요 및 특징

PostgreSQL 의 공식 사이트인 'http://www.PostgreSQL.org" 의 대문짝에는 다음과 같은 글이 커다랗게 쓰여있다.

" PostgreSQL는 강력한 차 세대 객체 - 관계형 DBMS로서 Berkeley Postgres 데이터베이스 관리 시스템에서 파생되었다 PostgreSQL 는 강력한 객체-관계형 데이터 모델과 풍구한 데이터 타입, 쉬운 확장성을 가지고 있으며 , PostQuel 질의 언어를 확정된 SQL의 부분 집합으로 대체하고 있다."

tgraSQL은 한마디로 객체지향 기능을 가지고 있는 관계형 데이터 베이스 시스템이다. PostgreSQL 의 모태가 되는 최초의 Postgres 프로젝트는 1986년 마이클 스톤브레이커(Michale Stonebraker) 교수에 의해 주도되었으며. DRAPA(방위 진보 리서치 기관 ), ARO(육군 리서치연구소). NSF (미 국립 과학 재단) 등 여러기관으로부터 후원을 받았다.즉 애초에 상업적인 목적으로 개발된 것이 아니라 교육 연구차원에서 개발된 것이다. 나중에 설명하겠지만 이러한 특징은 PostgreSQL 의 데이터 타입에서도 나타난다. 그리고 아이러니칼 하게도 PostgreSQL에 관련된 문서는 직접적으로 사용자 매뉴얼에 나타난 것보다도 각종 논문으로 발표된 것이 훨씬 많다.

PostgreSQL는 매우 다양한 연구와 여러 응용 결과를 구현하는데 사용되어져 왔으면 금융상의 데이터 분석 시스템, 제트엔진의 성능을 모니터링 하는 패키지 소행성의 운동을 추적하는 데이터 베이스 ,의학정보 데이터 베이스 몇 개의 지리정보 시스템등에 관련된 업무에 이용되어져 왔다.

Postgres는  또한 여러 대학에서 교육용으로 쓰여 져왔다. 마침내 Illustra Information Technologies 에서는 일부의 코드를 사용하여 그것을 상업화하였다
1992년에 Postgre는 '세퀴이어 2000과학 컴퓨팅 프로젝트'의 주요한 데이터 처리기로 선정되었다 나아가서 1993년에는 내부 사용자 집단의 크기가 두배에 가까워졌다 이것은 코드의 원형을 관리하고 그것을 지원하는 일에 데이터 베이스 연구 중 더 많은 시간이 할당되어 가고 있다는 점을 명백하게 말해준다. 이러한 힘든 수고를 줄이기 위해서 공식적으로 이 프로젝트는 버전4.2를 마지막으로 종료되었다.

PostgreSQL 는 이러한 Postgres 의 마지막 릴리즈인 버전4.2에서 파생되었으며, 버클리 소재 캘리포니아 대학에서 개발되었다. PostgreSQL6.0 이전의 버전은 흔히 Postgre95라고 불러왔다. PostgreSQL의 코드는 현재 완전히 ANSI C  로 작성되었으며 ,코드의 크기도 약25%가 줄었고 , 성능개선과 코드유지 부분에 대한 많은 내부적 변화가 있었다. PostgreSQL 버전은 이전의 Postgres에 비교해볼 때 상당한 속도상의 이점이 있다고 한다.

PostgreSQL의 세가지 중요특징은 다음과 같다.

관계형 모델 : Postgres 프로젝트 리서치의 최초의 목적 중의 하나는 복합객체(complex object),규칙(rule) 등을 다룰 수 있으며 고수준으로 확장가능한 관계형 DBMS가 가지고 있는 거의 모든 기능을 가지고 잇다. 예를 들면 SQL에서 서술적인 질의어의 사용과 질의 최적화, 동시성제어,트랜잭션처리, 멀티 유저 기능 등을 제공하고 있다.

고수준 확장성 : PostgreSQL는 사용자 정의 오퍼레이터와 타입,함수,엑세스 메쏘드를 지원한다.

객체지향 : PostgreSQL 는 상속, 객체와 같은 객체지향개념에서 볼 수 있는 여러 특징을 초보적이나마 구현하고 있다 이러한 특징 때문에 여러 사람들은 PostgreSQL를 설명할 때 ORDBMS라고 말하 기도한다.

PostgreSQL 는 일반적인 구조는 postmaster . postgres. frontend 의 3가지 부분으로 구성되어 있다.

  • postmaster 는 최상위 데몬 프로세스이다 이것은 frontend와 backend 프로세스 사이의 통신을 담당하며 공유버퍼 풀 (공유 메모리 내부에)을 할당하며 . 시작 시에 다른 초기화 부분을 수행한다.
  • postgres는 backend 데이터베이스 서버 프로세스이다. 질의(query)를 수행하는 등의 실제 작업을 처리한다. postmaster는 해당frontend 접속마다 새로운 backend 프로세스를 시작시킨다. postgres backend는 항상 서버머쉰에서 수행된다.
  • frontend 응용프로그램(예를들면 psql) 은 아마 또 다른 머신(예를 들면 클라이언트 워크스테이션)상에서 돌아 갈수 있으며 .postmaster를 거쳐서 postgres backend 에게 접속을 요청한다.

여기에서 backend 라는 용어는 어떠한 (데이타베이스)시스템에서 실질적으로 사용자의 요청을 처리하는 엔진과 유사한 부분이라고 보면 된다. frontend 는 사용자의 입력을 받아 들이거나 요청을 접수하여 backend 로 전달하는 인터페이스 부분을 일컫는다. PostgreSQL에서 backend는 postgres 프로세스이고 frontend 는 psql 이나 여타의 PostgreSQL 사용자 응용프로그램이다.

PostgreSQL 는 정말 다양한 API를 지원한다. 이중에서 아마도 앞으로 주로 사용하게 될 API가하나 이상씩은 있을 것이다 마음에 드는 것을 골라서 마음껏 사용해보기 바란다.

  • C API
  • C ++ API
  • Tcl API
  • Perl API
  • Python API

이중에서 C와 C ++ API는 일반적인 라이브러리와 클래스 형태로 제공한다. PostgreSQL가 공개적인 성격을 띄고 있다는 점 때문에 정말 수도 헤아릴 수 없을 정도의 지원 툴이 전세계의 여러 사람에 의해 개발되어 사용되고 있다.
PostgreSQL 내외부에서 비공식, 공식적으로 지원되는 툴이나 다양한 패키지를 잠깐 나열해보자

  • ODBC UDBC JDBC 드라이버
  • 자바 레트둘 , 자바 클래스
  • WISQL- 윈도우즈 상호대화식 질의 툴
  • ISQL-  상호대화식 질의 툴
  • AppGEN 개발 시스템- PostgreSQL , 4GL 웹 데이터 베이스 어플리케이션
  • EARP - 웹 테이타 베이스 디자인 /구현툴
  • dbengine- 웹 인터페이스
  • NeoSoft NeoWebScript - Apache 웹서버 모듈
  • PHP/FI - 서버 측 html 엠베디드 스크립트 언어
  • WDB -P95 -PostgreSQL 와 웹의 게이트 웨이
  • ESQL/C

이에 대한 자세한 내용을 알고 싶으면 얼마 전에 나온 "Linux Database HOWTO' 문서를 참조하게 바란다. 다음에서 구할 수 있다.

http://sunsite.unc.edu/LDP/HOWTO/Database-HOWUO.html

3. PostgresSQL 저작권

PostgresSQL는 기본적으로 소스수준까지도 공개적인 성격을 띄고 있다. GPL은 아니지만 사용,복사, 수정,배포에 있어서 자유로우며 무료로 구할 수 있다. 아울러 COPYRIGHT문서에는 , 소프트웨어 사용으로 인한 손해에 대해 어떠한 보증도 하지 않으며 ,, 상업적인 이용이나 어떤 특별한 목적에의 사용에 대해서도 보증(warranties)을 거부한다. 고 명시하고 있다. 즉 상식적인 수준에서 공개 소프트웨어의 범주에 포함된다고 보면 될 것 같다.

4. PostgresSQL 의 설치

PostgresSQL는 다음의 플랫폼에서 동작한다.

      aix              IBM on  AIX 3.2.5
       
      alpha            DEC Alpha AXP  on OSF/1.2.0
       
      BSD44_derived    OSs derived from 4.4-lite BSD (NetBSD,FreeBSD)
       
      bsdi             BSD/OS 2.0, 2.0.1 2.1 
       
      dgux             DG/UX  5.4R3.10
       
      hpux             HP PA-RISC on HP-UX 9.0
       
      i386_solaris     i386 Solaris
       
      irix5            SGI MIPS on IRIX 5.3
       
                       SPARC on Linux ELF
       
                       (For non-ELF Linux, see LINUX_ELF below)
       
      sparc_solaris    SUN SPARC on Solaris 2.4
       
      sunos4           SUN SPARC on SunOS 4.1.3
       
      svr4             INTEL x86 on Intel SVR4
       
      ultrix4          DEC MIPS on Ulrix 4.4
       
      nextstep에서는 약간의 문제가 있다고 한다. 

 

part 1 PostgerSQL를 소스 파일로 설치하기

현재까지 나온 PostgresSQL 6.1.1의소스 파일의 압축분량은 대략 2메가 이다. 소스파일의 압축을 풀면 대략 10메가정도 된다. 설치시에는 최소메모리 8메가와 소스 바이너리 사용자 데이터 베이스에 대략 45메가 정도의 디스크 공간을 필요로 한다 대용량의 데이터 베이스를 구축하지 않을거라면 사실 이정도 까지도 필요하지 않다. 소스파일을 풀고 컴파일하여 바이너리를 둘 공간과 약간의 데이터 베이스 저장공간만 있으면 된다.

지금 9월 30일 현재까지 나온 최신의 공식버전은 6.1.1이다 베타버젼은 6.2b11까지 나와있다. 10월 초경에는 6.2.가 나올 예정이고 12월 경에는 6.3이 나올 예정이라고 한다 사실 PostgresSQL 과 다른 공개용 DRBMS를 비교해볼 때 PostgresSQL은 비표준적인 부분을 많이 원해왔던 것이 사실이다, 그리하여 사용자 확장성은 정말 뛰어나게 되었으나 기본 표준인 ANSI SQL을 여전히 완전하게는 지원하지 못하고 있다. 아마도 그중에서 정말 요긴하게 사용되는 것은 subselects. primary/secondary key, constraint 정도 가 될 것이다. 하지만 사실 이런 기능의 대부분은 PostgresSQL에서 사용자 정의 함수와 인덱스 생성을 통하여 해결할 수 있는 부분들이다. 이제 6.2 버전부터 이러한 표준 SQL부분을 본격적으로 지원하겠다고 한다. 6.2 베타 버전에서도 벌써 테이블의 필드네에서 기본 DEFAULT 값을 지정하거나 NOT NULL키워드를 사용할 수 있다. 6.2 버전을 손꼽아 기다려볼만 하다.

하지만 여기서는 현재까지의 공식버전인 6.1.1 의 설치를 기준으로 설명하겠다. PostgresSQL 에서의 한글 사용문제도 있고 추가적인 기능은 나중에 탐미해도 충분할 것 같기 때문이다.

이미 PostgresSQL를 설치하였다면 이부분을 건너뛰면 된다 괜히 본 것 또 보면 머리만 아프고 식욕만 떨어질 뿐이다.

설치를 하기로 마음먹었다면 PostgresSQL 사이트나 국내BBS Linux 동호회에서 PostgresSQL 최신버전을 받아오자 ,. 예전의 Postgres 95 와 현재의 PostgresSQL 6.x  대 버전은 서로 설치방법이 조금 다르지만 , PostgresSQL 6.대에서는 거의 같다. 혹시 베타버전을 설치하려는 분이나 며칠 있으면 나올 PostgresSQL6.2를 설치하고 싶다면 그것으로 설치해도 상관은 없다.
PostgresSQL 6.1.1을 포함한 이하 버전을 설치하려고 하고 , 테이블 명이나 필드명에 한글을 사용하고 싶다던지 , 2바이트 문자를 정규표현식으로 검색하고 싶다면 , 다음 사이트에서 PostgresSQL 의 버전에 맞는 2바이트 코드 패치파일인 jp.patch.gz를 가져온다.

ftp://ftp.sra.co.jp/pub/cmd/postgres/

사실 PostgresSQL의 기본 설치는 ./configure, make, make install, initab 만으로도 충분하다 물론 Postgres 이런 작업을 수행해야 한다는게 중요하다 환경변수를 잡는 다던지 여타의 것들은 이제 하나하나 설명하겠다.

1) postgres 계정이 없다면 만든다.
물론 이전에 만들어 두었다면 다시 손볼 필요는 없다.

2) 디스크 용량이 충분한지 체크한다.
가끔 희안한 에러가 나는 경우가 나는 경우를 자주 볼 경우가 있는데 이럴 경우에 'dr'을 쳐보니 남은 디스크 용량이 0 이였다. 여유있게 50메가 정도의 여유분을 잡아놓고 시작해보자 요즘에는 디스크 가격에 정말 싸다.

3) 일단 postgresql-v6.1.1.tar.gz을 postgres 홈 디렉토리에 가져다 놓자

4) Linux를 비롯한 몇몇 시스템에서는 flex를 사용한다.
시스템에 있는 flex가 문제가 없는 버전인지 점검한다 다음과 같이 친다.

flex - version 

flex가 없다면 아마도 그것이 필요없을 것이다. 2.5.2나 2.5.4. 이상이면 O.K  2.5.3. 이나 2.5.2. 이전의 버전이면 flex를 업그레이드 해야 한다.

ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz에서 구할 수 있다.

5) 이제 postgres 홈 디렉토리(/home/postgres)에 있는 PostgresSQL배포본의 압축을 풀어보자

혹시 GUN tar가 아니면 gzip 과 tar 명령을 두번으로 나누어 사용해야 할 필요가 있을 것이다.

6) 한글을 사용하려면
위에서 받아둔 패치로 소스트리를 패치해 야한다 테이블 명이나 컬럼명에 한글을 사용하지 않아도 된다면 6단계는 뛰어넘어도 된다.물론 데이터의 내용을 한글로 사용하는 것은 이 패치를 하지 않아도 전혀 지장 없다.

gzip -dc jp.patch.gz | patch -p0

src/ 디렉토리에 Makefile.custom파일을 만들어서 JP=1 이라고  한줄 적어준다.

7) /usr/local/pgsql 디렉토리를 postgres 소유로 만들어둔다.

su -l
 
Password : ***********
 
mkdir /usr/local/pgsql
 
chown postgres.postgres /usr/local/pgsql

8) 앞으로는 계속 postgres 사용자 계정으로 로긴하여 작업 해야한다.
! 혹시 무의식적으로 root로 컴파일 작업을 하지 않도록 한다 자신의 시스템이 너무나도 느린 386 시스템이거나 다시 컴파일 하기가 정말 싫은 사람이 root 로 컴파일하는 실수를 범했다면 다음 명령으로 아무 문제없이 사용할 수는 있다.

chown -R postgres.postgres POSTGRES_ INSTALL_DIRECTORY

src 디렉토리로 들어가서 ./configure를 실행하여 자신의 시스템에 맞는 사양을 고르면 된다. Linux  사용자라면 엔터만 두세 번 두들기면 알아서 잡아준다.

cd
 
cd postgresql-v6.1.1/src
 
/configure

여기에서 잠시 readline 라이브러리에 대해서 짚고 넘어가자 . readline은 bash.psql 과 같은 명령행 기반 프로그램에서 히스토리 기능과 편집기능을 제공해주는 아주 편리한 라이브러이이다 readline 라이브러리는 홈디렉토리의 .inputrc에서 설정을 읽어오기 때문에 2바이트 문자를 처리하려면 ~/.inputrc 에 다음의 한줄을 적어주면 한글을 사용할 수 있다.

set eightbit

readline 라이브러리는 주위에서 쉽게 구하여 설치할 수 있을 것이다.

9) 컴파일한다.

make

"All of PostgreSQL is successfully made. Ready to install " 이라는 메시지가 보인다면 성공한 것이다 .

make install

보통 별 무리없이 잘 설치될 것이다. 설치되지 않는 대부분의 경우는 /usr/local/pgsql 디렉토리를 만들어 두는 것을 깜빡 했거나 , postgres 의 소유로 되어 있지 않아서 그럴 것이다.

10) 시스템이 공유라이브러리를 잘 찾을 수 있도록 root 로 로긴하여 /etc/ld.so.conf 파일에 다음의 한 줄을 추가한다.

/usr/local/pgsql/lib

그리고 /sbin/ldconfig를 실행한다.

혹시 Linux 시스템이 아닌 다른 UNIX 시스템이라면 다음과 같이 해야 할 필요성이 있을지도 모르겠다.

bash 의 경우 :export LD_LIBRARY_PATH=/usr/local/pgsql/lib
 
csh  의 경우 :setenv LD_LiBRARY_PATH /usr/local/pgsql/lib

데이터베이스를 생성할 때 "pg_id:can't load library 'libpq.so'" 라는 메시지를 받는다면 위의 작업이 필요하다.

11) postgre로 로긴하여 postgreSQL을 위한 환경변수 설정을 한다. 이후의 모든 작업은 postgres사용자로 로긴하여 수행하여야 한다. PostgreSQL를 사용하려면 반드시 환경변수를 설정하여야 한다. 가끔 환경변수를 설정하지 않고 PostgreSQL가 작동하지 않는다고 이야기하는 분들이 많다.

bash 사용자라면 , 다음의 내용을 ~/.bash_profile에 적어넣는다.

PATH-$PATH:/usr/local/pgslq/bin
 
MANPATH=/usr/local/pgsql/man
 
PGLIB=/usr/local/pgsql/lib
 
PGDATA=/usr/local/pgsql/data
 
export PATH MANPATH PGLIB PGDATA

csh 사용자라면 setenv를  사용하여 똑같이 환경변수를 설정할 수 있다.
다시 로긴하거나 source 명령을 수행하여 환경변수를 적용시킨다.

source~/.bash_profile

12) 데이터 베이스를 초기화한다.

initdb

13) 데이터 베이스에 접근할 퍼미션을 설정한다.
이 작업은 /usr/local/pgsql/data/pg_hba.conf를 편집함으로써 할수 있다.이 파일을 편집하고 난 뒤에는 반드시  read only 모드로 만들어 두자

14) postmaster 데몬을 수행한다.

postmaster > server.log 2> & 1 &

15) postgers를 부팅시에 자동으로 띄우게  하려면 다음과 같이 하면된다.
Linux를 포함한 거의 모든 UNIX 시스템에서 /etc.rc.d 디렉토리밑에 부팅시에 수행되는 여러 스크립트들이 있다.
그중에서 rc.local 정도의 파일에 다음과 같이 적어주면 된다.

su postgres -c "/usr/local/pgsql/bin/postmaster -S -D /usr/local/pgsql/data "

RedHat 리눅스 같은 경우에는 rc.d 구조가 조금 다르긴 하지만 rc.local 파일에 그냥 적어주는 것이 편하다.

16) 이왕 말이 나온김에 postmaster를 좀더 효율적으로 띄우는 옵션을 잠깐 살펴보자.
postmster 는 몇가지 작업을 위해 공유메모리를 사용한다. 기본 설정은 64버퍼로 되어 있으며 하나의 버퍼당 8K를 차지한다. 필자는 대략 4메가의 메모리인 512버퍼를 postmaster에 부여하여 사용하고 있다. 너무 적으면 성능이 조금 떨어지고 너무 많으면 오히려 이상징후가 생길 수 있으니 자신의 시스템 사양에 맞게 적당하게 잡아두자 .

그리고  postmaster의 backend는 기본적으로 디스크 케슁을 하지 않고 변화가 생길 때 마다 곧바로 디스크에 기록하므로 속도가 좀 느려진다. 디스크캐슁을  활성화하려면 backend 옵션('-o') 에 -F를 설정하면 된다.

필자는 다음과 같은 postmaster 초기 부팅 옵션 값을 사용하고 있다.

su -l postgres -c "/usr/local/bin/postmaster -S -B 512 -o -F -D /usr/local/pgsql/data "

17) 그 외의 여러 시스템에서 필요한 사항을 잠깐 살펴보자.

Ultrix4.x :Ultrix4.x 에 동적 로더가 없다면 libdl-1.1 패키지를 설치해야한다. 이것은 다음에서 구할수 있다.

s2k-ftp.C.S.Berkeley.EDU:pub/personal/andrew/libdl-1.1.tar.Z

Linux: Linux-elf 는 잘 설치된다 i486이상의 프로세스를 사용하고 있다면 template/LInux-elf에 "-m486"을 컴파일 옵션에 추가할 수 있다.
ELF가 아닌 리눅스에서는 .old 라이브러리를 반드시 얻어서 시스템에 설치해야 한다. 이 라이브러리는 postgres포트에서 동적으로 링크 로딩을 할 수 있는 능력을 부여한다.dld 라이브러리는 선사이트의 리눅스 배포본에서 얻을 수 있다 현재의 이름은 dld-3.2.5 이다.

BSD/OS : BSD/OS 2.0 와 2.01에서는 GNU dld 라이브러리를 설치해야 한다.

NeXT :NeXT 포트는 Tom R Hageman tom@basil.icce.rug.nl 이 제공한다.
이 판은 공유라이브러리와 세마포어 헤더파일이 필요하다 NEXTSTEP에서 돌아가는 PostgreSQL의 바이너리 배포본도 Tom에게서 general public으로 얻을 수 있다.

18) PostgreSQL를 운영하려면 사용할 데이터 베이스와 사용자를 등록해야 한다.
/usr/local/pgsql/bin 에 보면 이와 관련된 프로그램이 준비되어 있다. test라는 데이터베이스를 만들려면 createdb명령을 사용하면 된다.

$ createdb test
 
linuxer라는 사용자를 등록하려면 다음과 같이 하면 된다. 
 
$ createuser linuxer
 
Enter user's postgres ID or RETURN to use unix user ID : 514 -> [Enter]
 
ls user " inuxer " allowed to create to database (y/n) y
 
ls user " inuxer " allowed to create to add users?(y/n) y
 
createuser : linuxer was successfully added 

linuxer 라는 사용자에게 데이터베이스를 생성할 권리를 제공했지만 또 다른 사용자를 추가할 권리를 주지 않았다 참고적으로 이야기하면 사용자를 추가할 권리를 주지 않으면 해당사용자는 자신의 데이터베이스를 삭제할 수 없게 된다.

createdb와 createuser에 반대되는 명령은 destrotdb와 destroyuser 명령이다.

test 라는 데이터 베이스를 만들었으면 이제 잠깐 테스트해 보자

$psql test
 
Welcome to the POSTGRESQL interactive sql monitor :
 
Please read the file COPYRIGHT for copyright terms of POSTGRESQL
 
type \? for help on slash commands 
 
type \q to quit
 
type \g or terminate with semicolon to execute query
 
You are currently connected to the database : test
 
test => craeat table 연습(
 
test -> 이름 test
 
test -> 번호 int4
 
test -> );
 
CREATE
 
test =>\d 연습
 
Table=연습 

Field

Type

Length

이름

text

var

번호

int4

4

 

test => inster into 연습 values ('꺼벙이'.1);
 
INSERT 154615
 
test => inster into 연습 values ('멍청이'.2);
 
INSERT 154616
 
test => select*from 연습 : 

이름

번호

꺼벙이

1

멍청이

2

(2 rows)

test =>postmaster backend에 접속하려면 반드시 해당 데이터 베이스를 명시해야 한다 그렇지 않으면 사용자 아이디와 같은 데이터베이스를 찾으려고 할 것이다. 데이터베이스를 삭제(drop)할 때 조차도 해당 데이터베이스에 접속해 있는 상태에서는 불가능하고 , 임시적인 다른 데이터 베이스에 접속한 다음에 원하는 데이타 베이스를 제거하여야 한다. .PostreSQL의 슈퍼유저인 postgres에게는 이러한 용도로 template1 이라는 별의미 없는 데이터 베이스가 하나있다.

part 2  PostgreSQL를 바이너리로 설치하기

PostgreSQL를 본격적으로 활용측면에서 살펴 보기 전에 PostgreSQL를 바이너리로 설치하는 방법을 잠시 살펴본다. 바이너리는 주로 rpm으로 배포된다 물론 데비안 페키지형식인 deb로 배포되긴 하지만 여기서는 PostgreSQL 의 rpm 배포판을 다루겠다. 필자는 주로 슬렉웨어를 사용하는 데 슬렉웨어에 rpm 패키지를 설치 관리할수 있도록 해주는 rpm 패키지를 설치하고  PostgreSQL 6.1 rpm 판을 설치하려다 잘 되지 않았다. 사용하고 있는 rpm 버전이 낮아서 그런지 모르겠다.

PostgreSQL rpm 패키지는 역시 레드헷에서 설치가 잘된다. 국내 BBS 리눅스 동호회나 레드햇에서 PostgreSQL rpm 패키지를 쉽게 구할 수 있다.

root로 로긴하여 일상적인 rpm 명령으로 설치하면 된다.

$rpm -ivh pgsql61.rpm

패키지의 이름은 다를 수 있다. 필자가 설치해본 PostgreSQL rpm 판은 관련파일을 여러곳으로 분산시키는 경향이 있었다. 바이너리는 /user/bin 에 , 데이터파일과 리소스 파일은 /var/lib/postgresql에 들어간다 이미 데이터베이스 초기화가 되어 있으므로 initdb로 할 필요없다.

PostgreSQL rpm 패키지에는 몇가지 문제가 있다 postmaster를 실행시키려면 퍼미션 에러가떨어지는데 이는 다음을 수행하여 해결할수 있다.
물론 root로 수행해야한다.

$chown -R postgres /var/lib/postgresql

또 하나의 예상치 못한 문제점은 PostgreSQL의 슈퍼유저 권한이 postgres 에게 있는 것이 아니라 deamon에게 있다는 것이다. PostgreSQL를  rpm으로설치하고 데이터 베이스와 사용자를 아무리 추가하려고 해도 되지 않아서 data 디렉토리의 pg_user 데이터를 바리너리 에디터로 살펴보니 황당하게도 deamon으로 설정되어 있는 것이 아닌가 ? 패키징한 사람이 어떤 이유로 이렇게 한 것인지 알수는 없지만 우리는 이런상황을 바로 잡아보자 먼저 root 상태에서 deamon으로 로긴해야한다. deamon은 일반적인 계정이 아니라 시스템의 효율적인 운영을 위해 생성되는 계정이다.

$ su -I deamon

$ createuser postgres

postgres 에게 데이터 베이스 와 사용자 추가권한을 부여한다. 이제 postgres 계정으로 로긴하여 앞서와 마찬가지로 데이터 베이스와 사용자를 추가하면 된다.하지만 이렇게 한다고 해서 모든 문제가 해결되는 것은 아니다 그냥 간단하게 배우기에는 별문제가 없겠지만 데이터베이스 시스템을 구축한다는 측면에서 보면 꼭 소스파일로 설치하던지 제대로 된 바이너리 패키지를 구해서 설치하기 바란다.

5. PostgreSQL 기초 사용법

PostgreSQL 의 특징인 부분들을 활용하기 이전에 먼저 PostgreSQL에서 지원하는 SQL 의 기본 사용법을 잠깐 살펴보자 . PostgreSQL는 아직은 ANSI SQL을 완벽하게 지원하지 않는다. 다른 자유롭게 구할 수 있는 RDBMS에 비해볼 때 표준 부분에서는 조금 떨어지는게 사실이다 하지만 일반적인 사용에는 전혀 지장이 없으며 , 다른 RDBMS에서는 지원하지 않는 다양한 비표준기능들을 많이 지원한다 .
관계형 데이터 베이스에서는 보통 레코드(recoard)와 필드(field)라는 용어대신에 테이블(표-table) , 로우(행-row) 컬럼(열-column)이라는 용어를 사용한다.
여기서는 일반적으로 많이 사용되는 용어를 기준으로 사용할 것이다.
먼저 다음의 내용을 자신이 편리하게 사용하고 있는 에디터로 편집해보자 명령행에서 일일이 치는 것은 정말 짜증스러운 일이 아닐 수 없다.

create table  날씨 (- 날씨 테이블
 
도시 varchar (20)
 
최저온도 int.
 
최고온도 int.
 
강수량 real.
 
날짜 date
 
):
 
insert into 날씨 values ('서울'. 10.27.0.0.'1997/10/1');
 
insert into 날씨 values ('서울'. 12.25.0.12.'1997/10/2');
 
insert into 날씨 values ('부산'. 13.28.0.32.'1997/10/1');
 
insert into 날씨 values ('광주'. 15.25.0.73.'1997/9/28');
 
insert into 날씨 values ('대전'. 10.27.0.0.'1997/10/4');
 
insert into 날씨 values ('대구'. 15.23.0.15.'1997/10/3');
 
insert into 날씨 values ('천안'. 9.22.0.42.'1997/10/2');
 
insert into 날씨 values ('마산'. 13.24.0.01.'1997/10/1');
 
insert into 날씨 values ('전주'. 12.29.0.0.'1997/10/5');
 
insert into 날씨 values ('인천'. 14.23.0.25.'1997/11/2');

이 파일을 weather.sql으로 저장한다. .
앞으로 모든 작업은 mydb위에서 하는걸로 가정하겠다 다음과 같이 mydb를 만들어두자

$ createdb mydb

이제 데이터 베이스에 접속한다.

$ psql mydb

약간의환영 메시지가 나온다. 앞서 저장했던 SQL 질의어가 담긴 파일을 불러서 실행하는 명령은 '\i filename'이다.

mydb=> \i weather.sql

정상적으로 테이블을 만들고 해당 값을 삽입할 것이다. . SQL 질의어에 대한 간단한 온라인 도움말은 '\ hcommand'형식으로 얻을 수 있다.psql 모니터링은 프로그램에서 제공하는 몇 가지 명령어는 '\?'를 사용하면 알 수 있다 기억이 잘 안날 때 자주 사용하기 바란다.

mydb => \?
 
\?- help
 
\a - toggle field-alignment (currenty on)
 
\C [<captn>]-set html3 caption <currently") 
 
\connect <dbname|-> <user> -connect to new database
 
<currently 'ddoch'>
 
\ copy table {from | to} <fname>
 
\ d [<table>] - list tables and indicies in database or columns in 
 
<table>. * for all
 
\ di- list only indicied in database
 
\ ds - list only sequences in database
 
\ dt -list only tables in database
 
\ e [<fname>]-edit the current query buffer or <fname>, \E
 
execute too
 
\ f [<sep>]- change field separater (currently '|')
 
\g [<fname>][<cmd>] - send query to backend [end results
 
in <fname> or pipe
 
\h [<cmd>] - help on syntax of sql commands. *for all
 
commands
 
\ H - toggle html3 output (currently off)
 
\ i <fname> - read and execute queries from filename
 
\ I - list all databases
 
\ m - toggle monitor-like table display (currently off)
 
\ o [<fname>] [<cmd>]-send all query result to stdout,
 
<fname>, or pipe
 
\p - print the current query buffer
 
\q - quit
 
\r -reset(clear) the query buffer
 
\s [<fname>] - print history or save it in <fname>
 
\t - toggle table headings and row count (currently on)
 
\T[<html>]-set html3.0 <table...> options (currently")
 
\x - toggle expanded output (currently off)
 
\z - list current grant/revoke permissions
 
\! [<cmd>] - shell escape or command
 
mydb =>
 
 
 
mydb =>\h
 
type \h <cmd> where <cmd> is one of the following:
 
abort               abort                 alter table
 
begin               begin transaction     begin work
 
cluster             close                 commit
 
commit work         copy                  create
 
create aggregate    create database       create function 
 
create index        creat operator        create rule
 
createsequence      create table          create type
 
create view         declare               delete
 
drop                drop aggregate        drop database
 
drop function       drop index            drop operator
 
drop rule           drop table            drop sequence
 
drop type           drop view             end
 
end transaction     explain               fetch
 
grant               insert                listen
 
load                notify                purge
 
reset               revoke                rollback
 
select              set                   show 
 
update              vacuum
 
type \h " for a complete description of all commands
 
mydb =>

1) select

'날씨 ' 테이블에 입력한 모든 데이터를 검색해보자

mydb => select * from 날씨 ;

도시

최저온도

최고온도

강수량

날짜

천안

9

22

0.42

10-02-1997

대전

10

26

0.1

10-04-1997

서울

10

27

0

10-01-1997

서울

12

25

0.12

10-02-1997

전주

12

29

0.

10-05-1997

마산

13

24

0.01

10-01-1997

부산

13

28

0.32

10-01-1997

인천

14

23

0.25

11-02-1997

광주

15

25

0.73

09-28-1997

 

이번에는 최저 온도가 가장 낮은 순서대로 검색해보자

mydb => select *from 날씨 order by 최저온도 asc;

asc 는 오름차순으로 정리하는 것이다. 내림차순으로 정리하려 desc를 사용하면 된다 여기에서 정렬은 order by를 사용하면 된다. 여기에서 정렬은 order by를 사용하여 최저온도에 적용하였다.

이번에는 강수량이 0.1에서 0.3사이인 행의 도시와 강수량을 구해보자.

mydb => select 도시 , 강수량 , from 날씨 where 강수량 > 0.1 and 강수량 < 0.3

도시

강수량

서울

0.12

대구

0.15

인천

0.25

다음을 10월달의 기록 중에 최저온도 최고온도의 차이가 10도 미만인 행을 찾아서 도시와 날짜와 도시와 날짜에 대한 정보를 날짜와 대한 정보를 날씨2 라는 테이블에 저장해 보자

mydb = > select 도시,날짜 into table 날씨2 from 날씨 
 
mydb = > where 날짜  > = '1997/10/1'
 
mydb = >and 날짜  <= '1997/10/3'
 
mydb = >and (최고온도- 최저온도) < 10;
 
SELECT
 
mydb = > select *from 날씨2; 

도시

날짜

대구

10-03-1997

 

2) update

10월 1일 날의 최저온도를 2도 더하고 최고온도를 2도 빼보자

mydb => update 날씨 set 최저온도 = 최저온도 + 2, 최고온도 = 최고온도 -2
 
mydb => where 날짜 = '1997/10/1';
 
UPDATE

3)delete

delete 명령은 내부 데이터를 삭제한다 테이블 전체를 삭제하려면 drop를 써야 한다.

mydb => delete from 날씨2
 
DELETE
 
mydb => select * from 날씨2 ;

도시

날짜

mydb => drop table 날씨2;
 
WARN: 날씨2: Table does not exist.

4) alter

'배기 가스 유출량' 이라는 칼럼을 하나 삽입해보자.

mydb => alter table 날씨 add column 배기가스유출량 int;
 
ADD
 
mydb =>\d 날씨
 
Table = 날씨 

Field

Type

Length

도시

varchar

20

최저온도

int4

4

최고온도

int4

4

강수량

float8

8

날짜

data

4

배기가스유출량

int4

4

mydb =>

현재 PostgresSQL 6.1.1 까지의 버전에는 특정 컬럼을 제거하는 명령은 없다. 6.2 이상에서 컬럼을 제거하려면 제거하고 자하는 컬럼을 제외한 나머지 컬럼을 모두 select 하여 다른 데이블로 저장한 다음 이전 테이블을 삭제하고 , 새로 만든 테이블을 이전 테이블의 명칭으로 변경하면 된다.

5) 전체함수

PostgreSQL는 count , sum, average, max min 과같은 전체함수를 지원한다.

mydb => select max(강수량) from 날씨 ;
 
max
 
-----
 
0.73

6)  psql의 모니터링 명령어

psql 은 libpq 에 기반한 SQL 모니터링 프로그램이다. 여러 가지 다양한 기능을 제공하기 때문에 활용을 해볼 만하다. .
psql 의 내부 모니터링 명령어 중에서 자주 사용하는 것만 설명하겠다. 나머지는 필요에 따라서 \?를 입력하여 살펴보기 바란다.

\? : 도움말
 
\a : 필드 정렬자 토글
 
\C : html3 캡션 설정
 
\c : 데이터베이스에 접속
 
\d : 현재 데이터 베이스의 전체 테이블 또는 특정 테이블 출력
 
\di :데이터 베이스 내부의 인덱스만 출력
 
\ds :데이터 베이스 내부의 시퀀스만 출력
 
\dt :데이터 베이스내부의 테이블만 출력
 
\e : 현재버퍼에 있는 질의어나 파일을 편집
 
\f : 필드 구분자 변경 (보통은 '|')
 
\h : SQL 명령어에 대한 문법적 도움발출력
 
\H : 질의의 결과를 html3 으로 출력할지의 여부 결정
 
\i : 외부 파일에서 질의를 읽어서 실행함
 
\l : 시스템의 모든 데이터 베이스를 출력
 
\p : 현재의 질의 버퍼를 출력
 
\q : 종로
 
\r : 질의 버퍼를 청소
 
\t : 헤더정보와 행의 갯수를 출력할지의 여부결정
 
    \T : html3.0 <Table...> 옵션결정
 
\z : 현재의 허용/취소 권한 출력
 
\! : 쉘 명령어 실행

이중에서 \i 와 \d , \h 정도를 가장 많이 사용하게 될 것이다.

7) psql 외부옵션

psql 모니터링 프로그램은 아주 유용한 외부옵션을 많이 제공한다. 이걸 사용하면 쉘스크립트로 PostgreSQL를 사용한 CGI  프로그램을 간단하게 짤 수 있다.

-c 질의어 : psql  명령행으로 들어가지 않고 질의어만 전달하여 작업할 수 있다. 간단한 PostgreSQL작업에 유용하다.
-d 디비이름 : 접속할 데이터 베이스를 지정한다.
-e : backend로 보낸 질의어를 echo 한다.
- f 파일이름  : psql 내부에서 \i 명령을 사영하듯이, 외부에서도 SQL 질의어가 담긴 파일을 지정하여 실행할 수 있다
-H 호스트 이름 : postmaster 가 수행되고 있는 호스트에 접속한다 기본값은 localhost 이다.
-l : 사용가능한 데이테 베이스 목록을 출력한다.
-n : psql 내부 명령행에서 readline 라이브러리를 사용하지 않는다. 한글입력에 문제가 있을 때 사용할 수 있다.
-p 포트 : postmaster 가 돌아가고 있는 인터넷 tcp 포트를 지정한다. 기본값은 5432이다.
-q : 여러 가지 부가적인 메시지를 출력하지 않도록 한다.
-s : 싱글 스텝모드로 psql을 실행한다.  질의어를 실행하기 전에 엔터키를 한번더 쳐야 한다. 조심해야 할 작업에 사용할 수 있다.
             쉘에서 어떠한 목적으로 psql 내부에 들어가지 않고 작업을 할 수 있다.

$ psql mydb -e -c "select * from 날씨"

다음호에서는 실제적인 업무에서 사용될 법한 좀더 복잡한 데이터 베이스를 PostgreSQL 로 다루어 보면서 활용방안을 살펴보겠다.


'프로그래밍... > PostgreSQL' 카테고리의 다른 글

PostgreSQL with PHP  (0) 2010.01.08
PostgreSQL 설치및 기본 사용법  (0) 2010.01.08
트리거 (Trigger) 예제  (1) 2009.12.31
PL/pgSQL이란?  (0) 2009.12.22
PostgreSQL의 PL/PgSQL 사용법  (0) 2009.12.22
프로그래밍.../PostgreSQL | Posted by 고기킬러 2010. 1. 8. 15:57

PostgreSQL with PHP

PostgreSQL with PHP

HOWTO PostgreSQL
김준석 저

시작하며

컴퓨터에서 데이터베이스란 정보의 저장소를 의미한다. 각종업무에서 데이터베이스가 필
요하고, 워드에서 게임까지 수많은 프로그램에서 데이터베이스가 존재한다. 리눅스에는 이
러한 일을 처리해 줄 데이터베이스가 많다. 그들은 무료일 뿐만 아니라 성능면에서도 탁월
함을 보여준다. 필자는 PostgreSQL을 PHP와 연동해서 사용하는 것을 설명하겠다.
PostgreSQL을 다른 용도로 사용하실 분은 아쉽지만 설치에 대한 정보만 필요할 것이다.

PostgreSQL은 리눅스(유닉스?)용으로 개발된 무료(자유) 데이터베이스이다. 리눅스에서
사용할 수 있는 데이터베이스라면 infomix,mSQL,oracle등이 있을 것이다. 중소규모에서
가장 많이 쓰인다면 MySQL을 들수 있을 것이다. 아쉽지만 PostgreSQL은 속도 면에서는
MySQL보다 떨어지는 것 같다.(보든 분야에서 확실치는 않다.) 하지만 안정성에서는
MySQL보다 앞서는 것 같다.(이 또한 확신 할 수는 없다.)

필자는 국내에 PostgreSQL에 대한 문서가 너무 적은 듯 싶어서 이 문서를 쓰기 시작했다.
쓰면서도 다른 곳에서 정보를 얻기란 정말 어려웠다. www.postgresql.org에 있는 영문
PDF문서를 많이 참고했다. 지금은 많은 부분이 생략된 상태에서 문서를 배포하게 되었다.
설치과정도 소스로 설치하는 부분이 생략되었고, rpm으로 설치하는 부분또한 레드헷에 치
중되어 있다. 또한 PHP, PostgreSQL을 이용하여 게시판을 만드는 부분도 빠졌고, 많은 팁
이나 PostgreSQL관리에 대한 것들 또한 빠져 있다. 이들은 조만간 후에 다시 문서를 배포
할 때 함께 있을 것이다.

본 문서는 PDF로만 배포될 것이며 필자의 허락없이 재배포 할 수 없다. 또한 필자의 문서
를 이용해서 다른 문서를 작성하는 것도 허락하지 않겠다. 다만 PostgreSQL에 지식이 있
고, 좋은 문서를 배포할 수 있게 도와줄 사람이라면 개인적으로 파일을 주겠다. 이 글과
PostgreSQL에 대한 질문은 tozigy.com으로 오셔서하기 바란다.

필자는 본 문서를 작성하면서 윈도우를 사용했다. 따라서 각종 예시 그림들도 윈도우 어플
리케이션일 것이다. 다른 오해가 없기를 바란다.

PostgreSQL with PHP

1 장 PostgreSQL 설치하기

본 문서에는 rpm으로 PostgreSQL을 설치하는 법만 나와있다. 나중에 다시 나올 문서에는
소스를 이용해 설치하거나, 윈도우에서 설치하는 법이 있을 것이다. (필자는 아직까지도
윈도우에서 PostgreSQL설치에 성공한 적이 없다. 아시는 분은 알려주기 바란다.)

rpm으로 설치하기

리눅스에서 프로그램을 설치한다면 크게 두개로 생각할 수 있다. 예전부터 사용된 소스를
이용한 방법과 레드헷 6.1부터 제공된 rpm(Redhat Pakage Manager)을 이용한 설치 방법
이 있다. 여기서는 rpm으로 설치하는 방법으로 하겠다. rpm으로 설치하면 소스를 이용하
여 설치하는 것 보다 편하게 설치,관리 할 수 있다.
www.postgresql.org로 들어와서 FTP미러 사이트에 들어오면 각 배포판에 알맞은 rpm을
구할 수 있다. 국내 유저가 많이 이용하는 ‘와우리눅스’, ‘한컴리눅스’등은 레드헷 기반 rpm
을 받으면 된다. 한국미러는 ftp.kr.postgresql.org로 익명 접속하면 된다.

 
위의 그림과 같이 자신의 배포판에 맞고 원하는 버전의 PostgreSQL을 다운 받으면 된다.
많은 파일 중에서 다음과 같은 파일만 받으면 된다.

postgresql-*-*.*.rpm
PostgreSQL 클라이언트 프로그램과 라이브러리를 포함하는 패키지
postgresql-server-*-*.*.rpm
PostgreSQL Datebase를 형석 작동하기 위한 패키지
postgresql-libs-*-*.*.rpm
PostgreSQL 클라이언트 프로그램과 인터페이스를 위한 라이브러리를 제공하는 패키지

N O T E rpm 파일에 대해서
postgresql-7.2-1PGDG.i386.rpm보통 rpm파일은 위와 같은 형태를 가지고 있다.
postgresql은 프로그램 이름이며 그 뒤에 붙은 것은 각종 정보를 가지고 있다.postgresql -
> 프로그램 이름7.2 -> 버전 이름1PGDG -> 패치 정보i386 -> 하드웨어 플랫폼
(i386,i586,i686)
 
F.A.Q. i386 i486 i586 i686의 차이점
위 NOTE에서 나왔듯이 rpm 패키지 파일에는 i***이라는 것이 붙는다. 이는 rpm을 설치하
기 적합한 하드웨어(CPU)를 알려줍니다. 우리가 흔히 보는 i*86은 인텔 계열이며 sparc은
스팍 리눅스용, alpha는 알파리눅스용을 나타냅니다. i*86에서도 i386 i486등으로 나뉩니
다. i386은 인텔 CPU 386이상의 컴퓨터에 적합합니다. i486은 486에 i586은 펜티엄 초기 중
기, i686은 펜티엄3 이상의 CPU가 적합함을 의미합니다. i386인 rpm은 386이상의 컴퓨터
에 설치가 됩니다. 하지만 i586인 rpm을 386컴퓨터에 설치할려면 예기치 않은 오류가 있을
수 있습니다. 이는 윈도우98용 소프트웨어가 윈도우2000에 설치가 되며 윈도우2000용 소프
트웨어는 윈도우98에 설치가 되지않는것과 비슷한의 의미입니다.

받은 파일을 이용하여 다음과 같이 설치하면 된다. 당연히 root 계정에서 해야한다.

# rpm –Uvh postgresql-*또는#rpm –Uvh postgresql-server-*#rpm –Uvh postgresql-
*#rpm –Uvh posrgresql-libs-*따로 설치할 경우에는 의존성 문제 때문에 순서를 맞추어
야 한다.

다음과 같이 나오면 설치에 성공한 것이다.

 


T.I.P. rpm –q 옵션
rpm 명령어와 q로 시작한 옵션을 이용하여 설치된 패키지의 정보를 알 수 있다. 주로 –qi
와 –ql 옵션을 이용한다.-qi을 이용할 경우 패키지에 대한 자세한 정보가 나온다.-qa을 이
용할 경우 설치된 패키지의 파일들의 경로명이 나온다.


PostgreSQL 서비스 시작하기

 

PostgreSQL 데이터베이스에 접속하고 작업을 시작하기 위해서는 우선 PostgreSQL 데몬
을 시작해야 한다. 다른 데몬과 마찬가지로 PostgreSQL도 rpm으로 설치했을 경우에
는 /etc/init.d/ 폴더 내에 PostgreSQL 데몬을 다루는 스크립트 파일이 생긴다.
따라서 위와 같이 PostgreSQL 서비스를 시작, 중지 할 수 있다. 물론 root일 때만 가능하
다.

서비스 시작하기# /etc/init.d/postgresql start서비스 중지하기# /etc/init.d/postgresql
stop서비스 재시작하기# /etc/init.d/postgresql restart

새 사용자 만들기

처음으로 사용자를 등록하도록 하자. PostgreSQL의 사용자는 리눅스 유저와는 다른 유저
이다. 또한 root가 사용자를 등록할 수는 없다. 새로운 사용자를 등록할려면 우선 사용자
를 Postgres 바꾸어야 한다. (처음에는 비밀번호가 없다.)

 

createuser 유저명 으로 새 사용자를 등록한다. 패스워드까지 같이 등록하는 것은 다음에
다루도록 하겠다. 새 사용자를 등록할 때에는 두가지의 질문이 오른다. 첫번째는 새 사용자
가 앞으로 새 데이터베이스를 만들 수 있게 할지 묻는 것이고, 두번째는 새 사용자가 새 유
저를 만들 수 있게 할지 묻는 것이다. 각자 판단에 의해서 y와 n을 기입하기 바란다. 보통
일반 유저라면 이러한 권한이 필요가 없다.

다음에는 데이터베이스를 만들도록 하자. 간단히 createdb 디비명 으로 만들 수 있다.

PostgreSQL 접속하기

PostgreSQL에 접속한다는 것은 클라이언트 프로그램으로 데이터베이스에 접속한다는 뜻
이다. psql 명령어를 통해서 접속 할 수 있다. 주로 –U 와 –d 옵션을 이용한다. 더 많은 옵
션을 알려면 psql --help 를 참고하면 된다. –U 다음에는 접속할 사용자 아이디를 –d 다음
에는 접속할 데이터베이스를 쓴다. 앞에서 만든 test 데이터 베이스를 tozigy 유저로 접속
할려면 다음과 같이 한다.
 

접속과 동시에 몇가지 단축기능에 대해 설명해 준다. 다음은 그에대한 간략한 설명이다.

copyright postgreSQL의 저작권을 간략히 보여준다.
h SQL명령어에 대한 도움말을 보여준다.
? 로 시작하는 명령어에 대한 도움말을 보여준다.
g 입력한 SQL문을 실행시킨다.
q 데이터베이스에서 빠져 나온다.

?과 h 명령으로 PostgreSQL에서 쓰이는 많은 명령어에 대한 정보를 알 수 있다.

 

T.I.P. h 명령어
PostgreSQL을 쓰면서 따로 정보를 구할 필요 없이 도움말을 통해서도 많은 정보를 얻을
수 있다. 다음은 그림은 h 으로 ALTER TABLE에 대한 정보를 얻는 것을 보여준다. 다음
과 같이 h 이후에 알고싶은 명령어를 붙여주면 그에대한 정보가 나온다.


PostgreSQL with PHP

2 장 PostgreSQL, PHP, Apache 연동하기

아파치,PHP,Mysql(APM)을 연동하여 사용할 수 있듯이 아파치,PHP,PostgreSQL을 연동
하여 웹 서비스를 할 수 있다. 앞에서 먼저 말했듯이 이 문서에서는 리눅스에서 rpm으로 패
키지를 설치하고 새팅하는 것만 다룬다. 윈도우에서 구현하거나, 소스로 설치하는 것들은
앞으로 다시 나올 문서에 포함되어있을 것이다.

F.A.Q. MySQL이 설치되어있는데 PostgreSQL을 설치 할수 있나요?
설치할수 있습니다. 사실 데이터베이스가 한 플랫폼내에 몇 개가 되어도 상관없습니다.(약
간은 과장입니다.) 데이터베이스라는 개념이 많은 정보들을 한곳에 규칙에 따라서 저장하
는 것이기 때문입니다. 웹서버도 윈도우에서 IIS와 APACHE를 같이 돌릴 수 있습니다. 하
지만 디폴트로 시도하면 둘다 포트 80번을 사용하기 때문에 에러가 날 뿐이죠.

아파치와 PHP에서 설치하는 순서는 아파치 &agrave; PHP입니다. PostgreSQL은 아무 때에 설치
해도 됩니다. 중요한 것은 PHP스크립트로 웹에서 PostgreSQL에서 접속하고 SQL문을 실
행할 수 있도록 모듈을 잡아주는 것입니다.

아파치 설치하기

먼저 아파치를 설치합니다. 쉽게 rpm으로 설치하도록 하죠. 필요한 rpm은 설치하신 배포
판 CD에서 찾거나 ftp.bora.net에서 자신에게 맞는 배포판의 rpm을 찾으시면 된다.
apache-*-*.*.rpm 과 apacheconf-*-*.*.rpm 파일이 필요한다.

설치

아파치 시작하기

아파치 데몬을 시작할려면 다음과 같이 하면 된다.

[root@tozigy /]# /etc/init.d/httpd start

/etc/init.d/httpd 파일은 아파치 실행에 대한 스크립트 파일이며 start 데몬을 시작하라는
는 옵션이다. 하지만 분명 다음과 같은 오류가 날것이다.
 

위 그림과 같이 에러가 날것이다. 이는 웹서버의 이름이 설정되어있지 않기 때문이다. 웹서
버는 실행되고 있다. ([확인]이라는 메시지가 떴다.) 아파치 데몬 실행시 이 메시지를 띄우
지 않기 위해서는 아파치 설정파일을 수정해야 한다. 다음과 같은 명령어로 수정할 수 있
다.

[root@tozigy /]# /etc/httpd/conf/httpd.conf

설치한 아파치의 패키지에 따라서 httpd.conf파일의 위치가 다를 수 있다. 위의 것은 레드
헷 계열을 예로 한 것이다. 만약 httpd.conf파일을 찾을 수가 없다면 다음과 같이하면 찾을
수 있다.

[root@tozigy /]# rpm -ql apache | grep conf

 
위의 그림에서 #ServerName localhost라는 부분이 있다. 주석을 제거(#를 제거)하고
localhost부분을 바꾸면 된다. localhost를 그냥 놔두어도 된다. 고정아이피가 있다면 아이
피 주소를 도메인이 있다면 도메인 명을 적어주면 된다. 수정 후 아파치 데몬을 재시작하
면 다음과 같이 에러문 없이 시작된다.

 

N O T E #ntsysv
ntsysv명령어로 리눅스 서버가 부팅 될 때 자동으로 실행될 데몬을 설정할 수 있다. 앞에
서 설치한 아파치 데몬이 부팅시 바로 실행되게 하려면 다음 그림과 같이 httpd 앞에 체크
를 하고 [확인]을 눌러주면 된다.  직접 보면 여러가지의 서비스가 있는 것을 확인할 수 있
다. 잘 모르는 서비스라면 F1를 누르면 그림과 같이 그 서비스에 대한 설명이 나온다.

웹서버가 실재로 잘 돌아가는지 확인해 보자. 웹브라우저로 서버에 접속해 본다.

 

다음과 같은 페이지가 출력되면(설치한 아파치 패키지에 따라 다를 수 있다.) 성공적으로
웹서버를 구축한 것이다. 페이지 내용을 자세히 보면 여러가지 정보를 얻을 수 있다.

PHP 설치하기

다음에는 PHP를 설치해 보죠. 필요한 rpm은 위에서 아파치관련 패키지를 구했던 방법으
로 구한다. 필요한 파일은 php-*-*.*.rpm 이며 중요한 것은 php-pgsql-*-*.*.rpm 파일이
필요하다. php-pgsql-*-*.*.rpm 파일은 PHP스크립트를 이용하여 PostgreSQL에 접속,
SQL 쿼리문등을 실행 할수 있게 해준다. 파일을 받은 이후에 php-*-*.*.rpm &agrave; php-pgsql-
*-*.*.rpm 순서로 패키지를 설치한다. PHP는 설치한 이후에는 위의 아파치와 같이 따로 데
몬을 실행시킬 필요가 없다. 단지 PHP가 잘 설치되어 있는지는 다음과 같이 알아 볼수 있
다.

php파일 하나를 다음과 같이 작성한다. (/var/www/html 디렉토리 내에 간단히 test.php
라고 만들자.)

<?phpinfo();?>

그리고 웹 브라우저로 확인한다. 다음과 같은 결과가 나올 것이다.

 

중간에 다음과 같은 메시지가 있으면 Apache, PHP, PostgreSQL 연동 준비가 끝난 것이
다. 이제 본격적으로 PHP과 PostgreSQL을 다루는 법을 알아보자.

 

F.A.Q. MySQL도 서비스 할려면?
위에서 한번 언급했듯이 PostgreSQL과 MySQL을 동시에 운영할 수 있다. 우선 MySQL서
버를 설치하고 위에서 했듯이 데몬을 시작한다. 그리고 PHP스크립트로 PostgreSQL에 접
속하기 위해서 php-pgsql-*-*.*.rpm 파일을 설치했듯이 php-mysql-*-*.*.rpm 파일을 받
아서 설치하면 된다.

F.A.Q. 그림 #@$와 같은 결과가 안나옵니다.
PHP가 PostgreSQL을 지원하도록 설정을 해야 합니다. 우선 /etc/php.ini파일을 수정합니
다. 파일에 다음과 같은 부분이 있으면 주석(;)을 제거하도록 합니다.;extension=pgsql.so
그리고 아파치 데몬을 다시 시작해 봅니다.

PostgreSQL with PHP

3 장 PostgreSQL지원 PHP 함수

본 문서에서는 PHP의 PostgreSQL지원 함수에 대한 설명만 있다. 이 함수들을 이용하여
게시판을 만드는 과정은 이후에 나올 새 문서에 포함되어 있을 것이다.

pg_connect()

pg_connect()함수를 이용하여 PostgreSQL에 접속할 수 있다. PHP와 PostgreSQL 이용
하여 작업을 하려면 우선적으로 pg_connect()함수를 이용하여 해당 데이터베이스에 접속
을 해야한다.

예시 1-1
1234 <?$dbconn = mysql_connect (“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);?>

예시 1-2
12345 <?$dbconn = pg_connect (“dbname=test”);$dbconn1=pg_connect
(“user=tozigy password=security dbname=test”);$dbconn2=pg_connect
(“dbname=test”) or die (“not connected!”);?>

mysql_connect(예시 1-1)와 pg_connect(예시 1-2)는 사용법이 조금 다르다.
mysql_connect는 서버명,사용자이름,패스워드를 따옴표를 구분해서 나열한다. 하지만
pg_connect는 각각 따로 인수에 값을 대입해 주는 형식을 취한다. 또한 mysql에서는 원하
는 데이터베이스에 접속하기 위해서 mysql_connect() 다음에 mysql_select_db를 써야한
다. 하지만 PostgreSQL에서는 pg_connect하나로 해결 할 수 있다. 예시 1-2를 보자. 2번
라인은 가장 간단한 접속법이다. 디비이름만 지정해 주었다. 보통은 3번 라인을 쓴다. 사용
자이름, 패스워드, 디비이름을 지정해 준다. 각각 인수는 한칸씩 띄워서 구분한다. 4번 라
인은 접속에 실패 했을 경우 “not connected!”라는 에러메시지를 출력하게 한다.

T.I.P. config.inc.php
일반적으로 데이터베이스 연결 부분은 따로 파일은 만들어 관리한다. 이유는 보안상 안전
해 질수 있고 작업도 좀더 효율적으로 할 수 있기 때문이다. config.inc.php 파일은 그러한
파일의 대표적인 이름이다(바꾸어도 상관없다). config.inc라고도 쓰지만 서버에서 확장자
가 inc인 파일이 PHP스크립트로 지정되지 않은 경우 웹상에서 직접 config.inc파일을 불러
오면 스크립트 내용을 전부 출력하는 문제가 있다. 따로 파일을 만들고 후에 불러들일 때
는 include를 사용하면 된다.

N O T E pg_connet와 사용가능한 인수
dbname : 데이터베이스 , port : 포트번호 , host : 호스트명 , tty :  , options :  , user : 유
저명 , password : 비밀번호

pg_close()

pg_close()함수는 pg_connect로 연결된 PostgreSQL의 연결을 끊는 것이다. 불필요한 연
결이 계속 지속된다면 그만큼 서버 시스템에 부하를 많이 주는 것이다. pg_close()로 연결
을 끊는 습관을 가지는 것이 좋다.

예시 2-1
123456 <?$dbconn = mysql_connect (“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);mysql_close($dbconn); // mysql_close()
만 써도 된다.?>

예시 2-2
12345 <?$dbconn = pg_connect (“dbname=test”);pg_close($dbconn); //
pg_close() 만 써도 된다.?>

위의 예제와 같이 mysql_close()와 pg_close()는 사용법이 같다. 물론 postgreSQL에 연
결되지 않은 상태에서 위 함수를 사용하면 에러가 출력된다. 함수내 서버 연결 인자를 써야
하나 쓰지 않더라도 작동한다. 만약 데이터베이스 연결이 여러 개라면 한번에 접속을 종료
하게 된다.

F.A.Q. pg_close()를 반듯이 써야 하나요?
일반적으로 PHP 스크립트가 끝이나면 PHP 스스로 데이터베이스 연결을 종료한다. 따라
서 pg_close()를 사용하지 않아도 상관이 없다. 하지만 습관적으로 사용하는 것이 좋다.

pg_exec()

PHP스크립트로 PostgreSQL의 SQL문을 실행시킬려면 pg_exec()함수를 사용한다.
pg_exec()함수에 인자로 들어갈수 있는 SQL문은 PostgreSQL에서 사용가능한 거의 모든
SQL문이 해당된다. MySQL에서 유사 함수는 mysql_query()이다.

예제 3-1
123456 <?$dbconn = mysql_connect (“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = “select * from test”;$query =
mysql_query($sql,$dbconn);?>

예제 3-2
12345 <?$dbconn = pg_connect(“dbname=test”);$sql = “select * from
test”;$query = pg_exec($dbconn,$sql);?>

mysql_query와 pg_exec의 사용법은 같다. 하지만 주의해야 할점은 접속지시자의 위치가
다르다는 것이다. mysql_connect와 같은 경우에는 접속 지시자가 SQL문 다음에 오지만
pg_connect에서는 SQL문 전에 위치한다. 이는 MySQL을 다루다가 처음으로
PostgreSQL을 접하는 사람이 하기 쉬운 실수 중 하나이다. 앞으로 pg_exec함수를 가장
많이 보게될 것이다. 하지만 이 함수는 독자적으론 아무것도 할 수 없다. 다음에 나오는 다
른 함수와 잘 조합을 해야한다.

T.I.P. SQL쿼리문은 따로 작성하자.
예제 3-1의 2번 라인을 보자. sql쿼리문을 따로 변수로 만들어 두었다. 물론 2,3번 라인을
같이 붙여서 $query = mysql_query(“select * from test”); 라고 해도 된다. 하지만 위의 예
제와 같이 따로 만드는 습관을 가지는 것이 좋다. 나중에 다시 작업할 때나 공동작업을 할
때 훨씬 효율적이기 때문이다.


pg_numrows()

pg_numrows()함수를 이용해서 구하고자하는 열의 숫자를 알아낼 수 있다. 즉, 테이블에
서 SELECT문을 이용해서 추려낸 자료들의 수를 구할 수 있다는 것이다. MySQL에서의 유
사 함수는 mysql_num_rows()이다. pg_numrows()와는 달리 num과 row사이에 언더바(_)
가 더 있다.

예제 4-1
1234567 <?// 데이터 베이스 연결 생략$sql = “select * from test”;$result =
mysql_query($sql,$dbconn);$num = mysql_num_rows($result);echo $num;?>

예제 4-2
1234567 <?// 데이터 베이스 연결 생략$sql = “select * from test”;$result = pg_exec
($dbconn,$sql);ㄴ$num = pg_numrows($result);echo $num;?>

mysql_num_rows함수와 pg_numrows함수의 사용법은 같다. 이 함수를 통해서 회원수, 등
록된 게시물 수를 구할 수 있다. SELECT문의 조건절만 잘 이용한다면 원하는 수의 값을
구할 수 있다.

T.I.P. SQL쿼리문을 이용한 열의 수 구하기
pg_numrows()함수를 SQL 쿼리문을 이용하여 구현할 수 있다. SELECT COUNT()를 이용
하는 것이다. psql> SELECT COUNT(*) from table; 이라고 하면 등록된 자료의 수를 알아
낼수 있다. 조건 절만 잘 이용하면 원하는 데이터를 구할 수 있다. 이 수를 뒤에서 나올 함
수를 통해서 변수에 값을 넣으면 된다. SELECT문에서 COUNT말고 MAX와 같은 다른 것
들도 있다. 이는 h SELECT 로 알수 있다.

pg_fetch_row()

pg_fetch_row()함수를 이용해서 테이블에서 특정한 데이터를 구할 수 있다. 이 함수는 유
사한 다른 함수와 달리 숫자를 인덱스로 하는 배열로 가져온다. 아마 그냥 이해하기는 힘들
것이다. 다음의 예시를 통해 알아보자. MySQL에서 유사함수는 mysql_fetch_row()이다.

예시 5
test=# select * from class; class  | female | male ------+------+----- A    |  13  | 
20 B    |  12  |  25(2 rows)
앞에서 만든 다음과 같은 테이블 값을 이용하도록 하자.

예시 5-1
12345678 <?$dbconn = mysql_connect(“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = "select * from class";$result =
mysql_query($sql,$dbconn);$row = mysql_fetch_row($result,0);echo $row[0];?>

예시 5-2
1234567 <?$dbconn = pg_connect ("dbname=test user=tozigy");$sql = "select *
from class";$result = pg_exec($dbconn,$sql);$row = pg_fetch_row($result,0);echo
$row[0];?>

mysql_fetch_row()와 pg_fetch_row()함수의 사용법은 같다. 위의 소스의 결과물은 문자 A
이다. 예시 5-2을 기준으로 살펴보자. 5번 라인에서 마지막에 0이라는 숫자가 있다. select
할때 위에서 첫번째 행을 의미하는 것이다. (예시 5을 참고) 6번째 라인에도 0이라는 숫자
가 있다. 여기서는 0번째 열을 의미한다.

0(class) 1(female) 2(male)
0 A 13 20
1 B 12 25
다음과 같은 도표로 이해할 수 있다. 숫자의 시작은 1이 아니라 0이다. B반의 남자 수를 구
할려면 2번째 열, 3번째 행이므로 위의 예시 1-2(5-6번 라인)는 다음과 같이 바뀌어야 한
다.
$row = pg_fetch_row($result,0);echo $row[0];

실재로는 숫자를 인덱스로하는 pg_fetch_row()보다 필드명을 인덱스로 하는
pg_fetch_array()를 더 많이 이용한다.

pg_fetch_array()

위의 pg_fetch_row()함수와 비슷한 역할을 한다. 테이블의 행을 배열로 가져온다. 다은 점
은 pg_fetch_row()에서 배열의 인덱스가 숫자인 반면에 pg_fetch_array()에서는 필드명이
인덱스가 된다는 것이다. 즉, 위에서 $row[0]가 pg_fetch_array()에서는 $row[“class”]
가 된다. MySQL에서 유사함수는 mysql_fetch_array()이다.

예시 6-0
test=# select * from class; class | female |  male -----+------+------ A    |    13 | 
20 B    |    12 |  25(2 rows)

예시 6-1
12345678 <?$dbconn = mysql_connect(“localhost”,”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = "select * from class";$result =
mysql_query($sql,$dbconn);$row = mysql_fetch_row($result,0);echo $row[class];?>

예시 6-2
1234567 <?$dbconn = pg_connect ("dbname=test user=tozigy");$sql = "select *
from class";$result = pg_exec($dbconn,$sql);$row = pg_fetch_array($result,0);echo
$row[“class”];?>

mysql_fetch_array()와 pg_fetch_array()함수의 사용법은 비슷하지만 주의해야 할 점이 있
다. 예시 6-1의 7번 라인과 예시 6-2의 각 6번라인을 비교해 보자. pg_fetch_array() 함수
를 쓸 경우에는 ‘[ ]’안에 해당 필드명을 썼을 때 따옴표 안에 넣어야 한다.

N O T E pg_fetch_array()에서도 숫자를 배열의 인덱스로 사용할 수 있다.
pg_fetch_array()에서는 pg_fetch_row()와 같이 숫자를 인덱스 값으로 넣어도 된다. 예시
6-2 6번 라인에서 $row[“class”]대신에 $row[0]을 써도 된다는 것이다.


pg_fetch_object()

위에서 다룬 pg_fetch_row(), pg_fetch_array()와 같은 역할을 한다. 하지만 다른점은
pg_fetch_object()에서는 함수 이름에서도 알 수 있듯이 오브젝트로 데이터를 가져온다는
것이다. pg_fetch_row(), pg_fetch_array()가 행의 값들을 배열로 가져오는 반면에
pg_fetch_object()는 오브젝트로 가져온다. MySQL에서 관련 함수는 mysql_fetch_object
()이다.

예시 7-1
12345678 <?$dbconn = mysql_connect ("localhost",”tozigy”,”
security”);mysql_select_db(“test”,$dbconn);$sql = "select * from class";$result =
mysql_query($sql,$dbconn);$row = mysql_fetch_object($result,0);echo $row->class;?
>


예시 7-2
1234567 <?$dbconn = pg_connect ("dbname=test user=tozigy");$sql = "select *
from class";$result = pg_exec($dbconn,$sql);$row = pg_fetch_object($result,0);echo
$row->class;?>

mysql_fetch_object와 pg_fetch_object 두 함수의 사용법은 같다. 위의 결과물도 “A”로 같
다. 이전의 pg_fetch_row, pg_fetch_array와 다른점은 구하고자하는 행의 값을 오브젝트
의 형태로 가져온다는 것이다. 따라서 예시 7-2의 6번 라인 처럼 $row->class라는 방식으
로 값을 출력할 수 있다. 이때 class자리에는 원하는 값의 필드명을 적어야 하며 숫자로 해
서는 안된다. 즉 pg_fetch_row()에서 $row[0]와 같이 $row->0 이런 식으로 하면 에러가
난다는 것이다.
pg_fetch_array(), pg_fetch_row(), pg_fetch_object()는 서로 비슷한 역할을 한다. 그리고
속도의 차이도 미미하다. 이 세가지 중 어떤걸 택해서 사용하는가는 여러분에게 달려있다.
[이 게시물은 관리자님에 의해 2007-01-04 18:41:36 팁앤테크에서 복사 됨]

'프로그래밍... > PostgreSQL' 카테고리의 다른 글

PostgreSQL 설치 및 기본 사용법  (0) 2010.01.08
PostgreSQL 설치및 기본 사용법  (0) 2010.01.08
트리거 (Trigger) 예제  (1) 2009.12.31
PL/pgSQL이란?  (0) 2009.12.22
PostgreSQL의 PL/PgSQL 사용법  (0) 2009.12.22
프로그래밍.../PostgreSQL | Posted by 고기킬러 2010. 1. 8. 13:39

PostgreSQL 설치및 기본 사용법


PostgreSQL 설치및 기본 사용법



PostgreSQL 의 공식 사이트 http://www.postgresql.org/




최근 postgresql 의 사용이 늘어나는 추세이니 발빠른 서버관리자들은 이미 사용법을 익히고 있을 것으로 판단됩니다만
언제나 모르는 사람은 있는법. 딱 서버관리자가 알아야 할 만큼만의 내용을 써 보겠습니다.

서버관리자가 해야 하는것은 크게 나누면 설치, 관리, 튜닝, 백업, 리스토어,검색,삭제 정도라고 볼 수 있지요.
그렇기 때문에 최소한 모든 프로그램의 사용법을 그 분야의 전문가 수준은 아니더라도 어느수준이상을 알고 있어야 합니다.
언제 써먹을지도 모르지만 말이죠.

그럼 시작하겠습니다.



1)설치
PostgreSQL 을 rpm 으로 설치하는것은 그냥 설치만 하면 자동으로 다 알아서 만들어주고 처리해 주니 소스설치에 대한
부분만 설명하고 넘어가겠습니다.

공식 다운로드 배포처는 postgresql.org 입니다만 여러곳에서 링크하고 있으니 다운 받으시면 되구요.
postgresql-7.3.2.tar.gz 버전으로 설명을 하도록 하겠습니다.

첫째로 압축을 해제하구요.





[root@ora local]# tar xvfzp postgresql-7.3.2.tar.gz
postgresql-7.3.2/
postgresql-7.3.2/config/
postgresql-7.3.2/config/libtool.m4
postgresql-7.3.2/config/java.m4
postgresql-7.3.2/config/ac_func_accept_argtypes.m4


......주루륵............


postgresql-7.3.2/README
postgresql-7.3.2/configure.in
postgresql-7.3.2/configure
postgresql-7.3.2/register.txt
[root@ora local]#






풀리고 나면 압축이 풀린 폴더로 들어갑니다.



[root@ora local]# cd postgresql-7.3.2
[root@ora postgresql-7.3.2]# ls
COPYRIGHT       INSTALL   aclocal.m4  configure.in  register.txt
GNUmakefile.in  Makefile  config      contrib       src
HISTORY         README    configure   doc
[root@ora postgresql-7.3.2]#




설정파일을 시스템에 맞도록 갱신하는 작업을 합니다.
수많은 옵션이 있지만 추후에 ./configure --help 로 확인하기로 하고 우선 필요한 설치폴더 설정과
멀티바이트를 지원하도록 합니다.



[root@ora postgresql-7.3.2]# ./configure --prefix=/usr/local/pgsql --enable-multibyte
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking which template to use... linux
checking whether to build with 64-bit integer date/time support... no
checking whether to build with recode support... no
checking whether NLS is wanted... no


.......주루륵......................


config.status: linking ./src/backend/port/dynloader/linux.h to src/include/dynloader.h
config.status: linking ./src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking ./src/makefiles/Makefile.linux to src/Makefile.port
[root@ora postgresql-7.3.2]#






설정이 무리없이 끝나면 make 와 make install 을 합니다.



[root@ora postgresql-7.3.2]# make ; make install
make -C doc all
make[1]: Entering directory `/usr/local/postgresql-7.3.2/doc'
gzip -d -c man.tar.gz | /bin/tar xf -
for file in man1/*.1; do
  mv $file $file.bak &&

....................

And, so that we have an idea of who is using what, please connect to the
following registration URL:

        http://www.pgsql.com/register/submit.php


Thank you for choosing PostgreSQL, the most advanced open source database
engine.


[root@ora postgresql-7.3.2]#







설치가 다 되었으면 이제 설치된 폴더로 이동합니다.



[root@ora postgresql-7.3.2]# cd /usr/local/pgsql/
[root@ora pgsql]# ls
bin  doc  include  lib  man  share
[root@ora pgsql]# cd bin
[root@ora bin]# ls
clusterdb   dropdb    initdb        pg_controldata  pg_encoding   postgres
createdb    droplang  initlocation  pg_ctl          pg_id         postmaster
createlang  dropuser  ipcclean      pg_dump         pg_resetxlog  psql
createuser  ecpg      pg_config     pg_dumpall      pg_restore    vacuumdb
[root@ora bin]#






데이터베이스를 초기화 하고 작동시키기전에 현 postgresql 을 가동할 권한자를 생성합니다.



[root@ora bin]#adduser -d /usr/local/pgsql postgres
[root@ora bin]# mkdir /usr/local/pgsql/data
[root@ora bin]# chown -R postgres.postgres /usr/local/pgsql/
[root@ora bin]#






그런다음 데이터베이스를 초기화 하기위하여 postgres 계정으로 로그인 한 후 데이터베이스를 초기화합니다.



[root@ora bin]# su - postgres
[postgres@ora pgsql]$
[postgres@ora pgsql]$ ls
bin  data  doc  include  lib  man  share
[postgres@ora pgsql]$ cd bin
[postgres@ora bin]$ ls
clusterdb   dropdb    initdb        pg_controldata  pg_encoding   postgres
createdb    droplang  initlocation  pg_ctl          pg_id         postmaster
createlang  dropuser  ipcclean      pg_dump         pg_resetxlog  psql
createuser  ecpg      pg_config     pg_dumpall      pg_restore    vacuumdb
[postgres@ora bin]$ ./initdb  /usr/local/pgsql/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 ko_KR.euckr.
This locale setting will prevent the use of indexes for pattern matching
operations.  If that is a concern, rerun initdb with the collation order
set to "C".  For more information see the Administrator's Guide.

Fixing permissions on existing directory /usr/local/pgsql/data/... ok
creating directory /usr/local/pgsql/data//base... ok
creating directory /usr/local/pgsql/data//global... ok
creating directory /usr/local/pgsql/data//pg_xlog... ok


...........략................


Success. You can now start the database server using:

    ./postmaster -D /usr/local/pgsql/data/
or
    ./pg_ctl -D /usr/local/pgsql/data/ -l logfile start

[postgres@ora bin]$






라고 하고 기본데이터베이스가 생성됩니다.

데이터베이스를 가동시켜 보도록 합니다.


[postgres@ora bin]$ ./postmaster -D /usr/local/pgsql/data/ &
[1] 723
[postgres@ora bin]$ LOG:  database system was shut down at 2003-05-26 11:43:55 K
ST
LOG:  checkpoint record is at 0/8018FC
LOG:  redo record is at 0/8018FC; undo record is at 0/0; shutdown TRUE
LOG:  next transaction id: 480; next oid: 16976
LOG:  database system is ready

[postgres@ora bin]$ ps ax|grep post
  351 pts/0    S      0:00 su - postgres
  723 pts/0    S      0:00 ./postmaster -D /usr/local/pgsql/data/
  724 pts/0    S      0:00 postgres: stats buffer process
  726 pts/0    S      0:00 postgres: stats collector process
  728 pts/0    S      0:00 grep post
[postgres@ora bin]$




데이터베이스가 작동된것이 확인 됩니다.

로그인 해 보죠.,




[postgres@ora bin]$ ./psql template1
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

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

template1=#






'template1=#' 이것이 postgresql의 명령어 대기쉘입니다.

우선은 postgres 의 패스워드를 변경하고 postgresql 을 패스워드 모드로 작동하게 하겠습니다.
postgresql 은 기본적으로 아무 사용자가 접근가능한 모드로 작동이 되더군요.이유는 모르겠습니다.
제가 잘못 안 것일 수도 있고..--a..

패스워드를 먼저 변경하도록 하지요.




template1=# alter user postgres with password '1234';
ALTER USER
template1=# select*from pg_user;
usename  | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig
----------+----------+-------------+----------+-----------+----------+----------+-----------
postgres |        1 | t           | t        | t         | ******** |          |
(1 row)

template1=#






그리고 일단 빠져나온 후 /usr/local/pgsql/data 폴더로 이동하여 pg_hba.conf 파일을 열어서 아래의 내용을 바꿉니다.




template1=# q
[postgres@ora bin]$ cd ../data/
[postgres@ora data]$ ls
PG_VERSION  global   pg_hba.conf    pg_xlog          postmaster.opts
base        pg_clog  pg_ident.conf  postgresql.conf  postmaster.pid
[postgres@ora data]$vi pg_hba.conf








pg_hba.conf 파일의 내용중

==============================================================================
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD

local   all         all                                             trust
host    all         all         127.0.0.1         255.255.255.255   trust
==============================================================================

==============================================================================
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD

local   all         all                                             password
host    all         all         127.0.0.1         255.255.255.255   password
==============================================================================


위와같이 trust -> password 로 바꾸어 준 뒤 저장합니다.


그리고 데이터베이스를 재시동 하고 로그인 해 봅니다.


[postgres@ora data]$ cd ../bin
[postgres@ora bin]$ ./pg_ctl restart -D /usr/local/pgsql/data/
waiting for postmaster to shut down....LOG:  smart shutdown request
LOG:  shutting down
.LOG:  database system is shut down
.done
postmaster successfully shut down
postmaster successfully started
[postgres@ora bin]$ LOG:  database system was shut down at 2003-05-26 12:12:45 KST
LOG:  checkpoint record is at 0/81402C
LOG:  redo record is at 0/81402C; undo record is at 0/0; shutdown TRUE
LOG:  next transaction id: 569; next oid: 16977
LOG:  database system is ready

[postgres@ora bin]$ ./psql template1
Password: ****
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

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

template1=#

'프로그래밍... > PostgreSQL' 카테고리의 다른 글

PostgreSQL 설치 및 기본 사용법  (0) 2010.01.08
PostgreSQL with PHP  (0) 2010.01.08
트리거 (Trigger) 예제  (1) 2009.12.31
PL/pgSQL이란?  (0) 2009.12.22
PostgreSQL의 PL/PgSQL 사용법  (0) 2009.12.22

Apache, MySQL, PostgreSQL, PHP 컴파일 옵션

내가 주로 사용하는 APM 컴파일 옵션.

MySQL

./configure --prefix=/opt/mysql \
--localstatedir=/opt/mysql/data \
--with-unix-socket-path=/tmp/mysql.sock \
--sysconfdir=/etc \
--with-mysqld-user=mysql \
--with-big-tables \
--with-plugins=innobase \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static \
--without-debug \
--enable-assembler \
--with-charset=utf8 \
--with-collation=utf8_general_ci \
--with-extra-charsets=all \
--with-gnu-ld

PostgreSQL

./configure --prefix=/opt/pgsql --with-ldap --with-libxml --with-openssl --with-gnu-ld

옵션은 다음과 같다
.

 --prefix : 기본적으로 대부분의 소스가 ./configure make;make install을 하면 /usr/local 이나 특정위치로 설치된다.그렇게 되면 추가 파티션 이동이나 프로그램 파일 백업 등에 에러사항이 발생한다. 이경우 유지보수,관리를 위해 prefix 를 이용해서 특정위치로 설치되게 지정해준다. PostgreSQL MakfeFile 에서는 uninstall 을 지원한다
 --enable-integer-datetimes enable 64-bit integer date/time support : 64Bit 숫자,날짜,시간지원여부로 일반적으로는 필요하지 않다.
 --enable-nls[=LANGUAGES] : 시스템의 각종 출력 메세지에 대한 나라별 언어 지원으로 8.0 부터는 DSN PostgreSQL 에서도 한글 메세지와 에러로그를 볼 수 있다. 이 옵션은 복수 선택이 가능하며, 디폴트로 추후 선택하거나 상황에 따라 Database 별로 설정 가능하다.
        
지원 되는 NLS 종류 : http://developer.postgresql.org/~petere/nlsstatus/#t8.0-branch 
         
다중선택시 --enable-nls='ko de' 같이 설정합니다.
--disable-shared : PostgreSQL 컴파일 시 공유라이브러리와 함께 컴파일하지 않겠다는 부분으로 하지않으면 성능은 좀 향상될수 있으나 상황에 따라 에러가 발생하는 시스템이 많을 것으로 기본적으로 사용하지 않기를 권장한다.
--enable-depend : 소스컴파일 시 의존성이 있는 파일이나 라이브러리에 대한 체크를 하는것으로 포함하지 않으면, 컴파일 속도는 다소 빨라지지만 현재의 주류 시스템에서는 체크를 해서 안전사용하는것도 좋은 예이다
--enable-thread-safety : PostgreSQL Muti-Thread 기반이 아니며, Prefork 방식으로서 각종 Client 등에서 Muti-Thread 동작 접근 시의 안전성을 위한것으로 각종 Cluster Pooler 들은 Muti-Thread 로 접근되어 추가를 요구하니 추가해준다. V8.0 부터는 디폴트값이다.
--enable-thread-safety-force : --enable-thread-safety 를 추가 하였는데 Thread Safe Test 에서 에러가 발생하였지만 에러는 그냥 무시하고 컴파일 할 때 필요한것으로 에러가 발생하면 에러원인을 찾아 주는것니 오동작을 막을 수 있다.
--with-docdir=DIR
--without-docdir : Man Page 의 설치 관련 옵션으로 기본적으로 옵션을 주지 않으면 설치위치의 doc 디렉토리에 설치되지만 --without-docdir Man Page 설치를 하지 않거나 --with-docdir 를 사용하여 특정위치로 설치가 가능하다.
--with-pgport=PORTNUM : PostgreSQL의 기본 Service Port 5432 이나 만약에 외부에서 접근이 이루어지거나 하는 경우에는 변경을 해주는것이 좋다. 따로 설정파일에서도 변경이 가능하다.
--with-tcl
--with-tclconfig=DIR : Procedure Language TCL 을 사용 시 옵션추가, 따로 설치 위치는 주지 못하며, 자동 검색을 한다. 원할경우 소스수정이 이루어져야한다.
--with-perl : Procedure Language Perl 을 사용 시 옵션추가, 따로 설치 위치는 주지 못하며, 자동 검색을 한다. 원할경우 소스수정이 이루어져야한다.
--with-python : Procedure Language Python 를 사용 시 옵션추가, 따로 설치 위치는 주지 못하며, 자동 검색을 한다. 원할경우 소스수정이 이루어져야한다.
--with-krb4
--with-krb5 : Kerberos 를 통한 접속 인증 시스템 사용을 원할 때에 추가(버전에 따라 추가) 한다.
--with-pam : PAM(Pluggable Authentication Modules) 사용을 원할 때 추가한다.
--with-rendezvous : Apple Rendezvous 인증처리를 원할 때 추가한다.
--with-openssl : SSL 인증처리를 원할 때 추가한다.
--without-readline : Command History 기능을 사용하지 않을때 추가한다.
--without-zlib : Zlip 사용을 하지 않을 시 추가 (내부에서 압축관련 알고리즘이 필요) 한다.
--with-includes=DIRS : --with-openssl, --with-python 등 자동검색하는 항목이 있는데 이의경우 prefix 등으로 따로 설치하였거나 특정위치의 C Header 파일을 참조하게 하고 싶을 때 추가한다. ) --with-includes=/usr/local/ssl/include:/usr/local/python/include
--with-libraries=DIRS : --with-includes와 같이 Library 위치를 지정하고 싶을 때 사용한다. --with-includes, --with-libraries 로 설정하면 configure 단계에서 우선적으로 참조한다. ) --with-libraries=/usr/local/ssl/lib:/usr/local/python/lib 


Apache

./configure --prefix=/opt/httpd \
--enable-modules=so \
--enable-module=shared \
--enable-mods-shared=all \
--enable-so \
--enable-ssl \
--enable-rewrite \
--enable-rule=SHARED_CORE \
--enable-mods-shared=ssl \
--with-ssl \
--with-mpm=prefork


PHP

./configure \
--prefix=/opt/php \
--with-apxs2=/opt/httpd/bin/apxs \
--with-config-file-path=/opt/httpd/conf  \
--with-mysql=/opt/mysql \
--with-pgsql=/opt/pgsql \
--with-pdo-mysql=/opt/mysql \
--with-pdo-pgsql=/opt/pgsql \
--disable-debug \
--enable-bcmath \
--enable-calendar \
--enable-dbase \
--enable-exif \
--enable-force-cgi-redirect \
--enable-ftp \
--enable-gd-native-ttf \
--enable-magic-quotes \
--enable-mbregex \
--enable-mbstring \
--enable-mod-charset \
--enable-sigchild \
--enable-soap \
--enable-sockets \
--enable-wddx \
--enable-zip \
--with-bz2 \
--with-curl \
--with-freetype-dir=/usr \
--with-gd \
--with-gdbm=/usr \
--with-gettext \
--with-iconv  \
--with-imap \
--with-imap-ssl  \
--with-jpeg-dir=/usr \
--with-kerberos  \
--with-ldap \
--with-libexpat-dir \
--with-libxml-dir \
--with-mcrypt \
--with-openssl \
--without-sqlite \
--with-png-dir=/usr \
--with-snmp \
--with-ttf \
--with-xmlrpc \
--with-zlib \

'프로그래밍... > Linux' 카테고리의 다른 글

CentOS 리눅스 웹 서버 구축  (0) 2009.12.22
리눅스 명령어 (T~Z)  (0) 2009.12.21
리눅스 명령어 (O~S)  (0) 2009.12.21
리눅스 명령어 (H~N)  (0) 2009.12.21
리눅스 명령어 (A~G)  (0) 2009.12.21
프로그래밍.../PostgreSQL | Posted by 고기킬러 2009. 12. 31. 15:26

트리거 (Trigger) 예제


SQL : TRIGGER : TRIGGER.

 

-- [0] 트리거 연습용 테이블 생성
-- DROP TABLE dbo.[구매테이블]

CREATE TABLE dbo.[구매테이블]
(
 CustomerID int, ProductID int, Quantity int
)
GO


-- DROP TABLE dbo.[재고테이블]
CREATE TABLE dbo.[재고테이블]
(
 ProductID int,
 Quantity int
)
GO

 

-- [1] 재고테이블에 1번, 2번 제품을 10개 넣어 놓음(가상)
INSERT [재고테이블] VALUES(1, 10)
INSERT [재고테이블] VALUES(2, 10)
SELECT * FROM [재고테이블]

 

-- [2] 구매가 한번 이루어지면 자동으로 구매테이블에서 감소시키는 트리거 작성
CREATE TRIGGER [자동재고감소]
ON [구매테이블]
FOR INSERT
AS
 UPDATE [재고테이블] SET Quantity = Quantity -1
 PRINT '재고테이블에서 1개 감소했습니다.'

 

-- [3] 구매 테이블에 INSERT문을 실행시켜본다.
INSERT [구매테이블] VALUES(1,1,1)

 

-- [4] 트리거에의해 재고테이블의 모든 필드값이 자동으로 감소됨을 알 수 있다.
SELECT * FROM [재고테이블]

 

-- [5] 트리거를 수정해보자: 구매개수만큼 줄이도록 수정
ALTER TRIGGER [자동재고감소]
ON [구매테이블]
FOR INSERT
AS
 DECLARE @ProductID int, @Quantity int
 SET @ProductID = 0
 SET @Quantity = 0
 SELECT @ProductID = ProductID, @Quantity = Quantity
 FROM INSERTED  --INSERTED에 의해서 입력된 데이터 받아옴

 UPDATE [재고테이블] SET Quantity = Quantity - @Quantity
 WHERE ProductID = @ProductID
GO

 

-- [6] 1번 제품만을 1개 감소
INSERT [구매테이블] VALUES(1,1,1)
SELECT * FROM [재고테이블]

 

-- [7] 2번 제품만을 3개 감소
INSERT [구매테이블] VALUES(1,2,3)
SELECT * FROM [재고테이블]

 

-- [8] 트리거 삭제
DROP TRIGGER [자동재고감소]

 

-- [!] [자동재고감소]와 동일한 기능을 하는 입력 저장 프로시저
Create Procedure dbo.[자동재고감소프로시저]
 @CustomerID  Int,
 @ProductID    Int,
 @Quantity   Int
As
Begin Tran
 Insert [구매테이블]
 Values
 (
  @CustomerID,
  @ProductID,
  @Quantity
 )

 UPDATE [재고테이블]
 SET Quantity = Quantity - @Quantity
 WHERE ProductID = @ProductID

 Select * From [재고테이블]
Commit Tran
Go

Exec [자동재고감소프로시저] 1, 1, 1

'프로그래밍... > PostgreSQL' 카테고리의 다른 글

PostgreSQL with PHP  (0) 2010.01.08
PostgreSQL 설치및 기본 사용법  (0) 2010.01.08
PL/pgSQL이란?  (0) 2009.12.22
PostgreSQL의 PL/PgSQL 사용법  (0) 2009.12.22
PostgreSQL 언어의 사용법 (PL/PgSQL)  (0) 2009.12.22
보물들../DSLR(1000D) | Posted by 고기킬러 2009. 12. 28. 14:05

산지 꾀 됐지만 나름 나의 보물



사진 좀 찍어 볼라고 구입했던 캐논 1000d!! 하지만 렌즈 값의 압박으로 기본 렌즈로 이것 저것 찍고 다니는 카메라.... 돈 많이 벌면 좋은 렌즈 달아줄께 ㅠㅠ 좀만 참으렴...

iPhone 에서 작성된 글입니다.
보물들../아이폰(IPhone) | Posted by 고기킬러 2009. 12. 28. 14:01

귀여운 아이폰 테마 -picnic-



많은 테마들을 받아봤지만 이만한게 없는듯... picnic 추천입니다~

iPhone 에서 작성된 글입니다.

'보물들.. > 아이폰(IPhone)' 카테고리의 다른 글

내 핸드폰 바탕화면  (0) 2009.12.23
나도 아이폰이다!!  (0) 2009.12.15
프로그래밍.../PHP | Posted by 고기킬러 2009. 12. 28. 13:52

cURL 이란??? (PHP)

차례
1. cURL이란?
2. cURL의 장점
3. cURL의 함수 설명
4. 기초사용법
5. 옵션 설명
6. cURL의 활용




1. cURL이란?

- cURL = Client URL
- cURL은 아래와 같은 프로토콜 등에 의해 전송되는 파일들을 위한 command line tool이다.
   FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE
-  SSL, HTTP POST, HTTP PUT, FTP uploading, HTTP form기반의 upload, proxies, cookies, user+password인증도 제공한다.
- cURL은 무료이며, 많은 운영체제에서 컴파일되고 동작하는 open software이다.
- command line tool을 이용하거나
- libCURL을 이용할 수 있다.

아래는 원문이다.
 curl is a command line tool for transferring files with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks.

Curl is free and open software that compiles and runs under a wide variety of operating systems.

 Use the cURL command line tool or use libcurl from within your own programs.

[what can curl do]의 내용을 참조하기 바란다.(http://curl.haxx.se/docs/features.html)


2. cURL의 장점
- cURL의 PHP설정의 allow_url_fopen옵션과 상관 없이 작동한다.
- Proxy, Cookie, Header등을 손쉽게 세팅할 수 있다.
- 다양한 프로토콜의 사용이 가능하여 개발의 범위가 넓다.
- 핸들러 하나로 여러개의 접속을 할 수 있기 때문에 코딩을 단순화 할 수 있다.

3. cURL의 함수 설명
 
-curl_close —URL handle  을 닫습니다.
-curl_copy_handlecURL handle 을 속성채로 복사합니다.
-curl_errno에러번호를 리턴합니다.
-curl_error  에러메세지를 리턴합니다.
-curl_exec  설정된옵션으로 실행합니다.
-curl_getinfo통신의 정보를 표시합니다.
-curl_initcURL handle 을 생성합니다.
-curl_multi_add_handle  handle  배열에 cURL handle  을 추가합니다
-curl_multi_closecURL handle 배열 전체를 닫습니다.
-curl_multi_exec  여러 개의 설정된옵션으로 실행합니다.
-curl_multi_getcontent  통신결과 컨텐츠를 표시합니다.
-curl_multi_info_read통신 정보들을 표시합니다.
-curl_multi_init여러 개의 handle 을 생성합니다.
-curl_multi_remove_handle여러 개의 handle  을 삭제합니다.
-curl_multi_select  여러 개의 handle  중 사용할 handle  을 선택합니다.
-curl_setopt_array옵션을 배열로 한번에 설정합니다.
-curl_setopt한가지의 옵션을 설정합니다.
-curl_version  cURL의 버젼정보를 가져옵니다.


4. 기초사용법

<?php
//핸들을 생성한다.
$ch = curl_init();


//URL을 설정한다.
curl_setopt($ch, CURLOPT_URL, http://www.naver.com/);

//실행한다.
$html = curl_exec($ch);

//핸들을 닫는다.
curl_close($ch);
?>


5. 옵션 설명

옵션 설명을 시작하기 전에...

sample.php
<?
if($a != "x")
header("Location:sample.php?a=x");
else{
?>
<pre>
webTech입니다.
<? print_r($_SERVER); ?>
<? print_r($_COOKIE); ?>
</pre>
<?
}
?>


출력 결과(IE)
webTech입니다.
Array
(
    [HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
    [HTTP_ACCEPT_LANGUAGE] => ko
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    [HTTP_HOST] => 192.168.0.43
    [HTTP_CONNECTION] => Keep-Alive
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => 
Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch Server at 192.168.0.43 Port 80
[SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch [SERVER_NAME] => 192.168.0.43 [SERVER_ADDR] => 192.168.0.43 [SERVER_PORT] => 80 [REMOTE_ADDR] => 192.168.0.59 [DOCUMENT_ROOT] => /var/www/web_index [SERVER_ADMIN] => webmaster@localhost [SCRIPT_FILENAME] => /home/bridge/public_html/sample.php [REMOTE_PORT] => 5576 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => a=x [REQUEST_URI] => /~bridge/sample.php?a=x [SCRIPT_NAME] => /~bridge/sample.php [PHP_SELF] => /~bridge/sample.php [REQUEST_TIME] => 1257858849 [argv] => Array ( [0] => a=x ) [argc] => 1 ) Array ( )
5.1 CURLOPT_FOLLOWLOCATION
 
CURLOPT_FOLLOWLOCATION의 값을 TRUE로 설정하면 서버가 HTTP 헤더로 보내는 "Location :"헤더의 내용을 추한다. (이것은 반복적으로 수행됩니다. CURLOPT_MAXREDIRS가 지정되지 않은 경우, 보내는 "Location : "헤더의 내용을 계속 추적 함에 주의해야 한다.)

sample2.php
echo("기본형");
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, http://localhost/sample.php);
$html = curl_exec($ch);


echo("return " . $html);

curl_close($ch);

결과
기본형
return 1

위의 소스는 sample.php의 소스에서 [sample.php?a=x]로 이동하라고 되어 있지만, 이동하지 않는 다는 것을 알 수 있다.

그럼 CURLOPT_FOLLOWLOCATION옵션을 TRUE로 설정 해보면...

sample3.php
echo("CURLOPT_FOLLOWLOCATION 옵션 예제");
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, http://localhost/sample.php);
curl_seropt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$html = curl_exec($ch);


echo("return " . $html);

curl_close($ch);

결과
CURLOPT_FOLLOWLOCATION 옵션 예제
webTech입니다.
Array
(
    [HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
    [HTTP_ACCEPT_LANGUAGE] => ko
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    [HTTP_HOST] => 192.168.0.43
    [HTTP_CONNECTION] => Keep-Alive
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => 
Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch Server at 192.168.0.43 Port 80
[SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.2 with Suhosin-Patch [SERVER_NAME] => 192.168.0.43 [SERVER_ADDR] => 192.168.0.43 [SERVER_PORT] => 80 [REMOTE_ADDR] => 192.168.0.59 [DOCUMENT_ROOT] => /var/www/web_index [SERVER_ADMIN] => webmaster@localhost [SCRIPT_FILENAME] => /home/bridge/public_html/sample.php [REMOTE_PORT] => 5576 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => a=x [REQUEST_URI] => /~bridge/sample.php?a=x [SCRIPT_NAME] => /~bridge/sample.php [PHP_SELF] => /~bridge/sample.php [REQUEST_TIME] => 1257858849 [argv] => Array ( [0] => a=x ) [argc] => 1 ) Array ( )

return 1

위에 보는 것 처럼 [sample.php?a=x]로 이동한 것을 알 수 있다.

5.2 CURLOPT_AUTOREFERER
 CURLOPT_AUTOREFERER의 값을 TRUE로 설정하면, LOCATION: 리디렉션을 따라갈 때 자동으로 Referer:필드를 요청에 추가 한다.




[출처] 웹테크 - http://webtech.tistory.com