원래 쓴 사람 : 앤드류 C.R. 마틴
(martin@biochem.ucl.ac.uk)
우리말로 옮긴 사람 : 정직한
(honest@hitel.net)
warning: cast from pointer to integer of different size1.8) [SuSE-Linux 4.2-4.4] curses 와 termcap 이 어디에 있나요?
yacc -d /disk2/PostgreSQL/src/backend/parser/gram.y make: /usr/bin/make: cannot execute binary file1.13) src/Makefile.global 의 X11_LIB 에 있는 libsocket 과 libnsl 로의 레퍼런스는 무엇입니까?
In file included from /usr/include/sys/sem.h:8, from ipc.c:37: /usr/include/asm/bitops.h:32: warning: no previous prototype for Set_bit' .... make: *** [ipc.o] Error 11.17) postgres, gcc 를 컴파일하면 signal 11 이 발생되고 중단됩니다.
_fUnKy_POSTPORT_sTuFf_ undefined3.2) postmaster 를 실행시키고 나면 'Bad system call(Core dumped) 라는 메시지가 나옵니다.
Failed Assertion("!(file != 0):(null)", File: "/usr/local/PostgreSQL/src/backend/storage/file/fd.c", Line: 257) !(file != 0) (0) initdb: could not create template database initdb: cleaning up.3.4) createuser 가 왜 작동하지 않나요?
IpcMemoryCreate: memKey=155356396 , size=760632 , permission=384IpcMemoryCreate: shmget(..., create, ...) failed: Invalid argument3.6) psql 이 이런 메시지와 함께 종료되고 맙니다
psql: can't load library 'libpq.so.1'3.7) 기타 이상한 증상들
그 외에 해주어야 할 것이라고는 만일 Flex 의 버전 2.5.3 을 가지고 있을 경우에 Flex 를 대치해주는 것입니다. 2.5.3. 버전은 createuser 명령을 수행하지 못합니다. (질문 3.4 를 보세요)
수작업으로 makefile 들을 고친다면
PORTNAME= linux다음 환경변수도 설치하는 환경에 맞게 설정해 주어야 합니다.
POSTGRESDIRUSE_TCL 옵션을 켜놓는다면 다음 변수들도 설정해야 합니다.
TCL_INCDIR= TCL_LIBDIR= TCL_LIB= TK_INCDIR= TK_LIBDIR= TK_LIB= X11_INCDIR= X11_LIBDIR= X11_LIB=슬랙웨어 3.0 을 사용한다면 아마 이렇게 될 것입니다.
TCL_INCDIR= /usr/include/tcl TCL_LIBDIR= /usr/lib TCL_LIB= -ltcl TK_INCDIR= /usr/include/tcl TK_LIBDIR= /usr/lib TK_LIB= -ltk X11_INCDIR= /usr/include/X11 X11_LIBDIR= /usr/X386/lib X11_LIB= -lX11INSTALL 파일과 Makefile.global 에 적혀있는대로 다른 변수들도 알맞게 설정해 주어야 할 것입니다.
데비안 리눅스는 FreeBSD 와 마찬가지로 readline 라이브러리가 기본으로 설치되어 있습니다.
libdl 라이브러리는 런타임에 사용자제공 함수를 동적으로 링크하기 위해 사용됩니다. 어떤 이유에선지 레드햇 리눅스에는 이것이 빠져 있습니다. 레드햇 4.0 (Colgate) 에서는 고쳐졌습니다.
레드햇 사에서는 새로운 ld.so RPM 패키지를 자사의 FTP 사이트에 올려놓았습니다. 다음 파일을 참고하세요.
ftp://ftp.redhat.com/pub/redhat/devel/i386/RedHat/RPMS/ld.so-1.7.14-4.i386.rpm평소와 같은 방법으로 RPM 파일을 인스톨하시면 만사 OK!
주의! 라이브러리를 설치한 후 재컴파일을 하기 전에 configure 를 다시 실행하고서 처음부터 make 를 해야 합니다.
(놀라운 일은 아닙니다만) 라이브러리를 업데이트하고 있는 도중에 프로그램이 라이브러리를 건드리면 시스템이 깨질 수 있다는 보고가 있습니다 (one report of corrupted system) 새 라이브러리를 설치하기 전에 시스템을 리부트 시키고 업그레이드가 이루어지고 있는 중에는 될 수 있으면 프로그램을 실행시키지 않는 것이 좋습니다. 단일사용자 모드로 작업을 하는 것도 좋은 생각입니다.
어려운 방법을 쓰고 싶다면 다음 장소에서 라이브러리와 헤더파일을 구할 수 있습니다.
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ld.so-1.7.14.tar.gz다른 방법으로는 이미 컴파일되어 있는 바이너리 파일을 같은 사이트의 /distributions/debian/buzz/binary-i386/base/ld.so-1.7.14-4.deb 에서 찾을 수 있습니다. 아니면 질문 1.2 의 설명에 따라 슬랙웨어 3.1 의 이전 릴리즈에 있던 동일한 에러를 잡는 방법을 사용할 수도 있습니다. 확실히 자신있는 것이 아니라면 이 방법은 사용하지 않는 것이 좋습니다.
질문 1.3 의 답을 보세요. 슬랙웨어 버전 3.0 까지는 이 라이브러리가 포함되어 있었고, 버전 3.1 의 후기버전에도 역시 포함되어 있지만 초기의 3.1 릴리즈 (1996년 9월 9일 이전 것) 에는 빠져 있으며 많은 CD-ROM 버전들이 초기의 3.1 릴리즈로 제작되었습니다. (놀라운 일은 아닙니다만) 라이브러리를 업데이트하고 있는 도중에 프로그램이 라이브러리를 건드리면 시스템이 깨질 수 있다는 보고가 있습니다 (one report of corrupted system) 새 라이브러리를 설치하기 전에 시스템을 리부트 시키고 업그레이드가 이루어지고 있는 중에는 될 수 있으면 프로그램을 실행시키지 않는 것이 좋습니다. 단일사용자 모드로 작업을 하는 것도 좋은 생각입니다.
가장 쉽게 이 문제를 해결하는 방법은 최근의 슬랙웨어 배포판의 a4 디스크에 있는 ldso.tgz 파일을 가져다가 루트(/) 디렉토리에 풀고, 다음 명령어를 실행하는 것입니다.
sh install/doinst.sh설치를 완료하려면 다음을 실행하세요.
ldconfig주의! 라이브러리를 설치한 후 재컴파일을 하기 전에 configure 를 다시 실행하고서 처음부터 make 를 해야 합니다.
수동으로 설치하고 싶다면 먼저 dlfcn.h 를 /usr/include 에 설치해야 합니다.
그런 다음, libdl.so.1.7.14 (가장 최근버전이면 됩니다) 를 /lib 에 설치합니다. 그리고 다음의 명령을 실행하세요.
cd /lib어떤 시스템에서는 (GCC 설정에 따라 다릅니다) 다음 작업을 해주어야 합니다.
ln -sf libdl.so.1.7.14 libdl.so.1
ln -sf libdl.so.1 libdl.so
cd /usr/lib마지막으로 다음을 실행하세요
ln -sf /lib/libdl.so .
ldconfig주의! 라이브러리를 설치한 후 재컴파일을 하기 전에 configure 를 다시 실행하고서 처음부터 make 를 해야 합니다.
src/Makefile.global 을 편집하여 CFLAGS_SL 의 값을 바꾸면 문제를 해결할 수 있습니다.
warning: cast from pointer to integer of different sizePostgres95 의 초기버전에서는 이런 메시지가 나왔으나 무시해도 되는 것이없습니다. PostgreSQL 6.0 에서는 시스템 헤더파일들에 관련된 것들을 (이것 역시 무시해도 되는 것입니다) 제외하고는 이런 메시지가 나오지 않아야 합니다.
LDADD_BE+= -L/usr/lib/termcapsrc/bin/psql/Make 를 편집하여 다음 항목을 수정해야 할 수도 있습니다.
ifeq ($(PORTNAME), linux) LD_ADD+=이것을 아래과 같이 바꾸세요.
ifeq ($(PORTNAME), linux) LD_ADD+= -ltermcapPostgreSQL( V6.1 ) ---------------------- 설정(configure) 스크립트는 termcap 라이브러리가 /usr/lib/termcap 에 있다는 것을 알지 못합니다. 따라서 사용자는 추가 검색할 디렉토리를 물어올 때 /usr/lib/termcap 이 라이브러리 디렉토리라는 것을 명시해 주어야 합니다. 이 방법이 효과가 없다면 (필자에게 SuSE 가 없어서 검사해 보지 못했습니다) configure 를 실행한 후, src/Makefile.global 을 편집하여 LDFLAGS 가 있는 줄의 -lreadline 뒤에 -ltermcap 을 추가해 주어야 합니다. (아니면, configure 를 실행시키기 전에 src/Makefile.custom 을 수정해 주어도 됩니다) SuSE 의 어떤 버전은 ncurses 만을 제공하므로 curses 대신 ncurses 를 사용하도록 강제적으로 -lcurses 를 -lncurses 로 바꿔주어야 합니다. (SuSE 5.1 에서 그렇다는 보고가 있습니다)
Linux/libs/dld.3.2.7.tar.gz ( ftp://sunsite.unc.edu/pub/Linux/libs/dld.3.2.7.tar.gz)그런 다음, src/Makefile.custom 에 아래의 내용을 추가하세요.
LINUX_ELF=(커스터마이즈하는 스크립트를 사용해도 됩니다)
yacc -d /disk2/PostgreSQL/src/backend/parser/gram.y make: /usr/bin/make: cannot execute binary filePostgres95 의 초기버전에서 있었던 문제입니다. PostgreSQL 은 기본적으로 yacc 가 아니라 bison -y 를 사용합니다.
yacc 는 일반적으로 bison -y 를 부르는 스크립트로 구현된다. 어떤 이유에선지 make 가 이 스크립트를 실행시키지 못한다. (make 의 어떤 버전인지? bash 의 어떤 버전인지?) 이 문제를 해결하기 위해서는 src/mk/port/postgres.mk.linux 를 열어 마지막 줄의
#YACC = bison -y를
YACC = bison -y로 바꾸어 줍니다.
src/bin/psql/Makefile 을 편집하여 다음 줄을 변경해 주세요.
ifeq ($(PORTNAME), linux)이것을 다음과 같이 변경합니다
LD_ADD+= -ltermcap
ifeq ($(PORTNAME), linux)
LD_ADD+=
이것은 미리 컴파일되어있는 버전이며 소스 RPM 은 글을 쓰는 시점에 있는 위치입니다. (1997년 2월 3일)
In file included from /usr/include/sys/sem.h:8, from ipc.c:37: /usr/include/asm/bitops.h:32: warning: no previous prototype for Set_bit' .... make: *** [ipc.o] Error 1리눅스가 해당 인라이니 함수들에 대해 프로토타입을 제공하지 않기 때문에 생기는 문제입니다. 이 문제를 해결하려면 .../src/backend/storage/ipc 디렉토리에 있는 Makefile 을 편집하여 다음과 같이 변경을 해주어야 합니다.
CFLAGS+=$(INCLUDE_OPT)이것을 아래와 같이 바꿉니다.
CFLAGS+=$(INCLUDE_OPT) -Wno-error../src/backend/storage/lmgr 디렉토리에서도 동일한 작업을 해주세요.
gcc: Internal compiler error: program cc1 got fatal signal 11하드웨어 내지 메모리 문제인 것 같습니다. PostgreSQL 은 매우 큰 프로그램이며 gcc 에서 큰 프로그램을 컴파일하는 것은 (PostgreSQL 을 컴파일하거나 커널을 리빌드하는 등) 메모리에 굉장한 부하를 주게 되며, 정상적인 상황에서는 일어나지 않는 에러를 발생시킬 수도 있습니다. 상대적으로 작은 운영체제들은 하드웨어를 그정도까지 혹사시키지 않기 때문에 도스나 윈도우즈에서는 경험하지 못하는 문제일 수 있습니다.
이 문제에 대한 자세한 정보는 다음 장소에서 구할 수 있습니다.
http://www.bitwizard.nl/sig11이곳에 있는 Sig11 FAQ 에 따르면, 레드햇 5.0 의 gcc 를 사이릭스 프로세서에서 돌릴 때 특정한 문제가 생기는 것 같습니다. 더 자세한 것은 위의 URL 을 참조하세요.
ftp://ftp.sra.co.jp/pub/cmd/postgres/6.1.1/mklinux.patch.gz
CFLAGS+= -m486아니면 (아직 많이 사용되고 있지 않은 새 컴파일러에서는)
CFLAGS+= -mpentium또는
CFLAGS+= -mpentiumpro
X11_LIBDIR = /usr/X11R6/lib
_fUnKy_POSTPORT_sTuFf_ undefinedPostgres 버전 1.06에서 1.07사이에 있었던 문제입니다. 버전 1.08 이상에서는 수정되었습니다.
Failed Assertion("!(file != 0):(null)", File: "/usr/local/PostgreSQL/src/backend/storage/file/fd.c", Line: 257) !(file != 0) (0) initdb: could not create template database initdb: cleaning up./dev/null 에 대한 퍼미션이 잘못되어 있습니다.
ls -l /dev/null 을 실행시키면 다음과 비슷하게 보일 것입니다.
crw-rw-rw- 1 root wheel 2, 2 Oct 8 18:41 /dev/null퍼미션을 다음과 같이 바꾸어 주세요.
chmod a+rw /dev/null
ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz
IpcMemoryCreate: memKey=155356396 , size=760632 , permission=384IpcMemoryCreate: shmget(..., create, ...) failed: Invalid argument리눅스 커널이 IPC 지원을 제외한 채 컴파일 되었습니다. 커널을 다시 빌드하면서 이 옵션을 켜야 합니다.
psql: can't load library 'libpq.so.1'Psql 이 libpq 라이브러리와 동적으로 연결되도록 컴파일되어 있습니다.
이 문제를 해결하려면 root 로 로긴해서 다음 파일을 편집해야 합니다.
/etc/ld.so.conf마지막 줄에 PostgreSQL 라이브러리 디렉토리 (PostgreSQL 이 설치된 곳의 lib 서브디렉토리) 를 알려주는 내용을 추가한 후, 다음을 실행시킵니다.
/sbin/ldconfig -v다른 방법으로는 (예를 들어 root 권한을 가지고 있지 않다면) LD_LIBRARY_PATH 환경변수를 사용할 수도 있습니다.
LD_LIBRARY_PATH 환경변수는 공유 라이브러리를 검색할 경로의 목록을 콜론(:)으로 구분해서 가지고 있습니다. 이 목록은 ldconfig 에 의해 지정된 라이브러리를 검색하기 전에 먼저 참조됩니다.
Bash 에서는 다음과 같이 합니다.
export LD_LIBRARY_PATH='PathToPGSQL'/libtcsh 를 사용한다면
setenv LD_LIBRARY_PATH 'PathToPGSQL'/lib'PathToPGSQL' 을 적절한 사용자의 PostgreSQL 설치 디렉토리로 바꾸면 됩니다.
ldd 명령을 사용하면 동적으로 연결되는 실행파일이 사용하는 공유라이브러리들의 경로명을 목록으로 볼 수 있습니다.
그래서, postmaster 를 rc 스크립트에서 기동시키는 방법을 추천합니다. 슬랙웨어 계열의 릴리즈에서는 /etc/rc.d/rc.local 을 편집하여 포스트마스터를 기동시킬 것입니다. 레드햇 계열에서는 /etc/rc.d/init.d 스켈리튼 파일을 기초로 하여 /etc/rc.d/rc3.d 에 SysV 스타일의 스크립트를 만들어야 합니다.
contrib/linux/postgres.init 에 샘플 파일이 있습니다.
존 로빈슨이 제공한 샘플을 제시합니다. 필요에 따라 수정해서 쓰세요.
#!/bin/sh # # postgreSQL.init This shell script takes care of starting and stopping # the PostgreSQL postmaster. # # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 # See how we were called. case "$1" in start) # Start daemons. echo -n "Starting postgres Postmaster daemon:" if [ -z "`pidofproc postmaster`" ] then su postgres -c "/usr/local/pgsql/bin/postmaster -D /home/postgreSQL/data -p 5432 &" echo -n " postmaster" else echo -n " (already running)" fi echo touch /var/lock/subsys/postgres ;; stop) # Stop daemons. echo -n "Shutting down postgres Postmaster daemon: " killall -TERM postmaster 2>/dev/null killall -TERM postgres 2>/dev/null echo rm -f /var/lock/subsys/postgres ;; *) echo "Usage: postgres {start|stop}" exit 1 esac exit 0
time postgres -texecutor -tplanner -Q bench < bench.sql를
postgres -texecutor -tplanner -Q bench < bench.sql로 바꾸면 됩니다. 2. 테스트를 실행시킨 후, bench.out 의 마지막에 다음과 같은 줄을 삭제하세요.
85.86user 114.47system 4:49.20elapsed 69%CPU (0avgtext+0avgdata 0maxresident)k그리고 다음을 입력하세요.
sh ./perquery < bench.out > & bench.out.perquery