Veri Taşıma (pgdump)

Postgresql’den postgresql’e ve farklı veritabanlarından postgresql’e veriyi taşırken
bir çok yöntem ve/veya uygulama kullanılabilir. Karar verirken en önemli kriterler veri
büyüklüğü ve kesinti süresidir. Uygulaması kolay ama yavaş bir yöntem/uygulama,
kesinti süresinin çok az olduğu bir ortamda kullanılamaz.
Test taşımalar yapılarak seçenekler tek tek test edilip tüm adımların ne kadar süre aldığı
not edilip toplam süre tespit edilmelidir.
pgdump

pg_dump veriyi ve objelerin DDL’ lerini script/text ve arşiv formatlarında import/
export eden kullanışlı terminal tabanlı bir araçtır.
script/text formatta alınan dump psql ile,
arşiv formatta alınan dump pg_restore ile import edilebilir.
Veriyi kopyalamak için COPY kullanır ama “-inserts” parametresi kullanılarak veri
insert cümleleriyle de alınabilir.
Insert, copy yöntemine göre yavaştır. Postgresql’den farklı bir veritabanına import
edilecekse kullanılabilir.
# yardım metni pg_dump --help # Detaylı yardım metni man pg_dump # testdb.sql text dosyasına önce create scrtipleri sonrasında copy cümlelerini yazar. postgres@srv1:~$ pg_dump testdb > /backup/pgdump/testdb.sql # dump alırken aynı zamanda sıkıştırır. pg_dump testdb | gzip -c > /backup/pgdump/testdb.sql.gz
pg_dump tek bir veritabanın dumpını alabilir. Tüm cluster’ın veya global objelerin
dumpı almak istenirse pg_dumpall kullanılmalıdır.
pg_dump başlatılan anın dumpını alır. Eğer gece 03:00’te dump alındı ise ve 17:00’da bir
sorun yaşanıp dumptan geri dönmeniz gerekirse gece 03:00’a dönülebilir.
Yani 14 saatlik bir veri kaybı olacaktır. Her ne kadar yedekleme için kullanılsa da
pgdump yedek aracı değildir. Şifaen sistemlerde dump alınır ama çoğunlukla amaç
metadata yedekleme ve arşivlemedir.
500 GB ve üzerinde IOPS kapasitesine bağlı olarak performans sorunları yaşanabilir.
Network üzerinden uzaktaki makinelerin de dumpı alınabilir.
pg_dump ile schema ve tablolar seçilerek alınabilir.
Not: Dump alınan veritabanının büyüklüğüne, hedef dizinin/diskin kapasitesine
(df -h) dikkat edilmeli. Veritabanı ile aynı dizine/diske dump alınırsa ve dump diskte
yer bırakmazsa veritabanını durdurur.
Sıkıştırılmış Arşiv Format (compressed) dump
pg_dump -h 10.71.6.22 -p 5434 -U mehmed -F c -b -v -f /../testdb.dmp testdb
10.71.6.22 makinesinin 5434 portundan
Testdb veritabanını
Sıkıştırarak (-F c)
Verbose modda, (detaylı loglama)
mehmed kullanıcısı ile dump alır.
Create Database Syntax
# -C create database syntaxını ekler. pg_dump -h 10.71.6.22 -p 5434 -U mehmed -C -F p -b -v -f / backup/pgdump/testdb.sql testdb
10.71.6.22 makinesinin 5434 porttundan
testdb veritabanını ‘create database’ scriptini de dahil ederek (-C) ,
Text formatında (-F p)
Verbose modda,
mehmed kullanıcısı ile dump alır.
pg_dumpall
#dump pg_dumpall > dumpdosya_ismi.dmp # Restore psql -f dumpdosya_ismi.dmp postgres
pg_dump tek veritabanının exportunu alabilir. Role tablespace vb. cluster genelindeki
objelerin dumpını alamaz.
pg_dumpall cluster’ın tamamının exportunu alabilir. Tüm veritabanları, roller ve
tablespace’ler.
Not: Eğer default haricinde oluşturulan tablespaceler varsa ve bunlar farklı dizinlerde
ise bu dizinler önceden oluşturulup hakların verilmesi gerekir.
Dump İçeriğini Listeleme
pg_restore --list testdb.dmp
Schema dump
# Sıkıştırılmış olarak erp_schema ve ik_schema larının dumpını alır (-F c) pg_dump -h 10.71.6.22 -p 5434 -U mehmed -F c -b -v -n erp_ schema -n ik_schema -f erp_ik.dmp testdb # Text olarak erp_schema ve ik_schema larının dumpını alır dump alır (-F p) pg_dump -h 10.71.6.22 -p 5434 -U mehmed -F p -b -v -n erp_ schema -n ik_schema -f erp_ik.sql testdb
10.71.6.22 makinesinin 5434 porttundan
testdb veritabanındaki erp_schema ve ik_schema’larının dumpını alır.
Paralelizm ( -Fd -j x )
pg_dump -h 10.71.6.22 -p 5434 -U mehmed -Fd -b -v -j 4 -f testdb.dir testdb
Sadece directory modda paralelizm kullanılabiliyor. testdb.dir isminde bir dizin açıp
dosyaları içerisine yazar.
CPU core sayısı ve disk IOPS kapasitesine göre optimum paralelizm seviyesine karar
verilebilir.
Dump alırken linux performans araçlarından top veya htop ile monitor edilebilir.
Custom Format (-Fc)
pg_dump -h 10.71.6.22 -p 5434 -U mehmed -Fc -b -v -f testdb.dmp testdb
Custom format -Fc ile tüm veritabanının dumpını alabilir. Hedef veritabanına ise sadece
istenen objenin importu pg_restore ile yapılabilir.
Metadata Dump
pg_dump -Fp --section pre-data --section post-data -f predata__ testdb.sql testdb # ya da pg_dump -Fp --schema-only -f schema-only_testdb_nodata.sql testdb # Not: schema ve schema-only farklı parametrelerdir. # “create database” syntaxı ile ( -C ) pg_dump -Fp --schema-only -C -f schema-only_testdb_nodata.sql testdb
Veri olmadan sadece create scriptlerini text olarak export eder.
Parçalara Bölme (split)
pg_dump veritabanı_ismi | split -b 30G --filter='gzip > $FILE.gz'
30 GB’lik parçalara böler ve sıkıştırır. Özellikle işletim sistemi limitlerine takılmamak ve
uzak mesafeler dosya gönderirken parçalara bölmek işe yarayabilir.
pg_restore
pg_dump ile arşiv formatta alınmış dump dosyalarını import eder.
Örnek 1 arşiv formatta import/export
Senaryo : testdb’ nin arşiv formatta dumpı alınıp restorearsivtestdb adındaki başka bir
veritabanına import edilir.
Adım 1
testdb’nin dumpı alınır.
# testdb adındaki veritabanının arşiv formatında dumpı alınır. cd /backup/pgdump/ pg_dump -Fc -b -v -f testdb.dmp testdb
Adım 2
Dump dosyasını restore etmek için “restorearsivtestdb” adında yeni bir veritabanı
oluşturulur.
Kaynak ile birebir aynı veritabanını oluşturmak için;
-pgadmin ile “create script” alınabilir.
-pg_dump ile -C parametresni kullanarak veri olmadan dump alınabilir.
(pg_dump -Fp --schema-only -C -f schema-only_testdb_nodata.sql testdb)
# schema-only_testdb_nodata.sql create database scripti alınır. CREATE DATABASE testdb WITH TEMPLATE = template0 ENCODING = ‘UTF8’ LOCALE = 'en_US.UTF-8'; # Database ismi değiştirilir. CREATE DATABASE restorearsivtestdb WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE = 'en_US.UTF-8'; postgres@srv1: psql CREATE DATABASE restorearsivtestdb WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE = 'en_US.UTF-8';
Adım 3
Restore işlemi başlatılır.
pg_restore --dbname=restorearsivtestdb --jobs=4 --verbose testdb.dmp postgres@srv1:/backup/pgdump$ psql -d restorearsivtestdb restorearsivtestdb=# \dt List of relations Schema | Name | Type | Owner --------+------------------+-------+---------- ..... public | staff | table | postgres public | store | table | postgres
veya
psql --set ON_ERROR_STOP=on restorescripttestdb < testdb.sql
Örnek 2 script/text formatında export/import
Senaryo : testdb’nin script/text formatta dumpı alınıp restorescripttestdb
adındaki başka bir veritabanına import edilir.
Adım 1
testdb’nin script/text formatta dumpı alınır.
# testdb adındaki veritabanının script/text formatında dumpı alınır. cd /backup/pgdump/ pg_dump -F p -b -v -f testdb.sql testdb
Adım 2
Dump dosyasını restore etmek için “restorescripttestdb” adında yeni bir veritabanı
oluşturulur.
CREATE DATABASE restorescripttestdb WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE = 'en_US.UTF-8'; CREATE DATABASE
Adım 3
Restore işlemi başlatılır.
postgres@srv1:/backup/pgdump$ psql -d restorescripttestdb restorescripttestdb=# \dt Did not find any relations. restorescripttestdb=# \i testdb.sql restorescripttestdb=# \dt List of relations Schema | Name | Type | Owner --------+------------------+-------+---------- ..... public | staff | table | postgres public | store | table | postgres # liste gelmezse set search_path="$user", public ;
veya
psql --set ON_ERROR_STOP=on restorescripttestdb < testdb.sql
ON_ERROR_STOP=on : Hata aldığında dumpı sonlandırır
(pg_restore --exit-on-error) .
Örnek 3 schema export/import
Senaryo : testdb veritabanındaki ik_schema’sı ik_schematestdb veritabanına
kopyalanır.
# ik_schematestdb veritabanı oluşturulur. CREATE DATABASE ik_schematestdb WITH TEMPLATE = template0 ENCODING = ‘UTF8’ LOCALE = ‘en_US.UTF-8’; # testdb’deki ik_schema, ik_schematestdb veritabanına kopyalanır. pg_dump -d testdb -n ik_schema | psql -d ik_schematestdb
Not: Veri büyük ise network ve IOPS performans değerleri monitor edilmeli. Aynı
makinede çalıştırılırsa hem okuyup hem yazacağı için performans darboğazı yaşanabilir.
Diğer yöntem;
# testdb’deki ik_schema’sının dumpı alınır. pg_dump -F c -b -v -n ik_schema -f ik_schema.dmp testdb # ik_schematestdb veritabanı oluşturulur. CREATE DATABASE ik_schematestdb WITH TEMPLATE = template0 ENCODING = ‘UTF8’ LOCALE = ‘en_US.UTF-8’; # ik_schematestdb veritabanında ik_scheması oluşturulur. psql -d ik_schematestdb CREATE SCHEMA IF NOT EXISTS ik_schema AUTHORIZATION ik_user; # ik_scheması, ik_schematestdb veritabanındaki ik_schema schemasına import edilir. pg_restore -d ik_schematestdb -n ik_schema ik_schema.dmp
Örnek 4 Tek bir tablonun export/import edilmesi
Senaryo : testdb veritabanında test tablosu oluşturulur.
Export edilir ve başka bir veritabanına import edilir.
# testdb veritabanında tablo oluşturulup veri girişi yapılır. postgres@srv1:/backup/pgdump$ psql -d testdb testdb=# CREATE TABLE birtablo (id serial, name text); INSERT INTO birtablo (name) SELECT ‘Dataera’ FROM generate_series(1, 5);
#testdb veritabanından birtablo nun dumpını alıyoruz. pg_dump -d testdb -t birtablo --schema=public > birtablo.sql # tdb veritabanına birtablo yu import ediyoruz. postgres@srv1:/backup/pgdump$ psql -d tdb tdb=# \i birtablo.sql tdb=# select count(*) from birtablo ; count ------- 5 # Sorgu sonucu gelmezse search_path i ayarlamak gerekebilir. tdb=# set search_path=”$user”, public ;
Diğer yöntem
pg_dump -d testdb -v -Fc -t birtablo --schema=public > birtablo.dmp pg_restore -d tdb -v < birtablo.dmp
Örnek 5 Full dump dosyasından tek bir tablonun import edilmesi
Senaryo : 17 adet tablo olan tdb veritabanının full dumpı alınır.
Actor adındaki tablo silinir (drop).
Full dumptan sadece bu actor tablosu import edilir.
# Tüm veritabanının dumpı alınır. pg_dump -d tdb -v -Fc -f tdb.tar # Actor tablosu drop edilir. postgres@srv1:/backup/pgdump$ psql -d tdb tdb=# drop table actor cascade ; # Sadece actor tablosu import edilir. pg_restore -v -d tdb -t actor < tdb.tar
