web-dev-qa-db-fra.com

Reproduire des tables sans transférer tout le journal

J'ai une base de données MySQL qui contient des tables avec des informations privées et des tables avec des informations publiques.

Je souhaite reproduire uniquement les tables contenant des informations publiques d'une base de données à une autre, en veillant à ce qu'aucune information confidentielle ne soit stockée sur l'esclave.

Je sais que je peux utiliser le replicate-do-table Pour spécifier que seules certaines tables sont répliquées, mais ma compréhension est que tout le journal des bacs est transféré à l'esclave.

Existe-t-il un moyen de s'assurer que seules les informations publiques sont transférées à l'esclave?

Je suis très hésitant à ajouter une autre copie de la base de données à un serveur existant - je ne pense tout simplement pas que le serveur existant a la capacité disponible, dans l'une ou l'autre RAM ou CPU.

5
chris

Le seul moyen de filtrer sur un serveur DB est d'exécuter plusieurs instances de MySQL sur un serveur DB.

Serveur DB1

Port 3306 serait votre instance de base de données normale pour votre demande

Port 3307 serait un esclave de port 3306

Il y a quelques éléments à faire avec l'instance MySQL en cours d'exécution sur DB1

  • Activez ce qui suit dans my.cnf pour
    • bOB-BIN = MYSQL-BIN
    • journal-esclave-mises à jour
    • replicat-do-table = db1.public_tb1
    • replicat-do-table = db2.public_tb2
    • ...
    • repliquer-do-table = dbn.public_tbn

En option, convertissez toutes les tables dans DB1 3307 au Moteur de stockage Blackhole .

De cette façon, DB1 3307 n'a que des binlogs avec des informations. Pas de données réelles.

Serveur DB2

Configurez l'instance MySQL et faites-la esclave de l'instance 3307 de DB1. Pourquoi est-ce bien ?

Parce que les binlogs de l'instance DB1 3307 ne doivent contenir que les informations publiques. Ainsi, tous les esclaves de DB1 3307 ne verront que des informations publiques.

CAVEAT

S'il vous plaît voir mes autres messages sur la façon d'utiliser Blackhole Tables dans la réplication

4
RolandoMySQLDBA

Comme vous l'avez dit, vous ne pouvez pas empêcher les événements d'être écrits dans les binlogs avec des tables répliquées, cependant, qui déterminera ce qui est écrit dans les binlogs d'esclaves si vous avez des mises à jour de log-esclave.

Envisagez de configurer une esclave intermédiaire sur la même machine de confiance que votre maître privé qui fonctionne dans le seul but du filtrage des binlogs, puis de votre base de données "publique" répliquée à partir de celle-ci.

Si vous vous inquiétez des données "privées" étant écrites dans le Binlog, même si l'environnement garde à l'esprit que les autorisations du système de fichiers limitent l'accès en lecture à l'utilisateur du système MySQL. Si vous craignez que ce compte soit compromis afin de pouvoir lire vos binlogs, gardez à l'esprit à ce moment-là que vous avez des problèmes plus importants et qu'il peut simplement saisir l'ensemble de la date de l'ajustement.

1
atxdba

Si votre architecture vous permet, vous pouvez essayer une approche inverse en utilisant le replicate-ignore-table uniquement pour vos tables privées

replicate-ignore-table=<database>.pvt_table_name
replicate-ignore-table=<database>.other_pvt_table_name
...

combiner un comportement comme celui-ci:

SET sql_log_bin = 0;

INSERT INTO pvt_table_name () VALUES(); -- or UPDATES

SET sql_log_bin = 1;

Une manière plus gérée est de créer votre propre procédure afin:

Écrivez-vous PROCEDURE

DELIMITER |
CREATE PROCEDURE write_my_private_data (`id` INT, `private_data` VARCHAR(255))
BEGIN
  SET SESSION SQL_LOG_BIN = 0;
  INSERT INTO `pvt_table_name` (`id`, `private_data`) VALUES (id, private_data);
  SET SESSION SQL_LOG_BIN = 1;
END
|
DELIMITER ;

Et remplacez-vous dans votre logiciel votre:

INSERT INTO `pvt_table_name` (`id`, `private_data`) VALUES (id, private_data);

Avec le:

CALL write_my_private_data (1,'privateData');

Voir le sql_log_bin pour désactiver la journalisation de la session en cours

Cette condition n'est pas vraie que si vous êtes sûr qu'il existe un point unique d'insertion/mise à jour (votre logiciel avec la déclaration dynamique de SQL_Log_bin), au contraire, cette condition échoue s'il ya également des interventions de tiers, telles que l'insert manuel directement sur la table.

1
Cristian Porta

Vous voudrez peut-être regarder MySQL :: Réplication - Décentralisée, pair-to-peer, multi-maître MySQL MySQL .

[Bien que ce soit Perl, c'est une application autonome. Je ne sais pas si c'est toujours maintenu. ]

Mettez simplement, il permet une réplication sélective telle que:

  • répliquer uniquement des tables
  • seulement quelques colonnes ou rangées
  • Réplication des nœuds Star-Schema

Cela fait un peu de la boîte; Étant une application distincte, vous pouvez intégrer tout type de filtrage que vous aimez sans avoir à redémarrer vos instances de base de données. Et être perl, vous pouvez facilement pirater.

0
Mathew