mysql master-user_【MySQL】MySQL5.6数据库基于binlog主从(Master/Slave)同步安装与配置详解...

主从数据库同步原理

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

主从数据库同步工作原理(流程):

当主库的数据发生修改时,数据更改的记录将写入到主库的二进制文件中,从库此时将会调用一个IO线程读取主库的二进制文件,并与中继日志作对比,并将存在差异的事件写入到中继日志中(当两日志内容事件一致时,IO线程将处于睡眠状态),然后从库再调用SQL线程去读取中继日志,并将刚写入的事件数据放入到从库中以保持主从数据库数据同步。

配置步骤:

安装环境:

操作系统:Cent0S 6.9

数据库版本:MySQL 5.6

主机A:192.168.206.134(Master)

主机B:192.168.206.201(Slave)

首先,需要注意几点问题:

1、互相同步的两台mysql的版本必须保证大版本号一致。比如5.5+和5.6+之间同步数据,5.6的数据同步到5.5就会出现问题。保证大版本号一致很重要。

2、每台服务器必须开启binlog,不开启binlog则根本无法开始数据同步。

3、每台服务器必须配置不同的server-id,范围在1到(2^32-1)之间。

以上三点都可能造成很多奇怪错误,请一定注意。

这里强调的数据库的版本,是因为MySQL在5.6之前和之后的配置方式是不一样的,后面将会提示到。

首先,要保证防火墙对3306端口的开启,为了学习数据库的主从配置,可以使用service iptables stop 命令直接关闭防火墙。

#service iptables stop

然后可以在两台机子之间进行 ping操作,确保两台机器之间能够想通

Master部分的配置

在Linux环境下MySQL的配置文件的位置是在 /etc/my.cnf

,在该文件下指定Master的完整配置如下:

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

mastercnf文件1.png

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

mastercnf文件2.png

其中,server-id用于标识唯一的数据库,取值为1到(2^32-1)

binlog-ignore-db:表示不需要同步的数据库

binlog-do-db:表示需要同步的数据库

然后重启MySQL

service mysqld restart

输入用户名密码进入MySQL

#mysql -uroot -p

赋予从库权限帐号,允许用户在主库上读取日志,赋予192.168.206.201也就是Slave机器有File权限,只赋予Slave机器有File权限还不行,还要给它REPLICATION SLAVE的权限才可以

在Master数据库命令行中输入:

mysql>GRANT FILE ON *.* TO '数据库用户名'@'Slave地址' IDENTIFIED BY '数据库登录密码';//赋予File权限格式

mysql>GRANT FILE ON *.* TO 'root'@'192.168.206.201' IDENTIFIED BY 'mysql password';//赋予File权限

mysql>GRANT REPLICATION SLAVE ON *.* TO '数据库用户名'@‘Slave地址’ IDENTIFIED BY '数据库登录密码';//赋予REPLICATION SLAVE权限格式

mysql>GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.206.201' IDENTIFIED BY 'mysql password';//赋予REPLICATION SLAVE权限

mysql>FLUSH PRIVILEGES;//刷新权限

重启mysql,登录mysql,显示主库信息:

mysql>show master status;

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

3查看master库状态.png

这里的File、Position是在后面配置Slave的时候需要用到的,Binlog_Do_DB表示需要同步的数据库,Binlog_Ignore_DB 表示Ignore的数据库

另外提示:如果执行这个步骤始终为Empty set(0.00 sec),那说明前面的my.cnf没配置对,需要仔细检查。

Slave部分的配置

与Master的配置一样,首先需要配置my.cnf文件,如下

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4slave配置文件1.png

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

5slave配置文件2.png

在配置文件中,MySQL5.6之后的版本中没有指定:

master-host=192.168.206.134 #Master的主机IP

master-user=root

master-password=mysql password #Master的MySQL密码

新版本的配置这种方式是不适用的。如果,在MySQL5.6和之后的版本中配置从库的时候,设置到了上边的内容,即指定了master-host、master-user等信息的话,重启MySQL的时候就会报错,查看数据库的报错信息(数据库的目录, /data/mysqldb/VM_128_194_centos.err ),可以看到master-host 被检测数是一个未知的变量,因此会出现错误

在5.6以及后续版本的配置如下:

修改完/etc/my.cnf 文件之后,重启一下MySQL

service mysqld restart

登录进入mysql控制台

#mysql -uroot -p

在控制台输入

mysql> stop slave; //关闭Slave

mysql> change master to master_host='192.168.206.134',master_user='root',master_password='123456',master_log_file='mysql-bin.000003', master_log_pos=120;//指定master信息

mysql> start slave; //开启Slave

在这里指定Master的信息,master_log_file是在配置Master的时候的File选项, master_log_pos是在配置Master的Position 选项,这里要进行对应。

更多关于change master语句的信息可参考:http://www.jianshu.com/p/ada9f34d8563

然后可以通过mysql> show slave status \G; 查看配置的信息:

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

6slave状态文件.png

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

7slave状态文件.png

在途中的Slave_IO_Running和Slave_SQL_Running都为yes,那么表示配置成功

各个字段含义可参考这篇文章:http://www.jianshu.com/p/3c4d7c6c6205

当完成配置后

查看master的状态:

mysql >show master status; //Position不应该为0

mysql>show processlist;

//state状态应该为Has sent all binlog to slave; waiting for binlog to be updated

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

查看slave状态:

mysql>show slave status;

//Slave_IO_Running 与 Slave_SQL_Running 状态都要为Yes

mysql>show processlist;

//应该有两行state值为:

Has read all relay log; waiting for the slave I/O thread to update it

Waiting for master to send event

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

下面开始真机测试:

测试环境:windows10+Navicat11

以下测试是使用真机连接虚拟机中的主从库

首先在Navicat中创建连接(物理机连接虚拟机的方法参考:http://www.jianshu.com/p/fa4db03db9ca):

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

7创建连接.png

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

7创建连接2.png

连接的地址为虚拟机中主/从库的地址

连接上去之后,分别在Master和Slave中创建数据库,该数据库名字为刚刚配置的需要同步的数据库名字

接着开始在该数据库中新建数据表

首先在主库中创建

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

9刷新从表之后从表数据表自动创建.png

创建好之后右键刷新从库,从库自动创建表

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

8Navicat中新建数据表.png

同样的,在主表添加数据

eed0ca8ba299?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

10主表添加数据.png

添加完数据后有点刷新从表,从表的数据也自动刷新

另:

从主服务器得到一个快照版本

如果你的是MYISAM或者既有MYISAM又有INNODB的话就在主服务器上使用如下命令导出服务器的一个快照:

mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql

试过只有INNODB的话就是用如下命令:

mysqldump -uroot -p --single-transaction --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql

将快照版本还原到从服务器上

mysqldump -uroot -p -h 10.1.1.76 test < db.sql

关于一些常见问题及解决方案

一、主从数据库不同步问题

可以先查看一下进程是否sleep太多

mysql> show processlist;

然后可以看看master的状态

mysql>show master status;

如果都为正常,那就到slave上看看状态

mysql>show slave status \G;

1、可能slave服务未开启

数据库控制台输入show slave status \G;打印出slave的状态

mysql> show slave status \G;

主要看slave_IO_Running和Slave_SQL_Running,结果都需要为yes,如果不为yes,需要重启slave服务

mysql> service slave restart;//重启

如果服务未开启,则开启:

mysql> service slave start;

2、从数据库连接失败

在正常情况下,配置好服务器后,从库不进行修改操作,即从库只有读的权限,如果修改了从库数据表,则会造成同步失败,如发现失败,用show slave status \G;查看服务器状态信息:

mysql> show slave status \G;

查看Slave_SQL_Running状态,如果出现slave_SQL_Running为NO时,表示从库连接失败,在Last_Error处会打印错误日志信息。出现该问题主要是事务回滚问题,解决方法有两种。

1、

mysql> slave stop;//停止从服务

mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;//不要滥用

mysql>slave start;//启动从服务

2、手动重设从服务器

mysql5.6之后的版本(包含5.6)

mysql> stop slave; #关闭Slavemysql> change master to master_host='主服务器IP地址',master_user='主库用户名',master_password='主库登录密码',

master_log_file='mysql-bin.000004', master_log_pos=28125;//master_log_file是在配置master的时候的file选项,master_log_pos是在配置master时候position选项的 mysql> show master status;可查看

mysql> start slave; #开启Slave

mysql5.6之前的版本:

mysql>change master to

master_host='主库IP地址',

master_user='主库用户名',

master_password='主库登录密码',

master_log_file='主库文件信息',//同上

master_log_pos=' 主库的position信息 ';//同上

如果数据库相差较大,或者要求数据完全统一的情况:

1、先进入主库,进行锁表,防止数据写入

mysql>flush tables with read lock;//此处是锁定为只读状态

2、进行数据备份

将数据备份到mysql.bak.sql文件

# mysqldump -uroot -p -hlocalhost > mysql.bak.sql

3.查看master 状态

mysql> show master status;

+-------------------+----------+--------------+-------------------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+-------------------------------+

| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |

+-------------------+----------+--------------+-------------------------------+

1 row in set (0.00 sec)

4.把mysql备份文件传到从库机器,进行数据恢复

使用scp命令

[root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/

5.停止从库的状态

mysql> stop slave;

6.然后到从库执行mysql命令,导入数据备份

mysql> source /tmp/mysql.bak.sql

7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项

#change master to master_host = '192.168.128.100', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260;

8.重新开启从同步

mysql> start slave;

9.查看同步状态

mysql> show slave status; 查看:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

二、主从复制,中继日志不断增长

解决方案:

设置中继日志自动删除

vi 配置文件my.cnf,在mysqld下添加(位置:/etc/my.cnf)

relay_log-purge=1//(自动清除中继日志打开)

然后重启MySQL, 这样SQL Thread每执行完一个events时才会判断该relay-log是否需要,已经不再需要则自动删除

三、主从同步失败,如何快速同步

跳过错误,继续同步。设置SQL_slave_skip_counter=1;来快速恢复主从架构,但是此时主从架构的数据可能已经不一致了。set global sql_slave_skip_counter=N; 当N等于1时,表示跳过若干个event,直到当前事务结束,而当N大于1时,每跳过一个event,都要N--设置--slave-skip-errors=[ err_code1[,err_code2][,all]] 跳过出现指定错误的SQL.如果要断开主从架构,应先stop slave io_thread;等待执行完relay log里的内容再stop slave;

如果有与字符编码问题:

先停止slave

mysql>stop slave;

跳过slave上的一个错误:

mysql>set global sql_slave_skip_counter=1;//不要滥用,用之前最好上网查找资料

启动slave

mysql>start slave;

使用此方法需要注意的问题:

检查跳过的event是否在一个事物中

跳过slave上的event进行后续处理后要检查数据的一致性。

最好能在master的binglog上查看一下跳过的evnet到底做了写什么。

四、IO线程(Slave_IO_Running)始终保持为connecting状态

主从架构中,从库的io_thread一直保持connecting状态。先理解Slave_IO_Running 为connecting,的含义。造成的主要有三个:

1、网络不通 (是否打开防火墙)

2、复制用户的密码不对 (主从同步指定的用户密码主机名限制)

3、pos不对 (指定的position不正确

五、主键冲突,报1062错误

主从架构中,从库复制报1062错误,主键冲突。如果binlog是基于语句级复制,很容易出现上面的问题。设置innodb_autoincr_lock_mode=0或是1或修改binlog_format=mixed|row

六、从库同步慢

主从架构中,从库的同步数据非常慢。出现主从同步慢的原因有:

主从同步延迟与系统时间的关系,查看主从两台机器间系统时间差

主从同步延迟与压力、网络、机器性能的关系,查看从库的io,cpu,mem及网络压力

主从同步延迟与lock锁的关系(myisam表读时会堵塞写),尽量避免使用myisam表。一个实例里面尽量减少数据库的数量。

七、change master时报错ERROR 1201(HY000)

表现:在搭建主从时,报1201错误 。ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

解决方法:出现这个问题的原因是之前曾做过主从复制!需要reset slave后再change

八、关于在主从的时候使用触发器的问题

1 主从都存在trigger时,主库会记录sql语句,不包含trigger的操作,从库上数据和主库一致..

2 主有trigger,从库上没有trigger时,从库上没有trigger时,触发器不会被执行

3 主上无trigger,从上有trigger时 ,主从数据不一致,从库上的trigger被触发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算数字的位数并逆序输出

根据控制台文本提示输入一个数&#xff0c;这个数不能大于5位&#xff0c;并且要求是一个整数&#xff0c;程序会输出你输入数字的位数并且会输出每个数字在第几位&#xff0c;然后进行逆序输出显示。 结果演示 代码演示 package com.five;import java.util.Scanner;public …

【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测 2.9 霍夫变换 霍夫变换&#xff08;Hough Transform&#xff09;是图像处…

数字排序

对数字进行排序输出&#xff0c;根据提示输入你要输入数字的个数&#xff0c;然后输入相关的数字&#xff0c;程序会进行排序输出。 结果演示 代码演示 package com.five;import java.util.Scanner;public class Paixu {public static Scanner input new Scanner(System.in…

linux 清除mysql密码_linux重置mysql密码

一般这个错误是由密码错误引起&#xff0c;解决的办法自然就是重置密码。假设我们使用的是root账户。1.重置密码的第一步就是跳过MySQL的密码认证过程&#xff0c;方法如下&#xff1a;#vim /etc/my.cnf(注&#xff1a;windows下修改的是my.ini)在文档内搜索mysqld定位到[mysql…

【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法 3.1 阈值处理基础 阈值就是临界值。图像阈值处理简单、直观&#xff…

【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理

【OpenCV 例程200篇】 系列&#xff0c;持续更新中… 【OpenCV 例程200篇 总目录-202205更新】 【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理 3.2 全局阈值处理基本方法 当图像中的目标和背景的灰度分布较为明显时&#xff0c;可以对整个图像使用固定阈值进行…

求最大值

在一个整数数组里面求最大的一个数并输出显示。 结果演示 代码演示 package com.six; public class Max {public static void main(String[] args) {int[] arr{4,8,3,30,7,5};int maxgetMax(arr);System.out.println("max"max);}static int getMax(int[] arr){int…

【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法 3.3 全局阈值处理 Otsu 方法 阈值处理本质上是对像素进行分类的统计决策问题。 OTSU 方法又称大津算…

【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现

OpenCV 例程200篇 总目录-202205更新 欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现 3.3 全局阈值处理 Otsu 方法 OTSU 方法又称大津算法&#xff0c;使用最大化类间方差&#xff08;…

近似值匹配

根据文本提示输入英文的星期一到星期日的任意一天的英文的首字母&#xff0c;程序会自动进行近似匹配并输出根据你输入的首字母匹配到的星期。 程序分析 1.大小写的转化 2.判断是否是星期几的英文首字母 3.如果是&#xff0c;输出星期几 4.如果不是给出相应的提示 结果演示 输…

mysql plsql cursor_Oracle--plsql游标创建和使用

游标(cursor)是Oracle系统在内存中开辟的一个工作区&#xff0c;在其中存放SELECT语句返回的查询结果。&#xff0c;PL/SQL隐式建立并自动管理这一游为什么要Oracle游标&#xff1a;先看这个&#xff1a;DECLAREv_empno emp.empno%type;v_ename emp.ename%type;BEGINSELECT emp…

【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法 3.4 全局阈值处理改进方法 在实际的图像处理中&#xff0c;噪声严重影响阈值处理的结果&#xff0c;…

mysql优化 坑_mysql之我们终将踩过的坑(优化)

一、EXPLAIN做MySQL优化&#xff0c;我们要善用 EXPLAIN 查看SQL执行计划。下面来个简单的示例&#xff0c;标注(1,2,3,4,5)我们要重点关注的数据type列&#xff0c;连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别key列&#xff0c;使用到的索引名。如果没有选…

求1+2!+3!+......+20!的和

使用java算法求求12&#xff01;3&#xff01;…20!的和 结果演示 代码展示 package com.six;public class Qiudsh {public static void main(String[] args) {long sum 0; long temp 1;for(int i1;i<20;i){temp 1;for(int j1;j<i;j){temp temp * j;}sum sumtemp…

计算机设计大赛国奖作品_6. 测试报告

计算机设计大赛国奖作品_6. 测试报告 如果本文对你有帮助&#xff0c;欢迎点赞或在评论区留言&#xff0c;可以发送完整项目文档和源程序。 本系列是2021年中国大学生计算机设计大赛作品“环境监测无人机航线优化”的相关文档&#xff0c;获得2021年西北赛区一等奖&#xff0c…

【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理 3.4 全局阈值处理改进方法 在实际的图像处理中&#xff0c;噪声严重影响阈值处理的结果&…

Java实现八大排序算法

我对java的八大排序算法进行了总结&#xff0c;以此文展示Java八大算法 常见排序算法如下&#xff1a; 1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序 排序方法示例简介 直接插入排序 基本思想 通常人们整理桥牌的方法…

【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列&#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理 3.4 全局阈值处理改进方法 在实际的图像处理中&#xff0c;噪声严重影响阈值处理的…

乘法口诀表

java程序之乘法口诀表的实现。 结果演示 代码演示 package com.seven;public class Cfb {public static void main(String[] args) {for(int i1;i<9;i){for(int j1;j<i;j){System.out.print(j"*"i""(j*i));}System.out.println("");}}…

mysql explain 派生表_MySQL的Explain命令

Explain命令是查看查询优化器如何决定执行查询的主要办法。调用 EXPLAIN要使用EXPLAIN&#xff0c;只需在查询中的SELECT关键字之前增加EXPLAIN。MySQL会在查询上设置一个标记。当执行查询时&#xff0c;这个标记会使其返回关于在执行计划中每一步的信息&#xff0c;而不是执行…