Open felix-cao opened 5 years ago
Last_Errno: 1032
Last_Error: Could not execute Update_rows event on table fncftc_sql.fanwe_reflection; Can't find record in 'fanwe_reflection', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000015, end_log_pos 139184519
分析了一下,这条错误,不会对主从同步造成数据不一致的影响,可以跳过
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
或者在 MySQL
配置文件中配置的 [mysqld]
中配置
[mysqld]
slave-skip-errors = 1062
问题原因分析
今天我们刚上线的MySQL数据库集群系统没能通过早晨的流量高峰,甚至是同一条数据出现N次,我们是一主(A)两从(B、C),一主(A)一从(B)的服务器在同一机房,另外一从(C)在阿里云,恰恰是这个在阿里云的C
从库,频繁的爆发错误
从这个现象不能看出由于从库所在的服务器和主库所在的服务器不在同一机房导致的同步时间差比较大,从而引发这个 频繁的爆发错误
追根要究底,在与同事沟通一番后,我明白了导致这一状况发生的根本原因是:系统在 insert
一条数据后,立即去 select
,可 select
不到,于是又去 insert
一条数据,业务基于微信公众号的
我提供的终极解决办法是 缓存处理 + 数据库移到同一个机房。
Got fatal error 1236 from master when reading data from binary log
在source那边,执行:
flush logs;
show master status;
记下File, Position。在target端做 2.6 启动slave
的动作,
错误原因,启动 slave
时, File
文件写错了, 多写了一个 0
由单机架构切换到一主一从或一主多从,主库正在运行,那么这种场景如何去部署主从复制呢?
我们首先来回顾一下,基于binlog的主从复制过程:
从上面的步骤我们可以看出,在进行主从备份的时候,不能再有主库的写入操作,否则会丢失数据,造成数据不准确。
所以,方法有两种:
本文采用第二种,全局锁表,所以在这个场景下,我们的步骤是:
全局锁表:
mysql> flush tables with read lock;
这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。
需要注意的是
flush tables with read lock
会把当前会话锁住。如果 unlock tables
,之前的会话还会执行,除非session
时间过了,断开连接。建议在锁表之前修改配置文件增加:
interactive_timeout = 1200000
wait_timeout = 1200000
mysql> show master status;
tar -czvf fncftc_sql_20190411_02.tar ./fncftc_sql
scp -r ./fncftc_sql_20190411_02.tar root@127.0.0.1:/usr/local/mysql/var
也可以使用 mysqldump
导出 sql
文
mysqldump -uquma -p --databases fncftc_sql >fncftc_sql.sql
导入时: 先创建表:
mysql> create database fncftc_sql;
再导入
mysql -uquma -p fncftc_sql < ./fncftc_sql.sql
按照本文的步骤进行主从配置
mysql> unlock tables;
总结 应该尽可能优化流程,减少锁表时间。
尽可能减少锁表范围,只锁定相关的数据库。
1364:Field 'sex' doesn't have a default value
SET @@GLOBAL.sql_mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
查看是否开启多线程
mysql> show variables like '%slave_parallel%'
+------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | slave_parallel_workers | 0 | +------------------------+-------+ 1 row in set (0.00 sec)
结果显示是单线程的
参考 http://www.thinkphp.cn/topic/47606.html
如果出现 -bash: mysqldumpslow: command not found
错误,请执行
ln -s /usr/local/mysql/bin/mysqldumpslow /usr/bin
mysqldumpslow -s r -t 20 /usr/local/mysql/var/slow.log
今天,发现 'Duplicate entry '1211' for key 'PRIMARY'' on query
, 意思是主从数据库不一致,很奇怪,为什么会不一致呢,仔细的查了一下,大吃一惊,发现从库,居然有 100 多条与主库不一致的 user
数据,而这些数据竟然在主库中是没有的,也就是说,从库发生了写入
的操作,那么为什么?这些数据是从哪里来的呢?
于是,我做了两个动作:
Atlas
中间件的 sql-log = ON
insert 、update、delete
的权限,请阅读《MySQL 添加用户、为用户分配权限 #》这两个动作之后就可以进一步的追踪。
上面我们已经有了一主(a.b.c.162)一从(a.b.c.185), 再单独那一台服务器(a.b.c.162),做 Atlas
服务器,
需要注意的是,这台 Atlas 服务器也是需要安装 mysql
软件的。
安装 atlas 的步骤参考 github, 也可以参考MySQL + Atlas --- 部署读写分离,安装配置完成后
进入管理
mysql -h127.0.0.1 -P2345 -uuser -ppwd
查看帮助
mysql> select * from help;
查看机器状态
mysql> select * from backends
mysqldump -uquma -p dbname tableName > ./mysqlBaks/dbname.tableName.sql
导入数据量比较大时,显示这个错误
vi /etc/my.cnf
修改 max_allowed_packet 的值,设置大点
下载地址: https://dev.mysql.com/downloads/mysql/ 官方文档:https://dev.mysql.com/doc/refman/8.0/en/osx-installation-pkg.html
mysql
复制的原理现阶段都是一样的,master
将操作记录到bin-log
中,slave
的一个线程去master
读取bin-log
,并将他们保存到relay-log
中,slave
的另外一个线程去重放relay-log
中的操作来实现和master
数据同步。一、场景描述
master
主服务器,假设主服务器IP
为a.b.c.162
slave
从服务器,假设从服务器IP
为a.b.c.185
mysql-proxy
mysql
官方提供的中间件用于实现负载均衡和读写分离本文描述的场景应用的
MySQL
版本是5.5.38二、主从配置
2.1、找到 MySQL 配置文件的位置
我这里得到的
/etc/my.cnf
2.2、主库
在
[mysqld]
中插入下面的代码:server-id
是给服务器起一个唯一ID
, Master 为1, Slave习惯是以ip
最后几位为标识log-bin=mysql-bin
表示以mysql-bin
为前缀命名的二进制日志binary log
binlog-format
二进制日志格式是监听sql
语句的变化还是影响行的变化statement
代表语句row
代表行 如果两者都用且让mysql
帮我们判断用哪个 则用mixed
expire_logs_days
主要用来控制binlog
日志文件保留时间,超过保留时间的binlog
日志会被自动删除,expire_logs_days=7
表示7天后删除保存退出,重启
MySQL
高版本的
Linux
2.3、从库
进入
MySQL
配置文件在
[mysqld]
中插入下面的代码:relay log
很多方面都跟binary log
差不多,区别是:从服务器I/O
线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL
线程会读取relay-log
日志的内容并应用到从服务器。保存退出
2.4、主库授权一个的账号
在主库中授权一个主从复制的账号,进入主库的
mysql
命令行,执行:mysync
是账号名,密码是!@#mysync123
2.5、查看二进制日志文件,记录position
二进制文件
记录
postion
把二进制文件名
mysql-bin.000015
和postion
: 132897217 记录下来, 它们是用来配置从数据库的关键信息,可以看到上面同步的数据库的fncftc_sql
数据库2.6、启动 slave 功能
现在让
slave
连接master
,开始读取master
二进制日志文件,保存到slave
的relay-log
文件中reset slave
清除以往配置的slave信息启动
slave
并查看状态show slave status \G
是检查主从复制的状态现在,可以在![image](https://user-images.githubusercontent.com/8563874/56073413-12204500-5dd6-11e9-8e57-c647ee82490c.png)
Master
中执行show slave status;
三、报错处理
有时候,我们会发现主从数据库不一致,首先要去从库所在的服务器
mysql
命令行中查看从库的状态也许你会发现几行
Last_Errno
错误解决的方法有两种
2.1、在mysql命令行中执行
2.2、在 MySQL 配置文件中配置
在
MySQL
配置文件中配置的[mysqld]
中配置但这两种方法都会给主从数据库的一致性带来隐患,因此不建议这么做,导致这种情况的发生有可能是: 在做主从一系列配置时,应确保主库中不再有新的数据产生
Reference'
mysql (master/slave)复制原理及配置