美文网首页
MySQL主从同步配置

MySQL主从同步配置

作者: 溪水散人 | 来源:发表于2020-05-09 14:47 被阅读0次

    机器准备

    • 机器准备 :一主二重的配置

    准备好三台虚拟机,分别安装MySQL。笔者为了省事,先准备了一台虚拟机,安装台好MySQL(但也埋下了祸根),再以此虚拟为母体,克隆两台虚拟机,这样MySQL也不用另外安装了。

    • 实验环境
    VM12,centos7,mysql5.7
    
    • 安装MySQL5.7过程
    0.安装weget:yum -y install wget
    1.wget https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
    2.rpm -ivh mysql57-community-release-el7-11.noarch.rpm
    3.yum install mysql-community-server
    4.启动:systemctl start mysqld
    4.查找root密码: grep 'temporary password' /var/log/mysqld.log
          不成功:
            清除:rm -rf /var/lib/mysql
             重启:systemctl restart mysqld
            执行:grep 'temporary password' /var/log/mysqld.log
            查看密码
    5.登录:mysql -u root -p
    6.设置为utf-8默认编码
            修改mysql的/etc/my.cnf 文件中的字符集键值
            在[mysqld]字段里加入character_set_server=utf8,如下:  
            [mysqld]  
            port = 3306  
            socket = /var/lib/mysql/mysql.sock  
            character_set_server=utf8
    7.重启:systemctl restart mysqld
    8.查看编码:show variables like 'character%';//都设置为了UTF-8
    9.设置远程访问:
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'myPassWord' WITH GRANT OPTION;
    FLUSH   PRIVILEGES;
    6.其他命令:
             set password for 'root'@'localhost'=password('myPassWord');// 修改密码
            systemctl restart mysqld;     //重启
            systemctl start mysqld;        //启动
            //设置开机自动启动
            systemctl enable mysqld
            systemctl daemon-reload
    

    克隆机器

    克隆机器也有很多注意的地方,MAC地址要重新生成

    主:192.168.25.128
    从0:192.168.25.133
    从1:192.168.25.134
    

    说明:因为在128号机器安装了MySQL,133,134机器是以128为母体克隆的,所以任何环境和配置都和128机器的相同,其中包括MySQL的密码server-iduuid.

    创建库表

    • 创建库
      在128号机主库机中创建master库
      在133号机从库机0中创建slave0库
      在133号机从库机1中创建slave1库
    • 创建表
      分别在master库、slave0库、slave1库中创建t_order表[表自己创,不一定要这张表]
    create table `t_order` (
    `order_id` int (11),
    `user_id` int (11)
    ); 
    

    注意:库名不同[涉及到下面的一个重要配置],但表结构一样

    主库master配置

    修改/etc/my.cnf配置

    #配置server_id
    server_id=1
    #绝对路径,也是开启bin-log
    log-bin=/var/lib/mysql/mysql-bin
    sync_binlog=0
    ##设置日志的过期天数
    expire_logs_days=7
    ## 要主从复制的库
    binlog-do-db=master
    ## 忽略的库
    binlog-ignore-db=information_schema
    binlog-ignore-db=sys
    binlog-ignore-db=mysql
    binlog-ignore-db=performance_schema
    

    给从库授权

    赋予从库权限账号,允许用户在主库上读取日志 ,同时赋予 REPLICATION SLAVE的权限

    • 给slave0授权
    grant FILE on *.* to 'root'@'192.168.25.133' identified by 'myPassWord';
    grant replication slave on *.* to 'root'@'192.168.25.133' identified by 'myPassWord';
    flush privileges;
    
    • 给slave1授权
    grant FILE on *.* to 'root'@'192.168.25.134' identified by 'myPassWord';
    grant replication slave on *.* to 'root'@'192.168.25.134' identified by 'myPassWord';
    flush privileges;
    
    • 重启master主库的mysql服务
    systemctl restart mysqld
    
    • 查看master状态
    show master status;
    
    主库状态.png

    从库slave0配置

    #配置server_id
    server_id=2
    ## 这里写的不是全路径,也可以写全路径
    log-bin=mysql-bin
    binlog-ignore-db=information_schema
    binlog-ignore-db=sys
    binlog-ignore-db=mysql
    ################################################
    #主库和从库的库名不一样,如果一样,以注释方法配置,  #
    #不一样,以未注释方法配置                         #
    ###############################################
    ## replicate-do-db=slave0
    # 以这种映射的方式配置
    replicate-rewrite-db = master -> slave0
    replicate-ignore-db=mysql
    log-slave-updates
    slave-skip-errors=all
    slave-net-timeout=60
    
    • 重启mysql服务
    systemctl restart mysqld
    
    • 配置slave0从库的slave
    mysql> stop slave;
    mysql> change master to master_host='192.168.25.128',master_user='root',master_password='myPassWord',master_log_file='mysql-bin.000002', master_log_pos=154;
    mysql> start slave;
    

    注意:master_log_file、master_log_file信息通过在主库中执行SHOW MASTER STATUS 命名查看

    • 查看slave信息
    Slave0状态.png

    如过 Slave_IO_Running: Yes和Slave_SQL_Running: Yes,则说明主从同步成功。 否则主从不成功。

    从库slave1配置

    配置与slave0配置大体一致,主要是server_id不一样,master_log_file、master_log_file信息要设置为最新的,重新查看

    测试

    在master库的表中插入一条数据,如果slave0和slave1库中的表同步更新,则说明主从同步配置成功

    否则,继续往下看

    问题

    前面说到埋下祸根,现在就来解释一下。

    前面在slave0从库中SHOW SLAVE STATUS,发现Slave_IO_Running=NO,没有起来,通过查到错误日志,发现有一行错误日志写道:

    2020-05-09T03:25:57.881822Z 3 [ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
    

    UUID竟然重复了,克隆的机器啊,当然会重复,既然有问题,那就解决他

    参考 https://blog.csdn.net/sunbocong/article/details/81634296博客,写的比较详细,具体方式是:删除和重新生成UUID

    [root@localhost mysql]# systemctl stop mysqld.service
    [root@localhost mysql]# rm -rf /var/lib/mysql/auto.cnf 
    [root@localhost mysql]# systemctl start mysqld.service
    

    重新配置从库

    mysql> stop slave;
    mysql> reset slave all;
    mysql> stop slave;
    mysql> change master to master_host='192.168.25.128',master_user='root',master_password='myPassWord',master_log_file='mysql-bin.000002', master_log_file=154;
    mysql> start slave;
    

    重新测试,在master库中插入数据,slave0和slave1中的数据同步添加了,则说明真正的成功了。

    相关文章

      网友评论

          本文标题:MySQL主从同步配置

          本文链接:https://www.haomeiwen.com/subject/rbsknhtx.html