MySQL 数据库主从同步配置

余生颓废 提交于 2020-08-06 03:57:39

一、概述

    模式:

    主从复制,主库写入数据,从库同步主库数据,从库保持与主库内容一致,达到实施备份的效果。

    优势:

  • 数据分布(data distribution)
  • 负载平衡(load balancing),实现读写分离,缓解数据库压力。
  • 数据备份(backup)
  • 高可用性与容错行(high availability and failover)

    原理图如下:

    功能:

  • BinLog:二进制文件,存储MasterDB(主数据库)中修改数据的内容,存储内容的格式有Statement,Row,Mixed。
  • Relay Log:功能作用与Binlog一样,不同点在于当日志内的内容被读取完后,会被删除。
  • Binlog dump:将读取Binlog后发送数据给IO线程。
  • IO线程:将接收到数据传给RelayLog日志。
  • SQL线程:读取RelayLog数据。

    流程:

  1. 从库,配置主库信息,建立连接。
  2. MasterDB数据库数据发生变化时,会记录在Binlog日志中。
  3. Binlog dump线程读取Binlog中的内容,将数据发送给IO线程。
  4. IO线程再将数据存入RelayLog中。
  5. SQL线程读取RelayLog中的数据并写入从库。

二、安装和配置

2.1 环境说明

    提示:主从库的数据库版本最好保持一致,或者,从库的版本一定要高于主库版本,否则在数据同步过程中可能会出现问题,切记。

    这里使用测试环境来记录。

    Master(主数据库)环境:

  • 机器:物理机
  • 网络:固定IP
  • 系统:Windows 7
  • IP:192.168.2.166
  • 子网掩码:255.255.255.0
  • 默认网关:192.168.2.1
  • DNS1:202.100.199.8
  • DNS2:202.100.192.68
  • 数据库版本:MySQL 5.7.19

    Slave(从数据库)环境:

  • 机器:从宿主机器建立Esxi环境,在Esxi下建立Centos系统。
  • 网络:1.Esxi 网络桥接 2.Centos 网络桥接
  • 系统:虚拟机 Linux Centos 7
  • IP:192.168.2.110
  • 子网掩码:255.255.255.0
  • 默认网关:192.168.2.1
  • DNS1:202.100.199.8
  • DNS2:202.100.192.68
  • 数据库版本:MySQL 5.7.30

    环境测试:

    要求:IP互通,端口互通

    Windows:

  • ping 192.168.2.110
  • telnet 192.168.2.110 3306

    Centos:

  • ping 192.168.2.166
  • telnet 192.168.2.166 3306 或 wget 192.168.2.166:3306 或 curl 192.168.2.166 3306

2.2 配置主数据库(Master)

    1.修改【主数据库】配置文件,Windows 下默认配置文件(my.ini)路径可以通过服务里面查询。

    2.修改my.ini配置文件,找到以下2行代码取消注释并修改。

  • Master(主数据库)192.168.2.166
[mysqld]

# 启用二进制日志,可指定指定路径和名称
log-bin=mysql-bin

# 服务唯一ID,默认是1,一般取IP最后一段,如IP:192.168.2.166
server-id=166

    3.重启数据库服务。

    4.进入到主数据库中,创建从数据库的操作用户账号和权限

# 1.登录
mysql -uroot -p

# 2.创建用户并授权 REPLICATION SLAVE ,用户:backup-user,密码:backup-user,授权IP:192.168.2.110(从数据库IP)
grant replication slave on *.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';

# 3.刷新权限
flush privileges;

# 4.查询用户表
select user,host from mysql.user;

    5.清除日志索引文件,用于第1次搭建主从环境。

reset master;

    6.查询 master 状态。

show master status\G;
  • File:mysql-bin.000001
  • Position:154

2.3 配置从数据库(Slave)

    1.修改my.ini配置文件(Linux下,执行 vim /etc/my.cnf),添加以下2行代码。

  • Slave(从数据库)192.168.2.110
[mysqld]

# 启用二进制日志,可指定指定路径和名称
log-bin=mysql-bin

# 服务唯一ID,默认是1,一般取IP最后一段,如IP:192.168.2.110
server-id=110

# 复制进程不随MySQL启动而启动,设置后重启数据库后需要手动启动复制进程,即start slave
skip-slave-start=on

# 同步的数据库名称
replicate_wild_do_table=test_db.*

    3.重启数据库服务。(systemctl restart mysqld.service)

    4.修改从数据库的master链接配置。

  • MASTER_HOST='192.168.2.166' # 连接主机地址
  • MASTER_USER='backup_user' # 连接主机账号
  • MASTER_PASSWORD='backup_user' # 连接主机账号密码
  • MASTER_LOG_FILE='mysql-bin.000001' # 日志文件-通过查询主数据库master状态取得
  • MASTER_LOG_POS=154 # 日志文件起始位置-通过查询主数据库master状态取得
# 1.修改master信息
CHANGE MASTER TO MASTER_HOST='192.168.2.166',MASTER_USER='backup_user',MASTER_PASSWORD='backup_user',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;

# 2.开启
start slave;

# 3.查询状态
show slave status\G;

    以下两行代码都显示yes代表已经配置成功。

  • Slave_IO_Running:Yes
  • Slave_SQL_Running:Yes

2.4 同步数据库

    1.如没有旧的数据库需要同步,则可以直接使用。如主数据库上,有旧的数据库需要同步,则要进行锁表操作,防止对数据库进行读写改变日志索引文件的位置值,将数据库上的数据库导入数据库后再进行解锁。

flush tables with read lock;

    2.将需要同步的数据库导出(可使用mysql命令或其他工具均可,如:Navicat等)。

    3.导入从数据库后,在主数据库上,进行解锁操作。

unlock tables;

    4.这里直接使用Navicat将表同步过去。

三、测试

    注意:启动从数据库同步命令以前建立的数据库是不会同步的,如需要同步旧的数据库,看2.4步骤,这里直接使用新增表操作来演示。

  1. 在主数据库上(192.168.2.166),新建 Article 表,新增1条数据。
  2. 刷新从数据库(192.168.2.110),可以看到从数据库已经同步了。

四、要点说明和场景应用(其它)

4.1 从库解除主从关系

    场景:从库解除主从关系,提升从库为主库进行使用或重置主从关系和日志文件。

    1.在从库数据库命令行中,先停止主从关系进程。

stop slave

    2.再使用以下命令,清除主从复制关系的位置信息。该语句将被用于干净的启动,它删除 master.info 文件和 relay-log.info 文件以及所有的 relay log 文件并重新启用一个新的 relaylog 文件。

reset slave

    3.查询状态

show slave status\G;

    4.修改 my.cnf 删除主从相关配置参数。

4.2 skip-slave-start 使从数据库复制进程不随从数据库启动而启动

    场景:从数据库重启时,确保手动启动从数据库复制进程是正常的,我们一般在从数据库配置文件中加入 skip-slave-start=on 参数配置,查询相关配置是否正确(主数据库 show master status\G; 的 File 和 Position 值正确为前提),从数据库重启完成后,先检查主数据库值,再手动去启动复制进程 start slave。

4.3 指定同步数据库

    第1种,在主数据库中进行 grant 用户授权时,限定用户可操作的数据库。

# 统一格式
grant 权限1,权限2,... on 数据库名称.表名称 to '用户名'@'授权地址' identified by '用户密码';

# 栗子:创建并授权本地 root用户 全部数据库 全部权限
grant all privileges on *.* to 'root'@'localhost' identified by 'root';

# 栗子:创建并授权192.168.2.110地址 test_user用户 test_db数据库 select,insert权限
grant select,insert on test_db.* to 'test_user'@'192.168.2.110' identified by 'test_user';

# 栗子:创建并授权192.168.2.110地址 test_user用户 test_db数据库 user数据表 select,insert权限
grant select,insert on test_db.user to 'test_user'@'192.168.2.110' identified by 'test_user';

# 栗子:创建并授权192.168.2.110地址 backup_user用户 test_db数据库 replication slave权限
grant replication slave on test_db.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';

    第2种,在数据库配置文件中(my.ini、my.cnf),设置以下规则参数,数据库中不做限制。

  • 不建议使用:binlog_do_db=DB_NAME(需要同步的数据库,1.如需同步全部数据库,则不需要设置;2.多个数据库,用逗号分开)
  • 不建议使用:binlog_ignore_db=DB_NAME(需要忽略的数据库,搭配使用)

    第3种,在数据库配置文件中(my.ini、my.cnf),设置以下规则参数,数据库中不做限制。

  • 不建议使用:replicate_do_db=DB_NAME(需要同步的数据库,1.如需同步全部数据库,则不需要设置;2.多个数据库,用逗号分开)
  • 不建议使用:replicate_ignore_db=DB_NAME(需要忽略的数据库,搭配使用)
  • 不建议使用:replicate_do_table=DB_NAME.TABLE_NAME(需要同步的数据表,1.如需同步全部数据表,则不需要设置;2.多个数据表,用逗号分开)
  • 不建议使用:replicate_igore_table=DB_NAME.TABLE_NAME(需要忽略的数据表,搭配使用)
  • 建议使用:replicate_wild_do_table=DB_NAME.TABLE_NAME(可解决跨库和过滤问题,需要同步的数据表,全部表:DB_NAME.%)
  • 建议使用:replicate_wild_ignore_table=DB_NAME.TABLE_NAME(可解决跨库和过滤问题,需要忽略的数据表,全部表:DB_NAME.%)

五、参考文章

  • https://blog.csdn.net/Yoga0301/article/details/80545914?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare
  • https://blog.csdn.net/kjsayn/article/details/51350691?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare
  • https://blog.csdn.net/donghaixiaolongwang/article/details/78591012

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!