macOS, CentOS ve Ubuntu Üzerinde PostgreSQL Kurulumu ve Türkçe Karakter Hatasının Giderilmesi

Gerekli komutlar

1 ay önce database, postgresql etiketinde yazıldı.

PostgreSQL

Merhaba arkadaşlar,

Uzun zamandır PostgreSQL ile ilgili kaynakları bir araya getirip bir makale yazmayı düşünüyordum, nasip bugüneymiş.

PostgreSQL bildiğiniz üzere birçok açıdan benzer veritabanı sistemlerden daha fazla artıya sahiptir. SaaS (Software as a Service, hizmet olarak yazılım) bir uygulamamız için veritabanı tercihi olarak PostgreSQL kullanmakta karar kıldık.

Bu makalede macOs, Centos ve Ubuntu üzerine kurulumu, kullanıcı (rol) ve veritabanı oluşturulmasına ilişkin komutları bulacaksınız.

Makinemize, son sürüm olan PostgreSQL 11.5 kurulumunu anlatacağız.

PostgreSQL Kurulumu

MacOS’a PostgreSQL kurulumu

Sisteminizde Homebrew kurulu olduğunu varsayarsak (değilse buradan gerekli yönergeleri takip ederek kurabilirsiniz);

Brew Repolarının güncel olduğundan emin olalım:

$ brew update

Kurulum:

$ brew install postgresql

komutu ile PostgreSQL’in kurulumu yapılır.

(Opsiyonel) Makinenizde eski bir sürüm yüklü ise bu komutla mevcut veritabanlarınızın yükseltilmesini sağlayabilirsiniz:

$ brew postgresql-upgrade-database

Servisin bilgisayarın açılışında otomatik çalıştırılması için:

$ brew services start postgresql

Servisi şimdi çalıştırmak için:

$ brew services start postgresql

Durdurmak için:

$ brew services stop postgresql

Yeniden başlatmak için:

$ brew services restart postgresql

Hatırlatma Açılışta başlaması ve şimdi çalıştırmak için komutlarının aynı ($ brew services start postgresql) olduğu dikkatinizi çekti mi? macOS’ta çalıştır komutunu verdiğiniz zaman tekrar durdur demediğiniz sürece servis açılışta otomatik çalıştırılacaktır. Bu durum stop için de geçerlidir. Durdurduğunuz servis açlışta tekrar devreye girmez.

Açılışta çalışması için farklı yöntemler de vardır ancak bu makalenin konusu olmadığından buna burada değinmeyeceğim.

$ brew services list komutu ile şu anda yüklü olan servisler ve durumları hakkında bilgi sahibi olabilirsiniz. bu komut size aşağıdakine benzer bir çıktı oluşturacaktır:

Name       Status  User Plist
beanstalkd started
dnsmasq    started
nginx      started
php        started
postgresql started
redis      started
unbound    stopped

CentOS’a PostgreSQL kurulumu

Yum Repolarının güncel olduğundan emin olalım:

$ sudo yum update

Kurulum:

$ sudo yum install postgresql-server postgresql-contrib

PostgreSQL’i devreye alma:

$ sudo postgresql-setup initdb

Servisi Başlatma:

$ sudo systemctl start postgresql

Servisin bilgisayarın açılışında otomatik çalıştırılması için:

$ sudo systemctl enable postgresql

Durdurmak için:

$ sudo systemctl stop postgresql

Yeniden başlatmak için:

$ sudo systemctl restart postgresql    

Ubuntu’ya PostgreSQL kurulumu

APT Repolarının güncel olduğundan emin olalım:

$ sudo apt-get update

Kurulum:

$ sudo apt-get install postgresql postgresql-contrib

Servisi Başlatma:

$ sudo systemctl start postgresql

Servisin bilgisayarın açılışında otomatik çalıştırılması için:

$ sudo systemctl enable postgresql

Durdurmak için:

$ sudo systemctl stop postgresql

Yeniden başlatmak için:

$ sudo systemctl restart postgresql

Kurulum Sonrası İşlemler

PostgreSQL veritabanı sunucusu kurulduktan sonra, varsayılan olarak, postgres rolüne sahip, postgres adında bir kullanıcı ve ayrıca postgres adı verilen bir sistem hesabı oluşturur. PostgreSQL sunucusuna bağlanmak için sisteminize postgres kullanıcısu olarak giriş yapın ve veritabanına bağlanın.

Veritabanına bağlanma

$ psql postgres

Karşınıza PostgreSQL’in komut aracı çıkacaktır:

psql (11.5)
Type "help" for help.

postgres=#

Sisteme homestead adında, secret şifresine sahip bir kullanıcı ekleyeceğim.

$ CREATE ROLE homestead WITH LOGIN PASSWORD 'secret';

Oluşturmuş olduğum bu homestead adındaki kullanıcıya veritabanı oluşturma yetkisi / rolü vereceğim:

$ ALTER ROLE homestead CREATEDB;

Bu veritananının kullanıcılarını listeleyeyim:

$ \du

Bu komut size aşağıdakine benzer bir çıktı oluşturacaktır:

                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 homestead | Create DB                                                  | {}
 sineld    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}    

PostgreSQL komut satırından çıkış yapalım:

$ \q

Oluşturmuş olduğumuz homestead kullanıcısı ile giriş yapalım:

$ psql postgres -U homestead

project1 isminde Türkçe karakter destekli bir veritabanı oluşturalım:

$ CREATE DATABASE project1 ENCODING='UTF-8' LC_COLLATE = 'tr_TR.UTF-8' LC_CTYPE='tr_TR.UTF-8' TEMPLATE template0;

Dikkat Bu komut size aşağıdakine benzer bir hata verirse sisteme UTF-8 deskteli Türkçe karakter seti tanımlaması gerekecektir:

$ ERROR:  invalid locale name: "tr_TR.UTF-8"

Sorunun giderilmesi

macOS için;

Kullanıdığınız ~/.profile, ~/.bash_profile veya ~/.zshrc içine aşağıdaki satırları ekleyin:

export LC_ALL=tr_TR.UTF-8
export LANG=tr_TR.UTF-8

Centos ve Ubuntu için;

$ sudo locale-gen tr_TR
$ sudo locale-gen tr_TR.UTF-8
$ sudo update-locale

Ardından PostgreSQL servisini yeniden bağlatalım:

MacOS için:

$ brew services restart postgresql

Centos / Ubuntu için:

$ sudo systemctl restart postgresql

Veritabanını oluşturma komutunu tekrar çalıştırınız.

Veritabanlarımızı listeleyelim:

$ \l

Bu komut size aşağıdakine benzer bir çıktı oluşturacaktır:

                                List of databases
   Name    |   Owner   | Encoding |   Collate   |    Ctype    | Access privileges
-----------+-----------+----------+-------------+-------------+-------------------
 project1     | homestead | UTF8     | tr_TR.UTF-8 | tr_TR.UTF-8 |
 postgres     | sineld    | UTF8     | C           | C           |
 template0    | sineld    | UTF8     | C           | C           | =c/sineld        +
              |           |          |             |             | sineld=CTc/sineld
 template1    | sineld    | UTF8     | C           | C           | =c/sineld        +
              |           |          |             |             | sineld=CTc/sineld
(6 rows)

Oluşturduğumuz Türkçe kararkter destekli project1 veritabanına bağlanalım:

$ \c project1;

Bu komut size aşağıdakine benzer bir çıktı oluşturacaktır:

You are now connected to database "project1" as user "homestead".
project1=#

Türkçe karakterlerimizin testini yapalım:

$ SELECT
    harf, upper(harf)
FROM (
VALUES ('ş'), ('t'), ('u'), ('a'), ('n'), ('o'), ('ö'), ('p'), ('f'), ('g'), ('ğ'), ('h'), ('ı'), ('i'), ('j'), ('k'), ('l'), ('m'), ('ü'), ('v'), ('r'), ('s'), ('b'), ('c'), ('ç'), ('d'), ('e'), ('y'), ('z')) AS
alfabe(harf)
ORDER BY 1; 

Bu komut postgresql mesaj panosu‘dan alınmıştır.

Bu komut size aşağıdakine benzer bir çıktı oluşturacaktır:

 harf | upper
------+-------
"a" "A"
"b" "B"
"c" "C"
"ç" "Ç"
"d" "D"
"e" "E"
"f" "F"
"g" "G"
"ğ" "Ğ"
"h" "H"
"ı" "I"
"i" "İ"
"j" "J"
"k" "K"
"l" "L"
"m" "M"
"n" "N"
"o" "O"
"ö" "Ö"
"p" "P"
"r" "R"
"s" "S"
"ş" "Ş"
"t" "T"
"u" "U"
"ü" "Ü"
"v" "V"
"y" "Y"
"z" "Z"
(29 rows)

macOS işletim sisteminizin yerel dili Türkçe değilse, sıralama farklı olabilir. Araştırmalarıma göre unix sistem spesifik bir sorun olarak bu durumla karşılaşabilirsiniz. Linux’ta locale-gen yaptığınız takdirde bu sorunla karşılaşmayacaksınız.

En çok ihtiyaç duyacağınız PostgreSQL komutları şunlardır:

\q                      : Çıkış
\c __veritabanı__       : veritabanı isimli veritabanına bağlantı yapar
\d __table__            : table isimli tablo hakkında açıklama (triggerları içerir)
\d+ __table__           : table isimli tablo hakkında daha fazla açıklamal (disk boyutu kullanımı)
\l                      : Veritabanlarını listeler
\dy                     : Olayları listeler
\df                     : Fonksiyonları listeler
\di                     : Indexleri listeler
\dn                     : Şemaları listeler
\dt *.*                 : Tüm şemaların tüm tablolarını listeler
\dT+                    : Tüm veri tipleri listeler
\dv                     : Görünümleri listeler
\df+ __function__       : Fonksiyonun SQL kodunu gösterir.
\x                      : Sorgu sonuçlarını, çirkin ASCII tablolar yerine güzelleştirerek döker
\du                     : Kullanıcıları listeler
\du __kullanıcı__       : Eğer mevcutsa kullanıcıyı listeler

Uzunca bir makalenin sonuna geldik.

Bu konuda bir otorite olmadığım ve paylaştıklarımın yeni öğrenen birine ait; hem kendisine, hem de kendisi gibi yeni başlayanlara referans bilgiler olması açısından hazırlandığı göz önünde bulundurulmalıdır.

Eksik veya yanlış bir bilgi ie karşılaşırsanız lütfen aşağıdaki yorum kısmından paylaşın.

Keyifli PostgreSQL’lemeler dilerim :)