数据库主从同步后的问题总结

在上班后的第一个星期,老大让我去搞数据库的主从同步,主要是一台在肇庆机房的服务器,首先先说一下公司的数据库架构,主要是多主一从,而我需要操作的这台从库是mariadb-10.0.13版本,从mariadb-10.0版本以后,就可以同时作为多个主库的从库了。而我同步的主库是mysql5.1版本,按照常规的做法,步骤如下:

1、除了主库在备份的时候指定所需要备份的库,我还加了--lock-all-tables和--flush-logs参数,这样可以快速锁定masterinfo的binlog文件名和pos点

2、备份完后,将备份的数据传到从库,然后导进从库

3、根据刷新的binlog和pos点修改masterinfo的信息

4、开启主从同步的开关(由于是多主一从,所以在从库的配置参数里面对不同主库的数据库进行了别名的设置),如start slave ‘bbs’;

以上一切的步骤都非常顺利,然后show slave ‘bbs’ status\G查看主从同步的状态,如图:

貌似是没有任何问题的,但是打开监控页面(这个是php的一个程序,用于主库和从库数据的比对),某些库的表的数据有差异,如图:

数据相差几十条甚至上百条,这个是很正常的,因为在从库导入数据的时候,主库会不断有数据更新的,但是只要开启主从同步之后,从库就会慢慢的同步上来

(半个小时以后……)

再次查看监控页面,却惊讶的发现主从之间数据的差异在不断的扩大(即主库不断有数据更新,但从库对应的这三个表的数据由始至终都没有更新),这下头大了,是怎么回事,以前并没有遇过这种情况。

在解决这个问题之前,我有做过一些操作,那些操作结果都是失败的,不过这里也分享一下:

①我将主库与从库之间差异的数据导出来,然后导进从库,主要的参数有--replace, 主要的作用是使用REPLACE INTO 取代INSERT INTO,再对齐好数据之后,然后过一会再次查看,差异又变大了,以失败告终。这种方法很耗时间和精力,因为要找主从表之间的差异部分,如果选择这个表导出来,小表还好说,大表就很耗时间了。

②在得到老大的同意后,在凌晨的时候进行了一小段时间的停库,在确保主从数据都对齐的情况下,开启了主库和主从同步,刚开始看还是没什么问题的,但是过了一会之后又出现了之前的情况,郁闷!!

最后老大让我逐步来排除,在排查过程中果然发现端倪了,具体的步骤是:

1、在SQL线程和IO线程都正常的情况下,先看看从库的pos点是否时刻在变化,如果pos点有变化的情况下,说明IO线程工作是正常的

2、接着就是用tail -f 查看relay-log的更新状况,能够时刻看到SQL语句的更新,并且还发现cdb_members表有数据的更新,如图:

通过排查,基本上可以确定这些SQL语句并没有写到数据库内。但是为什么没有写到数据库里面呢,在咨询老大之后,老大和我说可能存在跨库更新的情况。在上网搜索了一番之后,终于对跨库更新有了一定的概念。

首先要说明一下里面涉及的关键参数,replicate_do_db和replicate_wild_do_table,当从库只需要同步主库的某个库(表)或某几个库(表)的时候,就可以用到这两个参数,又或者用replicate_ignore_db和replicate_wild_ignore_table来忽略那些不需要更新的库和表,现在主要来说一下replicate_do_db和replicate_wild_do_table这两个参数的区别:

举个例子来说:

某两个数据库已经实现了主从同步,现在主库中有两个数据库test01和test02,然后test01中有一张表table01,如果在my.cnf的参数里面设置了replicate_do_db=test01,test02,即只同步这两个库的数据,然后执行以下的更新语句

use test01;

update test01.table1 set……

执行的结果是主从库都能看到更新的数据

但如果是另外一种执行的情况进行更新语句

use test02;

update test01.table1 set……

执行的结果是主库能够看到数据,但是从库却无法看到更新的数据

原因:设置replicate_do_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句在Slave上会被忽略。

而对于跨库更新SQL语句的问题,replicate_wild_do_table可以解决,即在my.cnf的参数里面设置

(正确写法)

replicate_wild_do_table=test01.%

replicate_wild_do_table=test02.%

(错误写法)

replicate_wild_do_table=test01.%,test02.%

注意需要同步的库必须分行写而不能在同一行用逗号隔开,否则在同步的时候该参数不生效

下面是mysql官方文档的一段说明

Warning

To specify multiple databases you must use multiple instances of this option. Because database names can contain commas, if you supply a comma separated list then the list

will be treated as the name of a single database.

时间: 2024-09-30 09:24:00

数据库主从同步后的问题总结的相关文章

mysql数据库主从同步配置教程--数据库同步

背景: 最近有一个mysql数据库同步的需求,我用了mysql主从同步的方法来实现.下面把步骤记录一下. 环境和拓扑 操作系统:Centos6.6 X64 mysql版本:5.1.73 Master: 10.6.1.210 Slave:  10.6.1.211 需求: 实现Master上test库同步到Slave上,但是禁止同步该库下的AA表 1.配置Master上的my.cnf #vim  /etc/my.cnf 添加内容到[mysqld]下,设定只同步test 数据库: [mysqld] l

谈谈Mysql数据库主从同步延迟分析及解决方案

一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 log dump 线程,用来给从库I/O线程读取binlog: 3. 从库的I/O Thread去请求主库的binlog,并将得到的binlog日志写到relay log文件中: 4. 从库的SQL Thread会读取relay log文件中的日志解析成具体操作,将主库的DDL和DML操作事件重放. 关

Mysql数据库主从同步(复制)热备份

随着大数据的发展,数据的安全问题日益凸显,往常不被重视的数据库维护变得必不可缺,数据的灾备变成个各大企业/个人站长业务运行中必须重视的环节.上一篇文章提到了自动化备份避灾的几种方案及选择,今天就来实践一下主从/双向异地热备份方案. Mysql数据库同步(复制)的概念,主从同步使得数据可以从一个服务器无缝迁移复制到另一台服务器.这个过程中一台服务器充当主服务器(master),另一台或另外多台充当从服务器(slave).复制进程I/O是异步进行的,所以服务器不需要一直保持关联的状态. Mysql数

mysql数据库主从同步(交互式)

mysql数据库主从同步交互式配置步骤,本文以一台mysql数据库多实例3306和3307为例进行配置,3306为主库,3307为从库(多台单实例与一台多实例配置是一样的) 一.my.cnf文件配置 1.修改my.cnf配置文件,主数据库3306要打开log-bin,server-id不能一样 [[email protected] ~]# egrep"log-bin|server-id" /data/{3306,3307}/my.cnf /data/3306/my.cnf:log-bi

Linux下Mongodb数据库主从同步配置

说明: 有两台已经安装完成的Mongodb数据库服务器,现在需要把一台设置为主库,另一台设置为从库,实现主从同步. 操作系统:CentOS 7.0 64位 MongoDB数据库版本:mongodb-linux-x86_64-2.6.5 准备工作:MongoDB数据库安装 具体操作: 一.配置MongoDB主库 以下操作在MongoDB主库服务器上进行 1.cd  /usr/local/mongodb/ #进入MongoDB安装目录 vi /usr/local/mongodb/mongodb.co

mysql数据库主从同步

环境: Mater:   CentOS7.1  5.5.52-MariaDB  192.168.108.133 Slave:   CentOS7.1  5.5.52-MariaDB  192.168.108.140 1.导出主服务数据,将主备初始数据同步 master: //从master上导出需要同步的数据库信息 mysqldump -u*** -p*** --database test > test.sql //将master上的备份信息传输到slave上 scp /root/test.sq

linux下mysql数据库主从同步配置

说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备篇: 说明:在两台MySQL服务器192.168.21.128和192.168.21.129上分别进行如下操作 备注: 作为主从服务器的MySQL版本建议使用同一版本! 或者必须保证主服务器的MySQL版本要高于从服务器的MySQL版本! 一.配置好IP.DNS .网关,确保使用远程连接工具能够连接

MySQL5.6 数据库主从同步安装与配置详解(Master/Slave)

MySQL5.6 数据库主从同步安装与配置详解(Master/Slave)本篇文章主要介绍了MySQL5.6 数据库主从同步安装与配置详解,具有一定的参考价值,有兴趣的可以了解一下.安装环境 操作系统 :CentOS 6.5 数据库版本:MySQL 5.6.27 主机A:192.168.1.1 (Master) 主机B:192.168.1.2 (Slave) 这里强调的数据库的版本,是因为MySQL在5.6之前和之后的安装方式是不一样的. 本人在进行配置的时候,也遇到了这个坑,这里提前说明,希望

MySQL数据库主从同步部署

MySQL数据库主从同步部署: 环境 Mater:   CentOS6.4  mysql5.5.38  192.168.107.133 Slave:   CentOS6.4  mysql5.5.38  192.168.107.135 1.导出主服务数据,将主备初始数据同步 master: //从master上导出需要同步的数据库信息 mysqldump -u*** -p*** --database test > test.sql //将master上的备份信息传输到slave上 scp /roo