本文从以下几个方面介绍在CentOS中安装mysql8,并基于两台服务器搭建主从环境
rpm -qa |grep mysql
我的机器上没有查出已安装的mysql软件包,如果有查询出对应的软件包,则使用如下命令进行删除
sudo yum remove 软件包名
rpm -qa |grep mariadb
可能的结果如下:
mariadb-libs-5.5.56-2.el7.x86_64
使用如下命令进行删除
sudo rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
接下来查询mysql的配置文件
sudo find / -name mysql
我本机显示的结果如下:
/etc/selinux/targeted/active/modules/100/mysql
/usr/lib64/mysql
使用如下命令进行清除:
sudo rm -rf /etc/selinux/targeted/active/modules/100/mysql
sudo rm -rf /usr/lib64/mysql
wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
sudo yum -y install mysql80-community-release-el7-3.noarch.rpm
安装完成后会在/etc/yum.repos.d/目录下生产两个repo文件
mysql-community.repo
mysql-community-source.repo
接下来更新yum缓存
yum clean all
yum makecache
更新完成之后查询yum仓库中的mysql
yum list | grep mysql
可以看到mysql-community-server.x86_64软件包,接下来安装mysql-community-server
sudo yum -y install mysql-community-server
启动MySQL
systemctl start mysqld.service
检查MySQL启动状态
systemctl status mysqld
可以看到Active是active(running)表示MySQL正在运行,接下来设置mysql开机自启动
systemctl enable mysqld
安装完成接下来准备登陆mysql,但是还不知道密码,所以需要先查询mysql预设的root密码
grep "password" /var/log/mysqld.log
显示结果如下:
2019-07-15T04:06:42.304918Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: f0q11Quasj*k
那么我本机的密码就是f0q11Quasj*k
登陆数据库
mysql -uroot -p
默认密码记忆难度确实有点高,这边我们登陆进去之后首先修改root的默认密码(mysql8的密码安全策略比较严格,需要包含大小写字母,数字,符号,并且长度不能少于8位)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Purepgmr-2019';
我们再创建一个用于其他电脑连接的用户,默认root用户的host是localhost的,只有本机才能连接.
create user 'test'@'%' identified by 'Purepgmr-2019';
此时我们使用连接工具,如Navicat等进行连接,会发现连接被拒绝,原因是CentOS7自带了firewall防火墙,我们把firewall防火墙给关闭了(如果使用的是阿里云或者华为云等云服务器,直接去云控制台上开启3306端口即可,不需要关闭firewall)
systemctl stop firewalld.service
并将firewal的开机自启动给关掉
systemctl disable firewalld.service
自此CentOS安装MySQL8就完成了,另一台服务器也按照同样的方法进行安装即可
当两台服务器都安装完成后,接下来进行两个数据库的主从配置,首先我的两个服务器ip分别为10.211.55.3,10.211.55.4,在这里为了方便配置,我们修改host命名10.211.55.3为node1,10.211.55.4为node2,将node1作为主机.
create database test default character set utf8mb4 collate utf8mb4_general_ci;
grant all privileges on test.* to 'test'@'%';
3.接下来编辑主服务器下的/etc/my.cnf文件,修改MySQL配置
sudo vi /etc/my.cnf
然后在mysqld下方添加如下配置
# 配置默认编码为utf8
character_set_server=utf8mb4
init_connect='SET NAMES utf8mb4'
# 主从配置
# 要给从机同步的库
binlog-do-db=test
# 不给从机同步的库
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=3
systemctl restart mysqld
show variables like '%log_bin%';
show master status;
create user 'backup'@'%' IDENTIFIED BY 'Purepgmr-2019';
grant file on *.* to 'backup'@'%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%';
同样的我们先添加test数据库并授权给test用户
create database test default character set utf8mb4 collate utf8mb4_general_ci;
grant all privileges on test.* to 'test'@'%';
# 配置从服务器
server-id=4
#加上以下参数可以避免更新不及时,SLAVE 重启后导致的主从复制出错。
read_only = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
systemctl restart mysqld
change master to master_host='node1',master_port=3306,master_user='backup',master_password='Purepgmr-2019',master_log_file='mysql-bin.000001',master_log_pos=155;
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用户
mysql -h node1 -ubackup -p
如果可以ping通,却连接不上,需要检查主服务器的防火墙是否成功关闭,且backup用户的host为’%’,如果可以连接上,配置也没有问题的话可以尝试重启主服务器的Mysql,然后重启从服务器的MySQL
systemctl restart mysqld
如果重启还是连接不上,可以尝试重新开启同步
stop slave;
start slave;
在失败后重新在从服务器配置主服务器之后导致Last_SQL_Errno报错创建backup用户失败,则需要检查从服务器是否已经有backup用户了
use mysql;
select user from user;
如果查询出来确实有backup用户,则删除掉backup用户,并刷新权限
delete from user where user = 'backup';
flush privileges;
如果没有backup用户(已经删除了)却仍然报此错误,则可能是没有刷新权限导致的,可以尝试重新刷新一下权限试试
flush privileges;
至此,是我在实际开发中配置数据库主备所有的总结,因为一般主库有读写权限,而从库只有读权限,为了提高系统数据库性能,实际开发中我们一般会进行读写分离,之后我将介绍在springboot中进行读写分离配置.