Yanıtlar:
Postgres, yeni bir veritabanı oluştururken sunucudaki mevcut herhangi bir veritabanının şablon olarak kullanılmasına izin verir. PgAdmin'in veritabanı oluştur iletişim kutusunda size seçenek verip vermediğinden emin değilim, ancak aşağıdaki durumlarda bir sorgu penceresinde aşağıdakileri çalıştırabilmeniz gerekir:
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
Yine de şunları alabilirsiniz:
ERROR: source database "originaldb" is being accessed by other users
Diğer tüm kullanıcıların veritabanıyla olan bağlantısını kesmek için şu sorguyu kullanabilirsiniz:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
Servers
-> (sunucum) -> Databases
seçebilir, Veritabanları'na sağ tıklayıp "Yeni Veritabanı" nı seçebilirim. Seçeneklerden biri şablondur ve veritabanını oluşturmak için kullanılan SQL eşdeğerdir. Öyle böylece aynı sunucuyu üzerinde geri / çok daha hızlı bir dökümü daha.
Bell'in cevabının komut satırı versiyonu :
createdb -O ownername -T originaldb newdb
Bu veritabanı yöneticisi, genellikle postgres ayrıcalıkları altında çalıştırılmalıdır.
createdb: database creation failed: ERROR: source database "conf" is being accessed by other users
bir üretim veritabanında yapmaya çalışırsanız alacaksınız ve beklendiği gibi bir kopya oluşturmak için kapatmak istemiyorum.
Varolan bir veritabanını postgres ile klonlamak için bunu yapabilirsiniz
/* KILL ALL EXISTING CONNECTION FROM ORIGINAL DB (sourcedb)*/
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'SOURCE_DB' AND pid <> pg_backend_pid();
/* CLONE DATABASE TO NEW ONE(TARGET_DB) */
CREATE DATABASE TARGET_DB WITH TEMPLATE SOURCE_DB OWNER USER_DB;
BT kaynak db hatadan kaçınarak tüm bağlantıyı öldürür
ERROR: source database "SOURCE_DB" is being accessed by other users
procpid
ile değiştirmek pid
zorunda
Orijinal veritabanının trafik altında olduğu üretim ortamında basitçe kullanıyorum:
pg_dump production-db | psql test-db
pg_dump -s
? postgresql.org/docs/current/static/app-pgdump.html
$ createdb newdb
PgAdmin hakkında bilmiyorum, ancak pgdump
SQL'de veritabanının bir dökümünü veriyor. Yalnızca aynı ada sahip bir veritabanı oluşturmanız ve
psql mydatabase < my dump
tüm tabloları ve verilerini ve tüm erişim ayrıcalıklarını geri yüklemek için.
pg_dump -U postgres sourcedb | psql -U postgres newdb
Bu tekniğin etkinliği şüpheli olsa bile yapabilirsiniz (muhtemelen okuma ve yazma arasında bağlam geçişi yaptığınızdan)
ssh dbserver pg_dump DBNAME | psql NEWDB
... veya pg_dump DBNAME | ssh otherserver pgsql NEWDB
... ile alabilirsiniz. Tabii ki izinler ve kimlik doğrulaması elbette bunlarla başa çıkmak istediğinizde ele alınmalıdır.
İlk sudo
olarak, veritabanı kullanıcısı olarak:
sudo su postgres
PostgreSQL komut satırına gidin:
psql
Yeni veritabanını oluşturun, hakları verin ve çıkın:
CREATE DATABASE new_database_name;
GRANT ALL PRIVILEGES ON DATABASE new_database_name TO my_user;
\d
Yapıyı ve verileri eski veritabanından yenisine kopyalayın:
pg_dump old_database_name | psql new_database_name
\l+
. Neden boyut farkı?
Bu yaklaşımı yukarıdaki örneklerle bir araya getirdim. Bir "yük altında" sunucu üzerinde çalışıyorum ve @zbyszek yaklaşım denediğinde hata var. Ayrıca bir "sadece komut satırı" çözümü peşindeydim.
createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users
.
Benim için işe yarayan şey ( Çıktıyı bir dosyaya taşımak ve sunucu bağlantısının kesilmesini önlemek için eklenmiş komutlarnohup
):
nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01
benim kullanıcı "postgres"
nohup psql exampledbclone_01 < example-01.sql
PgAdmin'de orijinal veritabanınızdan yedekleme yapabilir ve yeni bir veritabanı oluşturabilir ve yeni oluşturulan yedeklemeden geri yükleyebilirsiniz:
Tüm veritabanını (yapısı ve verileri) pgAdmin'de yenisine kopyalamanın doğru yolu nedir?
Cevap:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
Denendi ve test edildi.
Gönderen belgeler kullanılarak createdb
veya CREATE DATABASE
şablonlarla teşvik edilmez:
Şablon olarak adını belirterek template1 dışında bir veritabanını kopyalamak mümkün olsa da, bu (henüz) genel amaçlı bir “KOPYA VERİTABANI” tesisi olarak tasarlanmamıştır. Temel sınırlama, kopyalanırken şablon veritabanına başka hiçbir oturumun bağlanamamasıdır. CREATE DATABASE, başlatıldığında başka bir bağlantı varsa başarısız olur; Aksi takdirde, şablon veritabanına yeni bağlantılar CREATE DATABASE tamamlanıncaya kadar kilitlenir.
pg_dump
veya pg_dumpall
veritabanı VE TÜM VERİ kopyalama için gitmek için iyi bir yoldur. PgAdmin gibi bir GUI kullanıyorsanız, bir yedekleme komutu yürüttüğünüzde bu komutlar sahne arkasında çağrılır. Yeni bir veritabanına kopyalama iki aşamada gerçekleştirilir: Yedekleme ve Geri Yükleme
pg_dumpall
tüm veritabanlarını PostgreSQL kümesine kaydeder. Bu yaklaşımın dezavantajı, veritabanını oluşturmak ve verileri doldurmak için gereken SQL ile dolu çok büyük olasılıkla çok büyük bir metin dosyası elde etmenizdir. Bu yaklaşımın avantajı, kümenin tüm rollerini (izinlerini) ücretsiz olarak almanızdır. Tüm veritabanlarını boşaltmak için bunu süper kullanıcı hesabından yapın
pg_dumpall > db.out
ve geri yüklemek için
psql -f db.out postgres
pg_dump
size daha küçük dosyalar veren bazı sıkıştırma seçeneklerine sahiptir. Kullanarak bir cron işi ile günde iki kez yedekleme bir üretim veritabanı var
pg_dump --create --format=custom --compress=5 --file=db.dump mydatabase
compress
sıkıştırma seviyesi (0 ila 9) nerede ve veritabanını oluşturmak için komut eklemeyi create
söyler pg_dump
. Kullanarak geri yükleyin (veya yeni kümeye taşıyın)
pg_restore -d newdb db.dump
burada newdb, kullanmak istediğiniz veritabanının adıdır.
PostgreSQL, izinleri yönetmek için ROLES kullanır. Bunlar tarafından kopyalanmaz pg_dump
. Ayrıca, (veritabanını başka bir sunucuya taşıyorsanız ) postgresql.conf ve pg_hba.conf'daki ayarlarla da ilgilenmedik . Conf ayarlarını kendi başınıza bulmanız gerekir. Ama rolleri desteklediğim için keşfettiğim bir numara var. Roller küme düzeyinde yönetilir pg_dumpall
ve --roles-only
komut satırı anahtarıyla yalnızca rolleri yedeklemeyi isteyebilirsiniz .
PostgreSQL 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
orijinal veritabanının boşta kalmasını (yazma erişimine sahip bağlantıların olmaması) gerektirdiği ve kopyalama işlemi devam ederken orijinal veritabanına yeni bağlantıların önlenmesini gerektirdiği için uygulanır. Bundan memnunsanız, bu işe yarar.
Hala ilgilenenler için, yazarın ne istediğini (az ya da çok) yapan bir bash betiği buldum. Bir üretim sistemi üzerinde bir günlük iş veritabanı kopyası yapmak zorunda kaldım, bu komut dosyası hile yapmak gibi görünüyor. Veritabanı adını / kullanıcı / pw değerlerini değiştirmeyi unutmayın.
#!/bin/bash
if [ 1 -ne $# ]
then
echo "Usage `basename $0` {tar.gz database file}"
exit 65;
fi
if [ -f "$1" ]
then
EXTRACTED=`tar -xzvf $1`
echo "using database archive: $EXTRACTED";
else
echo "file $1 does not exist"
exit 1
fi
PGUSER=dbuser
PGPASSWORD=dbpw
export PGUSER PGPASSWORD
datestr=`date +%Y%m%d`
dbname="dbcpy_$datestr"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;"
dropdbcmp="DROP DATABASE $dbname"
echo "creating database $dbname"
psql -c "$createdbcmd"
rc=$?
if [[ $rc != 0 ]] ; then
rm -rf "$EXTRACTED"
echo "error occured while creating database $dbname ($rc)"
exit $rc
fi
echo "loading data into database"
psql $dbname < $EXTRACTED > /dev/null
rc=$?
rm -rf "$EXTRACTED"
if [[ $rc != 0 ]] ; then
psql -c "$dropdbcmd"
echo "error occured while loading data to database $dbname ($rc)"
exit $rc
fi
echo "finished OK"
Veritabanı dökümü oluşturmak için
cd /var/lib/pgsql/
pg_dump database_name> database_name.out
Veritabanı dökümünü yeniden başlatmak için
psql -d template1
CREATE DATABASE database_name WITH ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8' TEMPLATE template0;
CREATE USER role_name WITH PASSWORD 'password';
ALTER DATABASE database_name OWNER TO role_name;
ALTER USER role_name CREATEDB;
GRANT ALL PRIVILEGES ON DATABASE database_name to role_name;
CTR+D(logout from pgsql console)
cd /var/lib/pgsql/
psql -d database_name -f database_name.out
Yalnızca pgadmin4 GUI (yedekleme ve geri yükleme yoluyla) kullanarak bir veritabanı üzerinde kopya oluşturma işlemi
Postgres Pgadmin4 ile birlikte gelir. MacOS kullanıyorsanız, CMD
+ tuşuna basıp çalıştırmak için SPACE
yazabilirsiniz pgadmin4
. Bu, Chrome'da bir tarayıcı sekmesi açar.
Bunu veritabanını sağ tıklatarak yapın -> "yedekleme"
Gibi test12345
. Yedekle'yi tıklayın. Bu bir ikili dosya dökümü oluşturur, bir .sql
biçimde değildir
Ekranınızın sağ alt köşesinde bir açılır pencere olmalıdır. Yedeklemenizin nereye indirildiğini görmek için "daha fazla ayrıntı" sayfasını tıklayın
Bu durumda, /users/vincenttang
1 ile 4 arasındaki adımları doğru yaptığınızı varsayarsak, bir geri yükleme ikili dosyasına sahip olursunuz. İş arkadaşınızın geri yükleme dosyanızı yerel makinelerinde kullanmak istediği bir zaman gelebilir. Dedi ki kişi pgadmin'e gidip geri döndü mü
Bunu veritabanını sağ tıklatarak yapın -> "geri yükle"
Dosya konumunu manuel olarak seçtiğinizden emin olun, pgadmin'deki yükleyici alanlarına dosya sürükleyip BIRAKMAYIN. Çünkü hata izinleriyle karşılaşacaksınız. Bunun yerine, az önce oluşturduğunuz dosyayı bulun:
Filtreyi en altta "Tüm dosyalar" olarak değiştirmeniz gerekebilir. Daha sonra, 4. adımdan itibaren dosyayı bulun. Şimdi onaylamak için sağ alttaki "Seç" düğmesine basın
Dosyanın konumu seçiliyken bu sayfayı tekrar göreceksiniz. Devam et ve geri yükle
Her şey yolundaysa, sağ alttaki başarılı bir geri yüklemeyi gösteren bir gösterge açılır. Verilerin her tabloda düzgün bir şekilde geri yüklenip yüklenmediğini görmek için tablolarınıza gidebilirsiniz.
9. adımın başarısız olması durumunda, veritabanınızdaki eski genel şemanızı silmeyi deneyin. "Sorgu Aracı" na gidin
Bu kod bloğunu yürütün:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
Şimdi 5. ila 9. adımları tekrar deneyin.
DÜZENLE - Bazı ek notlar. Yükleme sırasında "arşivleyici başlığı 1.14 desteklenmeyen sürüm" satırlarında bir şeyle ilgili bir hata alıyorsanız PGADMIN4'ü güncelleyin
Veritabanında açık bağlantılar varsa, bu komut dosyası yardımcı olabilir. Bunu her gece canlı prodüksiyon veritabanının yedeğinden bir test veritabanı oluşturmak için kullanıyorum. Bu üretim db bir .SQL yedekleme dosyası olduğunu varsayar (Bunu webmin içinde yapmak).
#!/bin/sh
dbname="desired_db_name_of_test_enviroment"
username="user_name"
fname="/path to /ExistingBackupFileOfLive.sql"
dropdbcmp="DROP DATABASE $dbname"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = $username "
export PGPASSWORD=MyPassword
echo "**********"
echo "** Dropping $dbname"
psql -d postgres -h localhost -U "$username" -c "$dropdbcmp"
echo "**********"
echo "** Creating database $dbname"
psql -d postgres -h localhost -U "$username" -c "$createdbcmd"
echo "**********"
echo "** Loading data into database"
psql -d postgres -h localhost -U "$username" -d "$dbname" -a -f "$fname"
PgAdmin kullanarak, şablon olarak kullanmak istediğiniz veritabanının bağlantısını kesin. Sonra yeni veritabanı oluşturmak için şablon olarak seçin, bu zaten kullanım hatası almaktan kaçınır.
Tüm şemayı kopyalamak istiyorsanız, aşağıdaki komutla bir pg_dump yapabilirsiniz:
pg_dump -h database.host.com -d database_name -n schema_name -U database_user --password
Ve bu dökümü içe aktarmak istediğinizde şunları kullanabilirsiniz:
psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name" -f sql_dump_to_import.sql
Bağlantı dizeleri hakkında daha fazla bilgi: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING
Ya da sadece bir astarda birleştirin:
pg_dump -h database.host.com -d postgres -n schema_name -U database_user --password | psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”
Şablon olarak kullanmak istediğiniz "templated" veritabanının bağlantısını kesin.
Aşağıdaki gibi 2 sorgu çalıştırın
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TemplateDB' AND pid <> pg_backend_pid();
(Yukarıdaki SQL ifadesi, TemplateDB ile tüm etkin oturumları sonlandıracak ve daha sonra yeni TargetDB veritabanını oluşturmak için şablon olarak seçebilirsiniz, bu zaten kullanım hatasını almayı önler.)
CREATE DATABASE 'TargetDB'
WITH TEMPLATE='TemplateDB'
CONNECTION LIMIT=-1;
Bunu dene:
CREATE DATABASE newdb WITH ENCODING='UTF8' OWNER=owner TEMPLATE=templatedb LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' CONNECTION LIMIT=-1;
gl XD