zoukankan      html  css  js  c++  java
  • MySQL 主从复制

    MySQL 主从复制:

    (1) MySQL Replication 称为 MySQL 主从复制,即在主库上写数据,从库也会跟着实时同步
    (2) MySQL 主从基于 binlog (二进制格式的日志),主库上必须开启 binlog 才能进行主从复制

    (1) 主库将更改操作的SQL语句记录到 binlog 日志
    (2) 从库将主库的 binlog 日志同步到本机并记录在 relaylog(中继日志)
    (3) 从库根据 relaylog 日志里的SQL语句按顺序执行,达到主从同步

    (1) 主库上有一个 log dump 线程,用来和从库的 I/O 线程传递 binlog 日志
    (2) 从库上有两个线程,其中 I/O 线程用来同步主库的 binlog 日志并记录到 relaylog 中,另外一个SQL线程用来将 relaylog 日志里的SQL语句按顺序执行


    配置 MySQL 主库(192.168.216.128):

    [root@localhost ~]$ mysqldump -uroot -proot -A > /tmp/all.sql     # 做主从同步前,必须先保证主库和从库数据一致
    [root@localhost ~]$ scp /tmp/all.sql root@192.168.216.132:/tmp/   # 备份所有库,发送到从库,然后在从库导入这些库
    [root@localhost ~]$ vim /etc/my.cnf     # 修改配置文件
    [mysqld]
    server-id = 1             # 用于标识 binlog 日志是由哪个 server 写入的,主从不能一致
    log_bin = mysql-binlog    # 记录二进制日志,mysql-binlog 作为日志的前缀名
    [root@localhost ~]$ /etc/init.d/mysqld restart    # 重启 MySQL 服务
    mysql> grant replication slave on *.* to 'repl'@'192.168.216.132' identified by '123456';    # 创建用于主从复制的用户,其中的IP是从库IP
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> flush privileges;                # 刷新用户权限
    Query OK, 0 rows affected (0.07 sec)
    
    mysql> flush tables with read lock;     # 锁表,不让数据写入,等做完主从同步再解锁
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show master status;    # 查看主库状态,记住下面的值,等下在从库的时候会用到
    +---------------------+----------+--------------+------------------+-------------------+
    | File                | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +---------------------+----------+--------------+------------------+-------------------+
    | mysql-binlog.000001 |      411 |              |                  |                   |
    +---------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    mysql> quit
    Bye


    配置 MySQL 从库(192.168.216.132):

    [root@localhost ~]$ vim /etc/my.cnf     # 修改配置文件,server id 不能与主库一致
    [mysqld]
    server-id = 2
    [root@localhost ~]$ /etc/init.d/mysqld restart    # 重启 MySQL 服务
    mysql> stop slave;    # 先停止从库
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> change master to master_host='192.168.216.128',     # 配置主库相关的信息
         > master_user='repl', master_password='123456', 
         > master_log_file='mysql-binlog.000001', master_log_pos=411;
    Query OK, 0 rows affected, 2 warnings (0.11 sec)
    
    mysql> start slave;    # 启动从库
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> show slave statusG    # 查看从库的状态,如果下面两个线程的值为Yes,则表明主从复制配置成功
        Slave_IO_Running: Yes
       Slave_SQL_Running: Yes
    mysql> unlock tables;    # 主从复制配置成功后,记得在主库上解锁表,让其恢复可写
    Query OK, 0 rows affected (0.00 sec)


    测试 MySQL 主从同步:

    [root@localhost ~]$ mysql -uroot -p'123456'    # 在 master 上创建一些数据库
    mysql> create database test1;
    mysql> create database test2;
    mysql> create database test3;
    mysql> show databases;    # 在 slave 上查询是否实时同步
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test1              |
    | test2              |
    | test3              |
    +--------------------+
    8 rows in set (0.04 sec)

        

  • 相关阅读:
    read-uncommited 下脏读的实现
    MySQL 加锁处理分析【重点】
    Next-key locking是如何解决幻读(当前读)问题的
    spring ioc
    讨论 update A set number=number+ ? where id=?的原子性 (含数据库原理)
    PESSIMISTIC_READ & PESSIMISTIC_WRITE 与 共享锁 & 排它锁
    innodb当前读 与 快照读 and rr级别是否真正避免了幻读
    java finalize及实践
    uva 539 The Settlers of Catan
    zoj 1016 Parencodings
  • 原文地址:https://www.cnblogs.com/pzk7788/p/10408374.html
Copyright © 2011-2022 走看看