提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
提示:这里可以添加本文要记录的大概内容:
今天偶然刷到了一篇文章,看到了mysql主从复制,刚好最近在学springboot开发,主从复制可以用的上,然后试着搞了一下,也是历经磨难,记录一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Mysql主从复制解决的问题
我们都知道,当一个程序用户查询访问或者对数据库进行增删改查的时候,如果后台开发只应用了一台数据库服务器,但是访问的人数足够多的,会导致数据库服务器的访问压力过大,导致数据出现缓慢甚至死机的情况,而Mysq主从复制就是为了解决这样的一个问题,通过设置一个主数据库和从库的方式,同步更新数据,分摊数据库的压力。
二、主从复制的原理
主从复制是一个异步复制的过程,主要是从库发送更新事件到从库,从库读取更新的数据,然后更新内容与主库保持一致。
大致过程如下:
1,每当主库更新的时候,更新的事件日志都会存储在二进制文件,称为binlog,当数据库启动,所有的数据库更新记录都会被保存到binlog中。
2,当从库连接主库后,主库会创建一个线程,将binlog发送到从库中并对线程上锁,直到该事件被读取完成,锁才会释放。
3,当从库启动slave后,从库会创建一个I/O线程连接到主库并请求主库发送binlog里面的更新记录到从库上,IO线程读取binlog中的记录并更新到本地文件中。
4、从库开始进行复制,创建一个SQL线程,根据读取到的文件进行更新。
三、主从复制的配置
配置主库
系统:Ubuntu(从库,IP地址192.168.23.129),kali(主库,IP地址 192.168.23.137)
1、配置/etc/mysql/my.cnf文件
设置log-bin日志,设置唯一的server-id,注意从库的server-id要比主库的大,注意要配置bind_address,否则默认是127.0.0.1,连接数据库会不成功。
2、开启kali数据库的外连
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; 赋予root用户所有权限,并且允许所有主机外连。
flush privileges; 执行权限。
记住配置完后要重启数据库。
3、配置Master
create user xiaoming identified by 'Root@root';
grant replication slave on *.* to xiaoming;
创建一个用户xiaoming,密码为Root@root,并赋予建立复制的用户权限。
show master status; 查看master状态后
配置从库
1、修改/etc/mysql/my.cnf文件
重启服务
2、 进入从库命令行
change master to master_host='192.168.23.137',master_user='xiaoming',master_password='Root@root',master_log_file='mysql-bin.000003',master_log_pos=1010; 设置连接主库
start slave;启动slave
Slave_IO_Running和Slave_SQL_Running都为Yes代表成功
假如出现以下错误:
那是因为节点已经存在了,执行以下重置即可
三、测试
1、在主库新建立数据库tests,并建表test
2、进入从库,查看是否同步
同步成功。
四、经历过的错误
假如出现连接不成功的情况,可以看看防火墙,3306端口是否被过滤了,进行开启。
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
开始虽然都出现了yes,但是好像主库更新,从库并没有,远程连接数据还出现了1055错误,是因为对select字段做了限制,只能是group by或者聚合。
set @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
总结
出了很多错,开始各种不行,就百度乱弄一通,结果弄成了,弄这个主要了为了后面开发进行读写分离。