美文网首页
mysql主从复制

mysql主从复制

作者: 暖暖白月光 | 来源:发表于2019-05-28 14:37 被阅读0次

    前言

    背景哟

    今天讲讲我昨天做的mysql一主一从复制吧,希望给自己留个笔记,而看到这篇文章的人可以同样有个参考

    大概说说怎么做

    准备了两台linux虚拟机(分为主机和从机),在主机上的my.cnf的文件上配置(server id,bin日志等),再在主机上的mysql数据库创建一个用户(用于将主机的sql操作的日志文件复制到从机)。然后在从机的mycnf文件上配置(severid,中断日志等),最后从机的mysql上进行连接主机(主机日志文件名称和位置,用于复制的用户名和密码)。

    简单来说就是 配置相关信息-->主机创建复制用户-->从机连接主机

    原理就是主机把sql操作记录在bin日志里,从机开一个线程把bin日志复制到自己的中断日志,再开一个线程把里面的sql再执行一遍

    主要参考的文章

    带原理简单讲解的博客
    主要参考的博客

    具体步骤

    0.环境装备

    • 虚拟机:centos7 (主库192.168.88.104,从库192.168.88.105)
    • mysql: 5.7
    • 虚拟机平台:virtual box
    • 操作系统:windows 10
    • 远程控制工具:Xshell 5

    1.克隆虚拟机

    复制后的虚拟机在c盘下(我的占了3G多),如果不喜欢可以在virtual box设置上改


    更改虚拟机位置.PNG

    右键虚拟机复制,注意选择了初始化mac地址(不知道为什么这样做,我这样做下面流程没问题)

    克隆centos.PNG

    2.更改克隆的虚拟机

    我使用的是桥接网卡的方式,不知道其他网络连接方式有没有影响,反正你能保证地址ping得通,地址不会变就可以了
    用(ifconfig)命令查看虚拟机的 ip 为 192.168.88.105,前面的虚拟机 ip 为 192.168.88.104

    用hostname可以查看更改主机名称,也不知有没有影响,反正我改了
    CentOS7修改主机名的三种方法

    hostnamectl                            查看主机名
    hostnamectl set-hostname centos7.02    永久修改主机名,其实修改了 /etc/hostname 的内容
    hostname   centos7.02                  修改临时的主机名,重启后失效,用hostnamectl查看会有Transient hostname这个描述
    

    最重要的是要修改mysql的uuid,因为做以前没有修改,所以导致做完以后出现了(Slave_IO_Running: NO)错误

    vim  /var/lib/mysql/auto.cnf
    
    uuid2.PNG

    修改auto.cnf文件里面server.uuid的值(auto.cnf 一般在 /var/lib/mysql 目录下),uuid可以百度一个uuid生成网站 uuid生成网站 ,保证两个虚拟机的uuid不一样即可。

    如果找不到 auto.cnf,可以登录mysql,通过(show variables like 'datadir';)这命令找到mysql的文件目录。

    datadir.PNG

    mysql主从复制之异常解决--- Slave_IO_Running: NO 之三大原因

    至此,克隆虚拟机的修改到此完成,更多的修改请自行百度吧。

    3.主机上的修改

    • 修改/etc/my.cnf 文件 (命令 vim /etc/my.cnf)
    #必须配置的参数
    server-id=104                   #这个数字自己起,一般为主机地址(192.168.88.104)最后一个数字
    log_bin=master-bin          #这个二进制日志名字自己起,等一下的mysql参数里会对应这个名字。
    
    #下面是可选参数
    # 一些不需要同步的数据库
    binlog_ignore_db=mysql  
    binlog_ignore_db=information_schema
    binlog_ignore_db=performation_schema
    binlog_ignore_db=sys
    #可以指定需要同步的数据库,应该可以配多个,我没有配,各位可以尝试一下
    binlog_do_db=mybatis
    
    主机mysql配置.PNG

    配置好上述参数后,重启mysql服务

    service mysqld restart
    

    登录mysql,

    show master stauts       #可以看到刚才配置的相关参数
    
    master-stauts.PNG

    其中File字段的值 master-bin.000006 前面的master-bin就是自己起的二进制日志名字。

    • 创建一个用户用于把主库的二进制日志复制到从库
    create user 'copy'@'%' identified by 'root_Copy1'   
    -------   'copy'@'%' 中copy为用户名,%为允许在任意地址登录这用户
    -------    root_Copy1 为用户密码
    grant replication slave on *.* to 'copy'@'%'    
    -------   replication slave 为 主从复制的权限吧(个人粗浅理解) 
    -------   \*.* 里面的点代表对所有数据库都有权限
    

    在这过程中,可能会遇到密码过于简单的错误导致创建用户不成功,可以通过

    SHOW VARIABLES LIKE 'validate_password%'; 
    

    查看密码生成策略。

    密码简单问题.PNG

    我的validate_password_policy = medium ,validate_password_length = 8
    有两个解决办法:
    1.弄个复杂的密码,包含数字,大小写,特殊字符以及符合长度,例如我创建时的密码(root_Copy1)
    2.修改密码策略为low (执行 set global validate_password_policy=LOW),这样就只要符合密码长度就可以了, 我没用过这个,各位可自行尝试。
    密码策略造成的密码简单问题

    至此,主机的配置到此结束,最后重启mysql服务(service mysqld restart,创建了用户要这样做吧,保险点)

    4.从机上的修改

    • 同样修改my.cnf文件,修改方法就不写了,前面有。
    server-id=105                           #这个保证与主机的不同即可,一般为ip的4个数最后一个
    relay-log=slave-relay-bin               #一样,自己起,这些东西最好有一些自己的命名规则
    relay-log-index=slave-relay-bin.index   #不知道什么东东,前面推荐的博客有篇里面有写,好像写也可以,不写也行
                                            #在主机上我就没写这个
    
    从机my.PNG

    重启mysql服务,登录数据库

    • 配置连接主库
    change master to master_host='192.168.88.104',master_port=3306, master_user='copy', master_password='root_Copy1', master_log_file='master-bin.000006', master_log_pos=154;
    

    这里面所有信息前面都有配置

    • master_host = 主机地址 ,master_port = 3306(mysql连接的默认端口),
      
    • master_user = 刚才主库创建的用户的用户名  master_password = 主库创建的用户的密码
      
    • master_log_file  = 刚才在主库mysql中用(show master status)看到的 File的值
      
    • master_log_pos = 刚才在主库mysql中用(show master status)看到的 Position的值
      

    这几个值非常的重要,一定要记住,在任何时候都可重新配置这几个值进行主从数据库的重新连接

    最后在从库mysql中

    start slave
    

    至此主从配置正式完成,你可以在从库的mysql中使用(show slave status \G)来查看 从库的状态


    slave状态.PNG

    如果发现 slave_on_runninng, slave_sql_running 都是yes时,那么都代表你的主从复制时成功

    但是你可能和我一样遇到一些问题

    我遇到的问题及解决过程:

    1) 在我配置完成的时候,我并没有使用上述的命令(show slave status \G)来查看状态,(不过我想就是查看了也不可能全部都是yes),而是直接使用navicat连接我线上的数据库,发现我根本连不上虚拟机的mysql,错误码为2003。
    2) 于是我在cmd中ping了一下我的主库虚拟机地址

    ping 192.168.88.104
    

    发现可以ping成功的,然后我又连接一下了这地址的3306端口
    windwos 下无法使用telnet

     telnet 192.168.88.104
    

    发现连接失败,这就表明了3306端口没有对外开放,也就是说可能是防火墙的问题,接下来就是让防火墙开放3306端口(有些博客里面说可以关闭防火墙来简单解决,方法自行百度,我觉得不太好)

    systemctl status firewalld                                  - 查看防火墙状态
    firewall-cmd --zone=public --add-port=3306/tcp --permanent  - 开启3306端口  --permanent 代表永久生效
    firewall-cmd --reload                                       - 重新防火墙配置
    firewall-cmd --zone=public --query-port=3306/tcp            - 查看3306端口状态,返回yes代表开放成功
    

    防火墙简单使用参考博客
    至此,我的navicat是可以连接我的数据库了,如果你还是连接不上,可以去进入到主库的mysql中

    select host,user from mysql.user;    - 查看mysql表下你使用连接的用户是否可以远程登录
    
    查看mysql.user表.PNG

    可以看到,我的root用户的host值为%,代表可以用任意ip登录。
    如果这样还不行,可以修改 my.cnf文件(vim /etc/my.cnf)

    bind-address=0.0.0.0      - 添加上这一句,不知道有没有用,网上的做法,我的主库有加,我的从库没有,但两个都可连接上
    

    我解决2003错误参考博客
    我能找到的办法就这些了,不行的话自己百度,google吧。

    3)最后我在从库中使用了(show slave status \G),发现了前面我一开提到的问题,Slave_IO_Running: NO,解决方法就是修改mysql的uuid,在前面克隆虚拟机时有提到。

    结束

    至此,大功告成。我用navicat连接了两个mysql,在主库的mysql上创建了数据库copy,刷新了一下从库的mysql,发现从库也创建了数据库copy,这里我就不上图了。
    温馨提示:
    请不要乱修改从库mysql里面的数据,可能会导致主库修改,从库无法响应的数据不一致问题,不过解决办法很简单,重新在从库上配置一下连接即可,即是前面重点提到的那个几个参数的连接语句(配之前可能要slave stop 一下)

    后话

    现在想想这个主从配置还是挺简单的。嗯,还有mysql环境搭建我并没有提,大家自行解决吧。要吐槽一下的是,我在以前在线装mysql环境的时候实在是很慢很慢,等了我好久好久。。。。。。

    相关文章

      网友评论

          本文标题:mysql主从复制

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