PostgreSQL Veri Dizinini Ubuntu 18.04’te Yeni Bir Konuma Taşıma
Giriş
PostgreSQL, açık kaynaklı ve güçlü bir ilişkisel veritabanı yönetim sistemidir (RDBMS). Uygulamaların ve hizmetlerin temelini oluşturan verilerin depolanmasında kritik bir rol oynar. Zamanla, bir PostgreSQL kurulumunun veri dizini, disk alanı yetersizliği, performans optimizasyonu, ayrı bir depolama birimine geçiş, yedekleme stratejilerini iyileştirme veya sistem mimarisini düzenleme gibi çeşitli nedenlerle farklı bir konuma taşınma ihtiyacı duyabilir. Bu teknik makale, Ubuntu 18.04 işletim sistemi üzerinde çalışan bir PostgreSQL veri dizinini güvenli ve etkili bir şekilde yeni bir konuma nasıl taşıyacağınızı adım adım açıklamaktadır.
Veri dizinini taşımak, hassas bir işlem olup yanlış yapıldığında veri kaybına yol açabilir. Bu nedenle, her adımın dikkatlice takip edilmesi ve özellikle yedekleme adımlarının atlanmaması büyük önem taşır. Bu rehber, olası riskleri en aza indirerek sorunsuz bir geçiş sağlamayı amaçlamaktadır.
Ön Hazırlıklar ve Güvenlik Tedbirleri
Veri taşıma işlemine başlamadan önce, sisteminizin ve verilerinizin güvenliğini sağlamak için bazı önemli hazırlıklar yapmanız gerekmektedir. Bu adımlar, olası sorunlarda geri dönüş noktası sağlamanın yanı sıra, taşıma işleminin başarılı bir şekilde tamamlanması için gerekli ortamı hazırlar.
Veri Yedekleme
Herhangi bir kritik sistem değişikliğinde olduğu gibi, PostgreSQL veri dizinini taşımadan önce mevcut veritabanlarınızın tam bir yedeğini almak mutlak surette gereklidir. Bu yedek, beklenmedik bir hata durumunda verilerinizi kurtarmanızı sağlayacak cankurtaranınızdır. İki temel yedekleme yöntemi önerilir:
Mantıksal Yedekleme (pg_dumpall)
Bu yöntem, tüm veritabanlarını, rolleri, tabloları ve diğer veritabanı nesnelerini SQL komutları şeklinde yedekler. Bu, platform bağımsız bir yedekleme olup, geri yükleme esnekliği sunar.
sudo -u postgres pg_dumpall > /path/to/your/backup/all_databases_backup.sql
/path/to/your/backup/ kısmını yedek dosyanızı saklamak istediğiniz güvenli bir dizinle değiştirin. Bu dizinin yeni veri dizini konumunda veya mevcut PostgreSQL veri dizininde olmaması önemlidir. Tercihen harici bir depolama birimi veya farklı bir disk bölümü kullanılmalıdır.
Fiziksel Yedekleme (Dizin Kopyalama)
PostgreSQL servisi durdurulduktan sonra veri dizininin doğrudan kopyalanması, taşıma işlemi sırasında bir sorun yaşanması durumunda mevcut durumu geri yüklemek için hızlı bir yol sağlar. Bu, bir nevi “anlık görüntü” yedeklemesidir.
sudo cp -Rp /var/lib/postgresql/10/main /path/to/your/backup/postgresql_data_backup_$(date +%Y%m%d%H%M)
Burada /var/lib/postgresql/10/main varsayılan PostgreSQL 10 veri dizini yoludur. Kendi PostgreSQL sürümünüze göre bu yolu ayarlamanız gerekebilir (örneğin, PostgreSQL 12 için /var/lib/postgresql/12/main). -R dizinleri özyinelemeli olarak kopyalar, -p ise izinleri ve zaman damgalarını korur.
Sistem Bilgilerini Kontrol Etme
Taşıma işlemine başlamadan önce mevcut PostgreSQL kurulumunuz hakkında bazı temel bilgileri edinmek faydalıdır:
* PostgreSQL Sürümü: Genellikle /etc/postgresql/ altında sürüm numarasına göre dizinler bulunur (örn. 10, 12, 14).
* Mevcut Veri Dizini Konumu: PostgreSQL komut satırından bağlanarak bu bilgiyi edinebilirsiniz:
sudo -u postgres psql -c "SHOW data_directory;"
Bu komut size mevcut veri dizininin tam yolunu gösterecektir, örneğin /var/lib/postgresql/10/main.
* PostgreSQL Servis Durumu: Servisin çalıştığından emin olun.
sudo systemctl status postgresql
* Yeni Konumda Disk Alanı: Yeni veri dizinini taşıyacağınız disk bölümünde yeterli boş alan olduğundan emin olun. Mevcut veri dizininin boyutunu kontrol edin ve yeni konumda en az aynı miktarda, hatta biraz daha fazla boş alan olduğundan emin olun.
du -sh /var/lib/postgresql/10/main # Mevcut dizin boyutu
df -h /mnt/new_disk_mount_point # Yeni konumdaki boş alan
Yeni Konumun Hazırlanması
Veri dizinini taşıyacağınız yeni konumda gerekli dizin yapısını oluşturmanız ve doğru sahiplik ile izinleri ayarlamanız gerekmektedir.
* Yeni Dizin Oluşturma: Yeni veri dizini için bir ana dizin ve ardından sürüm ve küme adı için alt dizinler oluşturun. Örneğin, /mnt/new_disk/postgresql/10/main gibi bir yapı kullanabilirsiniz.
sudo mkdir -p /mnt/new_disk/postgresql/10/main
Burada /mnt/new_disk yeni disk bölümünüzün bağlama noktası olabilir. Bu yolu kendi sisteminize göre ayarlayın.
* Sahiplik ve İzinleri Ayarlama: PostgreSQL veri dizini, postgres kullanıcısı ve grubuna ait olmalı ve yalnızca bu kullanıcı tarafından okunabilir ve yazılabilir olmalıdır. Bu, güvenlik için kritik öneme sahiptir.
sudo chown -R postgres:postgres /mnt/new_disk/postgresql/10/main
sudo chmod -R 0700 /mnt/new_disk/postgresql/10/main
0700 izinleri, yalnızca dizin sahibinin (yani postgres kullanıcısının) okuma, yazma ve yürütme (dizinler için gezinme) haklarına sahip olduğu anlamına gelir. Başka hiçbir kullanıcı veya grup bu dizine erişemez.
PostgreSQL Servisini Durdurma
Veri dizinini taşımadan önce PostgreSQL servisini tamamen durdurmak zorunludur. Servis çalışırken veri dizinini taşımaya çalışmak, veri bozulmasına ve geri dönüşü olmayan hatalara yol açabilir.
sudo systemctl stop postgresql
Servisin başarıyla durdurulduğunu doğrulamak için aşağıdaki komutu kullanabilirsiniz:
sudo systemctl status postgresql
Çıktıda Active: inactive (dead) veya benzeri bir durum görmelisiniz.
Veri Dizinini Taşıma
PostgreSQL servisi durdurulduktan ve yeni konum hazırlandıktan sonra, mevcut veri dizinini yeni konuma taşıyabiliriz. Bu işlem için rsync komutunu kullanmak, büyük dizinler için daha güvenli ve bilgilendirici bir yöntemdir.
rsync ile Taşıma
rsync, dosyaları ve dizinleri kopyalamak ve senkronize etmek için güçlü bir araçtır. Özellikle büyük veri dizinlerini taşırken ilerleme göstergesi sunması, ağ üzerinden kopyalama yapabilmesi ve hatalara karşı daha dirençli olması nedeniyle tercih edilir.
sudo rsync -av /var/lib/postgresql/10/main/ /mnt/new_disk/postgresql/10/main/
Bu komuttaki parametrelerin anlamları:
* -a (archive): Arşiv modu; özyinelemeli kopyalama, sembolik bağlantıları koruma, izinleri, sahipliği, zaman damgalarını koruma gibi birçok şeyi içerir.
* -v (verbose): Ayrıntılı çıktı verir, kopyalanan dosyaları gösterir.
/var/lib/postgresql/10/main/ (kaynak): Mevcut PostgreSQL veri dizininin yolu. Sondaki eğik çizgi (/), dizinin içeriğinin* kopyalanacağı anlamına gelir, dizinin kendisinin değil.
* /mnt/new_disk/postgresql/10/main/ (hedef): Yeni veri dizini konumu.
Taşıma işlemi tamamlandıktan sonra, eski veri dizinini hemen silmek yerine, bir yedek olarak yeniden adlandırmak iyi bir uygulamadır. Bu, herhangi bir sorun yaşanması durumunda kolayca geri dönebilmenizi sağlar.
sudo mv /var/lib/postgresql/10/main /var/lib/postgresql/10/main_old
PostgreSQL Yapılandırmasını Güncelleme
Veri dizini yeni konumuna taşındıktan sonra, PostgreSQL’e bu değişikliği bildirmeniz gerekir. Bu, postgresql.conf yapılandırma dosyasında yapılır.
postgresql.conf Dosyasını Düzenleme
postgresql.conf dosyası, PostgreSQL sunucusunun davranışını kontrol eden ana yapılandırma dosyasıdır. Ubuntu’da bu dosya genellikle /etc/postgresql/ yolunda bulunur.
1. Yapılandırma Dosyasını Açma:
sudo nano /etc/postgresql/10/main/postgresql.conf
PostgreSQL sürümünüze göre yolu ayarlamayı unutmayın.
2. data_directory Parametresini Bulma ve Güncelleme:
Dosya içinde data_directory parametresini arayın. Genellikle yorum satırı olarak (başında # işaretiyle) bulunur ve varsayılan yolu gösterir.
#data_directory = 'var/lib/postgresql/10/main' # use data in another directory
Bu satırı bulun, yorum işaretini kaldırın (#) ve değerini yeni veri dizini konumunuza ayarlayın:
data_directory = '/mnt/new_disk/postgresql/10/main'
Eğer dosyada birden fazla data_directory girişi varsa, yalnızca birinin yorum satırı olmadığından ve doğru yolu gösterdiğinden emin olun. Diğerlerini yorum satırı yapın veya silin.
3. Dosyayı Kaydetme ve Çıkma:
Nano düzenleyicisinde, Ctrl+O tuşlarına basarak kaydedin, ardından Enter tuşuna basın ve Ctrl+X tuşlarına basarak çıkın.
Yeni Konumun İzinlerini Kontrol Etme
Daha önce yeni dizini oluştururken izinleri ayarlamış olsak da, taşıma işlemi veya yapılandırma değişiklikleri sırasında yanlışlıkla değişmiş olabileceği ihtimaline karşı izinleri ve sahipliği tekrar kontrol etmek iyi bir adımdır. PostgreSQL’in yeni veri dizinine erişebilmesi için doğru izinlere sahip olması kritik öneme sahiptir.
sudo chown -R postgres:postgres /mnt/new_disk/postgresql/10/main
sudo chmod -R 0700 /mnt/new_disk/postgresql/10/main
Bu komutlar, yeni veri dizininin ve tüm alt dizinleri ile dosyalarının postgres kullanıcısı ve grubuna ait olmasını sağlar ve yalnızca bu kullanıcıya tam erişim yetkisi verir.
PostgreSQL Servisini Başlatma ve Doğrulama
Tüm yapılandırma değişiklikleri yapıldıktan ve izinler kontrol edildikten sonra, PostgreSQL servisini başlatabilir ve taşıma işleminin başarılı olup olmadığını doğrulayabiliriz.
1. PostgreSQL Servisini Başlatma:
sudo systemctl start postgresql
2. Servis Durumunu Kontrol Etme:
Servisin başarıyla başlatılıp başlatılmadığını kontrol edin.
sudo systemctl status postgresql
Active: active (exited) veya Active: active (running) gibi bir durum görmelisiniz. Eğer servis başlamazsa veya hata verirse, sonraki “Sık Karşılaşılan Sorunlar ve Çözümleri” bölümüne bakın.
3. PostgreSQL Loglarını Kontrol Etme:
Herhangi bir hata veya uyarı için PostgreSQL loglarını kontrol etmek çok önemlidir.
sudo journalctl -u postgresql -f
veya doğrudan log dosyalarını kontrol edebilirsiniz:
sudo tail -f /var/log/postgresql/postgresql-10-main.log
Loglarda FATAL veya ERROR mesajları arayın.
4. Veri Dizini Konumunu Doğrulama:
psql ile PostgreSQL’e bağlanarak yeni data_directory konumunun doğru ayarlandığını doğrulayın.
sudo -u postgres psql
psql komut isteminde:
SHOW data_directory;
Bu komutun çıktısı, postgresql.conf dosyasında belirttiğiniz yeni yolu (/mnt/new_disk/postgresql/10/main) göstermelidir.
5. Veritabanlarını ve Verileri Test Etme:
Veritabanlarınızın listesini görüntüleyin, tablolara sorgular çalıştırın ve verilerinize erişebildiğinizden emin olun. Tüm uygulamalarınızın ve hizmetlerinizin veritabanına sorunsuz bir şekilde bağlanabildiğini ve beklendiği gibi çalıştığını doğrulayın.
\l -- Veritabanlarını listeler
\c your_database_name -- Bir veritabanına bağlanın
\dt -- Tabloları listeler
SELECT * FROM your_table_name LIMIT 10; -- Bir tablodan veri sorgulayın
Eski Veri Dizinini Kaldırma
PostgreSQL servisi yeni konumdan başarıyla çalışıyor ve tüm verilerinizin erişilebilir olduğunu doğruladıktan sonra, eski veri dizinini güvenli bir şekilde kaldırabilirsiniz. Bu adımı, yeni sistemin birkaç gün veya hafta boyunca sorunsuz çalıştığından emin olmadan yapmamanız şiddetle tavsiye edilir. Eski dizini main_old olarak yeniden adlandırmıştık, şimdi onu silebiliriz.
sudo rm -rf /var/lib/postgresql/10/main_old
Bu komutu çalıştırmadan önce, yedeklerinizin güncel olduğundan ve yeni sistemin kararlı çalıştığından kesinlikle emin olun. Bu komut geri alınamaz.
Sık Karşılaşılan Sorunlar ve Çözümleri
Veri dizinini taşıma işlemi sırasında veya sonrasında bazı sorunlarla karşılaşmak mümkündür. İşte en yaygın sorunlar ve bunların çözümleri:
İzin Hataları
Belirti: PostgreSQL servisi başlamaz ve loglarda FATAL: could not open directory "..." Permission denied veya FATAL: data directory "/..." has wrong ownership gibi mesajlar görünür.
Neden: Yeni veri dizini veya içindeki dosyalar postgres kullanıcısı ve grubuna ait değildir veya doğru izinlere sahip değildir.
Çözüm: Yeni veri dizininin sahipliğini ve izinlerini doğru şekilde ayarlayın.
sudo chown -R postgres:postgres /mnt/new_disk/postgresql/10/main
sudo chmod -R 0700 /mnt/new_disk/postgresql/10/main
Yapılandırma Dosyası Hataları
Belirti: PostgreSQL servisi başlamaz ve loglarda FATAL: unrecognized configuration parameter "data_directory" veya FATAL: multiple data_directory specifications gibi mesajlar görünür.
Neden: postgresql.conf dosyasında data_directory parametresi yanlış yazılmış, iki kez tanımlanmış veya yorum satırı olarak bırakılmıştır.
Çözüm: postgresql.conf dosyasını dikkatlice kontrol edin. data_directory parametresinin doğru yazıldığından, yalnızca bir kez tanımlandığından ve başında # işareti olmadığından emin olun.
Disk Alanı Yetersizliği
Belirti: rsync komutu sırasında veya PostgreSQL servisi başlatılırken disk alanı yetersizliği ile ilgili hatalar.
Neden: Yeni veri dizini için ayrılan disk bölümünde yeterli boş alan yoktur.
Çözüm: Taşıma işlemine başlamadan önce df -h komutuyla hedef disk bölümündeki boş alanı kontrol edin. Gerekirse daha büyük bir disk bölümü hazırlayın veya mevcut bölümü genişletin.
PostgreSQL Başlatılamıyor
Belirti: sudo systemctl start postgresql komutu başarısız olur ve sudo systemctl status postgresql çıktısında hatalar görünür.
Neden: Genellikle izin hataları, yapılandırma hataları veya yeni veri dizinindeki bozuk dosyalar nedeniyle oluşur.
Çözüm:
* Logları kontrol edin: sudo journalctl -u postgresql veya /var/log/postgresql/ altındaki log dosyalarını dikkatlice inceleyin. Hatanın nedenini genellikle burada bulabilirsiniz.
* İzinleri ve sahipliği kontrol edin: Yukarıdaki izin hataları bölümündeki adımları tekrarlayın.
* postgresql.conf dosyasını kontrol edin: data_directory parametresinin doğru ayarlandığından emin olun.
* Yedekten geri yükleme: Eğer hiçbir çözüm işe yaramazsa ve loglar net bir çözüm sunmazsa, fiziksel veya mantıksal yedeklerinizden geri yükleme yapmayı düşünebilirsiniz.
Bağlantı Sorunları
Belirti: PostgreSQL servisi çalışıyor gibi görünse de, uygulamalar veya psql aracı veritabanına bağlanamıyor.
Neden: Genellikle pg_hba.conf dosyasındaki yanlış yapılandırma, güvenlik duvarı kuralları veya ağ ayarları nedeniyle oluşur.
Çözüm:
* pg_hba.conf kontrolü: Bu dosya, istemci bağlantılarına izin veren kuralları içerir. Dosyanın (/etc/postgresql/10/main/pg_hba.conf) doğru yapılandırıldığından emin olun.
* Güvenlik duvarı: Ubuntu’da ufw gibi bir güvenlik duvarı kullanıyorsanız, PostgreSQL’in varsayılan portu olan 5432’nin gelen bağlantılara açık olduğundan emin olun.
sudo ufw status
sudo ufw allow 5432/tcp
PostgreSQL dinleme adresi: postgresql.conf dosyasındaki listen_addresses parametresinin doğru ayarlandığından emin olun. Tüm arayüzlerden dinlemek için '' olarak ayarlanabilir.
Sonuç
PostgreSQL veri dizinini Ubuntu 18.04 üzerinde yeni bir konuma taşımak, dikkatli planlama ve adım adım uygulama gerektiren kritik bir sistem yönetimi görevidir. Bu rehberde açıklanan adımları izleyerek, veri kaybı riskini en aza indirerek bu işlemi güvenli ve başarılı bir şekilde gerçekleştirebilirsiniz.
Unutulmaması gereken en önemli adımlar:
1. Kapsamlı Yedekleme: Herhangi bir değişikliğe başlamadan önce verilerinizin tam yedeğini aldığınızdan emin olun.
2. Doğru İzinler: Yeni veri dizininin postgres kullanıcısına ve grubuna ait olduğundan ve 0700 izinlerine sahip olduğundan emin olun.
3. Yapılandırma Güncellemesi: postgresql.conf dosyasındaki data_directory parametresini yeni yola işaret edecek şekilde doğru bir şekilde güncelleyin.
4. Doğrulama: PostgreSQL servisini başlattıktan sonra, logları kontrol edin ve tüm veritabanı işlemlerinin beklendiği gibi çalıştığını doğrulayın.
Veri dizinini taşımak, disk alanı yönetimi, performans iyileştirmeleri ve genel sistem esnekliği açısından önemli faydalar sağlayabilir. Bu rehberdeki bilgileri kullanarak, PostgreSQL altyapınızı daha verimli ve güvenli bir şekilde yönetebilirsiniz.