前言
注意系统版本,可通过uname -a
查询!!!
将下载好的mysql-8.0.23-1.el7.x86_64.rpm-bundle.tar
解压,
并将一下rpm
包上传至服务器备用
[root@master huitian]# ll -h /home/huitian
总用量 572M
-rw-r--r--. 1 root root 48M 12月 12 21:09 mysql-community-client-8.0.23-1.el7.x86_64.rpm
-rw-r--r--. 1 root root 237K 12月 12 21:09 mysql-community-client-plugins-8.0.23-1.el7.x86_64.rpm
-rw-r--r--. 1 root root 621K 12月 12 21:09 mysql-community-common-8.0.23-1.el7.x86_64.rpm
-rw-r--r--. 1 root root 4.7M 12月 12 21:09 mysql-community-libs-8.0.23-1.el7.x86_64.rpm
-rw-r--r--. 1 root root 519M 12月 12 21:10 mysql-community-server-8.0.23-1.el7.x86_64.rpm
部署规划:
[root@master]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.3.140 master
192.168.3.141 slave
开启防火墙的3306端口
# 添加
[root@master ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
success
# 重新载入
[root@master ~]# firewall-cmd --reload
success
# 查看
[root@master ~]# firewall-cmd --zone=public --query-port=3306/tcp
yes
清理CentOS自带的mysql数据库
- 查找出系统安装的mysql软件包和依赖包
[root@master ~]# rpm -qa | grep mysql
[root@master ~]#
我的机器上没有查出已安装的mysql软件包,如果有查询出对应的软件包,则使用如下命令进行删除
[root@master ~]# yum -y remove 软件包名
- 查找出系统安装的MariaDB软件包和依赖包
MariaDB是mysql的一个分支,所以MySQL可能会和MariaDB文件有冲突,所以依然需要继续下载掉MariaDB.
[root@master ~]# rpm -qa | grep mariadb
可能的结果如下:
mariadb-libs-5.5.68-1.el7.x86_64
使用如下命令进行删除
[root@master ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
接下来查询mysql的配置文件
[root@master ~]# find / -name mysql
我本机显示的结果如下:
/usr/lib64/mysql
/etc/selinux/targeted/active/modules/100/mysql
使用如下命令进行清除:
[root@master ~]# rm -rf /usr/lib64/mysql
[root@master ~]# rm -rf /etc/selinux/targeted/active/modules/100/mysql
安装MySQL8
进入之前上传安装包的目录,执行安装命令(注意顺序):
[root@master huitian]# rpm -ivh mysql-community-common-8.0.23-1.el7.x86_64.rpm
[root@master huitian]# rpm -ivh mysql-community-client-plugins-8.0.23-1.el7.x86_64.rpm
[root@master huitian]# rpm -ivh mysql-community-libs-8.0.23-1.el7.x86_64.rpm
[root@master huitian]# rpm -ivh mysql-community-client-8.0.23-1.el7.x86_64.rpm
[root@master huitian]# rpm -ivh mysql-community-server-8.0.23-1.el7.x86_64.rpm
数据库初始化
[root@master ~]# mysqld --initialize --user=mysql --lower-case-table-names=1 --basedir=/home/mysql --datadir=/home/mysql/data
[root@master ~]# chown mysql:mysql /home/mysql -R
[root@master ~]# chown mysql:mysql /var/lib/mysql -R
注意
- lower-case-table-names: MySQL8 默认大小写敏感,值
1
即可忽略 - basedir:基本目录
- datadir:数据目录
启动MySQL,并设置开机自启
[root@master ~]# systemctl restart mysqld.service && systemctl enable mysqld
检查MySQL启动状态
[root@master ~]# systemctl status mysqld.service
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since 三 2021-01-27 01:08:54 CST; 25s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 15559 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 15603 (mysqld)
Status: "Server is operational"
Tasks: 38
CGroup: /system.slice/mysqld.service
└─15603 /usr/sbin/mysqld
可以看到Active是active(running)表示MySQL正在运行
安装完成接下来准备登陆mysql,但是还不知道密码,所以需要先查询mysql预设的root密码
[root@master ~]# grep "password" /var/log/mysqld.log
2021-01-26T17:06:01.232072Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: WMWhXk+HI8es
那么我本机的密码就是WMWhXk+HI8es
登陆数据库
[root@master ~]# mysql -u root -p
修改root用户的密码123456
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
创建操作用户
mysql> create user 'lottery'@'%' identified by '123456';
mysql> create user 'survey'@'%' identified by '123456';
自此CentOS安装MySQL8就完成了,另一台服务器也按照同样的方法进行安装即可
配置主服务器 master
- 首先我们在master上创建两个测试数据库
lottery
、survey
mysql> create database lottery default character set utf8 collate utf8_general_ci;
mysql> create database survey default character set utf8 collate utf8_general_ci;
- 授权survey数据库给之前创建的
lottery
、survey
用户
mysql> grant all privileges on lottery.* to 'lottery'@'%';
mysql> grant all privileges on survey.* to 'survey'@'%';
3.接下来编辑主服务器下的/etc/my.cnf文件,修改MySQL配置
[root@master ~]# cp /etc/my.cnf /etc/my.cnf.bak
[root@master ~]# vim /etc/my.cnf
然后在[mysqld]
下方添加如下配置
# 配置默认编码为utf8
character_set_server=utf8
init_connect='SET NAMES utf8'
# 主从配置
# 要给从机同步的库
binlog-do-db=survey
binlog-do-db=lottery
# 不给从机同步的库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 自动清理30天前的log文件
expire_logs_days=30
# 启用二进制日志
log-bin=mysql-bin
# 服务器唯一ID,一般用服务器内网IP最后一段
server-id=140
- 然后重启mysql服务已使配置生效
[root@master ~]# systemctl restart mysqld
- 重启之后从新连接进入数据库查看log_bin是否成功开启:
mysql> show variables like '%log_bin%';
如下图所示:
- 接下来创建一个
backup
用户并授权用于同步数据
mysql> create user 'backup'@'%' IDENTIFIED BY '123456';
mysql> grant file on *.* to 'backup'@'%';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%';
- 然后查询主服务器的状态(后面配置从服务器需要主服务器的
日志名称
、position
号)
mysql> show master status;
查询结果如下图所示:
配置从服务器 slave
同样的我们先添加lottery
、survey
数据库并授权给lottery
、survey
用户
mysql> create database lottery default character set utf8 collate utf8_general_ci;
mysql> create database survey default character set utf8 collate utf8_general_ci;
mysql> grant all privileges on lottery.* to 'lottery'@'%';
mysql> grant all privileges on survey.* to 'survey'@'%';
- 接下来编辑从服务器下的
/etc/my.cnf
文件,修改MySQL配置
[root@slave ~]# vim /etc/my.cnf
# 加上以下参数可以避免更新不及时,SLAVE 重启后导致的主从复制出错。
read_only = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
# 配置从服务器
server-id=141
- 然后重启mysql服务已使配置生效
[root@slave ~]# systemctl restart mysqld
- 在从服务器上设置主服务器,记得在从服务器的host中添加
master主服务器ip
mysql> change master to master_host='master',master_port=3306,master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=921;
Query OK, 0 rows affected, 9 warnings (0.67 sec)
- 设置完成后查看服务器状态
# 开启同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.09 sec)
# 查看从服务器状态
mysql> show slave status\G
如下图所示,则表示配置主从成功
Slave_IO_Running
为yes
Slave_SQL_Running
也为yes
如果配置完成之后发现Slave_IO_Running为NO或者Slave_SQL_Running为NO,则可以从Last_IO_Error或者Last_SQL_Errno查看错误原因。
常见失败原因分析
连接超时
检查两台机器网络是否连通,首先使用ping命令,如果是可以ping通的,在从服务器使用MySQL远程登录命令登录主服务器的backup
用户
[root@slave ~]# mysql -h master -ubackup -p
如果可以ping通,却连接不上,需要检查主服务器的防火墙是否成功关闭,且backup用户的host为’%’,如果可以连接上,配置也没有问题的话可以尝试重启主服务器的Mysql,然后重启从服务器的MySQL
[root@slave ~]# systemctl restart mysqld
如果重启还是连接不上,可以尝试重新开启同步
mysql> stop slave;
mysql> start slave;
创建backup用户失败
在失败后重新在从服务器配置主服务器之后导致Last_SQL_Errno报错创建backup用户失败,则需要检查从服务器是否已经有backup用户了
mysql> use mysql;
mysql> select user from user;
如果查询出来确实有backup用户,则删除掉backup用户,并刷新权限
mysql> delete from user where user = 'backup';
mysql> flush privileges;
如果没有backup用户(已经删除了)却仍然报此错误,则可能是没有刷新权限导致的,可以尝试重新刷新一下权限试试
mysql> flush privileges;
至此,CentOS7 下 MySQL8 主从配置结束。