• mysql复制原理与机制一


    复制原理:复制需要二进制日志记录数据库上的改变

    slave的IO线程复制把master上的Binary log读取到本地的relay log里
    SQL线程负责把relay log恢复到数据库数据里

    show slave statusG;
      Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.105.7.108
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 630
                   Relay_Log_File: mysqld-relay-bin.000006
                    Relay_Log_Pos: 793
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
    关闭slave的io线程
     stop slave io_thread;
     mysql> show slave statusG;
    *************************** 1. row ***************************
                   Slave_IO_State: 
                      Master_Host: 10.105.7.108
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 630
                   Relay_Log_File: mysqld-relay-bin.000006
                    Relay_Log_Pos: 793
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: No
                Slave_SQL_Running: Yes
    到master
    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       143 |
    | mysql-bin.000002 |       367 |
    | mysql-bin.000003 |       120 |
    | mysql-bin.000004 |       630 |
    +------------------+-----------+
    4 rows in set (0.00 sec)
    日志轮换
    mysql> flush logs;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       143 |
    | mysql-bin.000002 |       367 |
    | mysql-bin.000003 |       120 |
    | mysql-bin.000004 |       677 |
    | mysql-bin.000005 |       120 |
    +------------------+-----------+
    mysql> use hk;
    Database changed
    mysql> show tables;
    +--------------+
    | Tables_in_hk |
    +--------------+
    | test         |
    +--------------+
    1 row in set (0.01 sec)
    
    mysql> select * from test;
    +----+---------------------+
    | id | time                |
    +----+---------------------+
    |  1 | 2017-02-04 10:04:12 |
    |  2 | 2017-02-04 13:53:35 |
    |  3 | 2017-02-08 19:46:49 |
    +----+---------------------+
    3 rows in set (0.00 sec)
    
    mysql> insert into test values(4,now());
    Query OK, 1 row affected (0.05 sec)
    
    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       143 |
    | mysql-bin.000002 |       367 |
    | mysql-bin.000003 |       120 |
    | mysql-bin.000004 |       677 |
    | mysql-bin.000005 |       344 |
    +------------------+-----------+
    5 rows in set (0.00 sec)
    
    mysql> show binlog events in 'mysql-bin.000005';
    +------------------+-----+-------------+-----------+-------------+--------------------------------------------+
    | Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                       |
    +------------------+-----+-------------+-----------+-------------+--------------------------------------------+
    | mysql-bin.000005 |   4 | Format_desc |       108 |         120 | Server ver: 5.6.35-log, Binlog ver: 4      |
    | mysql-bin.000005 | 120 | Query       |       108 |         203 | BEGIN                                      |
    | mysql-bin.000005 | 203 | Query       |       108 |         313 | use `hk`; insert into test values(4,now()) |
    | mysql-bin.000005 | 313 | Xid         |       108 |         344 | COMMIT /* xid=110 */                       |
    +------------------+-----+-------------+-----------+-------------+--------------------------------------------+
    可以看到一件记录到二进制日志里
    
    mysql> select * from test where id=4;
    +----+---------------------+
    | id | time                |
    +----+---------------------+
    |  4 | 2017-02-08 20:34:49 |
    +----+---------------------+
    到从库
    Database changed
    mysql> select * from test;
    +----+---------------------+
    | id | time                |
    +----+---------------------+
    |  1 | 2017-02-04 10:04:12 |
    |  2 | 2017-02-04 13:53:35 |
    |  3 | 2017-02-08 19:46:49 |
    +----+---------------------+
    查看此时 Relay_Log_File: mysqld-relay-bin.000006
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: 
                      Master_Host: 10.105.7.108
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 630
                   Relay_Log_File: mysqld-relay-bin.000006
                    Relay_Log_Pos: 793
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: No
                Slave_SQL_Running: Yes
    开启io线程
    
    mysql> start slave io_thread;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.105.7.108
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000005
              Read_Master_Log_Pos: 344
                   Relay_Log_File: mysqld-relay-bin.000009
                    Relay_Log_Pos: 507
            Relay_Master_Log_File: mysql-bin.000005
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    发现中继日志发生变化
    Relay_Log_File: mysqld-relay-bin.000009
    mysql>  select * from test where id=4;
    +----+---------------------+
    | id | time                |
    +----+---------------------+
    |  4 | 2017-02-08 20:34:49 |
    +----+---------------------+
    1 row in set (0.00 sec)
    
    此时sql进程 从中继日志 读取数据 写入数据库

     在mysql外执行

    mysqlbinlog  mysqld-relay-bin.000009

    [root@bogon mysql]# mysqlbinlog  mysqld-relay-bin.000009
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #170208 20:39:46 server id 163  end_log_pos 120 CRC32 0xbdb725c4        Start: binlog v 4, server v 5.6.35 created 170208 20:39:46
    BINLOG '
    khGbWA+jAAAAdAAAAHgAAABAAAQANS42LjM1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAcQl
    t70=
    '/*!*/;
    # at 120
    #170208 20:39:46 server id 108  end_log_pos 0 CRC32 0x0649f72c  Rotate to mysql-bin.000005  pos: 4
    # at 167
    #170208 20:33:47 server id 108  end_log_pos 120 CRC32 0x045c4ff1        Start: binlog v 4, server v 5.6.35-log created 170208 20:33:47
    BINLOG '
    KxCbWA9sAAAAdAAAAHgAAAAAAAQANS42LjM1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAfFP
    XAQ=
    '/*!*/;
    # at 283
    #170208 20:34:49 server id 108  end_log_pos 203 CRC32 0xb10230cc        Query   thread_id=9     exec_time=0     error_code=0
    SET TIMESTAMP=1486557289/*!*/;
    SET @@session.pseudo_thread_id=9/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=1075838976/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
    SET @@session.time_zone='SYSTEM'/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    BEGIN
    /*!*/;
    # at 366
    #170208 20:34:49 server id 108  end_log_pos 313 CRC32 0x59ee4c4e        Query   thread_id=9     exec_time=0     error_code=0
    use `hk`/*!*/;
    SET TIMESTAMP=1486557289/*!*/;
    insert into test values(4,now())
    /*!*/;
    # at 476
    #170208 20:34:49 server id 108  end_log_pos 344 CRC32 0x1735772f        Xid = 110
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    View Code

    复制特点
    1.sql更新,没写binary log 不可能复制
    2.正在执行的sql更新,也不可能被复制
    3.只有执行完成而且成功的语句才会被复制

  • 相关阅读:
    match、match_phrase、term示例
    AVL树及java实现
    eclipse集成lombok注解不起作用
    红黑树原理详解
    为什么HashMap中链表长度超过8会转换成红黑树
    用deepin堆砌工作环境
    为什么黑客都不用鼠标?你听说过Linux吗?
    为什么二流程序员都喜欢黑php?
    看Linux 之父是如何定义 Linux?
    Linux 系统故障排查和修复技巧
  • 原文地址:https://www.cnblogs.com/HKUI/p/6376175.html
Copyright © 2020-2023  润新知