MySQL主从复制原理
master主: 有一个线程,记录本地的增删改操作,写入本地的binlog日志 。
slave从:有两个线程:
I/O线程,去master读取binlog日志,如果有变化,拿回本地,并写入relaylog
SQL线程,读取本地的relaylog,如果有新的sql语句,在自己本地的数据库中执行此sql。保持与master同步。
主服务器数据库的每次操作都会记录在其二进制文件mysql-bin.xxx(该文件可以在mysql目录下的data目录中看到)中,从服务器的I/O线程使用专用账号登录到主服务器中读取该二进制文件,并将文件内容写入到自己本地的中继日志relay-log文件中,然后从服务器的SQL线程会根据中继日志中的内容执行SQL语句
项目场景
- 主服务器master 1.1.1.1
- 从服务器Slave 1.1.1.2
配置
主服务器
#开启二进制
vim /etc/my.cnf
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
#重启mysql
/etc/init.d/mysqld restart
#创建允许从服务器同步数据的账户
#创建slave账号user,密码123456
mysql> grant replication slave on *.* to 'user'@'1.1.1.2' identified by '123456';
#更新数据库权限
mysql>flush privileges;
#查看master状态
mysql> show master status;
mysql> show master status\G;
从服务器
vim /etc/my.cnf
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#重启mysql
#执行同步命令,设置主服务器ip,同步账号密码,同步位置
mysql> slave stop;
mysql> change master to 变更用户和切割日志位置
-> master_host='1.1.1.1',
-> master_port=3306,
-> master_user='user', 修改哪个加哪个
-> master_password='123',
-> master_log_file='binlog.000006', 二进制日志
-> master_log_pos=0; master状态号
or
mysql> change master to master_host='10.1.1.1', master_user='user', master_password='123', master_log_file='binlog.000006', master_log_pos=0;
#开启同步功能
mysql> start slave;
#查看slave状态
mysql> show slavestatus;
mysql> show slave status\G
Slave_IO_Running: Yes 两个都为yes说明没有问题
Slave_SQL_Running: Yes