1.Linux安装mysql方法
linux安装mysql有多种方式:
- 像直接解压缩tar包,然后配置my.cnf(window中的mysql配置文件是my.ini)并使用命令启动mysql
- 像centos7自带mariadb(这个可以与mysql库对照使用,功能几乎一样)数据库
- 也可以使用rpm安装
- 也可以使用docker安装等。本文使用rpm安装方式。
2.Centos7通过rpm方式安装mysql(5.7.36)
1.centos7排除mariadb(以防与mysql冲突)
Centos7可能默认有 mariadb,可能与mysql安装有冲突,使用rpm -qa | grep mariadb看mariadb是否存在
若存在:
- 使用rpm -e --nodeps mariadb-*全部删除:
- 使用yum remove mysql mysql-server mysql-libs compat-mysql51全部删除;
俩条命令同时执行一下
mysql安装包版本:
2.以下操作在mysql主从服务器同步操作
这里我首先在主服务器上执行了一遍,故以下图片展示仅为从服务器执行操作
- 1.在/usr/local/下新建文件夹solf并将mysql安装包上传
-
2.cd /usr/local/solf,此时路径和包如图
-
3.执行tar –xvf mysql-5.7.36-1.el7.x86_64.rpm-bundle.tar,解压如下所示
- 4.rpm安装顺序
rpm -ivh mysql-community-common-5.7.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.36-1.el7.x86_64.rpm
注:安装mysql-community-server-5.7.36-1.el7.x86_64.rpm
若出现以下错误(这里我没有按顺序安装,是直接安装service出现的问题):
分别使用yum安装相关(若遇到询问全选y,要不就直接回车)
yum install libaio
yum install perl
yum -y install net-tools
安装成功后会创建mysql组、mysql用户。数据库目录的属组为mysql:mysql。使用find / -name mysql查看相关信息如下:
-
5.查看mysql状态service mysqld status,结果如下:
这个代表mysql未启动,使用service mysqld start启动mysql。
Mysql安装以后就是开机启动,故不需要设置了。 6.此时mysql已经安装成功,需要配置一下密码并授权远程登陆
使用vi /etc/my.cnf,打开mysql配置添加skip-grant-tables配置(跳过密码检查)
现在登录mysql不需要密码登录,使用mysql –uroot –p
直接登录
修改root密码(方法很多):
update mysql.user set authentication_string=password('123456') where user='root';
执行flush privileges;
(即刻生效)
退出,编辑vi /etc/my.cnf
,删除或者注释掉skip-grant-tables
最后使用systemctl restart mysqld.service
命令重启mysql服务。
再次登录mysql,可能会有这俩个错误:
一个是必须重置密码才能操作,一个是密码设的太简单也会报错
解决办法:
输入命令set global validate_password_policy=0;
这行命令的意思是mysql开启简单密码校验
set global validate_password_length=4;
这行命令意思是校验长度为4位
然后使用alter user 'root'@'localhost' identified by '123456';
重新设置密码
授权远程登录:
grant all privileges on *.* to 'root'@'%' identified by '123456';
执行flush privileges;
其中%代表允许所有主机远程登录,若只想允许某台主机远程登录,将%换为远程主机地址就可以
至此centos7安装mysql成功。
3.mysql主从搭建
1.配置主机ip及名字
首先在俩台服务器上打开vi /etc/hosts
文件,文件最底下加入mysql主从服务器ip配置。
主机ip地址 主机名称
例:172.30.11.12(你自己的服务器地址) master
172.30.11.13 slave- 两台主机都关闭防火墙和SELinux服务
关闭防火墙命令如下:
systemctl stop firewalld; //关闭防火墙
systemctl disable firewalld; //将防火墙设置开机不自启
关闭selinux服务:
vi /etc/selinux/config
//进入到此目录下将selinux的状态设置为disabled
再使用 set enforce 0 命令将selinux的修改生效
- 两台主机都关闭防火墙和SELinux服务
3.主从配置
1.mysql主服务器配置(master节点)
修改my.cnf配置文件,vi /etc/my.cnf
,在[mysqld]下任意位置加
#保持唯一,我是根据主机地址最后一位命名的
server-id=14
#开启binlog,指定binlog的文件前缀
log-bin=mysql-bin
修改结果如下:
退出,重启mysql服务,
systemctl restart mysqld.service
登录进mysql,检查binlog是否开启,on为开启,命令
show variables like '%log_bin%';
如图所示:在主节点master数据库上创建一个mysqlsync用户让从节点slave连接,并赋予从节点同步主节点数据库的权限,
grant replication slave on *.* to 'mysqlsync'@'slave节点ip' identified by '123456';
检查主节点状态:show master status;
2.配置从节点(slave)
测试slave连接master数据库:
mysql –h 主节点ip或者hosts中配置的名字 –u 用户名 –p密码 –P端口
例:mysql -h mysqlmaster -u mysqlsync -pmysqlsync -P 3306
注意:-p和密码直接不能有空格
修改my.cnf配置文件,内容如下:
[mysqld]
#保证该id唯一
server-id=15
#中继日志
relay_log=relay-log
#设置只读,开启读写分离
read_only=ON
展示如下:
重启mysql服务,
systemctl restart mysqld.service
并绑定master节点:
change master to master_host='192.168.56.14',master_user='mysqlsync',master_password='mysqlsync';
开启从节点服务。使用命令
show slave status\G;
并查看从节点服务状态,如果Slave_IO_Running
和Slave_SQL_Running
的状态都为YES
,则从节点服务开启成功。查询结果如图所示。使用命令开启
start slave;
查看
show slave status\G;
- 4.测试,在master新建数据库test,导入或者新建表,刷新slave数据库,数据库及表都同步过去了
4.保证从库可以同步主库数据,且存库是只读的
在slave库中需要设置set global read_only=1;
并将root设置为只能本地连接,新创建slave用户去同步主库。
Slave用户只授予所有库的查询权限:
show grants;
展示当前用户的所有权限
show grants for 'username'@'host';
查看某个用户的所有权限
grant select on *.* to 'subslave'@'%';
授予subslave用户所有库和表的查询权限
grant all priveleges on mysql.* to ‘subslave’@’%’
授予subslave用户mysql库中所有表的操作权限。
Revoke all privileges on databasename.tablename from 'username'@'host';
回收权限。
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
设置密码
5.主从的一些命令使用:
1.主:
show master status;
查看主库状态信息
reset master;
清除binlog日志信息
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个
PURGE BINARY LOGS TO 'mysql-bin.000002';
删除mysql-bin.000002之前的日志(不包括mysql-bin.000002)
PURGE BINARY LOGS BEFORE '2017-12-15 11:53:59';
删除2017-12-15 11:53:59时间点之前的日志
2.从:
start slave; 开启从库
show slave status\G; 查询slave状态信息,可以观察binlog文件,relaylog文件,io是否正常等信息
stop slave; 停止从库
reset slave; relay log日志清除
问题:
若见到以下俩个有一个为no
可采用如下解决方式:(一般情况下方式1就可解决)
- 解决方式1
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
一般是事务回滚造成的:
stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave; - 解决方式2
首先停掉Slave服务:slave stop,再到主服务器上查看主机状态:记录File和Position对应的值。
进入master,show master status;就可以看到值
然后到slave服务器上执行手动同步:
change master to
master_host='master_ip',
master_user='user',
master_password='pwd',
master_port=3306,
master_log_file='bin.000130', // 配置bin_log日志
master_log_pos=33622483 ; // 配置bin_log日志的位置
可能会报错:log_file 不存在,这是需要查看从数据库服务器中mysql的 log文件目录下,master_log_file 是否存在? 不存在时,直接从主数据服务器中复制过来即可。
6.总结
刚开始学习mysql主从搭建以为特别难,故自己搭建虚拟机安装mysql并配置主从,但是发现配置主从不是特别麻烦。这里建议使用docker搭建mysql主从,应该会方便不少,如果学习的,可以走一遍安装配置流程。