PostgreSQL Veri Dizinini Ubuntu 20.04’te Yeni Bir Konuma Taşıma Rehberi
Giriş
PostgreSQL, açık kaynaklı ve oldukça güçlü bir ilişkisel veritabanı yönetim sistemidir (RDBMS). Uygulamaların temelinde yer alan verileri depolamak ve yönetmek için sıklıkla tercih edilir. Zaman zaman, bir PostgreSQL kurulumunun veri dizinini (data directory) farklı bir fiziksel konuma taşımak gerekebilir. Bu taşıma işlemi, disk alanı yönetimi, performans iyileştirmeleri, daha güvenli bir depolama birimine geçiş veya mevcut diskin dolması gibi çeşitli nedenlerle gündeme gelebilir. Özellikle Ubuntu 20.04 gibi sunucu işletim sistemlerinde, varsayılan kurulum dizinleri belirli bir disk bölümünde yer alırken, veritabanı büyüdükçe bu bölüm yetersiz kalabilir veya daha hızlı bir SSD’ye geçiş ihtiyacı doğabilir.
Bu kapsamlı teknik makale, Ubuntu 20.04 işletim sistemi üzerinde çalışan bir PostgreSQL veritabanının veri dizinini güvenli ve doğru bir şekilde yeni bir konuma nasıl taşıyacağınızı adım adım açıklamaktadır. İşlem sırasında olası veri kayıplarını önlemek ve sistemin kesintisiz çalışmasını sağlamak için dikkat edilmesi gereken tüm kritik noktalar vurgulanacaktır. Rehber, hem deneyimli sistem yöneticileri hem de PostgreSQL ile yeni tanışan kullanıcılar için anlaşılır bir dil ve pratik örneklerle hazırlanmıştır.
Neden Veri Dizinini Taşımak Gerekir?
PostgreSQL veri dizinini taşıma kararı genellikle aşağıdaki senaryolardan biri veya birkaçı nedeniyle alınır:
Disk Alanı Yönetimi
Veritabanları zamanla büyür ve mevcut disk bölümündeki alanı tüketebilir. Özellikle kök dizin (/) altında veya sınırlı boyutlu bir disk bölümünde yer alan varsayılan veri dizini, yeterli depolama alanı sunmayabilir. Yeni bir, daha büyük veya ayrı bir disk bölümüne taşıma, disk alanı sıkıntısını giderir ve gelecekteki büyümeye olanak tanır.
Performans İyileştirmeleri
Veritabanı performansında I/O (giriş/çıkış) işlemleri kritik bir rol oynar. Daha hızlı bir depolama birimine (örneğin, HDD’den SSD’ye veya daha hızlı bir NVMe SSD’ye) geçiş yapmak, veritabanının okuma/yazma hızlarını önemli ölçüde artırabilir. Veri dizinini bu yeni, daha hızlı bir konuma taşımak, genel veritabanı performansını doğrudan etkiler.
Güvenlik ve Yedekleme Stratejileri
Bazı durumlarda, veri dizinini ayrı bir disk bölümüne veya depolama sistemine taşımak, yedekleme stratejilerini basitleştirebilir veya güvenlik gereksinimlerini karşılayabilir. Örneğin, hassas verilerin şifrelenmiş bir bölüme taşınması veya belirli güvenlik ilkelerine uygun bir depolama alanına yönlendirilmesi gerekebilir.
Sistem Yeniden Yapılandırması
Bir sunucunun genel disk düzenini veya depolama altyapısını yeniden yapılandırırken, veritabanı veri dizininin de yeni düzene uyacak şekilde taşınması gerekebilir. Bu, genellikle sunucu yükseltmeleri veya donanım değişiklikleri sırasında ortaya çıkar.
Yüksek Erişilebilirlik ve Felaket Kurtarma
Yüksek erişilebilirlik (HA) çözümlerinde veya felaket kurtarma (DR) senaryolarında, veri dizininin belirli bir paylaşımlı depolama birimine veya replikasyon için uygun bir konuma taşınması gerekebilir.
Önkoşullar
Taşıma işlemine başlamadan önce aşağıdaki önkoşulların sağlandığından emin olun:
* Sudo Yetkileri: İşlemleri gerçekleştirmek için sudo yetkisine sahip bir kullanıcı hesabınız olmalıdır.
* Yeni Konum: Veri dizinini taşımak istediğiniz yeni konum (dizin) belirlenmiş ve erişilebilir olmalıdır. Bu konumda, mevcut veri dizininin en az iki katı kadar boş alan olması önerilir (kopyalama ve olası geri alma senaryoları için).
* Yedekleme: Bu en kritik adımdır. Veri kaybını önlemek için mevcut PostgreSQL veritabanınızın tam bir yedeğini almış olmalısınız. pg_dumpall veya dosya sistemi seviyesinde bir yedekleme (servis durdurulmuşken) tercih edilebilir.
* PostgreSQL Sürümü: Ubuntu 20.04 genellikle PostgreSQL 12 veya daha yeni sürümlerle gelir. İşlem genel olarak aynı olsa da, varsayılan dizin yolu sürümden sürüme değişebilir (/var/lib/postgresql/)./main
Mevcut Durumu Anlama
Taşıma işlemine başlamadan önce mevcut PostgreSQL kurulumunuz hakkında bazı temel bilgileri edinmek önemlidir.
PostgreSQL Sürümünü Kontrol Etme
Hangi PostgreSQL sürümünü kullandığınızı öğrenmek için aşağıdaki komutu çalıştırabilirsiniz:
psql --version
Veya veritabanına bağlanarak:
sudo -u postgres psql -c "SELECT version();"
Bu bilgi, varsayılan veri dizini yolunu tahmin etmenize yardımcı olacaktır.
Mevcut Veri Dizinini Bulma
Mevcut veri dizininin nerede olduğunu öğrenmenin birkaç yolu vardır:
1. psql ile Sorgulama: Veritabanına bağlanıp data_directory parametresini sorgulayabilirsiniz.
sudo -u postgres psql -c "SHOW data_directory;"
Bu komut genellikle /var/lib/postgresql/ gibi bir çıktı verecektir./main
2. postgresql.conf Dosyasını Kontrol Etme: PostgreSQL’in ana yapılandırma dosyası olan postgresql.conf içinde data_directory parametresi belirtilebilir.
sudo grep "data_directory" /etc/postgresql/*/main/postgresql.conf
Bu komut, farklı PostgreSQL sürümlerindeki yapılandırma dosyalarını tarayarak data_directory ayarını bulmaya çalışacaktır. Ubuntu’da genellikle data_directory değeri bu dosyada yorum satırı olarak kalır ve varsayılan konum kullanılır, ancak yine de kontrol etmek önemlidir. Eğer bir değer belirtilmişse, o dizin kullanılacaktır.
Veritabanı Kullanıcılarını ve Rollerini Kontrol Etme
Bu adım taşıma işlemi için doğrudan gerekli olmasa da, genel bir iyi uygulama olarak veritabanı kullanıcılarını ve rollerini bilmek faydalıdır. Özellikle postgres kullanıcısı, servis yönetiminde ve dosya izinlerinde kilit rol oynar.
sudo -u postgres psql -c "\du"
Bu komut, mevcut veritabanı kullanıcılarını (rollerini) listeleyecektir.
Taşıma İşlemi
Şimdi, PostgreSQL veri dizinini yeni bir konuma taşıma adımlarına geçebiliriz.
1. PostgreSQL Servisini Durdurma
Veri bütünlüğünü sağlamak için taşıma işlemine başlamadan önce PostgreSQL servisini durdurmak zorunludur. Servis çalışırken dosyaları kopyalamak veya taşımak veri bozulmasına 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)” ifadesini görmelisiniz.
2. Yeni Konumu Hazırlama
Yeni veri dizini için bir konum belirledikten sonra, bu konumu oluşturmanız ve PostgreSQL servis kullanıcısı (postgres) için doğru izinleri ayarlamanız gerekir. Bu, genellikle /mnt/new_data_disk/postgresql/data veya /opt/postgresql/data gibi bir yol olabilir. Bu rehberde /mnt/new_pg_data yolunu örnek olarak kullanacağız.
Dizin Oluşturma
Yeni dizini oluşturun. Eğer üst dizinler mevcut değilse, -p bayrağını kullanarak onları da oluşturabilirsiniz.
sudo mkdir -p /mnt/new_pg_data
İzinleri Ayarlama
PostgreSQL servisi, veri dizinine erişmek ve yazmak için özel izinlere ihtiyaç duyar. Dizin sahibi postgres kullanıcısı ve postgres grubu olmalı ve izinler 0700 (sadece sahibin okuma, yazma ve çalıştırma izni) veya 0750 (sahibin okuma, yazma, çalıştırma; grubun okuma, çalıştırma izni) olarak ayarlanmalıdır. 0700 genellikle daha güvenli kabul edilir.
sudo chown -R postgres:postgres /mnt/new_pg_data
sudo chmod -R 0700 /mnt/new_pg_data
Önemli: Eğer bu izinler yanlış ayarlanırsa, PostgreSQL servisi başlatılamaz ve “Permission denied” hataları alırsınız.
3. Veri Dizinini Kopyalama
Mevcut veri dizinini yeni konuma kopyalamanın en güvenli ve önerilen yolu rsync kullanmaktır. rsync, dosyaların sahipliklerini, izinlerini, zaman damgalarını ve diğer özelliklerini koruyarak kopyalama yapar. Ayrıca, büyük dizinlerde kesintiye uğraması durumunda kaldığı yerden devam etme yeteneği sunar.
Öncelikle mevcut veri dizininizi tekrar kontrol edin (örn: /var/lib/postgresql/12/main).
# Mevcut veri dizini: /var/lib/postgresql/12/main olduğunu varsayalım
Yeni veri dizini: /mnt/new_pg_data
sudo rsync -avh /var/lib/postgresql/12/main/ /mnt/new_pg_data/
Bu komuttaki bayrakların anlamları:
* -a: Arşiv modu; izinleri, sahiplikleri, zaman damgalarını vb. korur. Rekürsif kopyalamayı da içerir.
* -v: Ayrıntılı çıktı; kopyalanan dosyaları gösterir.
* -h: İnsan tarafından okunabilir format; dosya boyutlarını okunabilir bir şekilde gösterir.
* Son / işareti önemlidir: /var/lib/postgresql/12/main/ ile main dizininin içeriğini kopyalarken, /var/lib/postgresql/12/main (sonunda / olmadan) main dizininin kendisini kopyalar. Biz içeriği yeni dizinin doğrudan altına kopyalamak istediğimiz için ilkini kullanırız.
Alternatif (cp ile): cp komutu da kullanılabilir, ancak rsync kadar esnek veya güvenli değildir, özellikle büyük dizinler için. Eğer cp kullanacaksanız, -a bayrağını kullanarak arşiv modunda kopyalama yapmalısınız:
sudo cp -a /var/lib/postgresql/12/main/ /mnt/new_pg_data/
Kopyalama işlemi tamamlandıktan sonra, yeni dizinin içeriğinin orijinal dizinle aynı olduğundan emin olmak için kontrol edebilirsiniz:
ls -l /mnt/new_pg_data/
Bu çıktı, PG_VERSION, base, global, pg_wal gibi PostgreSQL veri dizini bileşenlerini göstermelidir.
4. PostgreSQL Yapılandırmasını Güncelleme
PostgreSQL’in yeni veri dizinini tanıması için yapılandırma dosyalarını güncellemeniz gerekir. Ubuntu’da bu genellikle iki şekilde yapılabilir: postgresql.conf dosyasını düzenleyerek veya systemd servis birimi dosyasını güncelleyerek. En yaygın ve önerilen yöntem postgresql.conf dosyasını güncellemektir.
postgresql.conf Dosyasını Düzenleme
PostgreSQL’in ana yapılandırma dosyası olan postgresql.conf dosyasını düzenlemeniz gerekmektedir. Ubuntu’da bu dosya genellikle /etc/postgresql/ yolunda bulunur./main/postgresql.conf
sudo nano /etc/postgresql/12/main/postgresql.conf
Dosya içinde data_directory parametresini bulun. Eğer yorum satırı (başında # işareti) ise, yorumu kaldırın ve yeni veri dizini yolunu belirtin. Eğer zaten bir yol belirtilmişse, bunu yeni yolla değiştirin.
#------------------------------------------------------------------------------
FILE LOCATIONS
#------------------------------------------------------------------------------
The default values of these variables are driven from the -D command-line
option or PGDATA environment variable, and are not usually changed here.
#data_directory = 'data' # use data in another directory
# (change requires restart)
#hba_file = 'pg_hba.conf' # host-based authentication file
#ident_file = 'pg_ident.conf' # user name mapping file
Yeni veri dizini yolunuzu buraya ekleyin veya güncelleyin
data_directory = '/mnt/new_pg_data'
Değişiklikleri kaydedin ve düzenleyiciden çıkın (Nano için Ctrl+X, Y, Enter).
Önemli Not: Ubuntu’daki PostgreSQL paketleri genellikle data_directory ayarını postgresql.conf içinde yapmaz, bunun yerine systemd servis birimi dosyasında veya başlangıç betiklerinde PGDATA ortam değişkenini kullanarak belirler. Bu nedenle, postgresql.conf dosyasında bu ayarı bulamayabilir veya yorum satırı olarak bırakıldığını görebilirsiniz. Eğer postgresql.conf dosyasında data_directory ayarı yoksa veya yorum satırı olarak bırakılmışsa, bu durumda systemd servis birimi dosyasını güncellemeniz gerekecektir. Ancak, bu makalede her iki senaryoyu da ele alacağız. Genellikle postgresql.conf içindeki ayar, systemd ayarını geçersiz kılar, bu yüzden burada ayarlamak en temiz yoldur.
systemd Servis Dosyasını Güncelleme (Gerekirse)
Eğer postgresql.conf dosyasındaki data_directory ayarı işe yaramazsa veya PostgreSQL servisi yine eski konumu kullanmaya çalışırsa, systemd servis birimi dosyasını güncellemeniz gerekebilir. Bu dosya genellikle /lib/systemd/system/postgresql@.service veya /etc/systemd/system/postgresql@.service konumunda bulunur.
Öncelikle doğru servis birimi dosyasını bulalım:
sudo systemctl edit --full postgresql@12-main.service
(Buradaki 12-main kısmı sizin PostgreSQL sürümünüze ve küme adınıza göre değişebilir. Örneğin 15-main olabilir.)
Bu komut, varsayılan düzenleyici ile servis dosyasını açacaktır. [Service] bölümünde Environment=PGDATA=/var/lib/postgresql/12/main gibi bir satır arayın. Bu satırı yeni veri dizini yolunuzla güncelleyin:
[Service]
... diğer ayarlar ...
Environment=PGDATA=/mnt/new_pg_data
... diğer ayarlar ...
Değişiklikleri kaydedin ve çıkın.
Önemli: systemd servis birimi dosyasını değiştirdikten sonra, systemd yapılandırmasını yeniden yüklemeniz gerekir:
sudo systemctl daemon-reload
5. PostgreSQL Servisini Başlatma
Yapılandırma güncellemelerini tamamladıktan sonra, PostgreSQL servisini başlatabilirsiniz.
sudo systemctl start postgresql
Eğer her şey doğru yapıldıysa, servis sorunsuz bir şekilde başlamalıdır.
6. Taşıma İşlemini Doğrulama
Servis başladıktan sonra, veri dizininin başarıyla taşındığını doğrulamak için birkaç kontrol yapmanız gerekir.
Servis Durumunu Kontrol Etme
Servisin aktif ve çalışır durumda olduğunu doğrulayın:
sudo systemctl status postgresql
Çıktıda “Active: active (running)” ifadesini görmelisiniz. Ayrıca herhangi bir hata mesajı olup olmadığını da kontrol edin.
Veritabanına Bağlanma ve Verileri Kontrol Etme
psql ile veritabanına bağlanarak ve bazı sorgular çalıştırarak verilerin erişilebilir olduğunu doğrulayın:
sudo -u postgres psql
Bağlandıktan sonra:
\l
Bu komut, mevcut veritabanlarını listeleyecektir. Veritabanlarınızın ve tablolarınızın yerinde olduğundan emin olmak için özel veritabanlarınıza bağlanıp sorgular çalıştırabilirsiniz:
\c your_database_name;
\dt;
SELECT * FROM your_table_name LIMIT 10;
SHOW data_directory; Komutunu Kullanma
PostgreSQL’in hangi veri dizinini kullandığını doğrulamak için psql içinde tekrar SHOW data_directory; komutunu çalıştırın:
sudo -u postgres psql -c "SHOW data_directory;"
Bu komutun çıktısı yeni veri dizini yolunuzu (/mnt/new_pg_data) göstermelidir.
Tüm bu kontroller başarılı olursa, veri dizini taşıma işlemi başarıyla tamamlanmış demektir.
Geri Alma (Rollback) Stratejisi
Herhangi bir sorunla karşılaşmanız durumunda geri dönmek için bir plana sahip olmak önemlidir.
1. PostgreSQL Servisini Durdurma:
sudo systemctl stop postgresql
2. Yapılandırmayı Geri Alma:
* postgresql.conf dosyasındaki data_directory ayarını orijinal haline getirin (eski yol veya yorum satırı).
* Eğer systemd servis dosyasını değiştirdiyseniz, PGDATA ortam değişkenini eski yola geri döndürün ve sudo systemctl daemon-reload komutunu çalıştırın.
3. Orijinal Veri Dizinini Geri Yükleme:
* Taşıma işlemine başlamadan önce orijinal veri dizinini silmediyseniz (ki silmemelisiniz!), servis otomatik olarak eski dizini kullanacaktır.
* Eğer orijinal dizini sildiyseniz veya üzerine yazdıysanız, taşıma öncesi aldığınız tam yedeklemeyi geri yüklemeniz gerekecektir. Bu nedenle, taşıma öncesi yedekleme kritik öneme sahiptir.
4. PostgreSQL Servisini Başlatma:
sudo systemctl start postgresql
5. Doğrulama: Servisin başarıyla başladığını ve verilerin erişilebilir olduğunu kontrol edin.
Taşıma işlemi başarıyla tamamlandıktan ve sistemin kararlı çalıştığından emin olduktan sonra, eski veri dizinini (/var/lib/postgresql/12/main gibi) güvenli bir şekilde silebilirsiniz. Ancak, bir süre daha yedek olarak tutmak isteyebilirsiniz.
sudo rm -rf /var/lib/postgresql/12/main_old # "_old" eklemek güvenli bir yaklaşımdır
Önemli Notlar ve İpuçları
Yedekleme Önemi
Bu rehberde defalarca vurgulandığı gibi, herhangi bir veritabanı taşıma veya yapılandırma değişikliği işleminden önce tam bir yedekleme almak hayati önem taşır. Yedekleme, olası hatalara veya veri bozulmalarına karşı en iyi sigortanızdır.
Disk Alanı
Yeni veri dizini için yeterli disk alanına sahip olduğunuzdan emin olun. Kopyalama işlemi sırasında mevcut dizinin boyutuna ek olarak geçici alan da gerekebilir. Ayrıca, gelecekteki veritabanı büyümesini de göz önünde bulundurarak yeterli kapasite ayırın.
Performans Etkisi
Veri dizinini farklı bir disk bölümüne taşımak, disk I/O performansını doğrudan etkiler. Daha hızlı bir diske (örneğin SSD) geçiş yapmak performansı artırırken, yavaş bir diske geçiş yapmak performansı düşürebilir. Yeni konumun performans özelliklerini göz önünde bulundurun.
Güvenlik
Yeni veri dizini konumunun dosya izinleri ve sahiplikleri doğru ayarlanmalıdır. Yanlış izinler, veritabanının başlatılamamasına veya güvenlik açıklarına yol açabilir. 0700 veya 0750 izinleri ve postgres:postgres sahipliği standart uygulamadır.
Diğer PostgreSQL Sürümleri ve Dağıtımlar
Bu rehber Ubuntu 20.04 ve tipik PostgreSQL kurulumları için yazılmıştır. Diğer Linux dağıtımlarında (örneğin CentOS, Fedora) veya farklı PostgreSQL sürümlerinde (örn. 9.x, 10.x), varsayılan dizin yolları ve systemd servis adları farklılık gösterebilir. Ancak temel adımlar (durdurma, kopyalama, yapılandırma, başlatma, doğrulama) genellikle aynıdır.
Sembolik Bağlantılar (Symbolic Links)
Bazı durumlarda, data_directory ayarını değiştirmek yerine eski veri dizini konumundan yeni konuma bir sembolik bağlantı oluşturmak da bir seçenek olabilir. Ancak, bu yöntem genellikle data_directory ayarını doğrudan değiştirmekten daha az tercih edilir çünkü yapılandırma karmaşıklığını artırabilir ve bazı durumlarda beklenmedik davranışlara yol açabilir. postgresql.conf dosyasını düzenlemek veya systemd birim dosyasındaki PGDATA ortam değişkenini ayarlamak daha temiz ve anlaşılır bir çözümdür.
Sonuç
PostgreSQL veri dizinini Ubuntu 20.04’te yeni bir konuma taşımak, doğru adımlar izlendiğinde ve dikkatli bir şekilde yapıldığında güvenli ve sorunsuz bir işlemdir. Bu rehberde açıklanan adımları takip ederek, disk alanı yönetimi, performans iyileştirmeleri veya diğer sistem gereksinimleri nedeniyle veri dizininizi başarıyla taşıyabilirsiniz.
Unutulmaması gereken en önemli noktalar, işlemi başlatmadan önce kapsamlı bir yedekleme yapmak, PostgreSQL servisini durdurmak, yeni dizin için doğru izinleri ayarlamak ve yapılandırma dosyalarını (özellikle postgresql.conf veya systemd birim dosyası) dikkatlice güncellemektir. Her adımda doğrulama yaparak ve olası sorunlara karşı bir geri alma stratejisine sahip olarak, veritabanı taşıma işleminizi güvenle tamamlayabilirsiniz. Bu sayede, PostgreSQL kurulumunuzu yeni depolama altyapınızla entegre ederek daha verimli ve ölçeklenebilir bir veritabanı ortamına sahip olabilirsiniz.