MySQL_主从复制
读写分离
为什么要采用主从复制、读写分离的架构?
主从复制、读写分离一般都是一起使用的。
目的很简单,就是为了提高数据库的并发性能。
主从复制的原理
1 当Master节点进行insert、update、delete操作时,会按照顺序写入到binlog中。
binlog日志在哪?/var/lib/mysql
2 Salve从库连接Master主库,Master有多少个Slave就会创建多少个binlog dump线程。
这里的Master指主机,Slave指从机。
主机和从机之间的关系为:主机只能有一台,从机可以有多台。
3 当Master节点的binlog发生变化时,binlog dump线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
4 I/O线程接收到binlog内容后,将内容写入到本地的relay-log。
这里的relay-log一般称为中继日志。
5 SQL线程读取I/O线程写入的relay-log,并且根据relay-log的内容对数据库做对应的操作。
这里涉及一个MySQL主从复制的缺点:延迟。原因在于:中间有一个中继日志。

如何实现主从复制:
Master配置
1)使用命令行进入mysql:
1、mysql -u root -p
2、输入密码进入MySQL
2)创建用户,给予授权:
GRANT REPLICATION SLAVE ON *.* to 'root'@'192.168.42.160' identified by 'Java@1234'; // 192.168.42.160是slave从机的IP地址
FLUSH PRIVILEGES; // 刷新系统权限表的配置,创建的这个用户在配置slave从机时要用到。
3)接下来在找到mysql的配置文件/etc/my.cnf,增加以下配置:
# 开启binlog
log-bin=mysql-bin
server-id=104
# 需要同步的数据库,如果不配置则同步全部数据库
binlog-do-db=test_db
# binlog日志保留的天数,清除超过10天的日志
# 防止日志文件过大,导致磁盘空间不足
expire-logs-days=10
4)配置完成后,重启mysql:
systemctl restart mysqld.service
5)可以通过命令行show master status\G;查看当前binlog日志的信息(后面有用):
Slave配置
1)Slave配置相对简单一点。从机肯定也是一台MySQL服务器,所以和Master一样,找到/etc/my.cnf配置文件,增加以下配置:
# 不要和其他mysql服务id重复即可
server-id=106
2)接着使用命令行登录到mysql服务器:
mysql -u root -p
3)进入到mysql后,再输入以下命令:
CHANGE MASTER TO
MASTER_HOST='49.232.23.56',//主机IP
MASTER_USER='root',//之前创建的用户账号
MASTER_PASSWORD='Java@1234',//之前创建的用户密码
MASTER_LOG_FILE='mysql-bin.000001',//master主机的binlog日志名称
MASTER_LOG_POS=862,//binlog日志偏移量
master_port=3306;//端口
4)还没完,设置完之后需要启动:
# 启动slave服务
start slave;
5)启动完之后怎么校验是否启动成功呢?使用以下命令:
show slave status\G;
可以看到如下信息(摘取部分关键信息):
测试主从复制
在master主机执行sql:
CREATE TABLE `tb_commodity_info` (
`id` varchar(32) NOT NULL,
`commodity_name` varchar(512) DEFAULT NULL COMMENT '商品名称',
`commodity_price` varchar(36) DEFAULT '0' COMMENT '商品价格',
`number` int(10) DEFAULT '0' COMMENT '商品数量',
`description` varchar(2048) DEFAULT '' COMMENT '商品描述',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品信息表';
接着我们可以看到slave从机同步也创建了商品信息表,主从复制就完成了!
mysql从库Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'报错处理:
解决方法
1)首先在从库上执行
stop slave;
2)刷新binlog日志
flush logs;
刷新后的日志会+1
然后就不需要在操作master,切换到从库
3)输入CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000114',MASTER_LOG_POS=120;
4)执行start slave;
posted on 2021-09-06 21:25 XiaoXiaoli 阅读(46) 评论(0) 收藏 举报
浙公网安备 33010602011771号