• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • InnoDB和MySQL复制

    MySQL复制适用于InnoDB表,适用于MyISAM表。还可以通过以下方式使用复制:从属服务器上的存储引擎与主服务器上的原始存储引擎不同。例如,您可以InnoDB将对主服务器上的MyISAM表的修改复制到从服务器上的表。有关更多信息,请参见“在不同的主存储和从存储引擎中使用复制”。

    有关为主服务器设置新的从服务器的信息,请参见“设置复制从站”和“为数据快照选择方法”。要在不关闭主服务器或现有从服务器的情况下创建新的从服务器,请使用 MySQL Enterprise Backup产品。

    在主服务器上失败的事务根本不会影响复制。MySQL复制基于二进制日志,其中MySQL编写修改数据的SQL语句。失败的事务(例如,由于违反外键或由于其已回退)不会写入二进制日志,因此不会发送给从属。请参见“ START TRANSACTION,COMMIT和ROLLBACK语句”。

    复制和CASCADE。当共享外键关系的表同时在主服务器和从服务器上使用时,主服务器InnoDB上的表的级联操作才会在从服务器上复制InnoDB。无论您使用的是基于语句的复制还是基于行的复制,都是如此。假设您已经开始复制,然后使用以下CREATE TABLE语句在主数据库上创建两个表:

    CREATE TABLE fc1 (
        i INT PRIMARY KEY,
        j INT
    ) ENGINE = InnoDB;
    
    CREATE TABLE fc2 (
        m INT PRIMARY KEY,
        n INT,
        FOREIGN KEY ni (n) REFERENCES fc1 (i)
            ON DELETE CASCADE
    ) ENGINE = InnoDB;
    

    假设从站未InnoDB启用支持。如果是这种情况,则会创建从属服务器上的表,但它们使用MyISAM存储引擎,并且该FOREIGN KEY选项将被忽略。现在,我们将一些行插入到主数据库的表中:

    master> INSERT INTO fc1 VALUES (1, 1), (2, 2);
    Query OK, 2 rows affected (0.09 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    master> INSERT INTO fc2 VALUES (1, 1), (2, 2), (3, 1);
    Query OK, 3 rows affected (0.19 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    此时,在主服务器和从服务器上,表fc1包含2行,表fc2包含3行,如下所示:

    master> SELECT * FROM fc1;
    +---	+------	+
    | i 	| j    	|
    +---	+------	+
    | 1 	|    1 	|
    | 2 	|    2 	|
    +---	+------	+
    2 rows in set (0.00 sec)
    
    master> SELECT * FROM fc2;
    +---	+------	+
    | m 	| n    	|
    +---	+------	+
    | 1 	|    1 	|
    | 2 	|    2 	|
    | 3 	|    1 	|
    +---	+------	+
    3 rows in set (0.00 sec)
    
    slave> SELECT * FROM fc1;
    +---	+------	+
    | i 	| j    	|
    +---	+------	+
    | 1 	|    1 	|
    | 2 	|    2 	|
    +---	+------	+
    2 rows in set (0.00 sec)
    
    slave> SELECT * FROM fc2;
    +---	+------	+
    | m 	| n    	|
    +---	+------	+
    | 1 	|    1 	|
    | 2 	|    2 	|
    | 3 	|    1 	|
    +---	+------	+
    3 rows in set (0.00 sec)
    

    现在,假设您DELETE在主服务器上执行以下语句:

    master> DELETE FROM fc1 WHERE i=1;
    Query OK, 1 row affected (0.09 sec)
    

    由于级联,fc2现在主服务器上的表仅包含1行:

    master> SELECT * FROM fc2;
    +---	+---	+
    | m 	| n 	|
    +---	+---	+
    | 2 	| 2 	|
    +---	+---	+
    1 row in set (0.00 sec)
    

    但是,级联不会在从属服务器上传播,因为DELETEfor fc1不会在从属服务器上删除任何行fc2。从属的副本fc2仍包含最初插入的所有行:

    slave> SELECT * FROM fc2;
    +---	+---	+
    | m 	| n 	|
    +---	+---	+
    | 1 	| 1 	|
    | 3 	| 1 	|
    | 2 	| 2 	|
    +---	+---	+
    3 rows in set (0.00 sec)
    

    这种差异是由于级联删除操作是由InnoDB存储引擎在内部处理的事实所致,这意味着没有记录任何更改。

    上篇:InnoDB恢复

    下篇:InnoDB故障排除