CentOS7下安装MySQL8主从同步

1. 概况

主节点:mysql-m
从节点:mysql-s

【mysql-m、mysql-s上操作】

cat >> /etc/hosts << EOF

192.168.6.176 mysql-m
192.168.6.177 mysql-s
EOF

2. yum安装MySQL8

【mysql-m、mysql-s上操作】

关闭防火墙:systemctl disable firewalld --now
目录准备:mkdir /soft && cd /soft

下载相应Linux版本的MySQL的yum源:https://dev.mysql.com/downloads/repo/yum/

下载 mysql80-community-release-el7-7.noarch.rpm,上传到 /soft

安装rpm包:
    rpm -Uvh mysql80-community-release-el7-7.noarch.rpm

检查rpm包是否安装成功:
    yum repolist enabled | grep "mysql.*-community.*"

注:假如要修改安装版本,可以 vi /etc/yum.repos.d/mysql-community.repo,修改里面的 enabled 字段。

yum repolist all | grep mysql

修改mysql的yum镜像源为清华源(mysql官方源在国内非常慢!):
参考:https://mirror.tuna.tsinghua.edu.cn/mysql/yum/
vim /etc/yum.repos.d/mysql-community.repo,修改(enabled=1的几处):

[mysql80-community]
name=MySQL 8.0 Community Server
#baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
baseurl=https://mirror.tuna.tsinghua.edu.cn/mysql/yum/mysql80-community-el7/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-connectors-community]
name=MySQL Connectors Community
#baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/7/$basearch/
baseurl=https://mirror.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el7/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-tools-community]
name=MySQL Tools Community
#baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/7/$basearch/
baseurl=https://mirror.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el7/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

安装mysql-server(mysql-client等作为依赖自动被安装):

yum install mysql-community-server -y

修改datadir和socket(注:socket不修改会无法restart):

mkdir -p /data/mysql-data
cp -rf /var/lib/mysql /data/mysql-data

创建慢查询日志目录:

mkdir -p /data/mysql-data/log

vi /etc/my.cnf,修改:

[mysqld]
datadir=/data/mysql-data/mysql
socket=/data/mysql-data/mysql/mysql.sock

lower_case_table_names = 1
thread_cache_size=64
character_set_server=utf8mb4
max_connections=20000
max_connect_errors=200
join_buffer_size=4M
tmp_table_size=64M
max_allowed_packet=128M
read_rnd_buffer_size=8M
sort_buffer_size=4M
innodb_buffer_pool_size=1G
innodb_lru_scan_depth=800
innodb_log_buffer_size=32M
innodb_log_file_size=128M
expire_logs_days=7
slow_query_log=ON
slow_query_log_file=/data/mysql-data/log/mysql-slow.log
long_query_time=10
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

gtid_mode=ON
enforce_gtid_consistency=1
log_slave_updates=1
relay_log_recovery=1
#slave_skip_errors=ddl_exist_errors
slave_skip_errors=all
innodb_undo_log_truncate=1
default_authentication_plugin=mysql_native_password

symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


[client]
socket=/data/mysql-data/mysql/mysql.sock

注:
1)在Mysql5.7之后,Mysql使用的是严格模式,sql_mode默认配置为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2)slave-skip-errors的作用是定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。slave_skip_errors默认是off,也可设置为:
all、ddl_exist_errors(1007,1008,1050,1051,1054,1060,1061,1068,1091,1146[官方文档是1094,实测是1091])或具体Error_code(逗号分隔)。

修改权限(很重要!):

chown -R mysql:mysql /data/mysql-data/

设置开机自启并启动mysqld服务:

systemctl enable mysqld --now

启动完,确认一切正常之后,删除旧的数据目录:

rm -rf /var/lib/mysql

验证mysql状态:

systemctl status mysqld
ps -ef | grep mysql

查看临时密码(用于首次登录):

grep 'temporary password' /var/log/mysqld.log

分别登录:
mysql -uroot -p

修改root密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Th1s@is%Y0UR#pwd';
注:密码安全策略:长度>=8,包含大小写字母、特殊符号、数字。

创建用户并赋权(注:如果开启主从同步,在master上执行此操作可被同步到slave上):
CREATE USER 'main'@'%' IDENTIFIED WITH mysql_native_password BY 'Th1s@is%Y0UR#pwd';
GRANT ALL ON *.* TO 'main'@'%';

刷新权限:flush privileges;

查看mysql用户:
use mysql;
select Host,User,plugin from user;

查看版本:select version();

查看默认编码方式(可以不用修改):
SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation_%’;

注:数据库连接参数中,characterEncoding=utf8 会被自动识别为 utf8mb4,也可以不加这个参数,会自动检测。
而 autoReconnect=true 是必须加上的。

特别注意:
1)mysql.sock是mysql的主机和客户机在同一host上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快。
[mysqld]和[client]的socket都需要配置,且相同。

2)mysql8.0 要求我们不能在initialize之后再更改 lower_case_table_names 的值。也就是说,必须在初始化前就在my.cnf配置好“lower_case_table_names = 1”。如果没有在初始化之前就设置好“lower_case_table_names = 1”(表名一律按照小写),出路只有一条,卸载后重装mysql8。或者,严格区分大小写的表名。

3)mysql8+版更换了新的身份验证是(caching_sha2_password),之前身份验证是(mysql_native_password),Navicat和SQLyog等客户端软件其实是不支持新的身份验证,也就是说无法连接。如何解决?把登录密码加密规则改回(mysql_native_password)。

3. 构建MySQL主从同步

【主节点 mysql-m 上操作】

vim /etc/my.cnf,添加:

[mysqld]
server-id=176
log-bin=mysql-bin

重启服务:systemctl restart mysqld

【mysql-m、mysql-s节点上操作】
登录mysql:

create user 'repl'@'%' identified with mysql_native_password by 'R.ep.l@9966';
grant replication slave on *.* to 'repl'@'%';
flush privileges;

【从节点 mysql-s 上操作】
vim /etc/my.cnf,添加:

server-id=177

重启服务:systemctl restart mysqld

注意:如果你是在virtualbox等软件中复制的虚拟机(auto.cnf文件中server-uuid相同),要执行 rm -f /data/mysql-data/mysql/auto.cnf,再 systemctl restart mysqld。
防止报错:Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.4

登录mysql:

配置关联的master:
change master to
master_host='mysql-m',
master_user='repl',
master_password='R.ep.l@9966',
master_port=3306,
MASTER_AUTO_POSITION = 1;

启用slave:
start slave;
show slave status \G
注:\G后不要带分号,否则会提示ERROR: No query specified

确认主从同步状态是否正常:
查看IO和SQL线程状态是否正常:(均为Yes即正常)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

~.~ 大功告成,皆OK王!

有没有一种可能:【皆OK王 · 官网】里的文章会在细节上把控得更好一丢丢…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值