mysql5.7.26 基于GTID的主从复制环境搭建

简单工作原理:

(1)从库执行 change master to 语句,会立即将主库信息记录到master.info中

(2)从库执行 start slave语句,会立即生成IO_T和SQL_T

(3)IO_T 读取master.info文件,获取到主库信息

(4)IO_T 连接主库,主库会立即分配一个DUMP_T,进行交互

(5)IO_T 根据master.info binlog信息,向DUMP_T请求最新的binlog

(6)主库DUMP_T,经过查询,如果发现有新的,截取并反回给从库IO_T

(7)从库IO_T会收到binlog,存储在TCP/IP缓存中,在网络底层返回ACK

(8)从库IO_T会更新master.info ,重置binlog位置点信息

(9)从库IO_T会将binlog,写入到relay-log中

(10)从库SQL_T 读取Relay-log.info 文件,获取上次执行过的位置点

(11)SQL_T按照位置点往下执行relaylog日志

(12)SQL_T执行完成后,重新更新relay-log.info

(13)relaylog定期自动清理的功能。

线程:

主库:

binlog_dump_thread 二进制日志投递线程

mysql -S /data/3307/mysql.sock -e "show processlist"

从库:

IO_Thread :  从库IO线程 :    请求和接收binlog

SQL_Thread:  从库的SQL线程 : 回放日志

主从环境的基本准备 

1. mysql主从服务器说明

192.168.1.219 mysql主服务器

192.168.1.17 mysql从服务器

192.168.1.151  mysql从服务器

#中间配置IP和网络及防火墙设置省略

2.   安装mysql

2.1    yum安装所需相关依赖包。

yum -y install gcc-c++

yum -y install zlib zlib-devel pcre pcre-devel

yum -y install openssl-devel

yum -y install  libaio-devel.x86_64

2.2搜索关键字:MySQL5.7 linux二进制安装

参考网址:https://www.cnblogs.com/chenmh/p/5413881.htmlMySQL5.7 linux二进制安装

下载路径:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

2.2.1#创建mysql的数据目录,该目录在初始化数据库的候会用到

mkdir -p /data/mysql/data

mkdir -p /data/mysql/log

2.2.2#移动mysql文件到/data/mysql/mysql

tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

cd /usr/local/

ln -s mysql-5.7.26-linux-glibc2.12-x86_64 mysql ## 软连接

2.2.3 #先创建mysql组

groupadd mysql

2.2.4#将MySQL用户加入mysql组

useradd -r -g mysql -s /bin/false mysql

2.2.5#修改目录权限

chown -R mysql:mysql /data/mysql/

chmod 750 /data/mysql

2.2.6#配置my.cnf

ls -l  /etc/my.cnf

rpm -e mariadb-libs  --nodeps

vim /etc/my.cnf  #创建my.cnf文件要命名为my.cnf,另外删除/etc/下的所有my.*文件

=====================================================

/etc/my.cnf配置修改如下配置

主库配置

[[email protected] ~]# cat /etc/my.cnf

[client]

port = 3306

socket = /data/mysql/mysql.sock

[mysqld]

port = 3306

user = mysql

character-set-server = utf8mb4

default_storage_engine = innodb

log_timestamps = SYSTEM

socket = /data/mysql/mysql.sock

basedir =/usr/local/mysql

datadir = /data/mysql/data

pid-file = /data/mysql/mysql.pid

max_connections = 1000

max_connect_errors = 1000

table_open_cache = 1024

max_allowed_packet = 128M

open_files_limit = 65535

server-id=1

gtid_mode=on

enforce_gtid_consistency=on

log-slave-updates=1

log-bin=master-bin

log-bin-index = master-bin.index

relay-log = relay-log

relay-log-index = relay-log.index

binlog_format=row

log_error = /data/mysql/log/mysql-error.log

skip-name-resolve

log-slave-updates=1

relay_log_purge = 0

slow_query_log = 1

long_query_time = 1

slow_query_log_file = /data/mysql/log/mysql-slow.log

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

==========================================

从库1配置:

[client]

port = 3306

socket = /data/mysql/mysql.sock

[mysqld]

port = 3306

user = mysql

character-set-server = utf8mb4

default_storage_engine = innodb

log_timestamps = SYSTEM

socket = /data/mysql/mysql.sock

basedir =/usr/local/mysql

datadir = /data/mysql/data

pid-file = /data/mysql/mysql.pid

max_connections = 1000

max_connect_errors = 1000

table_open_cache = 1024

max_allowed_packet = 128M

open_files_limit = 65535

server-id=2

gtid_mode=on

enforce_gtid_consistency=on

log-slave-updates=1

log-bin=master-bin

log-bin-index = master-bin.index

relay-log = relay-log

relay-log-index = relay-log.index

binlog_format=row

log_error = /data/mysql/log/mysql-error.log

skip-name-resolve

log-slave-updates=1

relay_log_purge = 0

slow_query_log = 1

long_query_time = 1

slow_query_log_file = /data/mysql/log/mysql-slow.log

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

=========================================

从库2配置:

[client]

port = 3306

socket = /data/mysql/mysql.sock

[mysqld]

port = 3306

user = mysql

character-set-server = utf8mb4

default_storage_engine = innodb

log_timestamps = SYSTEM

socket = /data/mysql/mysql.sock

basedir =/usr/local/mysql

datadir = /data/mysql/data

pid-file = /data/mysql/mysql.pid

max_connections = 1000

max_connect_errors = 1000

table_open_cache = 1024

max_allowed_packet = 128M

open_files_limit = 65535

server-id=3

gtid_mode=on

enforce_gtid_consistency=on

log-slave-updates=1

log-bin=master-bin

log-bin-index = master-bin.index

relay-log = relay-log

relay-log-index = relay-log.index

binlog_format=row

log_error = /data/mysql/log/mysql-error.log

skip-name-resolve

log-slave-updates=1

relay_log_purge = 0

slow_query_log = 1

long_query_time = 1

slow_query_log_file = /data/mysql/log/mysql-slow.log

============================================

2.2.7#初始化数据库

/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/data/mysql/mysql --datadir=/data/mysql/data --innodb_undo_tablespaces=3 --explicit_defaults_for_timestamp    #初始化mysql

2.2.7#根据配置了my.cnf的error.log,查看初始密码

grep ‘password‘ /data/mysql/log/mysql-error.log

2.2.8#创建ssl加密

/usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/data/mysql/data

2.2.9#将里面的basedir和datadir改为和my.cnf一致

vi /usr/local/mysql/support-files/mysql.server

basedir=/usr/local/mysql

datadir=/data/mysql/data

2.2.10#拷贝和配置启动文件

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

2.2.11设置开机启动

chkconfig --add mysqld

chkconfig mysqld on

2.2.12配置环境变量

echo ‘PATH=/usr/local/mysql/bin:$PATH‘>>/etc/profile

tail -1 /etc/profile

source /etc/profile   #让环境变量生效

echo $PATH    #检查变量是否添加成功

##/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2.2.13#启动mysql

service mysqld start

2.2.14#进入mysql

mysql -uroot -p         #密码通过前面的2.2.7找到

2.2.15#修改初始密码

ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘123456‘;

2.2.16#刷新权限

flush privileges;

2.2.17#查看路径信息

SHOW  GLOBAL VARIABLES LIKE ‘%log%‘;

2.2.18日志查询

1.查找错误日志文件路径

show variables like ‘log_error‘;

2.查找日志文件路径

show variables like ‘general_log_file‘;

3.慢查询日志文件路径

show variables like ‘slow_query_log_file‘;

2.2.19加入开机启动项

vim /usr/lib/systemd/system/mysqld.service

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf

LimitNOFILE = 5000

chmod +x /usr/lib/systemd/system/mysqld.service ##给予执行权限

systemctl daemon-reload ###重新加载

systemctl enable mysqld.service

systemctl start mysqld.service

============================================

 GTID主从复制: 

配置步骤:

1.检查gtid是否运行正常

启动后可以使用show global variables like ‘%gtid%‘;查看GTID状态

gtid_mode | ON

enforce_gtid_consistency | ON

注:主库从库都需要开启GTID否则在做主从复制的时候就会报错:

查看数据库的uuid

在数据目录的auto.cnf

在mysql里面使用命令查看show global variables like ‘server_uuid‘

2.登录主库给从库复制权限

grant replication slave on *.* to ‘replication‘@‘192.168.1.%‘ identified by ‘1234‘;

flush privileges;

select host,user from mysql.user;

3.登录从库使用命令进行复制

change master to

master_host=‘192.168.1.219‘,

master_port=3306,

master_user=‘replication‘, ###用户名和密码要与在主库上建立的一致

master_password=‘1234‘,

master_auto_position = 1; ##此参数可以一直不变化

start slave; ##启动同步

show slave status\G; ##查看同步状态

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

这两个参数必须为yes否则同步没有成功

4.主从的binlog日志观察

show binlog events in ‘master-bin.000001‘;

5.测试同步

增加数据来验证是否同步成功

create database shijiange;

use shijiange;

create table test (id int);

insert into test values (1);

update test set id = 3 where id = 1;

delete from test;

drop database shijiange;

主库的信息(master.info):    

Master_Host: 10.0.0.51                主库的IP

Master_User: repl   复制用户名

Master_Port: 3307   主库的端口

Connect_Retry: 10   断连之后重试次数

Master_Log_File: mysql-bin.000001     已经获取得到binlog的文件名

Read_Master_Log_Pos: 444              已经获取得到binlog的位置号

从库的relaylog的信息(relay-log.info):

Relay_Log_File: db01-relay-bin.000002 从库已经运行过的relaylog的文件名

Relay_Log_Pos: 320   从库已经运行过的relaylog的位置点

从库复制线程工作状态:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

过滤复制相关的状态:

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

从库延时主库的时间:

Seconds_Behind_Master: 0        从库延时主库的时间(秒为单位)

从库线程报错详细信息:

Last_IO_Errno: 0        IO报错的号码

Last_IO_Error:          IO报错的具体信息

Last_SQL_Errno: 0       SQL报错的号码

Last_SQL_Error:         SQL线程报错的具体原因

延时从库:

SQL_Delay: 0              延时从库设定的时间

SQL_Remaining_Delay: NULL 延时操作剩余时间

GTID复制信息:

Retrieved_Gtid_Set:     接收到的GTID的个数

Executed_Gtid_Set: 执行了的GTID的个数

SQL线程故障

原因一:

读relay-log.info

读relay-log ,并执行日志

更新relay-log.info

以上文件损坏,最好是重新构建主从

原因二:

为什么一条SQL语句执行不成功?

1. 主从数据库版本差异较大

2. 主从数据库配置参数不一致(例如:sql_mode等)

3. 想要创建的对象已经存在

4. 想要删除或修改的对象不存在

5. 主键冲突

6. DML语句不符合表定义及约束时

归根结底是从库写入了。

IO线程No的状态分析:

原因一: 日志名不对

从库信息:

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 444

对比备份的位置号。

原因二:日志损坏,日志不连续

原文地址:https://www.cnblogs.com/--smile/p/11475106.html

时间: 2024-10-05 05:31:35

mysql5.7.26 基于GTID的主从复制环境搭建的相关文章

基于GTID的主从复制数据库

基于GTID的主从复制数据库 全局身份识别 GTID(global transaction identifier) 为了实现主备数据库的强一致性 GTID = source_id:transaction_id source_id 表示执行事务的主库 transaction_id 是一个序列号,表示这个主库上执行的第 n 个事务. server_uuid是系统自动生成的,用来的替代server_id,因为source_id是手工设置的,可能会有冲突 数据库的安装和初始化 server33,44:

CentOS6.8下MySQL5.6.40基于GTID主从及多线程复制

大纲 一 GTID简介 二 环境准备 三 数据库的安装 四 基于GTID主从配置步骤 五 验证GTID复制功能 一 GTID简介 GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号.GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增.下面是一个GTID的具体形式3E11FA47-71CA-11E1-9E33-C80AA9429562:23更详

企业——MYSQL(基于GTID)的主从复制

一.什么是主从复制? 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库:主数据库一般是准实时的业务数据库. 二.主从复制的作用(好处,或者说为什么要做主从) 1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失. 2.架构的扩展.业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能. 3.读写分离,使数据库能支撑更大的并发.在报表中尤其重要.由于部分报表sql语句非常的

Mysql 基于GTID的主从复制及切换

参考 http://imysql.com/tag/gtid http://mysqllover.com/?p=594 Mysql 基于GTID的主从复制及切换 一.主从复制配置 两个mysql服务的my.cnf 中相关内容配置 [mysqld] #从复制数据库表设置 replicate-wild-ignore-table = mysql.%,information_schema.%,innodb.%,innodb_log.%,performance_schema.%,test.%,tmp.% #

基于GTID的主从复制搭建

前置检查 server-id = 10,master/slave不允许重复 log-bin gtid-mode = ON enforce-gtid-consistency = ON 1,利用mysqlpump复制master数据到slave,搭建基于GTID的主从复制,缺少GTID处理方法,暂不成功. mysqlpump --host= --user= --password= --single-transaction --default-parallelism=4 --compress-outp

mysql主从之基于gtid的主从复制

一 GITD介绍 1.1 gtid的含义 Global Transaction Identifier,全局事务标识 阿里云的rds目前已经使用gtid 基于gtid的主从复制原理 每个mysql数据库上都有一个唯一uuid 每个事务生成一个id gtid由上面两者组合: uuid+事务id 1.2 优势 相对使用binlog+位置的方法来说 gtid让配置主从更加方便 从提升为主时比较方便 二 配置 2.1 主库的配置 [mysqld] bind-address=0.0.0.0 port=330

MySQL 基于 GTID 的主从复制和多实例配置

配置基于 GTID 的主从复制 1.修改 master 和 slave 的配置文件 server-id=113 gtid_mode=on enforce-gtid-consistency=on replicate-do-db=gateway_target # 如果只需同步部分表,就在 slave 上配置这两个额外项 replicate-do-table=gateway_target.t_target_snapshot 2.导出 master 的库和表结构到 slave,先停止 master my

docker下部署MySQL8基于GTID的主从复制

安装docker#yum install docker添加docker镜像仓库#vim /etc/docker/daemon.json {"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]} 拉取mysql镜像*# docker pull mysql 创建mysql容器# docker run -dit --name lisamysql001 -p 33307:3307 -e MYSQLROOTPAS

MySQL master-slave主从复制环境搭建初试

原文:MySQL master-slave主从复制环境搭建初试 环境为centos 7.2+mysql 5.7,网上教程很多,原理也不复杂(深知自己踩的坑还不够) 正常情况下,配置起来比较简单.另外,根据个人感受,MySQL的复制感觉要比SQL Server的复制要清爽很多(尽管功能上可能有一些差异). master服务器,首先是开启了二进制日志,同时设置server-id为一个具体的数值 1,创建复制用户 GRANT REPLICATION SLAVE ON *.* to 'repl_test