
Veri tabanı sistemlerinin en temel ve en önemli özelliklerinden biride hata durumlarında sizi koruyacak bir yedekleme politikasına sahip olmasıdır. Veritabanı herhangi bir nedenden dolayı crash olduğunda veya veritabanı geçmiş bir andaki haline döndürülmek istendiğinde veritabanı backup/restore işlemleri kullanılır. PostgreSQL veri tabanında temelde üç tip backup/restore operasyonu mevcuttur.
- Logical Backup
- Sql Dump (pg_dump ve pg_dumpall)
- Copy Komutu (CSV Load , Unload)
- File System level Backup (Cold Backup, Offline Backup)
- Online Backup (Continuous Archiving)
- pg_basebackup
- pgBackRest (extension)
1.LOGICAL BACUP (SQL DUMP)
Bu yedek yönteminde veri tabanı objelerinin SQL scriptlerinin text olarak yedeklenmesi mantığı üzerinden yapılır, geri dönüş (restore) senaryolarında ise bu sql ler tekrar çalıştırılarak backup tan geri dönülmüş olur, bu yaklaşım küçük veritabanları açısından sorun teşkil etmesede veritabanı boyutu büyüdünde, bu yöntem çok yavaş kalacak ve zorunda kalmadıkça kullanılabilir bir yöntem olmaktan çıkacaktır, anca pg_dump komutları bir çok açıdan DBA ler tarafından sıkça kullanılan bir çok faydalı özellikler barındıran bir komut setidir.
Pg_dump komut satırı aracı veritabanı veya veritabanı nesneleri için SQL dump backup ve restore işlemlerini yapmamızı sağlar. Kullanım şekli en basit haliyle aşağıdaki gibidir.
Syntax:pg_dump [options] [dbname] |
Bu komut çıktı olarak bir text dosyası üretir. Herhangi bir uzak sunucudan pg_dump komutu ile veritabanına bağlanıp backup/restore işlemleri gerçekleştirilebilir. Veritabanına bağlanacak kullanıcıların yedeklerin alınacak objeler üzerinde okuma hakkı olmalıdır, çünkü pg_dump dump alınacak veritabanındaki tüm objeleri satır satır okuyup sql cümlesi halinde bize bir text dosyasına yazacaktır. Veritabanı backup pg_dump ile alınacak ise superuser yetkisine sahip bir kullanıcı ile çalıştırılmalıdır.
pg_dump bazı özelliklerini kısaca bahsedecek olursak
Yedek alınacak veritabanında yedek alınması istenen bütün nesnelerin kayıtlarını sql ifadeleri olarak text dosyalarına döker
- Cluster düzeyinde global nesnelerin tanımlarını (DLL) almaz , bunun için pg_dumpall kullanılır
- pg_dump read ve write işlemlerini engellemez
- pg_dump tarafından oluşturulan dump dosyaları tutarlıdır (consistent), yani pg_dump başlatıldığı andaki Transaction ID yi kaydeder ve o ana göre Transaction snapshot oluşturur ve bu txid den sonraki değişimler almaz.
pg_dump tüm parametreleri ve açıklamalarını pg_dump –-help komutu ile öğrenebiliriz;
$ pg_dump --help |
Buradaki bütün parametreleri tek tek inceleyemeyeceğiz ancak DBA ler tarafından ihtiyaç duyulacak çok kullanılacak komutları örnekler üzerinden görüyor olacağız.
pg_dump komutunda ki bizim için önemli optionları nelerdir
pg_dump Options
- -a Data only. Do not dump the data definitions (schema)
- -s :Data definitions (schema) only (DDL). Do not dump the data
- -n <schema> – Dump from the specified schema only
- -t <table> – Dump specified table only
- -f <path/file name.backup> – Send dump to specified file
- -Fp – Dump in plain-text SQL script (default)
- -Ft – Dump in tar format
- -Fc – Dump in compressed, custom format
- -v – Verbose option
- -o use oids
pgAdmin4 ile Dump Backup Almak
Kitabın başında dvdrental veritabanını appdb olarak restore etmiştik şimdi bu veritabanının sql dump dosyasını Pgadmin4 ile client makinemiz üzerine alalım;
pgAdmin4 açılırİlgili Veritabanına bağlantı yapılırappdb üzerinde sağ click yapıyoruzbackup seçeneğini seçerek ilerliyoruz |
- Açılan ekranda filename nereye kaydedeceğiz dump dosyamızı
- formatı ne olacak
- Şifrelimi vs gibi seçenekleri seçebiliyoruz bazı dump optionlarını buradan da seçebiliyoruz
- Backup dediğimizde
Başarıyla tamamladı.
Eğer veritabanı ve dump alınacak obje boyutu çok büyükse bu işlem dump alması ve bu dumptan geri dönülmesi oldukça zaman alan ve diskte yer tutan bir işlem olacaktır bu yüzden pg_dump ile dump alırken sıkıştırma option nu kullanılabilir oldukça faydalıdır, network üzerinden trafiği azaltma, disk üzerinde daha az yer kaplama gibi avantajları olacaktır. Aşağıda örnek olarak Linux ta popüler olan gzip ile sıkıştırma örneği verilmiştir.
pg_dump dbname | gzip > filename.gz
- Ayrıca split komutuyla Dump çıktısı belli boyutlarda birden cok dosyaya bölünmek istenir ise komut aşağıdaki gibidir.
pg_dump dbname | split -b 1m - filename
- Sadece bir tablonun dump dosyasını almak istiyorsak
pg_dump -t tablename -d dbname > filename
- Dump işleminin parallel job lar ile yapılmasını istiyorsak
pg_dump -j <prosess_sayısı> -F d -f out.dir dbname
pg_dumpall
Alınan DUMP Dosyalarının Restore Edilmesi
pg_dumpall fonksiyonunun pg_dump fonksiyonundan temel farkı, sadece bir veritabanı yerine komple cluster içeriklerinin uygun şekilde yedeklenmesini sağlayabilmesidir. pg_dumpall, verilen bir kümedeki her veritabanının yedeğini ve cluster çapındaki rol ve tablo alanlarının tanımları (DDL), ilişkileri, izinleri vs. gibi verilerin yedeğini de alır. Temel kullanımı şu şekildedir. Cluster düzeyinde pg_dumpall ile bir dump alabilmek için superuser ile kullanılmalıdır.
pg_dumpall > dumpfile
pg_dumpall komutu için
$ pg_dumpall --help |
PgAdmin4 ile Global dump almak için;
SQL Dump Restore Adımları;
pg_dump tarafından oluşturulan dump dosyaları psql tarafından okunup içerisindeki sql ler çalıştırılarak restore yapılabilir.
psql dbname < dumpfile
yukarıdaki komutta dump file içerisinde database oluşturma kısmı yoktur (DDL) o yüzden dbname i öncesinde oluşturmuş olmanız gerekmektedir, bu kısımları bir sonraki aşamada örneklerde yapıyor olacağız
pg_dumpall ile tüm cluster (Cluster içerisindeki tüm databaseler) yedek alındıysa restore için aşağıdaki gibi bir komut kullanılır;
psql -f <dumpfile> postgres
PgAdmin4 ile Dump Restore yapmak
pg_restore kullanarak Restore yapma
pg_dump ile alınmış bir yedeği psql ile restore edebileceğimiz gibi pg_restore komutu ile de restore edebiliriz. psql ile pg_dump tarafından oluşturulmuş düz metin dosyalarını restore ederken pg_restore ile düz metin olmayan sıkıştırılmış, tar formatında veya özel format ile formatlanmış bir dump dosyasını restore edebiliriz.
pg_restore -d <dbname> <dumpfile>
$ pg_restore --help |
pg_restore option ları çok önemli burada bir çok faydalı otion bulunmakta , örneğin düzenli full dump alıyorsunuz ve bunları sıkıştırıp belli bir tarihe kadar arşivliyorsunuz , size geçen haftanın bir tablosu gerekti diyelim , geçen hafta alınan dump dosyasından sadece o tabloyu pg_restore ile alıp kayıtları inceleyebilirsiniz.
COPY KOMUTU
COPY komutu verileri PostgreSQL tabloları ile standart dosya sistemi dosyaları arasında taşımayı sağlayan bir komut sistemidir. COPY TO tablonun içeriğini İşletim sistemi üzerindeki bir dosyaya kopyalarken, COPY FROM komutu İşletim Sistemi üzerindeki bir dosyadan verileri okuyarak Veritabanı içerisindeki bir tabloya kopyalama işlemini yapar. COPY TO ayrıca herhangi bir SELECT sorgusunun sonuçlarını da OS üzerindeki bir dosyaya kopyalayabilir, yani sütun listesi belirtilirse.
- COPY komutu PostgreSQL sunucusuna doğrudan dosyadan okuma veya dosyaya yazma talimatı verir bu nedenler veritabanı erişimi ve OS ye yazma yetkileri olmalıdır
- COPY TO tarafından okunan tablo üzerinde SELECT ve COPY FROM ile değerlerin eklendiği tabloda INSERT yetkilerinin olması gerekir.
- COPY TO yalnızca tablolarla kullanılabilir, viewlerde kullanılamaz. Eğer bir viewin içeriğini kopyalamak istersek COPY komutunu sql sorgusu şeklinde verebiliriz
- ( COPY (SELECT * FROM view_table) TO ‘view.copy’;)
- COPY komutu server üzerindeki dosyaları okur ve yazar.
postgres=# \h copy |
Örmek : postgres database public scheması altındaki employee tablosunu /postgres/ dizini altına isciler.copy adında bir dosyaya her bir column aralarında | işareti olacak şekilde (Delimiter) copy ile çıkaralım.
postgres=# \d employee |
postgres=# COPY employee TO '/postgres/isciler.copy' (DELIMITER '|'); |
Aynı tabloyu aynı dizine farklı bir isimde csv olarak çıkaralım, ve kolon isimleride dosyada header olarak olsun;
postgres=# COPY employee TO '/postgres/employee.csv' CSV HEADER; |
Peki bir tablonun belli kayıtlarını veya bazı kolonlarını dosyaya çıkarmak istersek, o zaman sorgu ile COPY kullanımını uygulamalıyız,
postgres=# COPY (Select empno,ename,address from employee where lower(ename) like 'fa%') TO '/postgres/sql_copy.csv' csv; |
COPY ile aldığımız çıktıyı sıkıştırılmış olarak almak istersek;
postgres=# COPY employee TO PROGRAM 'gzip > /postgres/employee.csv.gz' CSV HEADER; COPY 4 |
Örnek; employee tablosunu kullanarak yeni bir empcsv adında bir tablo yapalım ve dışarıya aktardığımız csv dosyasını bu tabloya COPY komutunu kullanarak insert edelim;
postgres=# create table empcsv (like employee); |
Bazen csv türü bir dosyayı PostgreSQL içerisindeki bir tabloya aktarırken bazen karakter problemi olabilir bunun için COPY komutunda ENCODING opsiyonu vardır,
postgres=# COPY empcsv from '/postgres/employee.csv' CSV HEADER;COPY 4 encoding 'UTF8'; |
Copy Komutunu client tarafından bir dosyayı almak istersek aşağıdaki şekilde komutu çalıştırabiliriz \ copy … from dediğimizde bağlı bulunduğumuz client tarafındaki dosyalar içerisinden yani network üzerinden bu dosyayı veritabanına aktaracak aynı şekilde \copy …. to dediğimizde ise veritabanındaki tabloları bizim client tarafındaki dizinlere yazacaktır.
Örnek : dump backup ve restore ile ilgili birkaç uygulama yaparak konuyu daha iyi anlayalım;
- daha önce eklemiş olduğumuz appdb (dvdrentall) veritabanını /postgres/backup dizini altında tar formatında sıkıştırarak bir dump backupını alaım.
- Mevcut appdb yi drop edelim ve ardından adında boş bir veritabanı oluşturalım ve bu alınan dump dosyasını buraya önce psql ile ardından pg_restore ile restore edelim
- adım;
$ pg_dump -p 5434 -F t appdb -v > /postgres/backup/dvdrental.tar |
- Adım;
postgres=# drop database appdb; |
psql ile farklı bir isimdeki veritabanına bu veritabanını restore edemedik ancak pg_restore ile dvdrental veritabanına restore başarıyla gerçekleştirildi.
Bir yanıt yazın