Mysql 主从复制
主从复制工作原理
Master : 对数据有改变的语句操作(insert,drop,update,delete,create,alter)会写到Binary log 里面
Slave: slave服务器所有的数据都是来源于Master
Slave怎么同步?
I/O thread : 读取主服务器上Binary log (有变化的), 将读过来的二进制内容写到 Relay log 里面
SQL thread: 监测relay log ,从Relay log 里面的语句读出来,处理 replay (重放)操作,在slave 上操作
主从复制二进制日志类型
Binlog_format = statement
每一条修改数据的SQL 语句都会被记录到Master 端的bin-log 中,
slave 端在复制的时候SQL线程会解析成和原来的Master 端执行过的
相同的SQL语句再次执行
优点: 日志记录量少
缺点: 有可能数据不一致 (比如计算时间的函数的SQL语句,拿到从服务器来执行就会造成数据不一致)
Binlog_format = row (官网推荐)
日志中记录每一行数据被修改的形式,然后在slave 端执行相同的数据修改
优点:避免数据不一致
缺点:日志量急据扩大(比如一次性update 10 万条记录),某些情况下还会使用statement
Binlog_format = mixed
根据具体SQL 语句来选择日志的记录形成
Master 主服务器配置 (MySQL 5.7.10)
vim /etc/my.cnf
[mysqld]
log_bin=master-bin
binlog_format=row
server_id=11
datadir=/var/lib/mysql //数据库文件的路径,可根据实际情况修改
socket=/var/lib/mysql/mysql.sock
character_set_server=utf8
max_connections=2000
log_timestamps=SYSTEM
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
【root@WEB-01 mysql] systemctl restart mysqld
查看初始化是否成功
ls /var/lib/mysql // 查看目录下面是否有数据库的目录(mysql 目录,sys 目录)生成
如果初始化没成功,rm -rf /var/lib/mysql/* , 重新初始化。
mysql -uroot -p
mysql>grant replication slave on *.* to 'repuser'@'slaveip' identified by 'Xsjy%123';
mysql>flush privileges;
mysql>select user,host from mysql.user; //查看授权用户
mysql>show grants for repuser@'slaveip'; //查看授权用户情况
mysql>show master status\G
*******************************************************************************************
从服务器配置
[mysqld]
log_bin=slave-bin
binlog_format=row
relay_log=relay_bin
server_id=12
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character_set_server=utf8
max_connections=2000
log_timestamps=SYSTEM
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
【root@WEB-01 mysql] systemctl restart mysqld // 初始化启动从数据库
mysql -u root 登录mysql
// 设定主服务器的相关信息
mysql>change master to master_host='10.25.190.201',master_user='repuser',master_password='Xsjy%123',master_log_file='master-bin.000001',master_log_pos=1048,master_port=3306;
master_host : 主服务IP
master_user: 主服务器允许复制的用户名
master_password: 密码
master_log_file : 当前日志文件的名称 在主服务器上用 show master status\G 查看相关信息
master_log_pos : 当前日志文件的位置
mysql>start slave;
mysql>show slave status\G
查看这两个进程是否yes
Slave_IO_Running: yes
Slave_SQL_Running: yes