9월, 2017의 게시물 표시

PostgreSQL extension 사용 방법

PostgreSQL 에서는 extension 이라는 기능을 제공한다.
여러 extension 들이 존재하고,
extension 들을 사용해서 PostgreSQL 에서 제공하지 않는 추가적인 기능을 사용할 수 있다.

예전에 소스 컴파일을 통해서 PostgreSQL 을 설치했었다.
그 소스 디렉토리로 이동한다.
그 디렉토리 안에 contrib 디렉토리가 있다.
그 디렉토리 안에 들어가면 여러 extension 들이 있다.
PostgreSQL 에 설치해 보자.

% make

% make install

아래 디렉토리에 많은 extension 들이 설치된걸 확인할 수 있다.
$PG/share/extension
$PG/lib

많은 extension 들이 있지만, 그 중에서 pageinspect 를 예를 들어보겠다.
extension 을 사용하기 위해 등록을 해야 한다.
(만약 다른걸 사용하고 싶다면, pageinspect 대신에 해당 extension 을 입력하면 된다)

postgres=# create extension pageinspect;

CREATE EXTENSION

잘 작동하는지 확인해본다.

postgres=# select * from heap_page_items(get_raw_page('pg_class',0));

postgres=# select * from heap_page_items(get_raw_page('pg_class',0));
 lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff |              t_bits
         | t_oid |
                                                                 t_data

----+--------+----------+--------+--------+--------+----------+-…

PostgreSQL 쿼리 결과를 세로로 보기

PostgreSQL 에서 쿼리를 입력하면, 결과내용이 기본적으로 가로로 출력된다.

postgres=# select * from pg_class;
                 relname                 | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relp
ages | reltuples | relallvisible | reltoastrelid | relhasindex | relisshared | relpersistence | relkind | relnatts | relchecks | relh
asoids | relhaspkey | relhasrules | relhastriggers | relhassubclass | relrowsecurity | relforcerowsecurity | relispopulated | relrepl
ident | relfrozenxid | relminmxid |                             relacl                             |       reloptions
-----------------------------------------+--------------+---------+-----------+----------+-------+-------------+---------------+-----
-----+-----------+---------------+---------------+-------------+-------------+----------------+---------+----------+-----------+-----
-------+------------+-------------+----------------+----------------+----------------+---------------------+----------------+------…

컬럼(column), 필드(field), 로우(row), 레코드(recode) 차이점

파일 시스템 데이터베이스 모델링 관계형 데이터베이스 파일(file) 엔터티(Entity) 테이블(table) 레코드(record) 튜플(Tuple) 행(row) 키(key) 유일값(identifier) 기본키(Primary key), unique 필드(field) 어트리뷰트(attribute) 컬럼(column)


출처
http://blog.naver.com/PostView.nhn?blogId=classe82&logNo=20153660200

PostgreSQL DDD 연결 (3)

이미지
이제 진짜로, DDD 를 사용해서 PostgreSQL 을 실행시켜보자.

% cd $PG/bin

% ddd postgres


잘 로딩되었다.
brackpoint 도 잘 작동하는지 확인해 보자.

(gdb) b main


잘 된다.
실제로 저기에서 멈추는지 확인해 보자.

(gdb) run


잘 멈춘다.
다음 명령어로 이동하는지 확인해 보자. (next)

(gdb) n


잘 이동한다.
화살표가 현재 실행중인 위치를 표시해준다.
나머지 명령어들을 쭉 수행해 본다. (continue)

(gdb) c


이제 DDD 를 사용해서 PostgreSQL 을 디버깅 할 수 있게 되었다.



출처
나의 삽질

PostgreSQL DDD 연결 (2)

이미지
먼저 DDD 를 설치한다.

% yum install ddd

만약 성공적으로 설치되면 다행인데, 안되는 경우도 있다.

나 같은 경우는 머신을 2개를 사용중인데, 한쪽은 되는데, 다른 한쪽은 안된다.
이유를 모르겠다.
뭐 열심히 파보면 알 수도 있겠지만, 귀찮아서 그냥 말았다.

만약 안되는 경우, 소스를 사용해서 설치하는 방법에 대해 적어본다.

다운로드 아래 경로에 가서 소스를 다운로드 한다.
https://centos.pkgs.org/7/puias-unsupported-x86_64/ddd-3.3.12-20.sdl7.x86_64.rpm.html

사이트에 가면 아래와 같은 항목이 있는데, 다운로드 하면된다.
Source package: ddd-3.3.12-20.sdl7.src.rpm

만약 잘 못 찾겠으면, 그냥 아래 링크를 통해 다운로드 한다.
http://springdale.math.ias.edu/data/puias/unsupported/7/SRPMS/ddd-3.3.12-20.sdl7.src.rpm

압축해제 다운로드 한 rpm 파일을 압축해제 한다.

% rpm2cpio ddd-3.3.12-20.sdl7.src.rpm | cpio -idv
위 명령에 대한 자세한 설명은, 구글에서 "rpm 압축해제" 라고 검색하면 나온다.
설정 컴파일을 하기 전에 설정을 먼저 해야 한다. 설정은 일반적으로 configure 를 사용해서 한다.

% ./configure --prefix=$HOME/ddd
prefix 에 자신이 설치하고 싶은 디렉토리를 넣어주면 된다.
configure 진행 중 에러가 발생했다.

configure: error: The X11 library '-lX11' could not be found.
                  Please use the configure options '--x-includes=DIR'
                  and '--x-libraries=DIR' to specif…

PostgreSQL DDD 연결 (1)

이미지
DDD 가 뭐유?
DDD 가 뭔지 설명하기 전에, 먼저 말해야할 내용이 있다.

리눅스(유닉스)에서 전통적인 디버깅 방법에는 printf 가 있다.
엄청난 노가다와 printf 만 있으면, 사실 뭐든 디버깅 못할거는 없다.

그러나, 노가다는 많이 힘든 일이다.
그래서, 그 노가다의 수고를 덜어주기 위해, gdb 라는 것이 생겼다.
gdb 는 runtime 환경에서 디버깅을 도와주는 아주 훌륭한 툴이다.

그러나, 사람의 욕심은 끝이없다.
gdb 는 훌륭한 도구임에도 불구하고,
command 를 직접 입력해야 하고, visual 하게 보이지 않아서 불편하다는 불만을 받았다.

그래서 DDD (Data Display Debugger) 라는 것이 생겼다.
아래 그림처럼 디버깅을 visual 하게 작업할 수 있도록 도와준다.
command 를 직접 입력할 수 있고, 마우스를 사용해서 작업을 할 수도 있다.
변수들의 관계도 그림으로 나타내주기도 하니까, 유용한 도구이다.


"그래픽이 구리네요"
"작동은 제대로 하는 프로그램인가요"
"벌레 아이콘이 너무 못 생기고 징그러워요"
DDD 도 여러가지 불만을 받았다.
역시, 사람의 욕심은 끝이없다.

DDD 가 좋은 툴이긴 하나, 꼭 이걸 사용할 필요는 없다.
디버깅을 위한 다른 좋은 도구들이 있을테니, 취향대로 골라 사용하면 될듯하다.

나는 개인적으로 유용하게 사용한 툴이라서, 별 거부감이 없다.
그래서 PostgreSQL 을 DDD 로 연결해 보기로 했다. (다음편에 계속)

※ DDD 는 내부적으로 결국 gdb 를 사용해서 디버깅을 해준다.
   그러므로 시스템에 gdb 가 반드시 설치되어 있어야 하고,
   gdb 명령어를 그대로 사용하면 된다.



출처
https://www.gnu.org/software/ddd

HTTP 오류 404.3 - Not Found 해결 방법

이미지
컴퓨터에 Windows 10 이 설치되어 있었다.
그리고 자료를 공유하기 편하게 IIS 를 사용해서 http 를 열었다.

그런데 파일을 클릭해서 다운로드 하려고 하니까,
HTTP 오류 404.3 - Not Found 어쩌구 하면서 에러가 발생한다.


뭐지? 하면서 구글링을 했다.
다행히 나와 같은 문제를 겪고, 해결한 사람이 있다.

web.config 파일에 아래 내용을 추가하면 된다.

  <system.webServer>
      <staticContent>
            <mimeMap fileExtension=".확장자명" mimeType="application/octet-stream" />
        </staticContent>
  </system.webServer>

아마도 <system.webServer> 는 있을 것이다.
그러므로 그 안에 <staticContent> 구문을 넣어주면 된다.

web.config 가 어딨는지 모른다고요?
특별한 뻘짓을 하지 않았다면,
기본 폴더 위치가 C:\inetpub\wwwroot 이므로 그곳에 있을 것이다.
만약 바꿨다면 그 해당 폴더로 가면된다.



출처
http://blog.daum.net/joata/6682509

PostgreSQL gdb 디버그

이제 설치도 다 하고, 실행도 다 해봤으니, 휴~ 하고 안심하고 있었다.
그런데 옆에 분이 디버그로 해봤냐고 물어보셨다.
아! 디버그 접속을 안 해봤구나!
나의 임무를 망각하고 있었다.
내 임무는 PostgreSQL 을 디버그 해서 분석하는건데.....
디버그로 PostgreSQL 을 실행해 보도록 한다.

먼저 $PG 디렉토리를 삭제해야 한다.
왜냐하면 그거는 release 로 빌드 되어 있기 때문이다.

혹시라도 release 된 파일로 디버그를 하려고 하면 아래와 같이,
심볼테이블이 없다는 에러가 나올 것이다.
No symbol table is loaded.  Use the "file" command.

암튼 처음부터 다시 진행하자.

기존 파일들을 삭제한다.
% rm -rf $PG

postgresql-9.6.5.tar.gz 압축을 해제한 디렉토리로 이동한다.
특별한 뻘짓을 하지 않았다면,
그 디렉토리에 기존에 빌드되어 있는 파일들이 있다. (오브젝트 파일들)
그러므로 그 파일들을 지워줘야 한다.
% make clean

configure 설정에 추가적인 옵션을 지정한다.
% ./configure --prefix=$PG --enable-debug
그 다음은 동일하다.
% make
% make install

$PG 디렉토리가 새롭게 생긴것을 볼 수 있다.
그리고 DB 도 새롭게 생성해 준다.
% initdb -D $PG/data

자, 이제 디버깅을 해보자.
% gdb postgres

GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is …

PostgreSQL 접속

설치, 실행까지 잘 했으니 이제 PostSQL 에 접속을 해보자.
그런데 막상 접속을 하려고 하면 아래와 같은 에러가 발생한다.

% psql psql: FATAL:  database "ck0911.kim" does not exist
psql 을 사용해서 접속을 할때에는, 사용할 DB 를 명시해 줘야 한다. 만약 명시해 주지 않으면 기본적으로 사용자ID 와 동일한 DB 에 접속을 시도한다. 사용자ID 와 동일한 이름의 DB 를 생성한 적이 없으니 에러가 발생한 것이다.
DB 를 생성해 줘도 되지만, 그건 다음에 하기로 하고, 일단 initdb 를 할때 기본적으로 생성된 DB 에 접속하기로 한다.
% psql postgres
잘 작동하는지 테이블을 만들어 보도록 한다.
postgres=# create table t1 ( i1 char(10) );
만들었으면, 테이블을 조회해 보도록 한다. \d 명령어를 사용하면 확인해 볼 수 있다.
postgres-# \d
그럼 아래와 같이 테이블이 만들어진걸 확인할 수 있다.
Schema Name Type Owner public t1 table ck0911.kim (1 row)
PostgreSQL 에는 SQL 구문이 아닌 \ 를 이용한 명령어들이 존재한다. 아래 대표적인 명령 몇개는 익혀두는 것이 좋을 듯 하다.
\d - 현재 접속한 database의 모든 테이블과 sequence를 보여준다. \d 테이블명 - 지정한 테이블의 속성과 이에 속한 index를 보여준다. \di - 현재 접속한 database의 모든 index를 보여준다. \di 인덱스명 - 지정한 인덱스의 속성을 보여준다. \i 파일명 - 지정한 파일로부터 SQL 명령을 읽어 이를 수행한다. \q - 콘솔을 종료한다.

출처 http://www.specialguy.net/53 https://tedwon.atlassian.net/wiki/spaces/SE/pages/1212988/PostgreSQL

PostgreSQL 중지

PostgreSQL 을 정지할 때는 pg_ctl 을 사용하면 되지만,
엄밀히 말하면 그 내부에서는 kill 을 사용하는거 같다.
좀 더 자세히 내용을 보고, 포스팅을 하도록 한다.

출처
https://www.postgresql.org/docs/current/static/server-shutdown.html

PostgreSQL 실행

DB 를 실행시키는 방법에는 2가지가 있다.
forground, background

명령어는 아래와 같다.

Start foreground running
% postgres -D $PG/data

Start background running
% pg_ctl -D $PG/data -l logfile start

DB 를 start 하고 나면 ps 명령어를 통해,
postgres 프로세스가 실행되어 있는걸 확인할 수 있다.

DB 를 중지시키는 명령어는 아래와 같다.

Stop
% pg_ctl -D $PG/data stop

그런데 여기서 잠깐.
DB 를 foreground 로 실행시키는 경우가 있나? 라고 의문이 들 수 있다.
foreground 를 실행시킨 session 이 끊기면 DB 도 정지할텐데.
사실 DB 의 역할은 background 에서 안 보이는 곳에서 활동하면서
client 의 요청을 처리해주는게 주된 임무라고 생각하기 때문이다.

맞는 말이다.
평소에는 사용할 일이 없을 것......이다.
(아마도? 다른 뭐 필요한 경우가 있을 수도 있겠지.....)

그럼 어떨 때 사용하냐?
바로 debugging 할 때, 사용한다. (지극히 내 개인적인 경우)

물론 이미 실행되어 있는 프로세스에 gdb 를 attach 해서 사용할 수는 있겠지만. 실행 단계에서부터 디버깅이 필요하거나, 그냥 습관적으로 gdb 로 시작을 하거나. 이럴 때 사용하면 된다.
※ postgres 를 사용해서 foreground 로 실행시키면, 화면에 로그가 출력되는데, pg_ctl 의 -l 옵션이 그 내용을 파일로 저장해 주는 역할을 한다. 화면에 출력되는 내용이 logfile 내용과 같은걸 확인할 수 있다.


출처
https://www.postgresql.org/docs/current/static/server-start.html
https://tedwon.atlassian.net/wiki/spaces/SE/pages/1212988/PostgreSQL

PostgreSQL DB 생성

어느 DB 를 사용하건, 처음 DB 생성(초기화) 작업을 해줘야 한다.
PostgreSQL 도 마찬가지로 그 작업을 해줘야 하는데, 그 명령어가 initdb 이다.
위치는 $PG/bin/initdb 에 있다.

% initdb -D $PG/data

실행을 하면, db 가 생성되는 과정 메세지가 출력되는데, 너무 빨라서 휘리릭 출력된다.

The files belonging to this database system will be owned by user "ck0911.kim".
This user must also own the server process.

The database cluster will be initialized with locale "ko_KR.UTF-8".
The default database encoding has accordingly been set to "UTF8".
initdb: could not find suitable text search configuration for locale "ko_KR.UTF-8"
The default text search configuration will be set to "simple".

Data page checksums are disabled.

creating directory /home/ck0911.kim/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstra…

PostgreSQL 소스 설치 (CentOS 7)

CentOS 에 PostgreSQL 설치하면서, 수행한 내용들을 기록해 보기로 한다. 나중에 혹시라도 참고할 때가 있을거 같다. 암튼 치매 예방을 위해 기록한다.

소스 다운로드https://www.postgresql.org/ftp/source 에서 원하는 버전을 다운로드 한다. 글을 쓰고 있는 현재 기준으로, 9.6.5 가 최신이므로, 이 버전을 설치하도록 한다.
v9.6.5 링크를 클릭한다.
여러 파일들이 있는데, postgresql-9.6.5.tar.gz 다운로드 받는다.

압축해제 % tar vxzf postgresql-9.6.5.tar.gz 압축을 해제하면, postgresql-9.6.5 디렉토리가 생성된다.
설정 컴파일을 하기 전에 설정을 먼저 해야 한다.
설정은 일반적으로 configure 를 사용해서 한다.
% ./configure

쭉루루룩 하면서 잘되는가 싶더니 에러를 내뿜는다.

checking for main in -lm... yes
checking for library containing setproctitle... no
checking for library containing dlopen... -ldl
checking for library containing socket... none required
checking for library containing shl_load... no
checking for library containing getopt_long... none required
checking for library containing crypt... -lcrypt
checking for library containing shm_open... -lrt
checking for library containing shm_unlink... none required
checking for library containing fdatasync... none required
checking for library containing sched_yie…