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.
Le seul moyen de filtrer sur un serveur DB est d'exécuter plusieurs instances de MySQL sur un serveur DB.
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
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.
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.
S'il vous plaît voir mes autres messages sur la façon d'utiliser Blackhole Tables dans la réplication
Apr 18, 2013
: ((( esclave unique - multiple Master MySQL Replication Feb 03, 2012
: ((( un esclave, plusieurs masters MySQL Jun 01, 2011
: Que pouvons-nous faire dans la réplication MySQL 5.0 pour répondre aux préoccupations de la bande passante?May 16, 2011
: ( est une esclave unique Multi maître possible dans MySQL DB? Mar 11, 2011
: (( mysql en topologie étoile 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.
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.
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:
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.