mysql主从复制环境搭建流程
一、mysql主从复制原理
- master主库会将变动的信息记录到二进制日志里
- master有一个I/O线程将二进制日志发送到slave;
- slave有一个I/O线程把master发送的二进制日志写入到relay日志里面;
- slave有一个SQL线程,安装relay日志处理slave的数据,实现同步。
二、master操作步骤
1.开启master的二进制日志功能
vim /etc/my.cnf
2.添加二进制日志配置
log-bin=master-bin
server-id=1
注意:
开启二进制(master-bin只是日志文件名称,可以自己指定)
server-id是要指定的,不然会报错,每一台指定一个唯一标识符
3.授权
提前在从库slave配置一个用户/密码的权限,然后进入master命令操作界面
mysql>GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.18.2.157' IDENTIFIED BY 'root';
注意: GRANT REPLICATION SLAVE ON *.* TO '用户名'@'slave数据库的IP地址' IDENTIFIED BY '密码'; 意思是允许在某个IP地址的某个用户以某个密码对当前数据库的所有库和所有表进行复制操作
4.刷新下权限使用命令
mysql>flush privileges;
或者直接重启mysql服务
service mysql restart;
5.查看master的状态
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 1516 | | | |
+-------------------+----------+--------------+------------------+-------------------+
File: 日志文件名称
Position: 日志所在位置
主要步骤操作截图示例:
三、slave操作步骤
1.进入slave的服务器,编辑mysql的配置文件
vim /etc/my.cnf
2.添加二进制日志配置
log-bin=master-bin
server-id=2
注意:server-id是要指定的,不然会报错,每一台指定一个唯一标识符,和主库区分开;
3.将slave指向master
mysql>CHANGE MASTER TO
>MASTER_HOST='172.18.2.150',
>MASTER_USER='root',
>MASTER_PASSWORD='root',
>MASTER_LOG_FILE='master-bin.000002',
>MASTER_LOG_POS=154;
直接将下面的复制,然后填写对应的内容信息
CHANGE MASTER TO
MASTER_HOST='master所在服务器的IP',
MASTER_USER='master授权的账号',
MASTER_PASSWORD='master授权的密码',
MASTER_LOG_FILE='master的日志文件名',
MASTER_LOG_POS=master的日志所在位置;
4.开始主从复制
在slave的mysql上执行:
mysql>start slave;
执行完这一步还要检查是否运行成功:务必不能遗漏
mysql>show slave status\G;
成功了可以看到如下的内容:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master的IP地址
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 1516
Relay_Log_File: slave-bin.000004
Relay_Log_Pos: 1117
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
Slave_IO_Running: YES 表示slave的日志读取线程开启;
Slave_SQL_Running: YES 表示SQL执行线程开启;
补充:
如果是通过复制虚拟机生成的mysql, Slave_IO_Running: No
原因是其data目类下的auto.cnf文件里的UUID的一样的,需要修改成不一样即可;
5.效果验证
我们可以在主库创建数据库,创建表或者插入数据,然后再查看从库,是否有对应的数据生成,有的话说明主从复制环境搭建成功了;
四、注意事项
1)开启了主从复制,slave库如果写入数据的话,可能导致数据回滚从而主从复制线程中断,可以通过以下方式解决:
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;
2)如果要停止slave的复制可以使用命令:
mysql>stop slave;
3)由于主从复制是基于I/O的日志,所以会存在一定延时,如果对数据一致性要求非常高的话,简单的主从复制在实际环境中会存在问题
参考文章: https://www.cnblogs.com/lay2017/p/9043985.html