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

Veritabanı yaratma

Bu  yazıda veritabanı yönetimi anlatılmayacaktır. Ancak bu kısımda PostgreSQL’in çalışır durumda olup olmadığı gösterilecektir. Pgornek adını vereceğimiz basit bir veritabanı yaratıp içine bir takım veriler yerleştireceğiz.

Başlamadan önce, PostgreSQL’in sistemimizde çalışıp çalışmadığını, postmaster processine bakarak kontrol edelim:

$ ps -el | grep post

Eğer  çıktıda postmaster processi varsa, PostgreSQL sisteminizde çalışıyor demektir.

PostgreSQL veritabanı sunucusunun herbir kullanıcısı kendi veritabanını yaratabilir ve içindeki veriye erişimi düzenleyebilir. Bunu yapabilmek için PostgreSQL’e sistemdeki geçerli kullanıcıları belirtmemiz gerekir. Bunun için PostgreSQL’in createuser uygulamasını aşağıdaki şekilde kullanacağız:

Root iken su komutu ile PostgreSQL kullanıcısı, postgres olalım. Ardından da createuser konutu ile kullanıcıyı oluşturalım.Root iken su komutu ile PostgreSQL kullanıcısı, postgres olalım. Ardından da createuser komutu ile kullanıcıyı oluşturalım. Burada oluşturulan kullanıcı geçerli bir  PostgreSQL kullanıcısı olarak kaydedilir. Şimdi, bu kullanıcı haklarını varolan Linux/Unix kullanıcısı olan lkduser’a verelim. Burada verilen isim gerçek bir kullanıcı olmak zorunda değildir. Özellikle çok kullanıcılı sistemlerde gerçek bir kullanıcı adı kullanılmadan yapılacak bağlantılar gerçek anlamda güvenlik sağlayacaktır. (Tabii ki böyle bir kullanıcı olmadan nasıl bağlanacağınız sorusu aklınıza gelebilir. Burada psql’e –U parametresi ile kullanıcı adını geçirebilirsiniz.)

$ su

# su – postgres

[postgres@localhost postgres] /usr/local/pgsql/bin/createuser lkduser

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

Shall the new user be able to create new users (y/n) n

CREATE USER

[postgres@localhost postgres]

Burada, lkduser kullanıcısına yeni veritabanı yaratma izni verdik, ama yeni kullanıcı yaratma hakkı vermedik.

Kullanıcımıza aynı zamanda PostgreSQL kullanıcısı olma hakkı verdiğimize göre artık bir veritabanı yaratabileceğiz. Tekrar lkduser (root değil!) kullanıcımıza dönelim ve komutunu verelim:

$ /usr/local/pgsql/bin/createdb pgornek

CREATE DATABASE

$

Veritabanı yaratıldı. PostgreSQL’in interaktif terminali olarak adlandırılan psql uygulaması ile bu veritabanına bağlanabilmeniz gerekir:

$ /usr/local/pgsql/bin/psql –d pgornek

Welcome to psql, the PostgreSQL interactive terminal.

...

pgornek=>

PostgreSQL’e login olduğunuza göre, artık bazı komutları çalıştırabilir. Kabuğa geri dönmek için \q komutu verilebilir.

pgornek=>\q

[lkduser@localhost lkduser]#

Kabuğa dönmeden kabuki komutu vermek mümkündür. Bunun için vermek istediğiniz komutun başına \!  koymanız yeterlidir:

pgornek=>\!frm

You have no mail.

pgornek=>

Tabloları yaratmak

pgornek veritabanınızda, aşağıdaki sql komutlarını psql komut satırında yazıp tablolarınızı oluşturabilirsiniz. Bunları kopyala/yapıştır ile bir metin dosyasına kaydedebilir ve psql’de 

\i dosya_adi komutu ile dosyayı okutarak da tabloları oluşturabilirsiniz. Bu SQL komutları plain text biçimindedir,  bunları kullandığınız metin programı ile (pico,nano,vi,vb.) istediğiniz şekilde düzenleyebilirsiniz. Aşağıdaki satırlar http://seminer.devrim.oper.metu.edu.tr adresinde seminerden sonra ayrı bir dosya halinde bulunabilir.

 

create table musteri

(

    musteri_no                          serial                        ,

    ad                                  varchar(32)                   ,

    soyad                            varchar(32)           not null,

    adres                                varchar(64)                   ,

    sehir                            varchar(32)                   ,

    posta_kodu                       char(10)              not null,

    telefon                          varchar(11)                   ,

    CONSTRAINT                       musteri_pk PRIMARY KEY(musteri_no)

);

create table mal

(

    mal_no                           serial                        ,

    tanım                                varchar(64)           not null,

    gelis_fiyati                     numeric(7,2)                  ,

    satis_fiyati                     numeric(7,2)                  ,

    CONSTRAINT                       mal_pk PRIMARY KEY(mal_no)

);

create table siparis_bilgisi

(

    siparis_bilgisi_no              serial                        ,

    musteri_no                      integer               not null,

    gelis_tarihi                    date                  not null,

    cikis_tarihi                    date                          ,

    ucret                          numeric(7,2)                  ,

    CONSTRAINT                     siparis_bilgisi_pk PRIMARY KEY(siparis_bilgisi_no)

);

create table stok

(

    mal_no                         integer               not null,

    miktar                        integer               not null,

    CONSTRAINT                      stok_pk PRIMARY KEY(mal_no)

);

create table siparis

(

    siparis_bilgisi_no                    integer               not null,

    mal_no                         integer               not null,

    miktar                        integer               not null,

    CONSTRAINT                      siparis_pk PRIMARY KEY(siparis_bilgisi_no, mal_no)

);

create table barkod

(

    barkod_ean                     char(13)              not null,

    mal_no                         integer               not null,

    CONSTRAINT                      barkod_pk PRIMARY KEY(barkod_ean)

);

Tabloları silmek

İleride tabloları silip yeniden başlamak isterseniz, bu çok kolaydır. Aşağıdaki SQL komutlarını verin:

drop table barkod;

drop table siparis;

drop table stok;

drop table siparis_bilgisi;

drop table mal;

drop table musteri;

drop sequence musteri_musteri_no_seq;

drop sequence mal_mal_no_seq;

drop sequence siparis_bilgisi_siparis_bilgisi_no_seq;

Burada belirtmek isterim ki , tabloyu sildiğiniz anda içindeki veriler de silinir.

Tablolara veri ekleme

Şimdi sırada tablolara veri eklemek var:

Bu ve bundan önceki tüm örneklere sununun konacağı web sayfalarından da ayrı dosyalar halinde ulaşabileceksiniz. Siz tabii ki kendi verilerinizi istediğiniz gibi ekleyebilirsiniz, ancak tabii ki bu durumda sonuçlarınız burada yazılanlardan farklı olacaktır. Bu nedenle konuya hakim olana kadar aşağıdaki örnek verileri kullanmanız önerilir.

Rahat görebilmeniz açısında veriler aşağıda satır satır verilmiştir, ancak siz bunları tek bir satırda yazabilirsiniz. Ancak her girişin sonuna m-u-t-l-a-k-a noktalı virgül (;) işaretini koymalısınız, böylece psql’e her bir SQL komutunun sona erdiği bilgisini vermiş oluruz.

musteri tablosu

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Özgür','Dönmez','Arı Koop.2/2 Batıkent','Ankara','06130','03122560123');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Ödül','Ceylan',' Mavişehir D/35','İzmir','35300','02323680123');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Özlem','Yıldırım','LKD Caddesi inet APT No:5','Samsun','55120'04543210123');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Devrim','Gündüz','TR.NET ODTÜ','Ankara','06531','03122959595');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Senem','Işık','Mimozalar Sitesi A/41 Çayyolu','Ankara','06300,'2350123');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Abdül','Gülşen','5 Pasture Lane','Nicesehir','NT3 7RT','267 1232');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Anıl','Gündüz','34 Holly Way','Bingham','BG4 2WE','342 5982');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Umut','Asil','34 Holly Way','Bingham','BG4 2WE','342 5982');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Tülay','Asil','36 Queen Street','Histon','HT3 5EM','342 5432');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Kürşad','Sezgin','86 Dysart Street','Tibsville','TB3 7FG','505 5482');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Doruk','Fişek','54 Vale Rise','Bingham','BG3 8GD','342 8264');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Berk','Demir','42 Thached way','Winersby','WB3 6GQ','505 6482');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Mustafa','Akgül','73 Margeritta Way','Oxbridge','OX2 3HX','821 2335');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Evren','Balık','2 Beamer Street','Wellsehir','WT3 8GM','435 1234');

insert into musteri( ad, soyad, adres, sehir, posta_kodu, telefon) values('Ekin','Ateş','4 The Square','Millsehir','MT2 6RT','961 4526');

mal tablosu

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Wood Puzzle', 15.23, 21.95);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Rubic Cube', 7.45, 11.49);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Linux CD', 1.99, 2.49);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Tissues', 2.11, 3.99);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Picture Frame', 7.54, 9.95);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Fan Small', 9.23, 15.75);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Fan Large', 13.36, 19.95);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Toothbrush', 0.75, 1.45);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Roman Coin', 2.34, 2.45);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Carrier Bag', 0.01, 0.0);

insert into mal(tanım, gelis_fiyati, satis_fiyati) values('Speakers', 19.73, 25.32);

barkod tablosu

insert into barkod(barkod_ean, mal_no) values('6241527836173', 1);

insert into barkod(barkod_ean, mal_no) values('6241574635234', 2);

insert into barkod(barkod_ean, mal_no) values('6264537836173', 3);

insert into barkod(barkod_ean, mal_no) values('6241527746363', 3);

insert into barkod(barkod_ean, mal_no) values('7465743843764', 4);

insert into barkod(barkod_ean, mal_no) values('3453458677628', 5);

insert into barkod(barkod_ean, mal_no) values('6434564564544', 6);

insert into barkod(barkod_ean, mal_no) values('8476736836876', 7);

insert into barkod(barkod_ean, mal_no) values('6241234586487', 8);

insert into barkod(barkod_ean, mal_no) values('9473625532534', 8);

insert into barkod(barkod_ean, mal_no) values('9473627464543', 8);

insert into barkod(barkod_ean, mal_no) values('4587263646878', 9);

insert into barkod(barkod_ean, mal_no) values('9879879837489', 11);

insert into barkod(barkod_ean, mal_no) values('2239872376872', 11);

siparis_bilgisi tablosu

insert into siparis_bilgisi(musteri_no, gelis_tarihi, cikis_tarihi, ucret) values(3,'03-13-2000','03-17-2000', 2.99);

insert into siparis_bilgisi(musteri_no, gelis_tarihi, cikis_tarihi, ucret) values(8,'06-23-2000','06-24-2000', 0.00);

insert into siparis_bilgisi(musteri_no, gelis_tarihi, cikis_tarihi, ucret) values(15,'09-02-2000','09-12-2000', 3.99);

insert into siparis_bilgisi(musteri_no, gelis_tarihi, cikis_tarihi, ucret) values(13,'09-03-2000','09-10-2000', 2.99);

insert into siparis_bilgisi(musteri_no, gelis_tarihi, cikis_tarihi, ucret) values(8,'07-21-2000','07-24-2000', 0.00);

siparis tablosu

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(1, 4, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(1, 7, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(1, 9, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(2, 1, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(2, 10, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(2, 7, 2);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(2, 4, 2);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(3, 2, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(3, 1, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(4, 5, 2);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(5, 1, 1);

insert into siparis(siparis_bilgisi_no, mal_no, miktar) values(5, 3, 1);

stok tablosu

insert into stok(mal_no, miktar) values(1,12);

insert into stok(mal_no, miktar) values(2,2);

insert into stok(mal_no, miktar) values(4,8);

insert into stok(mal_no, miktar) values(5,3);

insert into stok(mal_no, miktar) values(7,8);

insert into stok(mal_no, miktar) values(8,18);

insert into stok(mal_no, miktar) values(10,1);

Çalışan PostgreSQL sistemimizle veritabanımızı yarattık, içine verileri girdik.

PostgreSQL’i durdurmak

PostgreSQL sunucu işlemini düzgün olarak durdurmak önemlidir. Bu yazılmayı bekleyen verinin veritabanına işlenmesini ve shared memory’de kullandığı kaynakları boşaltmasına yarar.

Veritabanını sorunsuz olarak durdurabilmek için, pg_ctl uygulamasını aşağıdaki biçimde kullanınız:

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

Ek bilgiler

psql, initdb, createuser, createdb uygulamaları hakkında detaylı bilgiyi man sayfalarından alabilirsiniz. İşlemlerinizi kolaylaştırmak açısından PostgreSQL uygulamalarının yollarını kabuğunuza tanıtmanız uygun olacaktır. Bunun için, standart UNIX/Linux kabuğunuzun başlangıç dosyasına (.profile ya da .bashrc) aşağıdaki satırları ekleyiniz:

PATH=$PATH:/usr/local/pgsql/bin

MANPATH=$MANPATH:/usr/local/pgsql/man

export PATH MANPATH

PostgreSQL yedekleme araçları

PostgreSQL veritabanını yedeklemek ya da yedeklerden bilgileri geri yüklemek için iki komut bulunm     aktadır:

Bunlardan sadece pg_dump yeterlidir.

 pg_dump

pg_dump komutu, belirtilen bir makinedeki belirtilen bir veritabanın istenilen şekildeki dump’unu alır. pg_dump komutu ile başka bir makinedeki yedeği almak, o makinedeki pg_hba.conf dosyasındaki izinlere bağlıdır. Komut aynı işlemin tersini de yapabilir: Daha önce alınmış bir yedeği geri yükleyebilir. Yedek alırken çıktı ekrana basılır. Bunu

[root@localhost root]#psql pgornek > pgornek.dump

örneğinde de gösterildiği gibi bir dosyaya yönlendirebilirsiniz.

Bu komuta verilebilecek bazı önemli parametreler aşağıdaki gibidir. Tüm parametreler için man dosyasına bakabilirsiniz:

 Parametre            

İşlevi

-d db_adı

Belirtilen veritabanın yedeğini alır.

-t tablo_adı

Belirtilen tablonun yedeğini alır.

-s

Verilen tablo ya da tüm veritabanının sadece şemasını alır.

-a

Verilen tablo ya da veritabanının sadece verisini yedekler.

Yedekleri geri yüklemek

PostgreSQL, 7.1 sürümü ile birlikte pg_restore komutunu getirmiştir. Pg_dump ile yaratılan arşivi PostgreSQL veritabanına geri yükler.

Bunun dışında psql komutu veriyi yüklemek için iki farklı şekilde kullanılabilir:

            1.psql command line komutları ile

[root@localhost /root]# psql pgornek -p 6879 -U lkduser -f pgornek.pgdump

Password:

You are now connected as new user lkduser

psql:pgornek.pgdump:17: NOTICE:  CREATE TABLE/PRIMARY KEY will create implicit index 'ip_pkey' for table 'ip'

...

           2.psql internal komutları ile

[root@localhost /root]# psql pgornek -p 6879 -U lkduser

Password:

pgornek =# \i pgornek.pgdump

Web üzerindeki siteler

http://www.postgresql.org/

http://techdocs.postgresql.org/

http://odbc.postgresql.org/

http://jdbc.postgresql.org/

http://www.unixodbc.org/

http://pgdemo.acucore.com

http://www.pgsql.com/


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