zoukankan      html  css  js  c++  java
  • Docker- Mysql数据库主从同步配置方法

    一、背景

    最近在学习Docker,顺便玩了一下数据库的主从同步,特此记录一下操作~

    我用的是mac系统,挂载目录一定要配置好 

    二、具体操作

    1、先建立数据存放目录(~/dockermysql)

     
    --mysql
       --master
          --data  
          --conf
             --my.cnf     
       --slave
          --data  
          --conf
             --my.cnf
     

    2、Master my.cnf配置文件

    [mysqld]
    server_id = 1

    log-bin= mysql-bin

    read-only=0


    replicate-ignore-db=mysql

    replicate-ignore-db=sys

    replicate-ignore-db=information_schema

    replicate-ignore-db=performance_schema


    !includedir /etc/mysql/conf.d/

    !includedir /etc/mysql/mysql.conf.d/

    3、Slave my.cnf配置文件

    [mysqld]
    server_id = 2

    log-bin= mysql-bin

    read-only=1


    replicate-ignore-db=mysql

    replicate-ignore-db=sys

    replicate-ignore-db=information_schema

    replicate-ignore-db=performance_schema

    !includedir /etc/mysql/conf.d/

    !includedir /etc/mysql/mysql.conf.d/

    4、创建master主容器

    docker run --name masterA -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -v ~/dockermysql/master/data:/var/lib/mysql -v ~/dockermysql/master/conf/my.cnf:/etc/mysql/my.cnf mysql:5.6

    5、创建slave从容器

    docker run --name slaveA -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -v ~/dockermysql/slave/data:/var/lib/mysql -v ~/dockermysql/slave/conf/my.cnf:/etc/mysql/my.cnf mysql:5.6

    6、master容器设置

     
    //进入master容器
    
    docker exec -it mastermysql bash
    
     
    //启动mysql命令,刚在创建窗口时我们把密码设置为:12345
    
    mysql -u root -p
    
     
    //创建一个用户来同步数据,每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE 权限。
    权限不懂的可以看看这篇博客-----https://www.cnblogs.com/wuxunyan/p/9095016.html CREATE USER 'slave'@ '%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456'; //这里表示创建一个slaver同步账号slave,允许访问的IP地址为%,%表示通配符 //查看状态,记住File、Position的值,在Slave中将用到 show master status

    //也可以直接一步到位

      docker exec -it masterA mysql -u root -p123456 -e "create database bbt;
                                   CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
                                   grant all privileges on *.* to slave@'%';
                                   grant REPLICATION SLAVE ON *.* TO slave@'%';
                                   show master status;"复制代码

    7、slave容器设置

    //进入slaver容器
    docker exec -it slavemysql bash
    
    //启动mysql命令,刚在创建窗口时我们把密码设置为:root
    mysql -u root -p
    
    //设置主库链接  change master to 语法---- https://blog.csdn.net/jesseyoung/article/details/41942809
    change master to master_host='本机ip',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=607,master_port=3307;
    
    //启动从库同步
    start slave;
    
    //查看状态
    show slave statusG;
    如果 show slave statusG命令结果中出现:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    以上两项都为Yes,那说明没问题了。

    //删除同步
    stop slave;
    reset slave all;
     

    三、注意事宜

     
    再此过程中,若主库存在业务,在同步的时候要先锁表,让其不要有修改!
     
    #如需要,可以master容器中,执行以下命令锁定数据库以防止写入数据。
    
    mysql>FLUSH TABLES WITH READ LOCK;

    等待主从数据追平,主从同步后在打开锁!

    #解锁数据表。
    
    mysql>UNLOCK TABLES;

    主从数据追平后,定位好从库到主库日志的文件名字,和相应的位置

    master主库运行:
    mysql> show master statusG;

    看到相应文件名字和位置!

    slave从库运行:

     
    #设置主库链接
    change master to master_host='172.17.0.9',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=2037,master_port=3306;
    
    #执行从库同步
    start slave;
    
    #查看从库同步状态
    show slave statusG;
     

     在结果中看到:

                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    即可成功同步!

     

    四、主从同步验证

    注:在本次实验中,由上述my.cnf配置文件可得知,主从同步针对的数据库(除了mysql,sys,information_schema,performance_schema这些以外)的其它所有数据库都会进行同步(含数据库、表、数据等)

    1、如当前数据库情况如下:

    2、在master主库容器中,创建数据库master_demo,并在此库下创建表userinfo,并插入一条记录

    create database master_demo;
    use master_demo;
    create table userinfo(username varchar(50),age int);
    insert into userinfo values('Tom',18);

    3、此时,进入从库容器中,查看:

    确实已经将在master主库新建的数据库和表记录都同步过来了。

    既然是主从同步,那反过来验证一下,在从库下插入记录后,会不会同步到主库中来呢?

    在从库上操作插入记录:

    insert into userinfo values('slave',20);

    查看: 

    切到master主库中,查看:

    发现在master主库中,还是只有一条记录,说明与预期设想的一样,在从库中插入记录,是不会同步到master主库中来的

    再来一波,在主库master上,插入新记录:

    insert into userinfo values('master',25);

    在从库中,查看

     

    发现在master主库中新加入的master记录,在从库中同步过来了。

    到此,基于docker mysql数据库的主从同步配置,验证到此结束,命令、配图给的如此详细,来点个赞吧~

  • 相关阅读:
    开端
    springboot打包失败
    CONCAT_WS函数
    关于使用|作为分隔符
    JSONArray数组
    Math.ceil(double)向上取整
    $.unique(array)数组去重
    觉得没有问题,却始终没有按照预想的走的问题
    关于mouseover与mouseout以及mouseleave和mouseenter
    关于网页元素定义click事件,点击一次触发两次问题解决办法
  • 原文地址:https://www.cnblogs.com/yuanfang0903/p/11238187.html
Copyright © 2011-2022 走看看