2 votes

Créer une base de données de test avec des données copiées *et* ses propres données

Je voudrais créer une base de données de test qui est rafraîchie chaque jour avec les données de la base de données de production.

MAIS, je voudrais pouvoir créer des enregistrements dans la base de données de test et les conserver au lieu de les écraser.

Je me demande s'il y a un moyen simple et direct de le faire.

Les deux bases de données tournent sur le même serveur, donc apparemment cela exclut la réplication?

Pour clarification, voici ce que je voudrais se produire:

  1. La base de données de test est créée avec des données de production
  2. Je crée quelques enregistrements de test que je veux garder fonctionnant sur le serveur de test (essentiellement pour avoir des enregistrements d'exemple avec lesquels je peux jouer)
  3. Le lendemain, la base de données est complètement rafraîchie, mais les enregistrements que j'ai créés ce jour-là sont conservés. Les enregistrements qui n'ont pas été touchés ce jour-là sont remplacés par des enregistrements de la base de données de production.

La complication est que si un enregistrement de la base de données de production est supprimé, je veux qu'il soit également supprimé de la base de données de test, donc je veux me débarrasser des enregistrements dans la base de données de test qui n'existent plus dans la base de production, sauf si ces enregistrements ont été créés dans la base de données de test.

Il semble que le seul moyen de faire cela serait d'avoir une sorte de table stockant des métadonnées sur les enregistrements créés? Donc par exemple, quelque chose comme ceci:

CREATE TABLE MetaDataRecords (
    id integer not null primary key auto_increment,
    tablename varchar(100),
    action char(1),
    pk varchar(100)
);

DELETE FROM testdb.users
WHERE
    NOT EXISTS (SELECT * from proddb.users WHERE proddb.users.id=testdb.users.id) AND
    NOT EXISTS (SELECT * from testdb.MetaDataRecords 
        WHERE  
            testdb.MetaDataRecords.pk=testdb.users.pk AND
            testdb.MetaDataRecords.action='C' AND
            testdb.MetaDataRecords.tablename='users'
    );

0voto

J.T. Hurley Points 493

J'ai été ici, et j'étais prêt à modifier légèrement mon flux de travail afin de minimiser le risque d'avoir des données de production qui auraient dû être remplacées, dans ma base de données de test.

Tout ce que j'ai fait était simplement:

  • mysqldump la production
  • Injecter du SQL à la fin du dump, et assert que c'est dans le fichier (on ne sait jamais avec les écritures de fichier)
  • Restaurer cette sauvegarde dans la base de données de test.

Le SQL que vous injectez doit être maintenu séparément, peut-être dans un autre script. Ces derniers sont généralement appelés fixtures de test. Pour s'abstraire de votre implémentation de DB, et s'appuyer moins sur la "magie" (c'est-à-dire, dans votre cas, comparer votre base de données de test avec sa restauration précédente pour voir ce qui a été ajouté, puis voir ce qui a été supprimé du live, croiser les clés primaires/étrangères, etc.) afin qu'il y ait beaucoup moins de chances que cela se passe mal, et que vous finissiez par envoyer un e-mail à vos utilisateurs réels plutôt qu'à vos utilisateurs de test.

Un avantage (pour moi) est de faire quelque chose comme:

UPDATE users SET email = CONCAT('gmailusername+', users.name, '@gmail.com')`;

ce qui est une méga-sécurité au cas où toutes les autres voies échouent (comme votre serveur SMTP factice), et que le mail passe (encore une fois, on ne peut jamais être trop prudent avec ces choses).

0voto

Hrvoje Špoljar Points 5116

Je pense que vous pourriez trouver les tables de fusion utiles ici. Gardez simplement les données de test dans une table ; et ayez des instantanés quotidiens de la production dans une autre table; et ayez une table de fusion de ces deux là.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X