pg_dump Postgresql veritabanını yedeklemek için kullanılan programdır.

  • pg_dump tarafından alınan dump dosyaları tamamen tutarlıdır, çünkü dump, veritabanınızın ve pg_dump’ın çalışmaya başladığı andaki verilerinin anlık görüntüsüdür(snapshot).
  • pg_dump diğer kullanıcıların veritabanına (read veya write) erişimini engellemez.
  • pg_dump kullanmak için özel bir yetki gerekmez; Normal bir kullanıcı bile, kullanıcının belirli bir veritabanı üzerinde izni olması koşuluyla onu çalıştırabilir.

pg_dump yalnızca tek bir veritabanının yedeğini alır. Clusterın tamamını yedeklemek veya clusterdaki tüm veritabanlarında ortak olan genel nesneleri (roller ve tablespace gibi) yedeklemek için pg_dumpall kullanılır.

Dump dosyaları, komut veya arşiv dosyası formatlarında çıkarılabilir. Komut dosyasında oluşan dump dosyası, veritabanını kaydedildiği sırada bulunduğu duruma yeniden yapılandırmak için gereken SQL komutlarını içeren düz metin dosyalarıdır. Böyle oluşan komut dosyasını geri yüklemek için oluşan sql dosyasını psql veya başka bir araç ile çalıştırmamız yeterlidir. Bu komut çalıştırılırken psql’de veritabanı ismi ile verilen veri tabanı yaratılmış olmalıdır, aksi halde objeler varsayılan olarak gelen postgres veritabanında yaratılır. Kullanım kolaylığı nedeni ile mimari ve makine değişimlerinde  veritabanını yeniden yapılandırmak için kullanılabilir.

Veritabanını elle oluşturmak istemiyorsak pg_dump ile arşiv dosyası formatında (custom, directory, tar) yedekler almalıyız ancak bu durumda restore işlemini psql yerine pg_restore aracı ile yapmalıyız. pg_restore’un neyin geri yüklendiği konusunda seçici olmasını ve hatta öğeleri geri yüklenmeden önce yeniden düzenlemesinide sağlar, bu şekilde daha esnek bir yöntem elde etmiş oluruz. Arşiv dosyası formatları, mimariler arasında taşınabilir olacak şekilde tasarlanmıştır. pg_dump komutunun sintaksı aşağıdaki gibidir;

pg_dump [connection-option…] [option…] [dbname]

Hangi sunucu üzerindeki veri tabanlarını yedeklemek istiyorsak, -h host ve -p port komutlarını kullanarak bunu belirtebiliriz. Varsayılan sunucu, lokal sunucudur ya da PGHOST değişkeninde ne belirtildiyse odur. Aynı şekilde, varsayılan portun değeri de PGPORT değişkeninde belirtilen değerdir ya da derlenmiş olan varsayılan değeri alır. Diğer PostgreSQL istemci uygulmaları gibi, pg_dump varsayılan olarak, geçerli işletim sistemi adına eşit olan veri tabanı kullanıcı adına bağlanacaktır. Bunu ezmek için, ya -U seçeneğini ya da PGUSER değişkenini kullanabiliriz.

Örnekler;
mydb isimli veritabanının bir kaç farklı sintaksla SQL dump dosyasını üretebiliriz.

pg_dump mydb > db.sql
pg_dump -h localhost -p 5432 -U postgres mydb > db.sql
pg_dump -h localhost -p 5432 -U postgres mydb -f db.sql

Ürettiğimiz dump dosyasını newdb adlı başka bir veritabanına yükleyebiliriz.

psql -d newdb -f db.sql
psql -f db.sql -d newdb -p 5432 -U postgres 

Aşağıdaki komutla mydb veritabanının custom dosyası formatında dump dosyası üretir.
NOT : Bu şekilde üretilen yedek dosyası sql dosyasına göre çok daha küçük olacaktır çünkü arka planda dosya zlib ile sıkıştırılır.

pg_dump -Fc mydb > db.dump

Alınan custom dosyasından geri yükleme için kullanılabilecek komut.

pg_restore -d newdb db.dump

Aşağıdaki komutla mydb veritabanının directory dosyası formatında dump dosyasını üretir.

pg_dump -Fd mydb -f dumpdirectory

Aşağıdaki komutu kullanarak bu işlemi paralel olarak yapabiliriz.
NOT : Bu seçeneği yalnızca directory çıktı formatıyla kullanabilirsiniz, çünkü bu, birden çok prosesin aynı anda verilerini yazabildiği tek çıktı biçimidir.

pg_dump -Fd mydb -j 5 -f dumpdir

Directory dosyasını geri yükleme için kullanılabilecek komut.

pg_restore -Fd -l dumpdirectory

mydb veritabanının tar dosyası formatında dump dosyasını üretir.

pg_dump -Ft mydb > db.tar

tar olarak alınan yedeği geri yüklemek;

pg_restore -Ft -d newdb db.tar

Sadece belirtilen tablonun  yedeğini almak istersek.

pg_dump -t test_table -d mydb > table.sql

test_table ile ismi başlayan tabloların yedeğini almak istersek.

pg_dump -t 'test_table*' -d mydb > table.sql

test_table ile ismi başlayan ancak ismi test_table_mustafa olmayan tabloların yedeğini almak istersek.

pg_dump -t 'test_table*' -T test_table_mustafa -d mydb > table.sql

İsimleri east veya west ile başlayıp gsm ile biten tüm şemaları, isimleri test kelimesini içeren tüm şemaları hariç tutmak için aşağıdakini kullanırız;
NOT : Bu komut şemanın kendisini hem de içerdiği tüm objeleri seçer.

pg_dump -n 'east*gsm' -n 'west*gsm' -N '*test*' mydb > db.sql
pg_dump -n '(east|west)*gsm' -N '*test*' mydb > db.sql

Normalde tablo ismini büyük veya küçük nasıl yazarsak yazalım pg_dump bunu küçük olarak düşünüp davranış sergiler ama biz yazdığımızın birebir baz alınmasını istiyorsak çift tırnak(“) içinde yazmamız gerekir. Tabi çift tırnak shell için özel karakterdir bu nedenle escape charecter gibi davranmalıyız.

pg_dump -t "\"MixedCaseName\"" mydb > mytab.sql

Bir veri tabanından başka bir veri tabanına direkt olarak restore işlemi yapmak için aşağıdaki komut kullanılır.Tabi bu durumda newdb isimli veritabanı belirtilen clusterda olmalı.

pg_dump mydb | psql -h 192.168.10.106 newdb

Metadata değilde sadece verileri almak istersek komut aşağıdaki gibidir.

pg_dump -a test > test.sql
pg_dump --data-only test > test.sql

pg_dump ile yedek alınırken çıktının sıkıştırılmış formatta alınması için aşağıdaki komut kullanılır.

pg_dump mydb | gzip -9 > mydb.gz

Dump çıktısı belli boyutlarda birden çok dosyaya bölünmek istenir ise komut aşağıdaki gibidir.

pg_dump mydb | split -b 1m - filename

Yeniden yüklemek için.

cat filename* | psql dbname

Varsayılan olarak; eğer geri yükleme sırasında bir hata oluşursa psql hatayı göz ardı edip çalışmaya devam edecektir. ON_ERROR_STOP değişkenini ayarlayarak bu durumu özelleştirebiliriz. Bu komut sonrasında, hatanın olduğu satıra kadar kodlar çalışacak fakat sonraki satırlar işleme alınmayacaktır.

psql --set ON_ERROR_STOP=on mydb < mydb.sql

Alternatif olarak, tek bir işlemde geri yüklemenin tamamlanması gerektiğini belirtebiliriz, yani ya tamamen tamamlanacak ya da tamamen yapılan işlemler geri alınacak. Eğer bir hata olduğunda hiçbir işlem yapmamasını istiyorsak.

psql --single-transaction mydb < mydb.sql

pg_dump bir seferde, sadece bir veri tabanını yedekleyebilir, roller ya da tablo alanlarınını yedeklemez (Çünkü bunlar, bir veri tabanından ziyade birden fazla veri tabanını kapsayan bilgilerdir). Bir veri tabanı kümesinin tüm içeriklerinin uygun şekilde yedeklenmesi için pg_dumpall’dan yararlanırız. pg_dumpall verilen bir kümedeki her veri tabanının yedeğini ve verilen küme çapındaki rol ve tablo alanları tanımları gibi verilerin yedeğini de alır.

pg_dumpall > dumpfile.sql
pg_dumpall -f dumpfile.sql
psql postgres < dumpfile.sql 
psql -f dumpfile.sql postgres

pg_dumpall ile geri yükleme yaparken, rol ve tablespace bilgilerini de geri yüklemek için, her zaman superuser erişimine ihtiyaç vardır. Bu işlemleri yaparken, eğer tablespace kullanıyorsak, bu tablespacelerin yollarının da var olduğundan emin olmamız gerekir.
pg_dumpall, roller, tablolar ve boş veri tabanlarını oluşturmak için komutlar gönderir, sonrasında her veri tabanı için pg_dump’ u çağırarak çalışır. Yani, her veri tabanı kendi içerisinde tutarlı olacaktır fakat diğer veri tabanları anlık olarak senkronize edilmeyecektir.

Mustafa Bektaş Tepe
İyi Çalışmalar

Referanslar;
https://www.postgresql.org/docs/current/app-pgdump.html
https://medium.com/@kursatsonmez9/postgresql-dump-i%CC%87leyedekleme-i%CC%87%C5%9Flemleri-3d16ba6dc0d9

Loading