AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 37015
Accepted
chris
chris
Asked: 2013-03-20 06:31:00 +0800 CST2013-03-20 06:31:00 +0800 CST 2013-03-20 06:31:00 +0800 CST

复制一些表而不传输整个日志

  • 772

我有一个 mysql 数据库,其中包含一些带有私有信息的表和一些带有公共信息的表。

我只想将包含公共信息的表从一个数据库复制到另一个数据库,确保没有机密信息存储在从属数据库上。

我知道我可以用replicate-do-table来指定只复制一些表,但我的理解是整个bin日志都传输到slave上。

有没有办法确保只有公共信息传输给从站?

我非常犹豫是否将数据库的另一个副本添加到现有服务器 - 我只是不认为现有服务器具有可用容量,无论是 RAM 还是 CPU。

mysql replication
  • 5 5 个回答
  • 27039 Views

5 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2014-02-14T15:24:43+08:002014-02-14T15:24:43+08:00

    在一台数据库服务器上进行过滤的唯一方法是在一台数据库服务器上运行多个 MySQL 实例。

    服务器 DB1

    端口 3306将是您的应用程序的普通数据库实例

    端口 3307将是端口 3306 的从属端口

    对于在 DB1 上运行的 MySQL 实例,您需要做一些事情

    • 在 my.cnf 中启用以下内容
      • 日志-bin=mysql-bin
      • 日志从更新
      • 复制做表=db1.public_tb1
      • 复制做表=db2.public_tb2
      • ...
      • 复制做表=dbn.public_tbn

    作为一个选项,将 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 MySql
    • Jun 01, 2011:我们可以在 MySQL 5.0 Replication 中做些什么来解决带宽问题?
    • May 16, 2011:在 mySQL DB 中可以多主单从吗?
    • Mar 11, 2011: MySQL 星型拓扑
    • 7
  2. atxdba
    2014-02-14T12:10:30+08:002014-02-14T12:10:30+08:00

    正如您所说,您无法阻止使用复制执行表将事件写入二进制日志,但是如果您启用了 log-slave-updates,这将确定写入从属二进制日志的内容。

    考虑在与您的私有主服务器相同的受信任机器上设置一个中间从属服务器,该服务器运行的唯一目的是进行二进制日志过滤,然后让您的“公共”数据库从中复制。

    如果您担心将“私有”数据写入 binlog,即使是那种环境,请记住文件系统权限将读取权限限制为仅 mysql 系统用户。如果您担心该帐户会受到威胁,以便他们可以读取您的二进制日志,请记住,此时您遇到了更大的问题,他们可以获取整个数据目录。

    • 2
  3. Cristian Porta
    2013-04-19T21:15:27+08:002013-04-19T21:15:27+08:00

    如果您的架构允许,您可以尝试使用replicate-ignore-tableonly 用于您的私有表的反向方法

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

    结合这样的行为:

    SET sql_log_bin = 0;
    
    INSERT INTO pvt_table_name () VALUES(); -- or UPDATES
    
    SET sql_log_bin = 1;
    

    一种更易于管理的方法是创建自己的过程,以便:

    给你写信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 ;
    

    并将您的软件替换为您的:

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

    与:

    CALL write_my_private_data (1,'privateData');
    

    查看sql_log_bin以关闭当前会话的日志记录

    仅当您确定存在单点插入/更新(您的软件具有 sql_log_bin 的动态声明)时,此条件才成立,相反,如果还可能有第三方干预,例如手动插入,则此条件不成立直接放在桌子上。

    • 1
  4. Mathew
    2016-09-01T18:56:14+08:002016-09-01T18:56:14+08:00

    您可能想查看MySQL::Replication - 分散式、点对点、多主 MySQL 复制。

    [ 虽然它是 Perl,但它是一个独立的应用程序。不确定它是否仍在维护。]

    简而言之,它允许选择性复制,例如:

    • 只复制一些表
    • 只有一些列或行
    • 星型节点复制

    它开箱即用。作为一个单独的应用程序,您可以合并任何类型的过滤,而无需重新启动数据库实例。作为 Perl,您可以轻松破解它。

    • 0
  5. TimG
    2013-03-20T07:19:47+08:002013-03-20T07:19:47+08:00

    对于像这样的特殊情况,一种常见的方法是将要移动的行复制到临时表/数据库(或等效缓冲区)中,然后让复制从那里获取它。行业术语是 ETL(提取、转换、加载)。中间/临时/缓冲区让您有机会在数据发货(加载步骤)之前对其进行操作(转换步骤)。这可能有点乏味,但保证了一致的结果。

    • -1

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve