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
10,757 total views, 4 views today