介绍
MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库)。主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主。
主从复制过程:
1、主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。
2、从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
3、从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。
环境:window7系统,mysql5.7.24
主服务器地址
主库访问地址
从服务器地址
远程连接主从服务器桌面
远程连接主服务器桌面
(1)快捷键Win+R键,并输入mstsc。输入计算机IP(192.168.x.xxx)和用户名administrator,并输入密码,点击连接。(因我连接过,所以我的界面是下图这样)
(2)快捷键Win+R键,并输入mstsc。输入计算机IP和用户名,并输入密码,点击连接。(因我连接过,所以我的界面是下图这样)
二、主服务器配置流程:
1.打开主库的核心配置文件:my.ini
找到ini文件位置,有的是my-default.ini文件:D:\db\mysql-5.7.24-winx64
A.若为my.ini文件,复制一份my.ini文件,并重命名my.ini.bak,以防配置错误。(不要小看备份,笔者就因配置错误导致mysql重启失败,还好有备份文件)。
B.若为my-default.ini文件,则复制一份,并重命名为my.ini,在my.ini文件中进行以下操作。
2.配置主库my.ini
在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。
(1)打开my.ini文件,并在[mysqld]下面插入以下数据:
#指定log-bin的文件名称,默认在D:\db\mysql-5.7.24-winx64\data中,可指定位置
log-bin=mysql-bin
#指定唯一的server-id
server-id=1
#[必须]启用二进制日志
log_bin=mysql-bin
#需要备份的数据库名 ,需要另起一行添加,用,分割不能识别多个库
binlog-do-db=qyrlzy
#例 binlog-do-db=gbtj
#若涉及及同步函数或者存储过程需要配置,否则主备会产生异常不能同步
log_bin_trust_function_creators=TRUE
-- 之前没有添加以下配置,会默认生成的二进制文件为mysql-bin.000001,添加以下内容后,会生成另一个文件mysql-bin.000002,由此可见,改变my.ini配置会生成新的二进制文件。
# binlog日志保留的天数,清除超过10天的日志
# 防止日志文件过大,导致磁盘空间不足
expire-logs-days=10
快捷键Win+R,并输入cmd,打开命令行界面,输入:
cd D:\db\mysql-5.7.24-winx64\bin #进入bin目录
mysql -uroot -proot #登录mysql
(2)创建同步账号repl
CREATE USER 'repl'@'%';
(3)授权给repl,只授予其复制权限。
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'text';
(6)鼠标右击桌面下方,点击服务管理器,找到mysql57服务并右击,点击重新启动
在从服务器配置(root用户下)连接到主服务器的相关信息:
快捷键Win+R,输入cmd ,输入cd D:\mysql-5.7.24-winx64\bin,输入mysql -uroot -proot
#输入以下命令,配置从服务器到主服务器的信息
change master to master_host='111.198.154.118', master_port=1847, master_user='repl',master_password='text';
三.主从服务器数据同步
如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。
1.在主服务器执行以下命令,将数据导出到qyrlzy.dump(或qyrlzy.sql,通过navicat导入)文件:
cd D:\db\mysql-5.7.24-winx64\bin #进入bin目录
mysqldump -uroot -proot qyrlzy > qyrlzy.dump #将qyrlzy库的文件储存到qyrlzy.dump文件
为保证主从数据库数据一致性,正常情况下应在dump完成数据之后,主数据库进行锁表操作,防止数据发生改动。但因主服务器开发人员在使用,且目前业务数据要求不高,所以未进行锁表。以下命令供参考:
锁表:LOCK TABLES tbl_name READ;
解锁:unlock tables;
2.将qyrlzy.dump复制到从服务器桌面并在bin目录下执行:
mysql -uroot -proot qyrlzy < 桌面位置\qyrlzy.dump --default-character-set=utf8
四、检查配置是否成功
1.在root用户下启动从服务器的复制线程
2.检查是否成功,在从服务上执行如下操作,检查从服务器端 IO线程和 SQL 线程是否是 OK。
show slave status\G
1.报错信息及处理
(1)报错1146:因我开始为了测试从库没有表的情况下能否直接从主库拿表和数据过来,所以报了以下表不存在的错误,按照以上的操作步骤来的话是不会有这个错误的,如果有的话,把报错的表同步一下就可以了。
报错1062:因我重启主库时间较早,而启动从库时间较晚,导致了已经导入到从库的数据中,在主库的mysql-bin.000001文件中也存在,也就是从库的中继日志中也存在这条数据,从而报错主键重复。解决办法1,删除掉从库中主键为以下主键的数据,但这种办法仅适用于少量数据重复的情况。解决方法2:
1.停止从库读取数据及写入:stop slave
2.重新从主库导出数据并插入到从库
3.清空主库mysql-bin文件,reset master
D.重启从库写入:start slave
E.查看从库状态:show slave status\G
(3)报错1032:我查看了报错中的从库主库表数据,结果发现数据完全一致,下面报错应该是因偏移量不同导致,这是前面没有对主库锁表导致的后遗症,即使锁表,这种情况也很难避免,因为在导出数据的过程中,主表的数据也在时刻发生变化。
解决办法1:跳过指定数量的事务,仅适用于错误数量少的情况
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳过一个事务
mysql>slave start
解决办法2:修改从库的my,ini文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误。
#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
slave-skip-errors=all #跳过所有错误
参考文档
1.主参考文档
https://www.jianshu.com/p/faf0127f1cb2
https://www.cnblogs.com/gdjlc/p/12222512.html
2.Mysql主从复制跳过错误
https://blog.csdn.net/fly910905/article/details/93721561
3.reset master、reset slave与reset slave all
https://cloud.tencent.com/developer/article/1533731
4.MySQL主从不一致的修复过程
https://blog.csdn.net/u011277123/article/details/53487831?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
5.show slave status \G 的详细解释
https://blog.csdn.net/xc_gxf/article/details/8432158