Veritabanı Sunucusunu Başlatma
Veritabanına herhangi birinin erişebilmesi için veritabanı sunucusunu başlatmanız gerekir. Veritabanı sunucusu programına postgres
denir. PostgreSQL’in önceden paketlenmiş bir sürümünü kullanıyorsanız, işletim sisteminizin kurallarına göre sunucuyu bir arka plan görevi olarak çalıştırmaya yönelik akış hemen hemen her dağıtım için sağlanmıştır.
Sunucuyu manuel olarak başlatmanın basit yolu, postgres’i -D
seçeneği ile veri dizininin konumunu belirterek çağırmaktır, örnek:
$ postgres -D /usr/local/pgsql/data
postgres’i arka planda başlamak için Unix kabuk sözdizimi:
$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &
stdout
ve stderr
çıktısını yukarıda gösterildiği gibi bir yerde saklamak denetim ve sorun teşhisinde yardımcı olacaktır.pg_ctl
sarmalayıcı programı, bu kabuk sözdizimi karmaşasından kurtulmak için kullanılabilir, Örnek:
pg_ctl start -l logfile
postgres
komutundaki kullanımla aynı anlama sahiptir. Ayrıca pg_ctl ile sunucu durdurulabilir.Farklı sistemlerin arka plan yordamlarını önyükleme sırasında başlatmak için farklı kuralları vardır. Çoğu sistemde /etc/rc.local
veya /etc/rc.d/rc.local
dosyası bulunur. Diğerleri init.d
veya rc.d
dizinlerini kullanır. Sunucu süper kullanıcı PostgreSQL kullanıcı hesabı tarafından çalıştırılmalıdır. Bu yüzden komutlarınızı su postgres -c '...'
formunda oluşturmalısınız. Örneğin:
su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'
Linux sistemlere özgü birkaç öneri.
Systemd kullanırken, aşağıdaki hizmet birimi dosyasını kullanabilirsiniz (/etc/systemd/system/postgresql.service
adresinde):
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Burada zaman aşımı ayarını dikkatlice düşünün. systemd 90 saniyelik varsayılan zaman aşımına sahiptir ve bu süre içinde hazır olduğunu bildirmeyen işlem sonlandırılacaktır. 0 değeri zaman aşımını devre dışı bırakır.
Sunucu çalışırken, PID’si veri dizinindeki postmaster.pid
dosyasında saklanır. Bu, birden çok instance’ın aynı veri dizininde çalışmasını önlemek ve sunucuyu kapatmak için kullanılabilir.
Sunucu Başlatma Hataları
Sunucuyu başlangıçlarının başarısız olmasının birkaç genel nedeni vardır. Bu durumlarda, sunucu loglarını kontrol edin veya elle başlatarak (standart çıktıyı veya standart hatayı yönlendirmeden) hangi hata mesajlarının alındığına bakın. Yaygın hata mesajlarından bazıları;
LOG: could not bind IPv4 address "127.0.0.1": Address already in use
HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
FATAL: could not create any TCP/IP sockets
Bu, çalışmakta olan sunucuyla aynı portta başka bir sunucu başlatmayı denedinizi bildiren bir öneri mesajıdır. Bu çekirdek hata mesajı Address already in use veya bir çeşidi değilse farklı bir sorun olabilir. Örneğin, ayırılmış bir portta sunucu başlatmaya çalışmak aşağıdaki gibi bir hata verecektir:
$ postgres -p 666
LOG: could not bind IPv4 address "127.0.0.1": Permission denied
HINT: Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL: could not create any TCP/IP sockets
FATAL: could not create shared memory segment: Invalid argument
DETAIL: Failed system call was shmget(key=5440001, size=4011376640, 03600).
Bu mesaj, muhtemelen çekirdeğinizin paylaşılan bellek boyutu sınırının PostgreSQL’in oluşturmaya çalıştığı çalışma alanından daha küçük olduğu anlamına gelir (örnekte 4011376640 bayt).
Şuna benzer bir hata:
FATAL: could not create semaphores: No space left on device
DETAIL: Failed system call was semget(5440126, 17, 03600).
Bu hata, disk alanınızın tükendiği anlamına gelmez. Bu, çekirdeğinizin System V semaforlarının sayısı üzerindeki sınırının PostgreSQL’in oluşturmak istediği sayıdan daha küçük olduğu ifade eder.
İstemci Bağlantı Sorunları
İstemci tarafında olası hata koşulları oldukça çeşitli ve uygulamaya bağlı olsa da bunlardan birkaçı doğrudan sunucunun nasıl başlatıldığıyla ilgilidir. Aşağıda gösterilenler dışındaki koşullar, ilgili istemci uygulamasıyla belgelenmelidir.
psql: could not connect to server: Connection refused
Is the server running on host "server.joe.com" and accepting
TCP/IP connections on port 5432?
Bu genel “konuşacak bir sunucu bulamadım” hatasıdır. TCP / IP bağlantısı denendiğinde yukarıdaki hata alınır. Burada yapılan en yaygın hata sunucuyu TCP / IP bağlantılarına izin verecek şekilde yapılandırmayı unutmaktır.
Benzer şekilde yerel bir sunucuya Unix soket bağlantısı denediğinizde şöyle bir hata alırsınız:
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
İstemcinin doğru yere bağlanmaya çalıştığını doğrulamak son satır kullanışlıdır. Gerçekte burada çalışan sunucu yoksa, gösterildiği gibi “Connection refused” veya “No such file or directory” şeklinde bir çekirdek hata mesajı alınır. Bir diğer hata mesajı olan “Connection timed out” ise ağ bağlantısının olmaması gibi daha temel sorunları ifade eder.
Kaynak: