Önceki bölüm PostgreSQL - Kurulum ve Çalıştırma Sonraki Bölüm

Bu işlemi root iken yapmak gerekmektedir. GnoRPM ya da kpackage (KDE ile gelir) uygulamalarını da rpmleri kurmak için kullanabiliriz. Bu komut, paketi açarak içindeki dosyaları gerekli yerlere yerleştirecektir. Ardından postgresql, postgresql-devel, postgresql-contrib, postgresql-server paketleri kurulmalıdır. Bu paketler, gereken minimum paketlerdir. Bunların dışındakiler ise kullanım gereksinimlerine göre kurulabilir.

Örnek olarak, SuSE 7.X sürümünde YaST uygulamasını çalıştırarak PostgreSQL’ i kurabilirsiniz:

PostgreSQL’i bir üst sürümüne yükseltmeden önce eski paketleri kaldırmanız önerilir. (Tabii ki sadece bir öneri J )

            [root@localhost root]#rpm –Fvh paket_adi

ile de yükseltme yapabiliriz.Burada öncelikle dikkat edilmesi gereken, öncelikle postgresql-libs paketinin upgrade edilmesidir.

PG KURULUMUNUN ANATOMÄ°SÄ°

PostgreSQL kurulumunda ne yazık ki bir standart bulunmamaktadır.

PostgreSQL kurulumu uygulamalar (applications), yardımcı programlar (utilities) ve veri dizinlerinden (data directories) oluşur. Ana PostgreSQL uygulamaları (postmaster ve postgres) istemcilerden veri erişimini sağlayan servislerin sunucu tarafındaki kodunu içerirler.

pg_ctl  gibi yardımcı uygulamalar sunucunun aktif olduğu tüm anlardaki ana sunucu işlemlerini (master server processes) kontrol etmekte kullanılır. Data dizini ise PostgreSQL taradından bir veritabanı için gereken tüm datayı, kayıtları, tabloları ve sistem parametrelerini tutmak için kullanılır.

Tipik bir PostgreSQL kurulumu tüm bu bileşenleri bulundurur. PostgreSQL, genel olarak /usr/local/pgsql dizinine kurulur. Bu dizin, kaynak koddan kurarken varsayılan dizindir. RPM’den kurarken ise /var/lib/pgsql dizini kullanılır.

Ana PostgreSQL dizininin alt dizinleri de aşağıdaki gibidir:

bin

pg_ctl,postmaster,psql gibi program ve yardımcı uygulamalar

data

Veritabanı

doc

HTML biçiminde belgeler

include

PostgreSQL uygulamalarında development için header dosyaları

lib

PostgreSQL uygulamalarında development için gereken kütüphaneler

man

PostgreSQL araçları için manual dosyaları

share

Örnek yapılandırma dosyaları

Verimlilik ve yönetim kolaylığı açısından, değişik kategorilerdeki dosyalar değişik yerlere konulabilir. PostgreSQL bize bu esnekliği sağlamaktadır. Örnek olarak, SuSE ve RedHat’ta PostgreSQL uygulamaları /usr/bin, log dosyası /var/log/postgresql, veri ise /var/lib/pgsql/data dizinlerine yerleştirilir. Bu, özellikle yedek alırken işe yarar. Gereksiz dosyaların yedeğini almak durumunda kalmazsınız.

Her bir dağıtım kendi dosya şemasını oluşturacaktır. Bunu görmek için RPM uygulamasını, tek bir paketin nereye hangi dosyaları koyduğunu görmek için kullanabiliriz:

[root@localhost root]#  rpm -ql postgresql

/usr/bin/createdb

...

/usr/share/man/man1/vacuum.l.gz

Alternatif olarak, kpackage gibi grafik arayüzlü programları bu iş için kullanabilirsiniz.

RPM kurulumundaki dezavantajlardan biri, neyi nereye kurduğunu tam olarak bilememektir. Dolayısıyla bazen kaynak koddan kurmak daha iyi sonuçlar verebilir.

Kaynak koddan kurma

           

Eğer Windows, Unix kullanıyor, ya da kullandığınız Linıx dağıtımında rpm kullanamıyorsanız, PostgreSQL’ i kaynak kodundan kurabilirsiniz.

Bu yazı ve seminerin içeriği gereği PostgreSQL’in NT çekirdekli Windows sürümlerine kurulumları anlatılmayacaktır. Ancak yakın zamanda http://seminer.devrim.oper.metu.edu.tr adresinde bu bilgileri de bulabilirsiniz. Özelllikle Windows ortamında çalışmak durumunda olan geliştiriciler için uygun bir yazı olacaktır.

PostgreSQL’in kaynak kodunu http://www.postgresql.org ya da herhangi bir yansısından indirebilirsiniz. Ülkemizde ftp.gazi.edu.tr adresi PostgreSQL’in resmi yansısıdır. ODTÜ içinden  ftp.oper.metu.edu.tr adresinde de son sürümleri bulabilirsiniz. Ana sitede beta ve test sürümlerini de bulmanız olasıdır. Eğer önemli veriler saklayacaksanız stable sürümleri tercih etmeniz gerekecektir.

Kaynak kod iki farklı şekilde indirilebilir:

            - Tüm kodlar bir arada (postgresql-7.1.3.tar.gz)

  (Bu yazı hazırlanırken 8,124,455 Byte)[DG1] 

- Ya da , postgresql-base

               postgresql-docs

               postgresql-support

               postgresql-test

 dosyalarını ayrı ayrı indirebilirsiniz.

PostgreSQL i derlemek, herhangi bir Açık Kod yazılımı derlemek kadar kolaydır.

Kaynak kodu derlemek için , Linux ya da Unix sisteminizde development için gereken uygulamaların kurulmuş olması gerekir. Bunlar C derleyicisini, make uygulamasını ve veritabanı yaratmak için gereken diğer uygulamaları kapsar. Linux dağıtımları genellikle Free Software Foundation' ın development ortamı için GNU uygulamaları ile gelir. Bunlar GNU C derleyicisi (gcc) 'yi içerir (Linux için standart derleyicidir). GNU uygulamaları tüm UNIX platformları için indirilebilir, ve PostgreSQL kurulumları için de önerilir.

Kaynak kodu indirip, derlemeniz için uygun bir dizine açınız. Bu dizinin PostgreSQL'in planladığınız çalışma dizini olmasına gerek yoktur. Şimdi, "tarball" ı extract ediniz:

[lkduser@localhost lkduser]# tar zxvf postgresql-7.1.3.tar.gz

Genellikle /usr/src dizini, kaynak kodların açılması için tercih edilir, ama yeterli disk alanınız olan her yere açmanız mümkündür. İlk anda 37 MB, toplamda da yaklaşık 50 MB'lık yere gereksinmeniz olacaktır.

Extract işlemi bittikten sonra yeni bir dizin yaratılmış olur; bu dizinin adı da sürüme bağlı olarak değişir:

[lkduser@localhost lkduser]# cd postgresql-7.1.3

Dizin içindeki INSTALL dosyası içinde detaylı olarak kurulum bilgileri bulunur.

configure scripti , build işlemini yönlendirir. Sistemin özelliklerine bağlı parametrelerini oluşturur. Tüm varsayılan değerleri kullanmak istiyorsanız bu scripti parametresiz olarak çalıştırmanız yeterlidir.

            [lkduser@localhost postgresql-7.1.3]# ./configure

creating cache ./config.cache

checking host system type... i686-pc-linux-gnu

checking which template to use... linux

...

creating src/include/config.h

linking ./src/backend/port/dynloader/linux.c to src/backend/port/dynloader.c

linking ./src/backend/port/dynloader/linux.h to src/include/dynloader.h

linking ./src/include/port/linux.h to src/include/os.h

linking ./src/makefiles/Makefile.linux to src/Makefile.port

linking ./src/backend/port/tas/dummy.s to src/backend/port/tas.s

[lkduser@localhost postgresql-7.1.3]#

configure scripti yazılımın build edildiği yolları kontrol eden değişkenleri, üzerinde çalıştığınız platformun tipini ve C derleyicinizin özelliklerini dikkate alarak hazırlar. Scriptin bu yönü ile ilgilenmemize gerek yoktur.

Script aynı zamanda kurulum için dizinleri de ayarlar. Varsayılan PostgreSQL kurulum dizini /usr/local/pgsql 'dir.

Configure scriptine vereceğiniz parametreler ile bu varsayılan değerleri değiştirebilirsiniz.

--prefix=PREFIX

Dizinleri PREFIX dizini altına açar..  PostgreSQL için varsayılan dizin /usr/local/pgsql dir.

--bindir=DIR

Programları DIR dizinine kurar.Varsayılan, PREFIX/bin dizinidir.

configure scriptine verebileceğiniz tüm parametrelerin listesini görmek için scripte --help parametresini verebilirsiniz:

[lkduser@localhost postgresql-7.1.3]# ./configure --help

Usage: configure [options] [host]

Options: [defaults in brackets after descriptions]

Configuration:

  --cache-file=FILE       cache test results in FILE

...

[lkduser@localhost postgresql-7.1.3]#

Veritabanı dosyaları ve log dosyası için bu aşamada bir dizin belirtmiyoruz. Bu dizinleri kurulumdan sonra PostgreSQL i başlattığımızda verebiliriz.

Derleme configure edildikten sonra  make uygulamasını çalıştırmak gerekir.

NOT:  PostgreSQL build işlemi , derleme işlemini kontrol edebilmek için birkaç tane Makefile kullanır. Bunun nedenle, make'in GNU sürümünün kullanılması önerilir. Bu, Linux dağıtımlarında varsayılandır. Diğer UNIX platformlarında GNU make uygulamasını ayrı olarak kurmanız gerekebilir. make ile GNU make ' i ayırmak için GNU  make 'e gmake adı verilmiştir. Aşağıdaki yönergeler GNU make içindir.

[lkduser@localhost postgresql-7.1.3]# make

...

All of PostgreSQL successfully made. Ready to install.

Eğer herşey yolunda giderse yukarıdaki mesajı alacaksınız.

Make bittiğinde, derlenmiş programları yerlerine koymak gerekir. Bunun için öncelikle super user (root) olmak gerekir. Ardından da make install komutu verilir.

            ­[lkduser@localhost postgresql-7.1.3]# su

[root@localhost postgresql-7.1.3]# make install

...

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

[root@localhost root]# exit

[lkduser@localhost postgresql-7.1.3]#

Artık PostgreSQL veritabanı sunucusunu çalıştırmak için gereken programlar sistemimizde!

Önceki bölümde anlatılan RPM kurulumu ile aynı noktaya geldik. Şimdi sıra PostgreSQL' i başlatmaya geldi. Bu başlatma işlemi RPM ya da kaynak koddan kurmaya bağlı olarak değişiklikler gösterir. RPM kurulumunda kaynak koddan yapılmış kurulumlardaki çalıştırma basamaklarının çoğu halledilir. Öncelikle RPM kurulumunu, sonra da kaynak koddan kurulumu çalıştıralım:

1.RPM’ den kurulumda PostgreSQL i başlatma

PostgreSQL’i RPM den kurduğunuzda kaynak koddan kuruluma göre çoğu işlemi yapmanıza gerek kalmaz: postgres kullanıcısı, data dizini vb yaratılır ve başlatma scripti oluşturulur. Sadece ntsysv ile sisteminiz her başladığında PostgreSQL’in başlamasını sağlamanız gerekir.

İlk çalıştırma sırasındasında da initialization işlemi yapılacaktır. Dolayısıyla initdb ile veritabanını initialize etmenize gerek kalmayacaktır.

 

İki kurulumda da pg_hba.conf dosyasının düzenlenmesi aynı şekildedir. Bu dosya ile ilgili bilgiler sonraki kısımda anlatılacağı için bu kısımda tekrarlanmayacaktır.

Öncelikle PostgreSQL’ in initialize işlemi için sunucumuzu başlatalım:

[root@localhost root]# /etc/rc.d/init.d/postgresql start

Initializing database:                                 [  OK  ]

Starting postgresql service:                           [  OK  ]

Ardından  /var/lib/pgsql/data dizinine geçelim. Az önceki init işleminden sonra bu dizinde bazı dosyalar oluşacaktır:

[root@localhost root]# cd /var/lib/pgsql/data/

[root@localhost data]# ls

base  global  pg_hba.conf  pg_ident.conf  PG_VERSION  pg_xlog  postgresql.conf  postmaster.opts  postmaster.pid

Buradaki postgresql.conf dosyasını aşağıdaki şekilde düzenleyelim.

tcpip_socket = true

max_connections = 32 # 1-1024

port = 6879

#

#       Performance

#

sort_mem = 512

shared_buffers = 2*max_connections # min 16

Postmaster’in değişik seçenekleri vardır:

  1. -B : shared-memory disk tamponu sayısını ayarlar. (Sunucu işlemlerinin en az iki katı olmalıdır.). Her bir tampon hafızanın 8 kb’ini alır.
  2. -D : Veritabanı dizinini gösterir:Örn: /var/lib/pgsql/data
  3. -N : Postgres’in maximum sunucu process sayısını ayarlar
  4. -S  : Postmaster’i silent modda çalıştırır.
  5. -i   : Bağlantılar için TCP/IP portu açar.
  6. -l   : SSL ile güvenli bağlantıyı etkin kılar.
  7. -p  : -i seçeneği ile açılacak TCP/IP portunu belirtir.

Bu seçenekler 7.0.x sürümlerinde kullanılıyordu. 7.1 ile birlikte postmaster.opts içine yazılan bu seçenekler postgresql.conf dosyası içine taşındı. (Not: Kaynak koddan kurulumda bu parametreler yine kullanılmaktadır.) 

Şimdi, postgres kullanıcısı dışında bir postgres kullanıcısı yaratalım.

NOT : Güvenlik nedeni ile sunucu işlemlerinini kesinlikle root olarak yapmamalısınız. Tüm işlemler postgres kullanıcısı kullanılarak yapılmalıdır. Olası bir sorunda, system dışından birisi root erişimi kazanabilir.Bu nedenle, postmaster root olarak çalıştırılamayacaktır.

Güvenlik açısından root a (ya da id’si 0 olan başka kullanıcı varsa onlara) postgres izninin verilmemesi gerekir. Varsayılan olarak root başlangıçta postgres kullanıcısı değildir ve postmaster i başlatamaz:

           

[root@localhost data]# psql template1

psql: FATAL 1:  user "root" does not exist

[root@localhost root]# postgres

"root" execution of the PostgreSQL server is not permitted.

The server must be started under an unprivileged userid to prevent

a possible system security compromise. See the INSTALL file for

more information on how to properly start the server.

Sistemimizdeki lkduser gerçek kullanıcısına postgres hakkı verelim:

[root@localhost data]# su - postgres

bash-2.05$ createuser lkduser

Shall the new user be allowed to create databases? (y/n) y

Shall the new user be allowed to create more new users? (y/n) n

CREATE USER

bash-2.05$ exit

logout

[root@localhost root]#

PostgreSQL init edildiğinde template0 ve template1 veritabanlarını oluşturur. İlk bağlantı için bu veritabanları kullanılabilir. psql ile bağlandıktan sonra \l ile sistemde olan veritabanlarını görebiliriz:

[root@localhost data]# su - lkduser

[lkduser@localhost lkduser]$ psql template1

Welcome to psql, 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=> \l

        List of databases

 Database  |  Owner   | Encoding

-----------+----------+-----------

 template0 | postgres | SQL_ASCII

 template1 | postgres | SQL_ASCII

(2 rows)

[lkduser@localhost lkduser]$exit

postgresql.conf  içinde yapılan her değişiklikten sonra bnu değişikliklerin geçerli olması için PostgreSQL’in yeniden başlatılması gerekir.

2.Kaynak koddan kurulumda PostgreSQL i başlatma

PostgreSQL için ana veritabanı işlemi postmaster dir. Tüm kullanıcıların tüm veritabanlarındaki verilere  erişimini yönetir. Kullanıcıların kendi veritabanlarına erişiminden ve başka kullanıcıların bilgilerine erişmesini engellemekten sorumludur. Bunun için tüm veri dosyalarının sahibi olmalıdır- hiç bir kullanıcı herhangi bir dosyaya direk olarak erişemez.

PostgreSQL, veri erişimini düzenlemek için pseudo user kavramını kullanır. Postgres kullanıcısı, veri dosyalarının ownerliği gibi özgün bir amaçla yaratılmıştır. Hiç bir kullanıcı (izin verilmediği sürece) postgres kullanıcısı haklarıyla login olup erişim sağlayamaz. Bu kullanıcı kimliği postmaster programı tarafından veritabanı dosyalarını diğerlerinin adına erişimi sağlamak için kullanır.

İşte bu nedenlerden dolayı, çalışan bir PostgreSQL sistemi oluşturmak için gerekli ilk adım, bu postgres kullanıcısını yaratmaktır.

Yeni bir kullanıcı yaratmak, sistemden sisteme gore bazı farklılıklar gösterir. Linux kullanıcıları (root iken) useradd komutunu kullanabilirler:

[root@localhost root]# useradd postgres

Diğer UNIX sistemlerinde bir yapılandırma dosyasının düzenlenmesi, ya da bir yönetim aracının (administration tool) kullanılması gerekebilir. Bunun için sistemlerin kendi özelliklerinin bilinmesi yeterlidir.

Postgres  kullanıcısının, uygun bir şifre koruma yöntemi ile login olmasını engellemeyi unutmayın.

Şimdi veritabanını oluşturup initialize etmek gerekiyor. Ardından da postmaster I başlatacağız.

PostgreSQL veritabanını, initdb yardımcı uygulamasını kullanarak initialize edeceğiz. initdb ye dosya sistemimizin nerede olduğunu ve veritabanı dosyalarımızın nerede olduğu bilgilerini vermek durumundayız. Öncelikle root kullanıcısı ile  verilerin olacağı dizini açıp, dizin iznini postgres kullanıcısına verilmesi gerekiyor:

[root@localhost root]# mkdir /usr/local/pgsql/data

[root@localhost root]# chown postgres /usr/local/pgsql/data

Buradaki dizin, varsayılan dizindir. Daha önce de belirtildiği gibi, veri dizininizi ayrı bir yerde tutabilirsiniz, ancak bu dizini derleme aşamasında belirtmeniz gerekir.

Veritabanını oluşturmak için postgres kullanıcısını kullanacağız. Öncelikle superuser (root) a geçip , oradan da postgres kullanıcısı olmak gerekir:

[lkduser@localhost lkduser]# su

[root@localhost root] su – postgres

[postgres@localhost postgres]

Programlar postgres kullanıcısının hakları ile çalışacaklar ve PostgreSQL veritabanı dosyalarına erişilebileceklerdir. Diğer örneklerden ayırabilmek için, postgres kullanıcısı tarafından yürütülen komutları [postgres@localhost postgres] ile göstereceğiz.

Veritabanını initdb ile initialize edelim:

[postgres@localhost postgres] /usr/local/pgsql/bin/initdb –D /usr/local/pgsql/data

This database system will be initialized with the user name "Postgres".

This user will own all the data files and must also own the server process.

...

Enabling unlimited row width for system tables.

Creating system views.

Loading pg_description.

Setting lastsysoid.

Vacuuming database.

Copying template1 to template0.

Success. You can now start the database server using:

    /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data

or

    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

[postgres@localhost postgres]

Eğer herşey yolunda giderse, yeni ve boş bir veritabanı sunucunuz, initdb’ ye -D ile belirttiğiniz yerde  hazırdır!

Şimdi, sunucu işlemini başlatalım. Aynı şekilde, postmaster a –D  seçeneği ile veritabanının hangi dizinde olduğunu belirtmemiz gerekir. Eğer bir ağ üzerindeki tüm kullanıcıların veritabanımıza erişmelerini istiyorsak, -i seçeneğini de uzak istemcilere izin verebilmek için postmaster a geçmeliyiz:

[postgres@localhost postgres] /usr/local/pgsql/bin/postmaster –i –D /usr/local/pgsql/data >logfile 2>&1 &

Burada, işlem çıktılarını (process output) Postgres kullanıcısının home dizinindeki bir dosyaya (buradaki örnekte logfile) yönlendirdik ve standart outputu (stdout) 2 >&1 shell construction kullanarak standart error (stderr) ile birleştirdik. Bu dosyayı tabii ki başka bir yere de koyabilirsiniz.

[postgres@localhost postgres]$ /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data > /var/log/postgresql.log 2>&1 &

DEBUG:  database system was shut down at 2001-10-29 13:23:35 EET

DEBUG:  CheckPoint record at (0, 1522064)

DEBUG:  Redo record at (0, 1522064); Undo record at (0, 0); Shutdown TRUE

DEBUG:  NextTransactionId: 615; NextOid: 18720

DEBUG:  database system is in production state

[postgres@localhost postgres]$ /usr/local/pgsql/bin/psql template1

Welcome to psql, 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=# \l

  List of databases

 Database  |  Owner

-----------+----------

 template0 | postgres

 template1 | postgres

(2 rows)

template1=# \q

[postgres@localhost postgres]$

Burada değişik parametreler mümkündür. Bunlar rpm’den kurulum bölümünde anlatılmıştır. Örnek olarak, PostgreSQL’i standart portu olan 5432’nin dışındaki bir porttan, 6879’dan çalıştıralım:

[postgres@localhost postgres]$/usr/local/pgsql/bin/postmaster -i -p 5455 -D /usr/local/pgsql/data 2>&1 &

Burada –i ile tcp-ip portu açtıktan sonra –p ile port numarasını verilmiştir. PostgreSQL’in standart portu olan 5432 dışındaki herhangi bir porttan bağlanmak istediğinizde PostgreSQL uygulamalarına –p ile port numarasını geçirmeniz gerekir.

 

/usr/local/pgsql/bin/psql -p 6879 template1/usr/local/pgsql/bin/psql -p 5455 template1

Aynı şey createdb, pg_dump gibi diğer uygulamalar için de geçerlidir.

pg.hba.conf dosyasının düzenlenmesi

Varsayılan değer olarak, PostgreSQL uzaktan erişime izin vermez. Bu izni vermek için pg_hba.conf dosyasını düzenlemeniz gerekir. Bu dosya veritabanının dosya alanında (örneğimizde /usr/local/pgsql/data) bulunur ve veritabanına bağlanmak için uzaktan erişecek istemcilerle ilgili izin ya da red bilgilerini içerir. Bunun biçemi oldukça basittir, ve PostgreSQL kurulumu ile gelen dosya yeni veriler eklemek için oldukça ayrıntılı bir yardım dosyası içerir. Bu dosyayı düzenleyerek bir tek kullanıcı, makineler ya da bilgisayar gruplarına istediğiniz veritabanına/veritabanlarına erişim imkanı sağlayabilirsiniz.

Aşağıdaki örnekte yerel ağ içindeki bir makineye, herhangi bir yetkilendirme olmadan istediği veritabanına erişim hakkı vereceğiz: Eğer siz daha farklı bir erişim planlıyorsanız, yapılandırma dosyasındaki yönergeleri takip ediniz.

pg_hba.conf dosyasının sonuna aşağıdaki gibi bir satır ekleyelim:

hostall  192.168.0.0   255.255.0.0   trust

Bu satır, IP adresi 192.168 ile başlayan herhangi bir  bilgisayarın (host) tüm veritabanlarına (all)  şifresiz olarak (trust) bağlanma izni verir.

Güvenlik: Veritabanına şifre koyma

PostgreSQL veritabanı sunucuna varsayılan erişim şifresizdir. Yani sunucu üzerindeki herkes –U parametresini postgres değeri ile birlikte geçirirse veritabanına erişim hakkı kazanır.

            [devrim@localhost devrim]$ psql template1 –U postgres

Welcome to psql, the PostgreSQL interactive terminal.

…

template1=# \q

[devrim@localhost devrim]$

Özellikle çok kullanıcılı sistemlerde bu önemli bir güvenlik sorunudur. Daha önce devrim kullanıcısına postgres izni verilmediği halde bu kullanıcı veritabanına erişebilmektedir. Bunu aşabilmek için iki aşama gerekir: Kullanıcılar için şifre tanımlama ve veritabanına erişim için şifre sorgulamasını zorunlu hale getirme.

Kullanıcılar için şifre tanımlama

Kullanıcılar için şifre tanımlama pg_passwd komutu ile yapılmaktadır. İlk kez bir şifre atanacaksa verilecek dosya ismi komut tarafından yaratılmak istenir. Örnek verelim. Şifre dosyamızın adı passwdf olsun. Bu dosya $PGDATA dizininde olmalıdır:

[postgres@localhost postgres]$ cd data/

[postgres@localhost postgres]$ pg_passwd passwdf

File "passwdf" does not exist.  Create? (y/n): y

Username: lkduser

New password:

Re-enter new password:

[postgres@localhost postgres]$ pg_passwd passwdf

Username: postgres

New password:

Re-enter new password:

passwdf dosyasına lkduser ve postgres kullanıcılar için şifre ekledik. Buradaki kullanıcıların sistemdeki gerçek kullanıcı olmalarına gerek yoktur. Sanal bir kullanıcı ile güvenliği arttırabilirsiniz. Tablonun / veritabanının tüm haklarını o kullanıcıya da verebilirsiniz.

pg_hba.conf dosyasını düzenleme

Şimdi ise PostgreSQL’in şifre sormasını ayarlamalıyız. Bunun için pg_hba.conf dosyasında küçük bir değişiklik yapacağız:

hostall  192.168.0.0   255.255.0.0    trust

satırını

host all  127.0.0.1  255.255.255.255     password passwdf

olarak değiştirelim. PostgreSQL’i restart ettikten sonra değişikliklerimiz aktif olacaktır.

bash-2.04$ psql pgornek -p 5455 -U lkduser

Password:

...

pgornek=# \q

Burada değişik alternatifler mümkündür. Örnek vermek gerekirse, bir ip’ye şifre sormasını ama başka bir ip’ye sormamasını ya da bu iki ip’nin farklı şifre dosyalarını kullanmalarını sağlayabiliriz.

 

PostgreSQL araçları

psql

Oracle’daki SQL*PLUS gibi PostgreSQL’de psql adında command line aracı vardır. PostgreSQL veritabanları genellikle bu uygulama tarafından yaratılır ve yönetilir.  psql :

psql [seçenekler] [veritabanı_adı [kullanıcı_adı]]

biçiminde çalışır.

Daha önce de gördüğümüz gibi, psql’i bağlanmak istediğimiz veritabanı adını vererek çalıştırıyoruz. Sunucunun adını, veritabanının dinlediği port numarasını ve bağlantı için geçerli bir kullanıcı adı ve şifresinin bilinmesi gerekmektedir. Basit bir bağlantı aşağıdaki gibidir:

[postgres@localhost postgres] psql pgornek

Varsayılan veritabanı, kullanıcı adı, sunucu makine adı ve dinlenilen port numarası  sırasıyla PGDATABASE, PGUSER, PGHOST ve PGPORT çevre değişkenlerinin ayarlanması  ile değiştirilebilir.

Bu varsayılan değerler yine sırasıyla psql’e –d, -U, -h ve –p seçeneklerini geçirerek değiştirilebilir.

           

Not: psql’i sadece bir veritabanına bağlanarak çalıştırabiliriz. Bu, ilk veritabanını yaratmak konusunda  tavuk-yumurta ikilemini anımsatır. postgres kullanıcısı yaratılmıştı. İlk veritabanını yaratmak için daha önce anlatılan template1 veritabanı kullanılacaktır.template1 e bağlandıktan sonra veritabanımızı yaratabilir, ardından psql’i yeniden başlatarak ya da \c parametresi ile yeni veritabanımıza bağlanabiliriz.

psql komutları

psql başladığı zaman, eğer kullanıcının dizininde varsa ve okuma izni varsa  .psqlrc dosyasını okur.Bu dosya kabuk scripti başlangıç dosyasına benzer ve psql’in istenildiği şekilde çalışmasını sağlar. psql’ i  bu dosyayı okumadan çalıştırmak için –x parametresini kullanmamız gerekir.

psql' i çalıştırdıktan sonra bağlandığımız veritabanı ve ardından => promptu çıkar. İki çeşit komut biçimi vardır: İç (internal) komutlar ve SQL  komutları.

psql' e PostgreSQL’in desteklediği herhangi bir SQL komutunu verebilirsiniz.

NOT: Desteklenen SQL komutlarının listesini \h iç komutu ile görebiliriz. Özel olarak istenen bir komut varsa \h sql_komutu ile de yardımı alabiliriz. \? iç bize tüm iç komut listesini verecektir.

psql de komutlar birden fazla satırda yazılabilir. Böyle zamanlarda psql promptu ‑> şekline dönüşecek ve daha fazla girişin beklendiği belirtilecektir:

[postgres@localhost postgres] /usr/local/pgsql/bin/psql pgornek

...

pgornek=> SELECT *

pgornek-> FROM musteri

pgornek->;

...

[postgres@localhost postgres]

psql’ e SQL komutunun bittiğini anlatmak için komut sonuna noktalı virgül (;) işaretini konur. Yani bu işaret SQL komutunun bir parçası değildir.

psql' i –S seçeneği ile başlatırsak psql komutlarımızı tek satırda bitirmemizi bekleyecektir.   Böyle bir durumda noktalı birgül koymaya gerek yoktur. Tek satır modunda (single line mode) olduğumuzu anımsatmak için, psql promptu ^> şeklini alacaktır.

Komut satırı (Command line) komutları

Yine anlaşılabilirlik için aşağıdaki metinler Türkçe’ye çevirilmemiştir. Seminerin webdeki notlarında bu bilgiler Türkçeleşecektir.

  -a             

Echo all input from script (Print all the lines to the screen as they are read.)

  -A             

Unaligned table output mode
(same as -P format=unaligned)

  -c <query>     

Run only single query (or slash command) and exit (This is useful in shell scripts) Also, in manual it says “query must be either a query string that is completely parseable by the backend (i.e., it contains no psql specific features), or it is a single backslash command. Thus you cannot mix SQL and psql meta-commands. To achieve that, you could pipe the string into psql, like this: echo "\x \\ select * from foo;" | psql.”

  -d <dbname>    

Specify database name to connect to
(default: $PGDATABASE or current login name)

  -e             

Echo queries sent to backend

  -E             

Display queries that internal commands generate

  -f <filename>  

Execute queries from file, then exit

  -F <string>    

Set field separator (default: "|")
(same as -P fieldsep=)

  -h <host>      

Specify database server host
(default: $PGHOST or local machine)

  -H             

HTML table output mode
(same as -P format=html)

  -l             

List available databases, then exit

  -n             

Disable readline, prevents line editing

  -o <filename>  

Send query output to filename. Use the form |pipe to send output to a filter program

  -p <port>      

Specify database server port
(default: $PGPORT or compiled-in default – usually 5432)

  -P var[=arg]   

Set printing option var to arg (see \pset command)

  -q             

Run quietly (no messages, only query output)

  -R <string>    

Set record separator (default: newline)
(same as -P recordsep=)

  -s             

Single step mode (confirm each query)

  -S             

Single line mode (newline terminates query rather than semi-colon)

  -t             

Print rows only
(same as -P tuples_only)

  -T text        

Set HTML table tag options (width, border)
(same as -P tableattr=)

  -U <username>  

Specify database username
(default: $PGUSER or current login)

  -v name=val     

Set psql variable name to value

  -V             

Show version information and exit

  -W             

Prompt for password (should happen automatically)

  -x             

Turn on expanded table output
(same as -P expanded)

  -X             

Do not read startup file (~/.psqlrc)

İç komutlar (Internal Commands)

psql tarafından desteklenen iç komutlar aşağıdaki gibidir: 

 \a            

Toggle between unaligned and aligned mode

 \c[onnect] [dbname|- [user]]

connect to new database. Use – as the database name to connect to the default database if you need to give a user name.

\C <title>    

set table title for output (same as \pset title)

 \copy ...     

perform SQL COPY with data stream to the client machine

 \copyright    

show PostgreSQL usage and distribution terms

 \d <table>    

describe table (or view, index, sequence)

 \d{t|i|s|v}   

list tables/indices/sequences/views

 \d{p|S|l}     

list permissions/system tables/lobjects

 \da           

list aggregates

 \dd [object]  

list comment for table, type, function, or operator

 \df           

list functions

 \do           

list operators

 \dT           

list data types

 \e [file]     

edit the current query buffer or file with external editor

 \echo <text>  

write text to stdout

 \encoding <encoding>  

set client encoding

 \f <sep>      

change field separator

 \g [file]     

send query to backend (and results in file or |pipe)

 \h [cmd]      

help on syntax of SQL commands, * for detail on all commands

 \H            

Toggle HTML mode

 \i <file>     

read and execute queries from file

 \l            

list all databases

 \lo_export, \lo_import, \lo_list, \lo_unlink

large object operations

 \o [file]     

send all query results to file, or |pipe

 \p            

show the content of the current query buffer

 \pset <opt>   

set table output  opt, which can be one of: format border expanded fieldsep null recordsep tuples_only title tableattr pager

 \q            

quit psql

 \qecho <text> 

write text to query output stream (see \o)

 \r             

reset (clear) the query buffer

 \s [file]     

print history or save it in [file]

 \set <var> <value> 

set internal variable

 \t            

show only rows (toggles between modes)

 \T <tags>     

HTML table tags

 \unset <var>  

unset (delete) internal variable

 \w <file>     

write current query buffer to a <file>

 \x            

Toggle expanded output

 \z            

list table access permissions

 \! [cmd]      

shell escape or command

Kpsql

http://www.mutinybaysoftware.com adresinde bulabileceğiniz Kpsql yazılımı psql’in görsel bir alternatifidir. Ancak bu yazılım artık geliştirilmemektedir.

Veritabanına bağlanma ve sunucuyu başlatma/durdurma scriptleri

         

Şimdi veritabanına bağlanmayı deneyerek çalışıp çalışmadığını deneyebiliriz. psql uygulaması veritabanına bağlantı kurup, basit yönetim işlemlerini (kullanıcı yaratma, veritabanı yaratma, tablo yaratma, vs) yapmaya yarar. Birazdan bu aracı veritabanı yaratma ve bu veritabanının içine veri eklemek için kullanacağız. Şimdi, postmaster in çalıştığını göstermek için veritabanına bağlanmaya çalışalım:

[postgres@localhost postgres] /usr/local/pgsql/bin/psql

psql: FATAL 1: Database "postgres" does not exist in the system catalog.

Hatamız nerede? Varsayılan değer olarak psgl yerel makinedeki veritabanına bağlanıp programı çalıştıran kullanıcının adı ile aynı ada sahip olan veritabanına erişmeye çalışır. Postgres adında bir veritabanı yaratmadığımız için bağlanma girişimi sonuçsuz kalacaktır. Ancak bu postmaster’in çalışmadığı anlamına gelmez.

Belirli bir veritabanına bağlanmak için ise iki yol var: Veritabanı ismini psql komutundan hemen sonra yazmak ya da –d veritabani_adi parametresini psql e geçmek. Boş bir veritabanı veri içermez, ancak sistemde yeni veritabanları yaratabilmemiz için iki veritabanı bulunur: Bunlardan biri template1 dir. Bu veritabanına yönetim için bağlanabiliriz.

Ağ üzerinden bağlanabilmeyi kontrol edebilmek icin, ağ içindeki PostgreSQL kurulu başka bir makineden bizim makinemize bağlanmayı deneyelim. IP adresi ya da host adını ,-h parametresi ile , -d ile de system veritabanlarından birini belirtmemiz gerekir (henüz gerçek bir veritabanı yaratmadık):

remote$ psql –h 192.168.0.66 –d template1

Welcome to psql, 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=# \q

remote$

Yapmamız gereken son şey, postmaster sunucu işleminin makine yeniden başlatıldığında otomatik olarak başlatabilmektir.

Aslında burada yapmamız gereken tek şey postmaster in başlangıçta çalışmasını sağlamaktır. Bunun nasıl yapılacağı, Linux ve Unix türevleri arasında farklılıklar göstermektedir. Bunun için sistemin kendi dokümanlarına bakabilirsiniz.

Eğer PostgreSQL’i bir Linux dağıtımından kurduysanız, RPM paketleri zaten başlangıç sorununu çözmüş olacaktır. SuSE  ve RedHat dağıtımlarında PostgreSQL,system  multi-user moduna geçtiğinde (init 3) /etc/rc.d/init.d/postgresql scripti ile başlatılır.

Eğer kendiniz bir başlangıç scripti yazmak isterseniz, postmaster’ ı sizin istediğiniz parametrelerle başlatmalı, ve scriptinizin başlangıçta otomatik olarak çalışmasını sağlamalısınız. Postmaster’ in postgres kullanıcısı ile çalıştığına emin olunuz.  Başlangıç scriptleri ile ilgili ayrıntılı bilgiyi http://techdocs.postgresql.org ya da tek yansısı olan http://techdocs.oper.metu.edu.tr adreslerinden alabilirsiniz. Aşağıda örnek bir script göreceksiniz:

#!/bin/sh

# PostgreSQL’i başlatmak ve durdurmak için script

SERVER=/usr/local/pgsql/bin/postmaster

PGCTL=/usr/local/pgsql/bin/pg_ctl

PGDATA=/usr/local/pgsql/data

OPTIONS=-i

LOGFILE=/usr/local/pgsql/data/postmaster.log

case "$1" in

       start)

              echo -n " PostgreSQL başlatılıyor…"

              su -l postgres -c "nohup $SERVER $OPTIONS -D $PGDATA >$LOGFILE 2>&1 &"

              ;;

       stop)

              echo -n "PostgreSQL durduruluyor..."

              su -l postgres -c "$PGCTL -D $PGDATA stop"

              ;;

       *)

              echo "Usage: $0 {start|stop}"

              exit 1

              ;;

esac

exit 0

Bu scripti içeren, çalıştırılabilir bir script dosyası yaratın ve MyPostgreSQL adını verin. Şimdi ise sunucu kapanırken PostgreSQL’i de kapatacak, açılırken PostgreSQL’i de açacak şekilde düzenleyelim:

MyPostgreSQL start

MyPostgreSQL stop

Bir çok Linux dağıtımı gibi, System V type init scripting kullanan sistemlerde, bu scripti uygun bir yere yerleştirmelisiniz. SuSE ya da RedHat için örnek vermek gerekirse, bu scripti /etc/rc.d/init.d/ altına yerleştirmemiz ve sembolik linkleri aşağıdaki yerlere, sunucunun multi-user moda girip çıktığı anlarda PostgreSQL’i başlatıp kapatmasını sağlamak için yaratmamız gerekir:

/etc/rc.d/rc2.d/S15MyPostgreSQL

/etc/rc.d/rc2.d/K15MyPostgreSQL

/etc/rc.d/rc3.d/S15MyPostgreSQL

/etc/rc.d/rc3.d/K15MyPostgreSQL

...

Başlangıç scriptleri sistemlerinizin özelliklerine gore değişiklik gösterebilir.

Direk bir komutla durdurmak isterseniz:

[postgres@localhost postgres]$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop

waiting for postmaster to shut down....Smart Shutdown request at Mon Oct 29 13:53:33 2001

DEBUG:  shutting down

..DEBUG:  database system is shut down

done

postmaster successfully shut down

[1]+  Done                    /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data 2>&1

ÖNEMLİ NOT: PostgreSQL’i k-e-s-i-n-l-i-k-l-e kill –9 –‘pidof postmaster’ ile durdurmayınız!!!

Şimdi sıra bir veritabanı yaratmakta.


Önceki bölüm PostgreSQL - Kuurlum ve Çalıştırma Sonraki Bölüm