准备两台虚拟机mysql-master和mysql-slave,分作作为主机和备机,对MySQL主备机进行模拟。
为了方便操作,在开启虚拟机后,可以改用MobaXterm连接虚拟机进行操作。
下载MySQL安装包
wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
rpm -ivh mysql57-community-release-el7-9.noarch.rpm
cd /etc/yum.repos.d/
yum install mysql-server
启动mysql服务
systemctl start mysqld
查看临时密码
grep 'temporary password' /var/log/mysqld.log
show variables like '%validate_password%'; //查看密码相关默认配置
set global validate_password_policy=LOW; //可选,只验证长度
set global validate_password_length=6; //可选,密码长度为6位
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; //修改密码
MySQL默认是没有开启远程控制的,必须添加远程访问的用户,即默认是只能自己访问,别的机器是访问不了的。
use mysql;
select Host, User,authentication_string,plugin from user; // 查看主机、用户名和密码
update user set Host='%' where User='root'; // 把主机设置为%,即任意主机
flush privileges;
flush privileges: 当我们直接用DML语句修改系统权限表(mysql.user、mysql.db、mysql.tables_priv、mysql.columns_priv)时,内存中的权限数组是不会同步更新的,此时我们就需要flush privileges来更新内存权限数据了。
设置mysql开机启动
systemctl enable mysqld
设置mysql编码
vi /etc/my.cnf
添加 [mysqld] character_set_server=utf8 init_connect=‘SET NAMES utf8’
以上搭建模拟好了MySQL的主从环境。
角色 | IP | OS/MySQL版本 |
---|---|---|
主数据库 | 192.168.11.10 | CentOS7 / MySQL5.7 |
备数据库 | 192.168.11.30 | CentOS7 / MySQL5.7 |
从库生成两个线程,一个I/O线程,一个SQL线程;i/o线程去请求主库 的binlog,并将得到的binlog日志写到relaylog(中继日志) 文件中;主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
- 使用场景:
- 灾备
- 读写分离
- 数据备份
主机
编辑mysql配置文件
vi /etc/my.cnf
在文件末尾添加:
log_bin=master-bin
server-id=10010 #不要和别的冲突
expire-logs-days=7
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys
重启mysql
systemctl restart mysqld
登录MySQL,并创建从库用户,并为它授权
create user 'repl'@'192.168.11.30' identified by '123456';
GRANT REPLICATION SLAVE ON *.* to 'repl'@'192.168.11.30' identified by '123456'; //REPLICATION SLAVE权限可以查看从服务器,从主服务器读取二进制日志。
注意(补充):当创建用户提示密码验证失败的话,可执行以下命令
show variables like '%validate_password%'; //查看密码相关默认配置
set global validate_password_policy=LOW; //可选,只验证长度
set global validate_password_length=6; //可选,密码长度为6位
在备机测试登录主数据库
mysql -h 192.168.11.10 -u repl -p123456 // 在备机上登录
systemctl status firewalld.service // 查看防火墙状态
systemctl stop firewalld.service // 关闭防火墙
systemctl disable firewalld.service // 禁止防火墙开机启动
确认防火墙关闭后,再尝试登录mysql。
备机
编辑mysql配置文件/etc/my.cnf
server-id = 10011 #不要和别的冲突
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
重启mysql。
在主库查询以下命令
show master status;
登录mysql从数据库,指令以下命令
change master to
master_host='192.168.11.10',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='master-bin.000004',
master_log_pos=154;
查看从数据库状态
start slave;
show slave status \G;
当看到Slave_IO_Running和Slave_SQL_Running的值均为Yes时,表示MySQL主备搭建成功。
在主数据库创建一个数据库test
在被数据库可以看到主数据刚创建的test数据库
可以看到对主数据库的修改都会被同步到从数据库中。