zoukankan      html  css  js  c++  java
  • day09_mysql——AB复制

    mysql a-b:


    AB【主从复制】


    A就是那个主库,B就是那个从库。一般是AB复制,你也可以ABBBBBBBCCCCCC复制。


    举例:
       主要实现什么功能?

    在主库执行 create database abc,在从库上自动创建了abc库
    mysql主库开启日志功能,你在库中create database abc库,这个动作一定会记录在bin-log日志中。
    此时我通过一种机制把Bin-log下载到从库,从库中也有create database abc语句,然后我通过从库本地的SQL线程,在我从库再执行一下create database abc语句。
    所以主库和从库做了一样的操作了。




    AB复制主要通过2个线程实现:

    从库上的
    I/O线程:从主库上把bin-log下载到从库后,放到从库的Relay-log中。
    SQL线程:把Relay-log中的动作,在从库上做一次。




    注意:
       (1)、关闭防火墙强,如果主库或从库中开了防火墙,会造成I/O线程无法连接。
       (2)、生产遇到SQL线程报错,如何解决?从主库拿到一些操作,在从库上执行不了,通过会跳过那些执行不了的。【详细上网自己查,咱们模拟不出来】




    咱们的数据是以为主库为准,在生产库做AB复制,主库中肯定有一些数据,从库肯定是新的库
    【假如原从库不是新的,从库中有ABC库,现在在主库中执行create table abc,肯定就报错了】。
    咱们实验环境中是两台新虚拟机,主库没有数据,咱们自己模拟点数据。
    实验手册是全的,是按主库有数据来写的。




    主库【模拟数据】:
    create database m;
    use m;
    create table a(a int);
    insert into a values(1);










    ----------------------------------------
    [root@rhce ~]# service iptables stop //关闭防火墙
    [root@rhce ~]# setenforce 0 //临时关闭selinux
    vi /etc/selinux/config   //永久关闭,要重启
    将SELINUX=enforcing改为SELINUX=disabled









    4.1

    master:
    vim /etc/my.cnf 【配置文件,server_id的值小,代表是主】
    [mysqld]
    server_id = 1


    slave: 【配置文件】
    vim /etc/my.cnf
    [mysql]
    server_id = 2



    4.2 
    master:
    vim /etc/my.cnf   【在主库开启bin-log日志】
    [mysql]
    server_id = 1
    log-bin=binlog
    log-bin-index=binlog.index


    4.3
    slave:
    vim /etc/my.cnf  【在从库开启relay-log日志】
    [mysql]
    server_id = 2
    relay_log = /app/mysql/mysql-relay-bin
    relay_log_index=/app/mysql/mysql-relay-bin.index


    4.4
    master && slave
    service mysql restart 【修改了配置文件,重启服务配置生效】


    4.5
    master:
    mysql> GRANT replication slave ON *.* TO 'lipengfei'@'%' identified by 'lipengfei'; 【创建一个用户,赋予复制权限】
    Query OK, 0 rows affected (0.05 sec)

    mysql> flush privileges; 【权限生效】
    Query OK, 0 rows affected (0.00 sec)

    ##################################################
    slave: 【如果从库以前有数据,要干掉原有数据,保持从库没有数据】

      service mysql stop
    cd /app/mysql/data  【进行数据目录】
    rm -fr 只删除库相关目录
    service mysql restart
    master: 【主库上有一些数据了,从库是干净的,要同步数据,两个库在同一起点才能同步。所以把主库的旧数据导出,再导入从库,让两边数据一致】

     mysqldump -u root -pmysql m >/tmp/full.sql
    scp /tmp/full.sql root@从库IP:/tmp/


    scp /tmp/full.sql root@192.168.8.101:/tmp/

    slave:
     mysql -u root -pmysql m < /tmp/full.sql  【导入主库的旧数据】


    ********************4.6******************************
    master:
    mysql> flush tables with read lock; 【给主库加上读锁,防止再的操作修改主库。咱们上面已经把主从库两边数据同步了】
    mysql> show master status;【查看Bin-log状态,查看写到哪个日志的哪个位置了,从库从现在的位置同步】
    +---------------+----------+--------------+------------------+-------------------+
    | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +---------------+----------+--------------+------------------+-------------------+
    | binlog.000001 |      402 |              |                  |                   |
    +---------------+----------+--------------+------------------+-------------------+

    mysql>unlock tables;


    4.6 
    slave:
    mysql> change master to master_host='主库IP', master_port=3306, master_user='同步复制的用户', master_password='同步复制的密码', master_log_file='binlog.000001',master_log_pos=402;


    change master to master_host='192.168.8.100', master_port=3306, master_user='lipengfei', master_password='lipengfei', master_log_file='binlog.000001',master_log_pos=402;





    mysql> start slave;

    4.7
    slave: 【查看AB复制成功没】
    mysql> show slave status G
     Slave_IO_Running: Yes
         Slave_SQL_Running: Yes



    创建数据测试
    master:
    create database slave;
    use slave;
    create table a(a int);
    insert into a values(1);
    insert into a values(2);
    slave: 
    show databases;
    use slave;
    select * from a;

    #################################################################
    Seconds_Behind_Master: 0 【说明同步效率非常好:主库发生变化,过了多少秒,从库就更新过来了】





    slave:【从库的数据应该全是从主库同步过来的,不应该有人往从库中写数据】
    vim /etc/my.cnf
    read-only=1 【只读,如果使用root用户登录,可以写数据,其它用户不能】




    如果从库的同步进程停止了,主库的操作还会往从库中同步吗?会丢数据吗?

    slave:
      service mysql stop

    master:
      use slave;
      insert into a values(3);
    insert into a values(4);

    slave:
      service mysql start
      use slave;
    select * from a;【咱们没有手工操作,数据自动同步过来了,说明主库相关的配置肯定保存在一个文件中】

    slave:

    more /app/mysql/data/master.info

                            




  • 相关阅读:
    static 和final
    Integer中getInteger(),valueof()
    Integer和String "+""=="方法的不同
    java中Integer常量池
    用jvm指令分析String 常量池
    多线程、线程安全
    String字符串缓冲区、StringBuffer
    TCP通信---文件上传案例、多线程文件上传
    网络通信协议、UDP通信、TCP通信
    Java线程-- 线程池
  • 原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/4af243223d3487b0e53a6ef2997e4f45.html
Copyright © 2011-2022 走看看