프로그래밍.../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에서 설치하는 순서는 아파치 à 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 à 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