一、GTID相关知识
见附录一
二、实验环境
2.1 环境说明
2.2 准备工作(主从)
操作系统:centos7.6 64位,在安装mysql之前centos7.6做了
关闭了防火墙、selinux、时间同步、epel及remi源、
安装vim lrzsz wget curl man treersync软件
安装了gcc及gcc++ v8版本
其中防火墙、selinux强烈建议设置一下,其它可以不用,具体见附录二
三、mysql5.7 yum基本安装(主从)
先是单台机,然后添加主从,这样比较接近业务发展需求。所以分别在vm61和vm62都安装上独立的mysql,然后再配置主从。
3.1 mysql安装(yum)
rpm -ih http://repo.mysql.com/mysql57-community-release-el7.rpm
yum install mysql-community-server mysql-community-devel mysql-community-client -y
3.2 修改配置文件
#1建立相关目录:
mkdir -pv /disk1/logs/mysql/mysql5.7/error
mkdir -pv /disk1/logs/mysql/mysql5.7/slow
mkdir -pv /disk1/mysqlData
chown mysql.mysql -R /disk1/logs/mysql
chown mysql.mysql -R /disk1/mysqlData
#2 修改my.cnf配置
cp /etc/my.cnf /etc/my.cnf.orig
vi /etc/my.cnf
#编辑配置文件并修改,黑色粗体部分为添加的,删除线部分为修改的,普通黑色为原配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
#datadir=/var/lib/mysqldatadir=/disk1/mysqlData
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted securityrisks
symbolic-links=0
#log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid
##by hua尾行添加
#设置密码策略及长度,mysql5.7默认安装并开启validate_password插件
#第一次初始化运行的时候要去掉,否则因mysql初始化生成不了密码而起不来
#validate_password_policy=0
#validate_password_length=4
#或者禁止validate_password
#validate_password=off
port = 3306
#id是唯一的,不能与主库的server_id相同,多个的从库的话也不能与其它从库相同
server_id =1
#设置默认字符集,也可以取消,取消则用安装时的默认字符集(不指定一般为latin1)
#用show
variables like '%char%';命令可以查看安装时的字符集是多少
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
innodb_file_per_table=1
#同步一定要开启bin log
log-bin=/disk1/logs/mysql/mysql5.7/mysql-bin
log-queries-not-using-indexes=on
log-error=/disk1/logs/mysql/mysql5.7/error/error.log
#记录慢查询,为了节省性能没开
#slow-query-log = on
#long_query_time = 3
#slow_query_log_file=/disk1/logs/mysql/mysql5.7/slow/slowquery.log
3.3启动mysql
#mysql启动、停止、重启,前提是安装了net-tools,没有安装可以直接用systemctl 命令
service mysqld start
service mysqld stop
service mysqld restart
#检查mysql状态、进程、端口号
service mysqld status
ps -ef |grep mysql
netstat -altnp|grep 3306
#设置开机启动,也以执行“systemctl enable mysqld”命令
chkconfig mysqld on
如果启动不起来
方法一:删除原来目录数据,再次启动让其重启生成数据
systemctl stop mysqld.service
ps -ef |grep mysql
rm -rf /disk1/mysqlData
rm -rf /disk1/logs
mkdir -p /disk1/logs/mysql/mysql5.7/error
mkdir -p /disk1/logs/mysql/mysql5.7/slow
mkdir -p /disk1/mysqlData
chown mysql.mysql -R /disk1/logs/mysql
chown mysql.mysql -R /disk1/mysqlData
service mysqld start
service mysqld status
ps -ef |grep mysql
netstat -altnp|grep 3306
方法二:
如果还是解决不了,有可能selinux没关,请关闭selinux
方法三:
按照上面的方法还是启动不起来,那么有可能是my.cnf没配置正确,或者相关目录没有授权,请仔细检查
3.4 查看及修改mysql密码
3.4.1查看mysql初始密码
mysql5.7相对mysql5.6做了新的调整,密码并不是空密码,而是一个至少是8位的随机生成的密码,保存在错误日志中,通过查看/etc/my.cnf得知错误日志的路径我改为了“/disk1/logs/mysql/mysql5.7/error/error.log”,查看日志内容里面的密码
grep "password is" /disk1/logs/mysql/mysql5.7/error/error.log
#登陆测试:
mysql -uroot -p
3.4.2修改安全级别
第一次登陆mysql之后需要修改密码才能执行操作,否则会报如下错误:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
yum mysql5.7默认安装了validate_password安全插件(用二进制安装默认是没有的),默认情况是不能少于8位,密码强度为中级,如果我们要修改为简单的(字母+数字、纯数字、纯字母),则会报如下错误:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
所以我们要要修改安全策略
#设置密码策略及长度
#length为什么要设置 4,因为不管你设置 1、2、3、4,最低长度都是4
set global validate_password_policy=0;
set global validate_password_length=4;
#在修改了mysql密码之后再次登陆才执行下面的命令,就可以看到策略改变了
SHOW VARIABLES LIKE 'validate_password%';
为了永久生效,已经添加到了my.cnf中,把注解去掉
sed -i '/validate_password_policy/s/#//' /etc/my.cnf
sed -i '/validate_password_length/s/#//' /etc/my.cnf
egrep 'validate_password_' /etc/my.cnf
#效果如下:
#重启mysql
service mysqld restart
3.4.3修改mysql密码
在修改了密码策略及长度的前提下,就可以设置比较简单的密码了
#特别提醒注意的一点是,新版的mysql数据库下的user表中已经没有Password字段了
#下面的语句是把本地为root的账号密码修改为123456
ALTER USER 'root'@'localhost'IDENTIFIED BY '123456';
quit
#再次登陆,密码为123456
mysql -uroot -p
#随便执行一个查询试下
show databases;
quit;
#如果要添加用户则用:grant PRIVILEGES
#下面是授权hua用户密码为123456,给访问所有数据库的权限,
#客户端IP址址只能是192.168开头的
GRANT ALL PRIVILEGES ON*.* TO 'hua'@'%'IDENTIFIED BY '123456'WITHGRANT OPTION;
flush privileges;
#也可以指定权限,下面语句,指定权权限给t1用户
#密码为123456,数据库指定为hua,客户端IP址址只能是192.168开头的
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE TEMPORARY TABLES, DROP, INDEX, ALTER, LOCK TABLES ONhua.* TO't1'@'192.168.%.%' IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;
3.5 使用SQL客户端工具登陆(SQLyog)
上面设置完了之后,可以使用mysql客户端工具SQLyog或navicat
for mysql 登记测试一下,我这里使用SQLyog
三、GTID同步步骤
配置gtid无论主从都要有下载选项
#GTID
server_id=x #主从id不能相同
gtid_mode=ON#必选
enforce-gtid-consistency=ON #必选
#binlog,主库是必选的,从库是可选的
log_bin=ON#master必选,如果不写默认开启
#STATEMENT:基于SQL语句的复制
#ROW:基于行的复制
#MIXED:混合模式复制
#MySQL 5.7.6之前默认为STATEMENT模式。MySQL 5.7.7之后默认为ROW模式。
binlog_format = row #必选mixed或者row
#5.6必选 5.7.5和它之后可选,为了高可用切换,最好设置ON
log-slave-updates=ON
# 5.6必选 5.7.5和它之后可选,为了高可用,最好设置
log-bin = /日志路径/
#relay log
#slave复制进程不随mysql启动而启动,此选项是配置运行配置slave前设置
#同步之后可以关闭设置为0,如果不关闭重启mysql服务之后不会自动同步
skip_slave_start=1
需要注意的是:当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;
按照mysql5.7(目前最新为5.7.26)官方说明文档,得知配置gtid主从步骤:
步骤1:将master 设置read-only,使slave赶上master更新速度
注:read-only 设置时候super用户可写,普通用户不可写。
步骤2:停止两台机器,相当于“service mysqld stop”命令
步骤3:修改配置,启用GTID功能,要启用基于GTID的复制,必须通过将gtid_mode变量 设置为启用GTID模式启动每个服务器 ON,并enforce_gtid_consistency 启用变量以确保只记录对基于GTID的复制安全的语句。在slave机器启动之前,使用--skip-slave-start禁用slave的复制进程。
由于在MySQL 5.7.5中增加了mysql.gtid_executed,所以不需要slave机器启用二进制日志记录来使用GTID 。这意味着您可以使用GTID但没有二进制日志记录的从服务器。为了能够复制,主设备必须始终启用二进制日志记录。而slave,只需要配置2个就行了。
步骤4:启动自动pos,之前普通的主从pos值需要手工指定,现在不用了,设置同步账号,如:
GRANT REPLICATION SLAVE ON*.*TO'gtid'@'192.168.%.%'IDENTIFIED BY '123456';
然后在slave库中执行下面的同步命令即可:
步骤5:备份
进行新备份。由于您已启用GTID,因此在启用GTID之前创建的现有备份现在无法在这些服务器上使用。此时进行新备份,这样您就不会没有可用的备份。
例如,您可以在要进行备份的服务器上执行FLUSH LOGS。然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。
可以使用mysqldump备份定时的数据库,语法如下:
mysqldump -h$hostname -u$user -p$pwd 数据库名 >xxx.sql
#最好用tar命令进行压缩这样体积会变很多
步骤6:开启slave同步(在slave端做),并关闭只读。
四、配置GTID主从
4.1 master上配置gtid(主库)
4.1.1 写入数据(主库)
主库在开启gtid之前写好一些数据,这样才能看到效果。
打开SQLyog连接上主库,执行如下命令:
CREATE DATABASE /*!32312 IF NOT
EXISTS*/`hua` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `hua`;
/*Table structure for table `t1`
*/
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`id` INT(6) UNSIGNED NOT NULL DEFAULT '0',
`sid` INT(6) NOT NULL,
`name` CHAR(10) NOT NULL,
`yuwen` FLOAT DEFAULT '0',
`shuxue` FLOAT DEFAULT '0',
`sex` CHAR(2) NOT NULL DEFAULT '男',
`zhiwei` CHAR(6) NOT NULL DEFAULT '学生'
) ENGINE=INNODB DEFAULT
CHARSET=utf8;
/*Data for the table `t1` */
INSERT INTO`t1`(`id`,`sid`,`name`,`yuwen`,`shuxue`,`sex`,`zhiwei`) VALUES
(1,1,'刘一',51,65,'男','学生'),
(2,2,'陈二',71,0,'男','学生'),
(3,3,'张三',87.6,90,'男','学生'),
(4,4,'李四',55.9,88,'男','学生'),
(5,5,'王五',77,59,'男','学生'),
(6,6,'赵六',45,90,'男','学生'),
(7,7,'开心',70,100,'女','学生'),
(8,8,'乐儿',65,50,'女','音乐委'),
(9,9,'乐乐',88,29.5,'女','学生'),
(10,10,'笑笑',73,69,'女','学生'),
(11,11,'fly',90,89,'男','学生'),
(12,12,'乐天',90,70,'男','副班长'),
(13,13,'云儿',95,65,'女','学生'),
(14,14,'伊洛',14,70,'男','班长'),
(15,15,'abc',86,98,'男','学生'),
(16,16,'菲菲',90,99,'女','学习委'),
(17,17,'mm',71,61,'女','学生'),
(18,18,'meiei',98,61,'男','学生');
4.1.2 修改my.cnf配置并添加同步账号
参照“三、GTID同步步骤”,因为我是用配置文件的,所以顺序修改一下,先配置my.cnf,因为你不重启mysql是不影响的。
#备份my.cnf配置
cp /etc/my.cnf /etc/my.cnf.orig2
#修改一下server_id,主从不能相同
sed -i '/server_id/s/1/61/' /etc/my.cnf
#上面已经默认配置了binlog路径,修改一下名字为master-bin
sed -i '/log-bin/s/mysql-bin/master-bin/' /etc/my.cnf
#添加GTID相关配置
echo 'log-slave-updates=1' >>/etc/my.cnf
echo 'binlog_format=row' >>/etc/my.cnf
echo '' >>/etc/my.cnf
echo '#GTID:' >>/etc/my.cnf
echo 'gtid_mode=on' >>/etc/my.cnf
echo 'enforce_gtid_consistency=on' >>/etc/my.cnf
echo '#slave复制进程不随mysql启动而启动' >>/etc/my.cnf
echo 'skip_slave_start=1'>>/etc/my.cnf
#添加同步账号,我这里设置只能内网使用,如果全部可以用’gtid’@’%’
GRANT REPLICATION SLAVE ON*.*TO'gtid'@'192.168.%.%'IDENTIFIED BY '123456';
4.1.3 备份数据库
#备份数据库之前要先锁定整个mysql数据库,避免写入数据。
SET @@GLOBAL.read_only = ON;
SHOW GLOBAL VARIABLES LIKE 'read_only'
注:具有SUPER权限的用户是不受限制的!如root和我刚才建立的hua用户,都包含的Super权限,有些小网站开发账号往往是直接用root或给全部权限,如我的hua,这样怎搞?那只能是深夜把web停止了,不让有新数据写入!!
#备份数据库,开启gtid是不能备份的!所以先不要重启mysqld,否则上面配置就生效了
mkdir -pv /disk1/backup/mysql
mysqldump -uroot -p -B hua >/disk1/backup/mysql/hua$(date +%F).sql
4.1.4 重启mysql
#重启mysql后gtid生成,只读模式会自动解除
systemctl restart mysqld
4.1.5 解锁
#重启mysql后gtid马上生效,只设置的只读也会失效,所以不用做
#SET @@GLOBAL.read_only = OFF;
SHOW GLOBAL VARIABLES LIKE 'read_only'
4.1.6 模拟在备份后有数据产生
重启后只读失效,所以会马上有数据产生,为了方便我模拟2条数据
INSERT INTO`t1`(`id`,`sid`,`name`,`yuwen`,`shuxue`,`sex`,`zhiwei`) VALUES
(19,19,'19',19,19,'男','学生'),
(20,20,'20',20,20,'男','学生');
4.2 slave上配置gtid(从库)
4.2.1修改my.cnf配置
#备份my.cnf配置
cp /etc/my.cnf /etc/my.cnf.orig2
#修改一下server_id,主从不能相同,从库我设置为62
sed -i '/server_id/s/1/62/' /etc/my.cnf
#上面已经默认配置了binlog路径,修改一下名字为slave-bin
sed -i '/log-bin/s/mysql-bin/slave-bin/' /etc/my.cnf
#添加GTID相关配置,和主库配置一样
echo 'log-slave-updates=1' >>/etc/my.cnf
echo 'binlog_format=row' >>/etc/my.cnf
echo '' >>/etc/my.cnf
echo '#GTID:' >>/etc/my.cnf
echo 'gtid_mode=on' >>/etc/my.cnf
echo 'enforce_gtid_consistency=on' >>/etc/my.cnf
echo '#slave复制进程不随mysql启动而启动,master没有slave' >>/etc/my.cnf
echo 'skip_slave_start=1'>>/etc/my.cnf
注:slave可以禁用bin log,但是master不能,为了让从能升主,所以没禁止
4.2.1 主库的sql备份还原到从库
开启mysql主从之后只能保证之后的数据库是一致的,所以为了保持之前的数据库一致性,得还原主库的备份到从库上。
mkdir -pv /disk1/backup/mysql
cd /disk1/backup/mysql/
#在从库上用scp把主库的sql文件同步过来,刚才备份的名字叫hua2019-06-14.sql
scp [email protected]:/disk1/backup/mysql/hua2019-06-14.sql .
#还原
mysql -uroot -p< hua2019-06-14.sql
mysql -uroot -p -e "show databases;"
4.2.3 重启mysql
重启主从的mysql这样主从的gtid就生效了
#主从同时操作
systemctl restart mysqld
4.2.4 开启同步
#登陆从库mysql,输入密码
mysql -uroot –p
#从库连接主库
CHANGE MASTER TO
MASTER_HOST = '192.168.3.61',
MASTER_PORT = 3306,
MASTER_USER = 'gtid',
MASTER_PASSWORD = '123456',
MASTER_AUTO_POSITION = 1;
#开启同步
START SLAVE;
4.2.5 查看同步状态
show slave status\G
#查看一下刚才主库在备份后,从库还原期间产生的2个数据,有没有同步过来
use hua;
select * from t1 where sid between 19 and 20;
4.3 测试
在主库添加1行,查看从库是否同步过来
INSERT INTO`t1`(`id`,`sid`,`name`,`yuwen`,`shuxue`,`sex`,`zhiwei`) VALUES
(666,666,'666',100,100,'男','学生');
#等一会再去从库查看一下是否同步过来了
SELECT * FROM t1 WHERE sid='666';
4.4 收尾工作
因为之前在my.cnf配置中添加了一行
skip_slave_start=1
现在主从正常了,那么从库就需要slave随着mysql服务启动而启动,命令如下:
sed -i '/skip_slave_start/s/1/0/' /etc/my.cnf
grep skip_slave_start /etc/my.cnf
systemctl restart mysqld
#重启后查看从库slave是否自动启动
SHOW SLAVE STATUS;
五、常用操作
5.1.mysql主从复制跳过错误
mysql主从复制,经常会遇到错误而导致slave端复制中断,这个时候一般就需要人工干预,跳过错误才能继续
跳过错误有两种方式:
1.跳过指定数量的事务:
mysql>slave stop;
mysql>SET GLOBALSQL_SLAVE_SKIP_COUNTER = 1 #跳过一个事务
mysql>slave start
2.修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146
#跳过指定error no类型的错误
#slave-skip-errors=all #跳过所有错误
5.2.常见其它命令
RESET MASTER #主机端运行,清除所有的日志,这条命令就是原来的FLUSH MASTER RESET SLAVE
#从机运行,清除日志同步位置标志,并重新生成master.info
5.3.从库重新同步
如果同步坏的话可以删除同步同步
#1)停止slave
stop slave;
#2)重置slave,这个很重要,如果没重置的话,Slave_IO_Running起不来,也可以查看错误日志
RESET SLAVE;
#3)重新执行同步操作
从库再次启动同步:
CHANGE MASTER TO
MASTER_HOST = '192.168.3.61',
MASTER_PORT = 3306,
MASTER_USER = 'gtid',
MASTER_PASSWORD = '123456',
MASTER_AUTO_POSITION = 1;
#开启同步
startslave;
#注意G后面是没有;号的
showslave status \G
附录一、GTID相关知识
1. GTID介绍
GTID (Global Transaction Identifiers)是对于一个已提交事务的编号,事务的唯一编号,并且是一个全局唯一的编号。GTID 和事务会记录到 binlog 中,用来标识事务。
GTID 是用来替代以前 classic 复制方法,MySQL-5.6.2 开始支持 GTID,在 MySQL-5.6.10 后完善。
有了 GTID,一个事务在集群中就不再孤单,在每一个节点中,都存在具有相同标识符的兄弟们和它作伴,可以避免同一个事务,在同一个节点中出现多次的情况。
GTID 的出现,最直接的效果就是,每一个事务在集群中具有了唯一性的意义,这在运维方面具有更大的意义,因为使用 GTID 后再也不需要为了不断地找点而烦恼了,给 DBA 带来了很大的便利性。
2. GTID 主从复制原理
1)当一个事务在主库端执行并提交时,产生 GTID,一同记录到 binlog 日志中。
2)binlog 传输到 slave,并存储到 slave 的 relaylog 后,读取这个 GTID 的这个值设置 gtid_next 变量,即告诉 Slave,下一个要执行的 GTID 值。
3)sql 线程从 relay log 中获取 GTID,然后对比 slave 端的binlog 是否有该 GTID。
4)如果有记录,说明该 GTID 的事务已经执行,slave 会忽略。
5)如果没有记录,slave 就会执行该 GTID 事务,并记录该 GTID 到自身的binlog;
6)在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
3. GTID 优势和限制
3.1GTID的优势:
1) 根据 GTID 可以快速的确定事务最初是在哪个实例上提交的。
)2 简单的实现 failover,不用以前那样在需要找 log_file 和 log_pos。
3) 更简单的搭建主从复制,确保每个事务只会被执行一次。
4) 比传统的复制更加安全。
5) GTID 的引入,让每一个事务在集群事务的海洋中有了秩序,使得 DBA 在运维中做集群变迁时更加方便,能够做到胸有成竹心中有数。
3.2 GTID 的限制
因为基于 GTID 的复制依赖于事务,所以在使用 GTID 时,有些 MySQL 特性是不支持的。
1)不允许在一个 SQL 同时更新一个事务引擎和非事务引擎的表;
事务中混合多个存储引擎,就会产生多个 GTID。当使用 GTID 时,如果在同一个事务中,更新包括了非事务引擎(如 MyISAM)和事务引擎(如 InnoDB)表的操作,就会导致多个 GTID 分配给了同一个事务。
2) 主从库的表存储引擎必须是一致的;
主从库的表存储引擎不一致,就会导致数据不一致。如果主从库的存储引擎不一致,例如一个是事务存储引擎,一个是非事务存储引擎,则会导致事务和 GTID 之间一对一的关系被破坏,结果就会导致基于 GTID 的复制不能正确运行;
3) 不支持 create table … select 语句复制(主库直接报错)
由于使用基于行模式的复制时,create table ...select 语句会被记录为两个单独的事件(会生成两个 sql),一个是 DDL 创建表 SQL,一个是 insert into 插入数据的 SQL。由于 DDL 会导致自动提交,所以这个 sql 至少需要两个 GTID,但是 GTID 模式下,只能给这个 sql 生成一个 GTID,如果强制执行会导致和上面(2)中一样的结果。
4) 在一个复制组中,必须要求统一开启 GTID 或是关闭 GTID;
5) 开启 GTID 需要重启(5.6 需要,5.7 中不需要)
6) 开启 GTID 后,就不能在使用原来的传统的复制方式;
7) 不支持 create temporary table 和 drop temporary table 语句;
使用 GTID 复制时,不支持 create temporary table 和 drop temporary table ,但是在 autocommit=1 情况下可以创建临时表,MASTER 创建临时表不产生 GTID 信息,所以不会同步到 SLAVE 上,但是删除临时表时,产生 GTID 会导致主从复制中断。
8) 不推荐在 GTID 模式的实例上进行 mysql_upgrade;
因为 mysql_upgrade 的过程要创建或修改系统表(非事务引擎),所以不建议在开启 GTID 的模式的实例上使用带有--write-binlog 选项的 mysql_upgrade;
9) 不支持sql_slave_skip_counter;
4. 为什么要使用 GTID
比如以下M-S结构
S1→M←S2,当M宕机的时候,其中一台S就必须承担起M的责任,但是由于2台S之间没有关系,很难使S2成为S1的slave。
GTID 的存在方便了Replication 的 Failover在 MySQL 5.6,GTID 出现之前 Replication failover 的操作过程:修改复制源的命令语法为:
mysql> CHANGE MASTER TO
MASTER_HOST='XXXX',
MASTER_USER='XXXX',
MASTER_PASSWORD='XXXXX',
MASTER_LOG_FILE='XXXXX',
MASTER_LOG_POS=XXXXX;
而比较麻烦的地方是:由于同一个事务在每台服务器上所在的 binlog 名字和 Postion 位置点都不一样,那么怎么找到 slave2 当前同步停止点,对应 New Master 的 master_log_file 和 Master_log_pos 是什么的时候就成为了难题。这也就是为什么 M-S 复制集群需要使用 MMM,MHA 这样的额外管理工具的一个重要原因。
其实也可以找到,只是比较麻烦,我们都知道主从复制环境中 master 的 binlog 复制到 slave 上后事务执行时的时间戳是不变的,所有 slave 上同一个事务的时间戳都是相同的。可以根据这个时间戳定位到 Master_log_file 和 Master_log_pos。只是很费时间;麻烦…
GTID 出现之后:
在 MySQL 5.6 的 GTID 出现之后,处理这个问题就非常简单了。由于同一个事务的 GTID 在所有的节点上都是一致的,那么根据 Slave 当前停止点的 GTID 就能唯一定位到 New Master 的 GTID。更简单的是,由于 MASTER_AUTO_POSITION 功能的出现,我们都不需要知道 GTID 的具体值。直接使用
mysql> CHANGE MASTER TO
MASTER_HOST='XXXX',
MASTER_USER='XXXXX',
MASTER_PASSWORD='XXXXX',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1;
命令就可以直接完成failover 的工作了。使用 GTID 处理这个问题就简单很多。
附录二、安装基础软件及基础配置
2.1 centos7安装兼容包(已安装)
服务器端和客户端同时操作
#兼容centOS6之前的命令
yum install -y net-tools
2.2关闭防火墙(可选)
#停止firewall ,禁止firewall开机启动
systemctl stopfirewalld.service
systemctl disablefirewalld.service
#如果安装了兼容性工具net-tools 可以使用如下命令:
service firewalld stop
chkconfig firewalld off
2.3关闭selinux(强烈建议)
一般建议关闭selinux,不然安装你修改一些软件配置路径不符合selinux规范可能会报错
软件启动不了!!这个是弊大于利的东西。
#临时关闭:
setenforce off
#永久性关闭:
sed -i's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
sed -n '/SELINUX=/p'/etc/selinux/config
#要生效需要重启
shutdown -r now
2.4时间同步(可选)
有些软件时间性要求比较强的,如同步类,数据库主从,做实验也最好同步一下时间
yuminstall ntp -y
/usr/sbin/ntpdatepool.ntp.org
echo'#time sync by hua'>>/var/spool/cron/root
echo'*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null2>&1'>>/var/spool/cron/root
crontab-l
2.5 安装常用软件(可选)
yum install -y vim lrzsz wget curl man tree rsync
2.6 安装第三方源epel源及remi源(可选)
#安装epel源可以下载比较新版本的软件及部分默认没用的yum软件
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ih remi-release-7.rpm
7.7 安装gcc gcc++(可选)
很多软件都是依赖于gcc及gcc++,默认的yum安装版本只有4.x有点低,一般安装5.x以上,操作见“附录三”
2.8 在history命令前添加时间显示(推荐)
echo '#by hua '>>/etc/bashrc
echo 'export HISTFILESIZE=100000000' >> /etc/bashrc
echo 'export HISTSIZE=1000000' >> /etc/bashrc
echo 'export PROMPT_COMMAND="history -a"' >>/etc/bashrc
echo 'export HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S "' >> /etc/bashrc
source /etc/bashrc
2.9 修改文件连接数(推荐)
#刚安装完系统的时候默认文件连接数为1024个,可以使用命令“ulimit -n”查看
#这样太小了不够用,所在生产环境一般都会修改此项。阿里云默认的tcp连接数是65535,#过大会报警,这样我们参照大哥的做法,因为一般他们都测试大量测试的。
cat>>/etc/security/limits.conf<
#by hua 2019.5
* soft nofile 65535
* hard nofile 65535
EOF
tail -5
/etc/security/limits.conf
附录三、安装gcc 、gcc++
#1.卸载c和c++,默认4.8.5版本太低了,在这里没有安装
yum remove -y gcc gcc-c++ -y
#2.安装一些依赖
yum install -y glibc glibc-develcpp libmpc mpfr
#3.去gcc官方安装新版本的gcc
#直接https://www.softwarecollections.org/en/搜索“devtoolset”,目前发现是7
#点版本7会打开链接https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7
#查看最版本
#发现最新版本为8了,返回页面devtoolset-7
#https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7根据说明安装
#不同的是把版本7改为版本8
yum install -y centos-release-scl
yum install -y devtoolset-8-gcc.x86_64 devtoolset-8-gcc-c++.x86_64
#4.查看gcc和gcc-c++版本
[root@vm76 ~]# rpm -qa|grep devtoolset
devtoolset-8-libstdc++-devel-8.2.1-3.el7.x86_64
devtoolset-8-gcc-8.2.1-3.el7.x86_64
devtoolset-8-runtime-8.0-2.el7.x86_64
devtoolset-8-binutils-2.30-47.el7.x86_64
devtoolset-8-gcc-c++-8.2.1-3.el7.x86_64
#5. 查看查看gcc和gcc-c++版本bin目录,bin目录都一样
rpm -ql devtoolset-8-gcc-8.2.1-3.el7.x86_64|grep "bin/gcc"
rpm -ql devtoolset-8-gcc-c++-8.2.1-3.el7.x86_64|grep "bin"
#4.设置环境变量
echo 'exportPATH=$PATH:/opt/rh/devtoolset-8/root/usr/bin'>>/etc/profile
source /etc/profile
gcc -v
g++ -v
#为了方便记忆c和c++做一个软链接
ln -s /opt/rh/devtoolset-8/root/usr/bin/gcc /usr/bin/cc
ln -s /opt/rh/devtoolset-8/root/usr/bin/c++ /usr/bin/c++