为什么要对MySQL做主从同步复制
一.MySQL主从方案主要作用
1.读写分离,使数据库能支撑更的并发
在报表中尤其重要。由于分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
2.发扬不同表引擎的优点
目前Myisam表的查询速度比innodb略快,而写入并发innodb比myIsam要好。那么,我们可以使用innodb作为master,处理高并发写入,使用master作为slave,接受查询。或在myisam slave中建立全文索引,解决innodb无全文索引的弱点。
3.热备
slave和master的数据“准实时”同步。
二.复制技术能够解决的问题
MySQL复制技术有以下一些特点:
1.数据分布 (Data distribution )
2.负载平衡(load balancing)
3.备份(Backups)
4.高可用性和容错行 High availability and failover
三.MySQL主从同步复制原理
MySQL主从复制的基本交互过程,如下:
1.slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容。
2.master端在接收到来自slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定 binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文件名以及在该binlog日志中的pos节点位置。
3.slave端的IO线程在接收到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relay log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master- info(该文件存在slave端)文件中,以便在下一次读取的时候能够清楚的告诉master,我需要从哪个binlog文件的哪个pos节点位置开 始,请把此节点以后的日志内容发给我。
4.slave端的SQL线程在检测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺序依次执行这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和 slave端的数据是完全一样的。
以上mysql主从复制交互过程比较拗口,理解起来也比较麻烦,我简化了该交互过程。如下:
1、master在执行sql之后,记录二进制log文件(bin-log)。
2、slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。
注意:
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
四.MySQL主从同步复制的缺点
1.主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。
2.如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。
3.如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。
注意:
1.一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。
2.如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。
五.如何实现MySQL主从复制
要实现MySQL的Replication,首先必须打开master端的binlog (mysql-bin.xxxxxx)日志功能,否则无法实现mysql的主从复制。因为mysql的整个主从复制过程实际上就是:slave端从 master端获取binlog日志,然后再在自己身上完全顺序的执行该日志中所记录的各种SQL操作。
六.MySQL主从复制配置教程
开始配置之前必须已经安装了mysql数据库,如果没有的就先安装一个数据库,可以去官网下载,教程自行百度吧!
首先到将已经安装好的mysql的安装路径,复制一份,命名为mysql-s1
下面是mysql里面的文件
我使用mysql的版本是5.5.57,首先要做的就是将mysql-s1添加服务
添加服务
上面那个是网上找的命令,my.ini是mysql从库的配置文件
首先在这个配置文件中就要修改端口原本是3306,因为一台主机下一个服务占一个端口,避免端口冲突启动不了,所以我们将端口号改为3307
现在启动添加完成服务后启动服务,发现报错1067 ,查看错误日志是因为多余的参数‐‐defaults‐file="E:\mysql-s1\my.ini"
所以后面就没有用这个了,直接使用
mysqld install mysqls1
后面启动成功。
两个服务的地址现在都是E:\mysql\bin\mysqld 下了
现在需要的是一个是在E:\mysql下一个是在E:\mysql-s1目录下
所以我们可以先移出服务。
然后我们要添加注册表
添加修改注册表
作用是修改服务启动的可执行路径
Win +R 输入【regedit】
进入目录计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\
找到原有的MySQL复制一份命名为MySQLs1
修改ImagePath路径 数据为E:\mysql-s1\bin\mysqld
其他的参数与上面原来mysql的参数一样
OK现在我们可以重新添加服务了
mysqld install mysqls1
添加成功,现在我们查看服务的可执行文件路径
OK,修改成功,现在mysqls1服务启动也成功了。
可以使用Navicat尝试连接,密码为空
连接成功。
接下来可以进行主从同步配置了
网上找的配置文件信息
主库:
从库:
重启服务发现报错1067
使用log-bin = mysql‐bin启动会报错1067
错误日志提示信息:unknown variable 'binlog‐do‐db=user_db'
经过百度查询应该使用 _ 代替 -
basedir="E:/mysql/" 代表安装文件路径
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"代表的是数据库数据存放的路径
启动成功!
授权主从复制专用账号
#查看从库状态Slave_IO_Runing和Slave_SQL_Runing都为Yes说明同步成功,如果不为Yes,请检查error_log,然后 排查相关异常。
所以必须要两个都是yes才能进行同步
START SLAVE;开启同步
如果slave_IO_Running是No就要删除auto.cnf文件如下:
请注意,主从MySQL下的数据(data)目录下有个文件auto.cnf,文件中定义了uuid,要保证主从数据库实例的 uuid不一样,建议直接删除掉,重启服务后将会重新生成。
然后就可以测试了修改主库user_db中的表中的数据然后在观察从库中是否改变
测试成功!
主从同步就配置成功了
标签: