【问题标题】:Replicate tables from different database of same mysql server从同一mysql服务器的不同数据库复制表
【发布时间】:2011-11-12 13:24:03
【问题描述】:

我有一台带有 2 个数据库的服务器,我想将多个表从一个数据库复制到另一个数据库。目的是我们使用与项目中相同的用户表。

正如在其他表中使用 InnoDB 和用户表的外键一样,我选择了一种复制方式。

为此,我对 my.cnf 进行了更改

master-user=root

server-id                       = 2
replicate-rewrite-db            = dou->jobs
replicate-do-table              = jobs.auth\_user
replicate-wild-do-table         = jobs.geo\_%
replicate-do-table              = jobs.user\_profile
replicate-same-server-id        = 1
report-host                     = master-is-slave

binlog-do-db                    = dou

log-bin

binlog-do-db 同步表并启动slave error.log 后出现下一行:

111112 15:10:22 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='localhost', master_port='3306', master_log_file='', master_log_pos='4'. New state master_host='localhost', master_port='3306', master_log_file='mysql-bin.000074', master_log_pos='106'.
111112 15:10:36 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000074' at position 106, relay log '/var/log/mysql/dell-relay-bin.000001' position: 4
111112 15:10:36 [Note] Slave I/O thread: connected to master 'root@localhost:3306',replication started in log 'mysql-bin.000074' at position 106

似乎在这一步一切正常,show slave status 没有显示错误。

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: localhost
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000074
          Read_Master_Log_Pos: 814
               Relay_Log_File: dell-relay-bin.000002
                Relay_Log_Pos: 959
        Relay_Master_Log_File: mysql-bin.000074
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: jobs.user\_profile,jobs.auth\_user
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: jobs.geo\_%
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 814
              Relay_Log_Space: 1113
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
1 row in set (0.00 sec)

ERROR: 
No query specified

问题是master的改变不会影响slave,但是slave的状态会改变。

感谢您为解决该问题提供的任何帮助。

【问题讨论】:

    标签: mysql replication


    【解决方案1】:

    我不会告诉你将表复制到同一个数据库是个坏主意,因为会增加数倍的 IO。

    Slave 没有更新,因为 server-id 对于 master 和 slave 来说是相同的。通常 slave 会忽略与它自己的 server-id 相同的更新。

    replicate-same-server-id 添加到 my.cnf。 replicate-same-server-id documentation

    【讨论】:

    • 将replicate-same-server-id 添加到my.cnf。 replicate-same-server-id 文档 感谢您的回答,我在 my.cnf 中有该选项
    • 抱歉,没查过。 “显示变量”说明了什么?设置好了吗?您是否在应用更改后重新启动了服务器?
    • replicate-rewrite-db: 数据库名称翻译在 --replicate-* 规则测试之前完成。 How Servers Evaluate Replication Filtering Rules: 后者的一个例子可能有意想不到的效果是 --replicate-do-db 和 --replicate-wild-do-table 一起使用,其中 --replicate-wild-do-table 使用与给定名称匹配的数据库名称模式 - -replicate-do-db
    • 我通过在我需要的表上创建触发器解决了这个问题。
    【解决方案2】:

    出于兴趣,视图会做你想做的事吗?

    我真的不认为在同一个 mysql 实例上运行复制到同一个实例是一个好主意。

    如果服务器硬件有问题,您可能想要调查的另一个选项是在同一台机器上运行多个运行不同端口的 mysql 实例,这可能会帮助您实现所需的目标。这是我在测试环境中用于模拟主数据库故障和从数据库升级的东西。

    【讨论】:

      【解决方案3】:

      例如,您可以在很多情况下实现更多优化。 DB1 复制到 DB2(同一服务器)。 DB2 从那里只存储了长达 1 周的数据。所有超过 1 周的数据都将被删除(在 db2 上)。在这样的设置中,例如一个高流量的数据库服务器,你需要它尽可能干净,如果你的服务器大部分时间做的是从服务器读取数据,那么在同一台服务器上的双数据库设置使用服务器的“更少”资源数据库。我有这样的设置,但我使用 4 个不同的服务器。服务器 1) 3 天。服务器 2) 30 天。服务器 3) 2 个月,服务器 4 从一开始的所有数据。 (服务器 4 主要用于获取非常旧的寄存器并没有太多使用。对不起,我的英语很抱歉,但我想我已经说明了你可以在哪里使用数据库复制,以减少内存使用和 cpu 使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-26
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-06
        相关资源
        最近更新 更多