mysql主从复制
前言
背景哟今天讲讲我昨天做的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地址(不知道为什么这样做,我这样做下面流程没问题)
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.PNGmysql主从复制之异常解决--- 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环境的时候实在是很慢很慢,等了我好久好久。。。。。。