主从复制原理
其实就是集群: 1. 负载均衡 2.数据迁移
实现主从同步(主从复制):
- master将改变的数据,记录在本地的二进制日志文件(binary log);该过程称之为:二进制日志事件
- slave将mater的binary log 拷贝到自己的relay log(中继日志文件)中
- 中继日志事件,将数据读取到自己的数据库之中
MYSQL的主从复制,是异步的,串行化的,有延迟的
master (1):slave (n)
配置步骤( 5.6版本)
配置环境: windows(mysql: my.ini) linux(mysql: my.cnf)
一mysql实例在windows系统上,另一个mysql实例在linux系统上
windows主机 linux从机
配置前,为了无误,现将权限(远程访问),防火墙等处理:
一、关闭windows/ linux 防火墙:
1)windows 右键“网络”:
2)linux:service iptables stop
二、Mysql允许远程连接(windows/linux):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;(5.6)
FLUSH PRIVILEGES;
三、文件配置---主机(以下代码和操作全部在windows中操作):
找到 my.ini 文件添加以下
[mysqld]
# id
server-id=1
# 二进制日志文件 一般放在data目录下
log-bin=""
# 错误记录文件
log-error=""
# 主从同步时,忽略的数据库
binlog-ignore-db=mysql
# (可选)指定主从同步时,同步哪些数据库
binlog-do-db=test
windows中的数据库授权哪台计算机的数据库是自己的从数据库:
GRANT REPLICATION slave,reload,super ON *.* TO 'root'@'192.168.52.%' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
查看主计算机的状态 ---》 记录 File Position的文件状态
每次在做主从同步前。需要观察主机状态的最新值便以从机使用(master_log_file master_log_pos 主机状态的最新值)
show master status;
从机(以下代码和操作全部在linux中操作):
找到my.cnf文件
# id
server-id=1
# 二进制日志文件 一般放在data目录下
log-bin=""
replicate-do-db=test
linux中的数据库授权哪台计算机中的数据库是自己的主计算机(master_log_file master_log_pos 主机状态的最新值)
CHANGE MASTER TO
MASTER_HOST = '192.168.52.1',
MASTER_USER = 'zenghongji',
MASTER_PASSWORD = '123456',
MASTER_PORT = 3306,
master_log_file = 'mysql-bin.000001',
master_log_pos=909;
如果报错: this operation cannot be performed with a running salve; run stop slave first;
解决: STOP SLAVE;
再次执行上条语句
开启主从同步:
从机linux: start slave
检查:show slave status \G
主要观察:slave_IO_Running和slave_SQL_Running都是 yes即可
如果不都是yes则看下方的日志
在主从中分别查看serverid: show variables like '%server_id%';
配置文件不行,则通过全局变量设置
stop slave;
set global server_id = 2;
start slave;
配置步骤(8.0版本)
mysql主从复制步骤 两台虚拟机的mysql
1.主服务器配置:
vi /etc/my.cnf 新增以下内容
[mysqld]
server_id=177 ###服务器id
log-bin=mysql-bin ###开启日志文件
binlog-ignore-db=mysql #不参与主从的数据库名,不参与主从复制的数据库名mysql
binlog-do-db = test #需要备份数据,多个请另起一行设置binlog_do_db=需要同步的数据库名称,不写全部都备份
重启mysql服务
systemctl restart mysqld
主服务器给从服务器账号授权
进入mysql
mysql -u root -p
一般不用root帐号 随意账号 给从服务器对应
要先创建再授权
create user 'snipe'@'%' identified WITH mysql_native_password by '123456'; (创建用户)
GRANT REPLICATION SLAVE ON *.* to 'snipe'@'%' ; (用户授权)
授权使用的数据库等等权限
grant all privileges on *.* to 'snipe'@'%' with grant option;
flush privileges; 刷新
登录主服务器的mysql,查询master的状态
show master status;
记录下:
File : mysql-bin.000001
Position : 909
2. 从服务器配置
[mysqld]
server_id=2 ###服务器id
log-bin=mysql-bin ###开启日志文件
replicate-do-db=test
重启服务器
systemctl restart mysqld
进入mysql
mysql -u root -p
stop slave;
授权哪台计算机中的数据库是自己的主计算机(MASTER_HOST:主机的IP, MASTER_USER: 主机授权的账号, MASTER_USER: 主机授权的账号密码, master_log_file : 文件名称, Position: 文件起始位置)
CHANGE MASTER TO
MASTER_HOST = '192.168.52.1',
MASTER_USER = 'zenghongji',
MASTER_PASSWORD = '123456',
MASTER_PORT = 3306,
master_log_file = 'mysql-bin.000001',
master_log_pos=909;
start slave;
检查从服务器复制功能状态
SHOW SLAVE STATUS \G
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
完成!