1. 主从原理
引用网上的图:
- 主服务器上面的任何休息都会通过自己的I/O thread线程保存在二进制日志(bin log)里面
- 从服务器上面也会启动一个I/O thread, 通过配置好的用户名和密码,连接主服务器上面请求二进制日志,然后把读取的二进制日志写到本地的一个Relay log(中继日志)里面。
- 从服务器上面同时启动一个SQL thread 定时检查relay log(这个文件也是二进制),如果发现有更新立即把更新的内容在本机的数据库上执行一遍。
2. 配置操作
2.1 Master节点配置`/etc/my.cnf`(master节点上执行)
vim /etc/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便去
log-bin=mysql-bin
## 复制过滤: 不需要备份的数据库, 不输出
binlog-ignore-db=mysql
## 为每一个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
2.2 Slave节点配置`/etc/my.cnf`(slave节点上执行)
vim /etc/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=102
## 开启二进制日志功能,以备Slave作为其他Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=mky-mysql-relay-bin
## 复制过滤: 不需要备份的数据库, 不输出
binlog-ignore-db=mysql
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## 为每一个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或者指定类型的错误,避免slave端复制中断
## 1062错误是指一些主键重复, 1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
2.3 在Master服务器授权slave服务器可以同步权限(master节点上执行)
mysql -uroot -pmaster的密码
# 授予slave服务器可以同步master服务
grant replication slave, replication client on *.* to 'root'@'slave的ip' identified by 'slave服务器的密码';
flush privileges;
# 查看mysql 有哪些用户以及对应的ip权限
select user,host from mysql.user;
2.4 查看master服务的binlog文件名和位置(master节点执行)
show master status;
2.5 slave进行关联master节点(slave节点执行)
- 进入到slave节点
- 开始绑定
# 根据上面的show master status 查出来的结果填写
change master to master_host='master服务器的ip', master_user='root', master_password='master密码',master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=621;
# 启动
start slave;
- 查看启动状态
# 查看启动状态 (必须两个yes IO_RUNNING, SQL_RUNNING 都是yes才算成功)
show slave status \G;
常见错误:
Slave_SQL_Running:No MYSQL镜像服务器因错误停止的恢复
解决方式:
stop slave
set global sql_slave_skip_counter=1;
start slave
show salve status \G;
Slave_IO_Running:No
解决方式:
# master节点运行
show master status;
# 从节点运行
stop slave
change master to master_log_file='上面查出的结果',master_log_pos=上面查出的结果;
start slave
show salve status \G;