mysql8.0主从复制配置(超详细)
Posted 是你的湫嘛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql8.0主从复制配置(超详细)相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
生活中我们生活遇到的软件都离不开数据库,比如淘宝这种,并发数量很大,防止单数据库的数据量太大导致数据库奔溃,所以就有了多数据库的主从复制,以下图片部分来自黑马课程的瑞吉外卖。
一、mysql主从复制是什么?
MysSQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台AysQL数据库(slave,即从库)从另一台MysQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MysQL数据库自带功能,无需借助第三方工具。
MysQL复制过程分成三步:
- master将改变记录到二进制日志( binary log)
- slave将master的binary log拷贝到它的中继日志(relay log)
- slave重做中继日志中的事件,将改变应用到自己的数据库中
二、配置前置条件
准备工作:
提前准备好两台服务器,我这边安装的是mysql8
由于从库是我克隆主库出来的,所以两个库的IP地址以及auto.cnf里的UUID都要改得不一样
- 主库Master 192.168.188.100
- 从库slave 192.168.188.101
注意:克隆的虚拟机需要修改数据库的uuid
这边修改的是克隆机的UUID,也就是从机
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# systemctl stop mysqld.service
//把auto.cnf里的UUID移除
[root@localhost mysql]# mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
//再启动数据库即可刷新出新的UUID
[root@localhost mysql]# systemctl start mysqld.service
[root@localhost mysql]# vim /var/lib/mysql/auto.cnf
更改前
更改后,查看下UUID确实更换了
三、配置-主库Master
第一步:修改Mysq1数据库的配置文件/etc/my.cnf
加多下面两句代码如下(示例):
[mysqld]
log-bin=mysql-bin #[必须]启用二进制日志,数据间复制必不可少
server-id=100 #[必须]服务器唯一ID
第二步:重启Mysql服务 systemctl restart mysqld
第三步:登录Mysql数据库,执行下面SQL(我这边登录统一用root)
一般虚拟机都会把mysql的密码复杂度设置的很高,想要设置简单密码就要自己调节
//降低安全策略等级
set global validate_password.policy=LOW;
//降低密码长度需求
set global validate_password.length=4;
//设置英文字母(包含大小写)最小长度
set global validate_password.mixed_case_count=0;
//设置特殊字符最小长度
set global validate_password.special_char_count=0;
//刷新权限
FLUSH PRIVILEGES;
//mysql8授权用户需要先创建,创建和授权同一条语句的话会报错
create user slave@'%' identified by '135564';
//再授权
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%'WITH GRANT OPTION;
//刷新
flush privileges;
注:上面SQL的作用是创建一个用户slave,密码为135564,并且给slave用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。
第四步:登录Mysql数据库,执行下面SQL,记录下结果中File和Position的值
show master status;
注:上面SQL的作用是查看Master的状态,执行完此SQL后不要再执行任何操作
四、配置-从库Slave
第一步:修改Mysq1数据库的配置文件/etc/my.cnf
[mysqld]
server-id=101 #[必须]服务器唯一ID
第二步:重启Mysql服务systemctl restart mysqld
第三步:登录Mysq1数据库,执行下面SQL
//执行前先停下slave
stop slave;
//这是从库和主库连接的关键一步,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status的信息
change master to
master_host='192.168.81.100',master_user='slave',master_password='135564',
master_log_file='mysql-bin.000003',master_log_pos=157;
//执行后启动slave
start slave;
第四步:登录Mysql数据库,执行下面SQL,查看从数据库的状态(我这边登录统一用root)
show slave status;输出会很乱
show slave status\\G;这样就竖着输出,不会乱
**两个yes则表示成功配置主从复制,Connection和No都是配置有问题
五、测试主从复制
我们分别用Navicat连接了主从的mysql
然后我现在往主机添加一个数据库
刷新一下备机,ok成功,主从复制配置完成
五、如果同步不了,如何排错?
如果主从数据库同步不了,就从库执行下 show slave status\\G;如果是Slave_IO_Running: No,那么,很可能是主从库UUID重复了,或者是防火墙端口没开通,(这些上面都有讲到);
如果是 Slave_SQL_Running: No,那么我们可以通过跳过错误和手动同步来解决。
Slave_SQL_Running: No 问题分析
1.程序可能在slave上进行了写操作
2.也可能是slave机器重启后,事务回滚造成的.
备机上每写一次,主机master的pos都会变一次,有时候同步没成功,就会导致主从机pos值不一样,这时候有两种解决方法,一种是跳过这个错误,一种是手动同步pos值
解决办法一:跳过这个错误,
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;就是跳过一次的意思
解决办法:
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;
解决办法二:手动同步pos值
进入master
到主服务器上查看主机状态:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 2844 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
然后进到slave
首先停掉Slave服务: stop slave;
然后到slave服务器上执行手动同步:
mysql>change master to
master_host='192.168.81.100',master_user='slave',master_password='135564',
master_log_file='mysql-bin.000003',master_log_pos=2844;
再打开Slave服务: start slave;
然后发现又是两个yes了,搞定!
mysql主从复制(超简单)
mysql主从复制
(超简单)
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下:
1、主从服务器分别作以下操作:
1.1、版本一致
1.2、初始化表,并在后台启动mysql
1.3、修改root的密码
2、修改主服务器master:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
3、修改从服务器slave:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
4、重启两台服务器的mysql
/etc/init.d/mysql restart
5、在主服务器上建立帐户并授权slave:
#/usr/local/mysql/bin/mysql -uroot -pmttang
mysql>GRANT REPLICATION SLAVE ON *.* to ‘mysync‘@‘%‘ identified by
‘q123456‘;
//一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,
如192.168.145.226,加强安全。
6、登录主服务器的mysql,查询master的状态
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、配置从服务器Slave:
mysql>change master to master_host=‘192.168.145.222‘,master_user=‘mysync‘,master_password=‘q123456‘,
master_log_file=‘mysql-bin.000004‘,master_log_pos=308; //注意不要断开,308数字前后无单引号。
Mysql>start slave; //启动从服务器复制功能
8、检查从服务器复制功能状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222 //主服务器地址
Master_User: mysync //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
......
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
以上操作过程,主从服务器配置完成。
9、主从服务器测试:
主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:
mysql> create database hi_db;
Query OK, 1 row affected (0.00 sec)
mysql> use hi_db;
Database changed
mysql> create table hi_tb(id int(3),name char(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into hi_tb values(001,‘bobu‘);
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
从服务器Mysql查询:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db | //I‘M here,大家看到了吧
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> use hi_db
Database changed
mysql> select * from hi_tb; //查看主服务器上新增的具体数据
+------+------+
| id | name |
+------+------+
| 1 | bobu |
+------+------+
1 row in set (0.00 sec)
10、完成:
编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。
本文出自 “系统网络运维” 博客,请务必保留此出处http://369369.blog.51cto.com/319630/790921
以上是关于mysql8.0主从复制配置(超详细)的主要内容,如果未能解决你的问题,请参考以下文章