一、原理
1、要实现主从同步至少需要两台数据库,一台主库(master)一台从库(slave);
2、主库将数据库操作记录在本地的二进制日志(binary log)中,该过程称之为二进制日志事件;
3、从库通过IO线程读取拷贝主库的binary log到自己的中继日志文件(relay log)中;
4、最后从库通过sql 线程将relay log中的操作记录读取到自己的数据库中执行。
注:mysql的主从复制不是完全实时的,有延迟。
二、配置
主库(master):
启用二进制日志。
为master设置一个全局唯一的server_id。
创建有复制权限的用户账号 REPLIACTION SLAVE ,REPLIATION CLIENT。
1、修改master配置文件
找到mysql的配置文件,windows上是my.ini,linux上是my.cnf
vi /etc/my.cnf
加入以下配置项:
[mysqld]
#唯一id
server-id=1
#二进制日志文件
log-bin=/usr/local/mysql/data/mysql-bin
#主从同步时,忽略的数据库
binlog-ignore-db=mysql
#指定需要同步哪些数据库(默认全部数据库)
binlog-do-db=testdb
2、重启mysql服务,连接mysql
systemctl restart mysqld
mysql -uroot -p
3、检查各项配置是否生效
①查看二进制日志是否开启
②查看master信息
③查看master的server id
4、在master上创建有复制权限的用户
本地的mysql可以被: 用户copyUser,密码123456,ip为129.204.69.233的访问
grant replication slave,replication client on *.* to copyUser@'129.204.69.233' identified by '123456';
刷新权限
flush privileges;
从库(slave):
启动中继日志。
为slave设置一个全局唯一的server id。
使用有复制权限的用户账号连接至master,并启动复制线程。
1、修改slave配置文件
vi /etc/my.cnf
添加以下配置项:
[mysqld]
#唯一id
server-id=2
#中继日志文件
relay-log=/usr/local/mysql/data/relay-log
#指定要复制的数据库
replicate-do-db=testdb
2、重启mysql服务,连接mysql
systemctl restart mysqld
mysql -uroot -p
3、检查各项配置是否生效
①检查中继日志是否开启
② 查看slave的server id
3、设置主从关系
master_host:主库的ip地址,
master_port:主库的端口,
master_user:在master上创建的有复制权限的用户(上面的copyUser)
master_password:复制权限用户的密码
master_log_file:主库中二进制日志文件名,show master status查看
master_log_pos:show master status中position字段值
CHANGE MASTER TO MASTER_HOST='150.158.42.158',MASTER_PORT=3306,MASTER_USER='copyUser',MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=596;
4、启动slave
start slave;
5、查看slave运行状态
show slave status\G
如下图所示:
必须保证以下两个为yes:
Slave_IO_Running: yes
Slave_SQL_Running: yes
三、测试
1、在master上创建testdb数据库
create database testdb;
2、在slave上查看数据库
show databases;
如上图在master上创建的数据库,在slave上也有,即主从复制基本ok。