mysql主从复制

2019-05-28  本文已影响0人  暖暖白月光

前言

背景哟

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

大概说说怎么做

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

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

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

主要参考的文章

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

具体步骤

0.环境装备

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.主机上的修改

#必须配置的参数
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.从机上的修改

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;

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

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

最后在从库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环境的时候实在是很慢很慢,等了我好久好久。。。。。。

上一篇下一篇

猜你喜欢

热点阅读