12
votes

Comment cloner une base de données de test d'une production une seule action?

Je cherche un script / commande de base qui créera une copie d'une base de données en direct (lâchez-les mydb et mydb_test , sur le même serveur).

Exigences

  • il doit fonctionner même si le mydb_test existe déjà et a des enregistrements
  • Il doit fonctionner même si mydb et mydb_test avoir des connexions existantes
  • Il doit nettoyer la base de données potentiellement existante si nécessaire

    Astuces:

    • Drop Database ne peut pas être utilisé si vous avez des connexions existantes

0 commentaires

4 Réponses :


2
votes

Depuis que vous n'avez pas dit que c'était un problème de supprimer objets dans la base de données, je pense à exécuter pg_dump avec le - nettoyer L'option fera ce que vous voulez. Vous pouvez tuyer la sortie de pg_dump dans psql pour ce genre de chose.


0 commentaires

0
votes

Vous regardez dans le Standby chaude avec réplication en continu ici?


0 commentaires

3
votes

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}"


0 commentaires

7
votes

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 Créer une base de données code> avec un modèle code> code> : xxx pré>

Cependant, il y a une limite importante strong> violer votre deuxième exigence: la base de données de modèle (source) ne peut pas y avoir de connexions supplémentaires. i Citez le manuel: P>

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 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>

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 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


0 commentaires