mysql主从复制原理 binlog
mysql主从复制依赖于mysql二进制日志文件,主mysql服务器会生成二进制日志文件,传递给从服务器执行
mysql从库同步有两个进程,一个io进程用来同步binlog,一个sql进程用来执行relaylog里的数据
目前mysql主从架构还是比较常见的,数据的重要性

实验环境
192.168.237.128 主库
192.168.237.129 从库
mysql主库的配置,需要新增二进制日志binlog配置
[mysqld]
bind-address=0.0.0.0
port=3306
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
skip-name-resolve
slow_query_log=on
long_query_time=1
slow_query_log_file=/data/mysql/mysql-slow.log
innodb-file-per-table=1
innodb_flush_log_at_trx_commit = 2
log_warnings = 1
connect_timeout = 60
net_read_timeout = 120
performance_schema_max_table_instances = 400
server-id = 1
log-bin=master-bin
log-bin-index = master-bin.index

[mysqld_safe]
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid

mysql主服务器binlog配置
server-id #binlog配置需要给mysql服务器设置id用来标识mysql服务器,每个mysql服务器都有不一样的id。从1开始标识
log-bin #开启binlog,mysql主服务器都需要开启
log-bin-index #binlog存放到文件里面,index里面存放着binlog的文件名
最好再配置文件里指定log-bin和log-bin-index,否则默认的时服务器的名称,若服务器名称更改,服务重启之后则log-bin和log-bin-index的名字会随着变换,主从复制会失败。
启动mysql主库
创建数据目录
数据初始化
启动mysql:systemctl start mysql
验证启动

mysql从库新增中继日志relaylog配置
[mysqld]
bind-address=0.0.0.0
port=3306
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
skip-name-resolve
slow_query_log=on
long_query_time=1
slow_query_log_file=/data/mysql/mysql-slow.log
innodb-file-per-table=1
innodb_flush_log_at_trx_commit = 2
log_warnings = 1
connect_timeout = 60
net_read_timeout = 120
performance_schema_max_table_instances = 400
server-id = 2
relay-log = relay-log
relay-log-index = relay-log.index

[mysqld_safe]
log-error=/data/mysql/mysqld.log
pid-file=/data/mysql/mysqld.pid

配置说明
server-id #每台mysql服务器的标识需要不一样
relay-log #从库需要开启relay-log,中继日志
relay-log-index #relaylog也放到文件里面,index里存放着relaylog的文件名

启动mysql从库
创建数据目录
数据初始化
启动数据库

登录到数据库验证
mysql -uroot -h 127.0.0.1 -p

两台数据库独立的,但binlog文件已经有,relaylog还没有
ll -h /data/mysql

mysql的binlog说明
主从复制依赖于二进制日志文件,简称为binlog
binlog里面有存放了偏移信息
mysql主库binlog信息查看命令,登录到mysql里
show master logs; #binlog列表查看
show master status; #记录目前的binlog+偏移信息

创建库创建表初始binlog
create database shijiange;
use shijiange;
create table test (id int);
查看binlog的两种方式
show binlog events in 'master-bin.000003';
show binlog events in 'master-bin.000003' limit 2;
show binlog events in 'master-bin.000003' from 120;
show binlog events in 'master-bin.000003' from 120 limit 1;

命令查看binglog日志:
mysqlbinlog master-bin.000003;

增删改查,然后查看binlog
use shijiange;
insert into test values (1); #插入数据
update test set id = 3 where id = 1; #更新数据,有事务的提交
select * from test; #无数据的改变,无需记录binlog
delete from test; #删除数据,事务提交
use mysql;
insert into test values (1); #错误sql不会写入binlog

mysql主库binlog清空,测试教学环境用,线上环境慎用。或者初搭建mysql主从用
reset master; #清空master的binlog日志
show master logs;

mysql主库刷新binlog,一般来说也是测试环境用
flush logs; #增加一个二进制日志
show master logs; #查看binlog日志
show binlog events in 'master-bin.000001'; #记录了下一个binlog的文件名和索引
show binlog events in 'master-bin.000002';
测试数据删除
drop database shijiange;
reset master;

mysql主从复制的配置步骤概述
mysql主库需要给从库复制的权限
从库使用命令去同步主库的数据

mysql主从复制主库的配置
主库需要给从库复制的权限,一般从都有自己的ip,一台从库放开一个ip

mysql主从复制从库的配置
主库服务器的ip
主库服务器的端口
主库服务器的binlog文件名+索引
用户名和密码

主库开放给从库复制的权限,replication slave权限
grant replication slave on . to 'replication'@'192.168.237.129' identified by 'shijiange';
flush privileges;

从库同步之前,实验是先在主库执行
reset master;

从库使用命令去同步主库。主库ip、主库端口、用户名、密码、binlog文件名、索引
change master to
master_host='192.168.237.128',
master_port=3306,
master_user='replication',
master_password='shijiange',
master_log_file='master-bin.000001',
master_log_pos=120;

从库的启动、关闭、状态
start slave; #启动主从同步
stop slave; #关闭主从同步
show slave status\G #查看主从同步的状态,注意以下三个状态
Slave_IO_Running: Yes #io进程,用来传输binlog
Slave_SQL_Running: Yes #sql进程,用来读取执行binlog里的内容
Seconds_Behind_Master: 0 #主从同步的延时为0
show processlist; #查看主从同步的进程

创建库、创建表、增删改查验证同步是否正常,查看binlog日志
create database shijiange;
use shijiange;
create table test( id int );
insert into test values (1);
update test set id = 3 where id = 1;
delete from test;
drop database shijiange;