1.主从原理
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
2.主从用途
mysql主从复制用途
- 实时灾备,用于故障切换
- 读写分离,提供查询服务
- 备份,避免影响业务
3.基础配置
环境 Linux centos 7+
A主数据库IP:192.168.111.111;
B从数据库IP:192.168.111.116;
4.配置主数据库A
启动mariadb.service;
1.添加一个同步账户
GRANT FILE ON . TO ‘yezt’@'192.168.111.116' IDENTIFIED BY ‘123456’;
GRANT REPLICATION SLAVE ON . TO ‘yezt’@'192.168.111.116' IDENTIFIED BY ‘123456’;
创建A数据库用户
create user 'yezt'@'%' identidied by '123456';
授权用户
grant all privileges on . to 'yezt'@'%' with grant option
2.添加一个数据库作为同步数据库
create database test;
3.创建一个表结构
create table mytest (username varchar(20),password varchar(20));
4.修改配置文件(/etc/my.cnf)
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test #要同步的数据库
5.重启服务
systemctl restart mariadb.service
进入数据库查看server-id;
mariadb>show variables like 'server_id';
6.用show master status\G命令查看日志情况
(可以用flush logs 命令来刷新得到最新的mysql-bin.000008文件)
5.设置从数据库B为slave
1.重复A的创建数据库和表结构
3.修改配置文件
Mysql版本从5.1.7以后开始就不支持“master-host”类似的参数;如果配置my.cnf会出现 [ERROR] /usr/local/webserver/mysql/libexec/mysqld: unknown variable 'master-host=192.168.111.111'的错误
所以只需要配置
之后在数据库执行
mariadb>change master to master_host='192.168.111.111', master_user='yezt', master_password='123456', master_log_file='mysql-bin.000008', master_log_pos=0;
(备注:master_log_file需要和主数据库一致,否则重新到A那flush logs,master_log_pos要设置为了,否则开始位置会出问题)
启动slave
start slave
6.用show slave status\G命令查看日志情况
正常情况如下
不正常时候last_IO_Error会报错
用生成的账户登录A数据库插入数据
从数据库得到
备注:如果从数据无法连接主数据库,尝试先关闭主数据库的防火墙
systemctl stop firewalld.service