Je cherche un script / commande de base qui créera une copie d'une base de données en direct (lâchez-les Exigences p>
Astuces: P>
mydb code> et
mydb_test code>, sur le même serveur). p>
mydb_test code> existe déjà et a des enregistrements li>
mydb code> et
mydb_test code> avoir des connexions existantes li>
Drop Database code> ne peut pas être utilisé si vous avez des connexions existantes li>
ul>
4 Réponses :
Depuis que vous n'avez pas dit que c'était un problème de supprimer objets em> dans la base de données, je pense à exécuter pg_dump code> avec le
- nettoyer code> L'option fera ce que vous voulez. Vous pouvez tuyer la sortie de pg_dump dans psql pour ce genre de chose. P>
C'est ce que je cherchais, mais je devais le compiler moi-même: P
Je souhaite seulement que je connais un moyen de conserver le même utilisateur et de ne pas avoir à le mettre à l'intérieur du script. P>
#!/bin/bash DB_SRC=conf DB_DST=conf_test DB_OWNER=confuser T="$(date +%s)" psql -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname='$DB_DST';" || { echo "disconnect users failed"; exit 1; } psql -c "drop database if exists $DB_DST;" || { echo "drop failed"; exit 1; } psql -c "create database $DB_DST owner confuser;" || { echo "create failed"; exit 1; } pg_dump $DB_SRC|psql $DB_DST || { echo "dump/restore failed"; exit 1; } T="$(($(date +%s)-T))" echo "Time in seconds: ${T}"
La méthode la plus simple et la plus rapide pour créer une copie complète d'une base de données existante (Live) consiste à utiliser Cependant, il y a une limite Il est possible de créer des bases de données de modèles supplémentaires et même une
peut copier une base de données dans un cluster en spécifiant son nom comme le
Modèle pour Vous pouvez mettre fin à toutes les sessions dans la base de données de modèle si vous avez les privilèges nécessaires avec Créer une base de données code> avec un modèle code> code>
:
Créer une base de données code>. Il est important de comprendre, cependant,
que ce n'est pas (encore) conçu comme une base générale "
de la base de données de copie code>"
établissement. La limitation principale est qu'aucune autre séances ne peut être
connecté à la base de données source alors qu'il est copié.
créer une base de données code>
échouera si une autre connexion existe lorsqu'elle commence; durant
L'opération de copie, les nouvelles connexions à la base de données source sont évitées. P>
blockQquote>
pg_terminate_backend () code>
.
Pour interdire temporairement les reconnectes, révoquer le Connecter code> privilège
(et subvention code> plus tard). P>
REVOKE CONNECT ON DATABASE mydb FROM PUBLIC;
-- while connected to another DB - like the default maintenance DB "postgres"
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb' -- name of prospective template db
AND pid <> pg_backend_pid(); -- don't kill your own session
CREATE DATABASE mydb_test TEMPLATE mydb;
GRANT CONNECT ON DATABASE mydb TO PUBLIC; -- only if they had it before