centos中mysql的安装(yum方式),及主从复制配置(一主两从)

一,mysql的基本安装(yum方式)
① # 下载mysql源安装包
shell> wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm# 安装mysql源shell> yum localinstall mysql57-community-release-el7-8.noarch.rpm
检查mysql源是否安装成功
shell> yum repolist enabled | grep "mysql.*-community.*"
②安装MySQL
shell> yum install mysql-community-server
③启动MySQL服务
shell> systemctl start mysqld
shell> systemctl enable mysqldshell> systemctl daemon-reload

④修改root默认密码
先查看临时密码
shell> grep 'temporary password' /var/log/mysqld.log
登录
shell> mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Zhiyuan2018!';
授权
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Zhiyuan2018!' WITH GRANT OPTION;
刷新权限
mysql> FLUSH   PRIVILEGES;
⑤修改默认编码为utf-8
修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示:
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
⑥重启服务
shell> systemctl restart mysqld

二,主从配置(一主两从)

①准备阶段
在局域网中准备三个节点的集群,主机名分别为master,slave1,slave2
,ip分别为192.168.30.101,192.168.30.102,192.168.30.103
主机之间可以互相ping通,每个主机上面都已经按照如上配置好,并且都已经运行了mysql服务,且假设所有的mysql数据库的root用户的密码都为Zhiyuan2018!

②配置mysql的/etc/my.cnf文件
shell> vi /etc/my.cnf
centos中mysql的安装(yum方式),及主从复制配置(一主两从)

添加三行配置
log-bin=mysql-bin
binlog_format=mixed
server-id=101
其中server-id起到标识作用,一般用ip地址最后一个10进制值如192.168.30.101就取101,其他两台机器中的/etc/my.cnf文件也这样添加三行,修改最后的server-id分别为102,103

配置好之后把所有的mysql服务都重启
使用命令 systemctl restart mysqld

③设置主mysql数据库(master)
我们选择第一台master为主数据库,ip为192.168.30.101,此时每个mysql服务都只有一个root用户,所以我们暂时使用root用户来搭建主从复制

登录
mysql -u root -p
输入密码
centos中mysql的安装(yum方式),及主从复制配置(一主两从)
此时将复制的权限给到root用户
mysql > GRANT replication slave ON *.* TO 'root'@'%' IDENTIFIED BY 'root用户的密码'; 
刷新权限
mysql> FLUSH   PRIVILEGES;
接下来执行
mysql> show master status;
查看主服务器BIN日志的信息(执行完之后记录下这两值,然后在配置完从服务器之前不要对主服务器进行任何操作,因为每次操作数据库时这两值会发生改变).
centos中mysql的安装(yum方式),及主从复制配置(一主两从)
记录下来file,和position两项的值
原理:
mysql主从复制是通过日志文件来实现的,主数据库每次执行完操作都往日志中写入操作事件,而主数据库从日志文件中读取操作操作事件,之后再在本地数据库执行,所以我们需要知道日志文件的名字,和日志最新的定位,position用于对操作的定位,可以设置从数据库执行操作的开始点。

④设置从数据库(slave1,slave2)
shell> mysql -uroot -p
输入密码

此时如果slave已经启动,则先关闭
mysql> stop slave;

此时输入
mysql> change master to
mysql> master_host = "192.168.30.101",
mysql> master_user = "root",
mysql> master_password = "Zhiyuan2018!",
mysql> master_log_file = "mysql-bin.000005",
mysql> master_log_pos = 56531;
此时,master_host是主数据库ip地址,master_user是主数据库有复制权限的用户,此处为root用户,密码为root用户的密码,master_log_file为从主数据库中查询出来的(第四步操作中show master status;指令的结果中,file的值),master_log_pos也是从主数据库中查询出来的(第四步操作中show master status;指令的结果中,position的值,但是也可以自己设置,这样从数据库可能会有错误)

启动slave功能
mysql> start slave;

查看slave的状态
msyql> show slave status\G;
centos中mysql的安装(yum方式),及主从复制配置(一主两从)
如果此时发现,slave_io_running 和 slave_sql_running两项的值都为yes值时,说明主从复制配置成功

用以上相同的方法,配置第二个msyql从数据库的slave功能

⑤测试主从复制功能
在mysql主数据库上执行
mysql> create database test;
mysql> use test;
mysql> create table helloworld (
mysql> id int ,
mysql> name varchar(20)
mysql> );
mysql> insert into helloworld values(1,'yifan'),(2,'changfu'),(3,'jinzhou');
centos中mysql的安装(yum方式),及主从复制配置(一主两从)

此时到slave1上面执行
mysql> show databases;
mysql> use test;
mysql> show tables;
mysql> select * from helloworld;
centos中mysql的安装(yum方式),及主从复制配置(一主两从)

发现主从复制成功

此时在mysql主库(192.168.30.101)执行:
mysql> show master status;
centos中mysql的安装(yum方式),及主从复制配置(一主两从)
之后再在从数据库(slave2,192.168.30.102)上面执行:
mysql> show slave status\G;
centos中mysql的安装(yum方式),及主从复制配置(一主两从)
对比两张图中的红色方框内容,发现刚刚的sql语句的日志文件业已更新,并复制到丛库中
之后再检查另一个丛库(slave2,192.168.30.103)

⑥复制出错
当在丛库执行show slave status\G;时,发现:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
此时可能是由于主数据库的波动问题

解决方法:
在主数据库(master)中执行
mysql> flush logs;
mysql> flush master status;
记录下此时的file和position的值
centos中mysql的安装(yum方式),及主从复制配置(一主两从)

在从数据库中(slave1,slave2)中执行
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=154;
请注意一一对应关系,填充的值都是从主数据库中查出的最新值

启动slave功能
mysql> start slave;
centos中mysql的安装(yum方式),及主从复制配置(一主两从)
发现slave功能已经正常,此时再用相同的方法设置其他从数据库