我有一个 mysql 数据库,其中包含一些带有私有信息的表和一些带有公共信息的表。
我只想将包含公共信息的表从一个数据库复制到另一个数据库,确保没有机密信息存储在从属数据库上。
我知道我可以用replicate-do-table
来指定只复制一些表,但我的理解是整个bin日志都传输到slave上。
有没有办法确保只有公共信息传输给从站?
我非常犹豫是否将数据库的另一个副本添加到现有服务器 - 我只是不认为现有服务器具有可用容量,无论是 RAM 还是 CPU。
我有一个 mysql 数据库,其中包含一些带有私有信息的表和一些带有公共信息的表。
我只想将包含公共信息的表从一个数据库复制到另一个数据库,确保没有机密信息存储在从属数据库上。
我知道我可以用replicate-do-table
来指定只复制一些表,但我的理解是整个bin日志都传输到slave上。
有没有办法确保只有公共信息传输给从站?
我非常犹豫是否将数据库的另一个副本添加到现有服务器 - 我只是不认为现有服务器具有可用容量,无论是 RAM 还是 CPU。
在一台数据库服务器上进行过滤的唯一方法是在一台数据库服务器上运行多个 MySQL 实例。
服务器 DB1
端口 3306将是您的应用程序的普通数据库实例
端口 3307将是端口 3306 的从属端口
对于在 DB1 上运行的 MySQL 实例,您需要做一些事情
作为一个选项,将 DB1 3307 中的所有表都转换为BLACKHOLE 存储引擎。
这样,DB1 3307 只有带有信息的 binlog。没有实际数据。
服务器 DB2
设置 MySQL 实例并使其成为 DB1 的 3307 实例的 Slave。为什么这么好?
因为 DB1 3307 实例中的 binlogs 应该只包含公共信息。因此,来自 DB1 3307 的所有从站将只能看到公共信息。
警告
请参阅我的其他帖子,了解如何在复制中使用 BLACKHOLE 表
Apr 18, 2013
:单从 - 多主 MySQL 复制Feb 03, 2012
:一个slave,多个master MySqlJun 01, 2011
:我们可以在 MySQL 5.0 Replication 中做些什么来解决带宽问题?May 16, 2011
:在 mySQL DB 中可以多主单从吗?Mar 11, 2011
: MySQL 星型拓扑正如您所说,您无法阻止使用复制执行表将事件写入二进制日志,但是如果您启用了 log-slave-updates,这将确定写入从属二进制日志的内容。
考虑在与您的私有主服务器相同的受信任机器上设置一个中间从属服务器,该服务器运行的唯一目的是进行二进制日志过滤,然后让您的“公共”数据库从中复制。
如果您担心将“私有”数据写入 binlog,即使是那种环境,请记住文件系统权限将读取权限限制为仅 mysql 系统用户。如果您担心该帐户会受到威胁,以便他们可以读取您的二进制日志,请记住,此时您遇到了更大的问题,他们可以获取整个数据目录。
如果您的架构允许,您可以尝试使用
replicate-ignore-table
only 用于您的私有表的反向方法结合这样的行为:
一种更易于管理的方法是创建自己的过程,以便:
给你写信
PROCEDURE
并将您的软件替换为您的:
与:
查看sql_log_bin以关闭当前会话的日志记录
仅当您确定存在单点插入/更新(您的软件具有 sql_log_bin 的动态声明)时,此条件才成立,相反,如果还可能有第三方干预,例如手动插入,则此条件不成立直接放在桌子上。
您可能想查看MySQL::Replication - 分散式、点对点、多主 MySQL 复制。
[ 虽然它是 Perl,但它是一个独立的应用程序。不确定它是否仍在维护。]
简而言之,它允许选择性复制,例如:
它开箱即用。作为一个单独的应用程序,您可以合并任何类型的过滤,而无需重新启动数据库实例。作为 Perl,您可以轻松破解它。
对于像这样的特殊情况,一种常见的方法是将要移动的行复制到临时表/数据库(或等效缓冲区)中,然后让复制从那里获取它。行业术语是 ETL(提取、转换、加载)。中间/临时/缓冲区让您有机会在数据发货(加载步骤)之前对其进行操作(转换步骤)。这可能有点乏味,但保证了一致的结果。