mysql5.7 安装及互为主从部署
安装
环境说明: centos7.6
myslq版本: mysql5.7
迅雷或者wget下载(别问我为啥用迅雷,因为快)
cd /usr/local/src
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
mkdir -p /usr/local/mysql5.7 && cd /usr/local/mysql5.7
tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar -C /usr/local/mysql5.7
AI写代码
卸载自带的mariadb
rpm -qa|grep mariadb
yum -y remove mariadb-libs
AI写代码
由于依赖关系,请按以下顺序执行安装
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
AI写代码
启动mysqld 并设置开机启动
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld
AI写代码
从日志文件查找临时密码
grep "password" /var/log/mysqld.log
AI写代码
登录
mysql -uroot -p"zS+u&ro49wbo"
AI写代码
修改root的密码
alter user 'root'@'localhost' identified by 'root1234ABCD!@#$';
AI写代码
测试是否修改成功
mysql -uroot -proot1234ABCD\!\@\#\$
AI写代码

这是默认的密码复杂度及长度限制。我们修改一下,不然每次敲密码要死人。。。测试使用,可以这么干,生产还是保持默认的好点。。

set global validate_password_policy=0;
set global validate_password_length=1;
set password for root@localhost=password('123456');
flush privileges;
AI写代码
也可以使用 mysql -uroot -p -S /var/lib/mysql/mysql.sock进行连接
互为主从搭建
当前两台机器时间不同步

先配置好ntp
yum install ntpdate -y
AI写代码
然后开始同步阿里云的时间(两台都执行)
ntpdate ntp1.aliyun.com
AI写代码

为了防止以后时间又不一致,设置定时同步时间的任务
echo "*/10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1" >> /var/spool/cron/root
crontab -l
AI写代码

在没有配置前mysql目录是这样的

开始配置配置文件
vim /etc/my.cnf
添加如下内容
character-set-server = utf8mb4 //设置字符集
log-bin=mysql-bin //开启二进制日志
server-id=1 //mysql的id 两个实例要不同
relay_log=relaylogs
AI写代码
重新启动mysql
systemctl restart mysqld
AI写代码
重启以后可以看到已经有bin-log日志产生了

并且设置的server_id 也生效了

创建主从同步的账号(两个实例都添加,因为要互为主从)
grant all on *.* to 'zhucong'@'192.168.1.%' identified by '123456';
flush privileges;
AI写代码
初始化bin-log日志
reset master;
show master status;
AI写代码

开始设置主从同步
先把1.121作为主,1.122作为从
在1.122机器上执行
change master to master_host='192.168.1.121',master_user='zhucong',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
AI写代码
这里的master_host是指主机B的ip地址,master_uesr是执行同步操作的用户名,master_password是执行同步的用户密码,master_log_file是主机B的bin-log日志,master_log_pos是从bin-log日志开始同步的位置。
开启同步:
mysql> start slave;
查看同步设置是否成功:


查看从库状态,主从同步正常

master上看不到slave信息,因为它是主。还没有互为主从。

验证一下主从功能是否正常

可以看到主库做的操作,自动就同步过去了。
把主作为从,从作为主
第一步主从搭好了,接着就是把主作为从,从作为主。这样就实现了互为主从的关系。
其实操作也是一样的。改一下参数而已
在主(1.121)上执行以下语句,在执行之前先在1.122上执行show master status\G;确认一下。1.122的log position位置和bin-log文件名
change master to master_host='192.168.1.122',master_user='zhucong',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
start slave;
AI写代码
执行完了以后,两边都执行show slave status \G; 可以看到两边都互为主从了。

可以通过下面命令查看binlog日志事件
show binlog events;
AI写代码
从下面的截图可以看出。在任何一边执行的语句在binlog并没有写到另一边的binlog日志里面去。只有在执行的当前的机器上有记录。(原因是主从是通过中继日志来进行复制执行的)

在生产上,为了避免两个库一起写,一般会把备库作为只读库。接下来就修改备库只读。
因为是互为主从,随便修改那个都可以。我这边就修改1.122作为只读把。
在1.122上执行下面语句,就设为只读了,当然也可以直接设置mysql配置文件,但是由于生产会存在切换和重启,干脆配置文件就不写了。免得要手工去改配置文件,直接在发生故障切换的时候。命令行修改更方便
set global read_only=1;
AI写代码
使用show global variables like "%read_only%"; 可以查看到设置是否成功。

注意:set global read_only=1 对拥有super权限的账号是不生效的,所以在授权账号的时候尽量避免添加super权限
其他方面:
那么我们在做数据迁移的时候不想发生任何数据的修改,包括super权限修改也要限制。
可以使用锁表功能:
flush tables with read lock;
AI写代码
验证如下

开启使用gtid
- 在配置文件里面添加如下配置
vim /etc/my.cnf
gtid_mode = on
enforce_gtid_consistency = 1
AI写代码
- 重启mysql,并设置Auto_Position
systemctl restart mysqld
AI写代码
登录并设置如下
stop slave;
change master to master_auto_position=1;
start slave;
AI写代码

效果如下

