Linux之MySQL主从复制方式 |
||||||||||||||||||||||||
概述
主库出现问题,可以快速切换到从库提供服务;实现读写分离,降低主库的访问压力;可以在从库中执行备份,以避免备份期间影响主库服务; 需要注意的是, 工作原理 从上图来看,主从复制分成三步:
说白了就是 综合案例前期准备准备两台虚拟机,需要提前安装好 如下所示:
注意:以上只是示例说明,具体以自己的虚拟机情况为主 。 例外如果克隆的两台虚拟机IP地址一致,可根据以下操作修改实现动态ip(基于mac地址发配IP) 切换目录到:/etc/netplan 并且编辑00-installer-config.yaml文件 如下图指定位置加入:dhcp-identifier: mac(严格缩进格式要求) 重启网络刷新修改:netplan apply 主库配置修改主库服务器的 [mysqld] ... # 开启二进制日志(必须) log-bin = mysql-bin # MySQL服务ID,保证整个集群环境中唯一,默认为1(必须) server-id = 1 # 二进制日志格式,默认ROW(可选) binlog_format = ROW # 忽略的数据,不需要同步的数据库 # binlog-ignore-db = db1 # binlog-ignore-db = db2 # 指定同步的数据库 # binlog-do-db = db3
重启 systemctl restart mysql (追求安全,否则可跳过)登录 # 创建xx用户,并设置密码,该用户可在任意主机连接该MySQL服务 create usxx'@'%' identified with mysql_native_password by 'xx1234'; # 为'xx'@'%'用户分配主从复制权限 grant replication slave on *.* to 'zking'@'%'; 通过指令,查看二进制日志坐标 show master status; 从库配置1)修改从库服务器的 [mysqld] ... # 开启二进制日志(必须) log-bin = mysql-bin # MySQL服务ID,保证整个集群环境中唯一,默认为1(必须) server-id = 2 # 二进制日志格式,默认ROW(可选) binlog_format = ROW # 是否只读,1代表只读,0代表读写 read-only = 1 2)重启 systemctl restart mysql 3)登录
change master to master_host='xxx.xxx.xxx.xxx',master_user='xxx',master_password='xxx',master_log_file='xxx',master_log_pos=xxx; change master to master_host='192.168.111.135',master_user='root',master_password='123',master_log_file='mysql_bin.000008',master_log_pos=2756;
change replication source to source_host='xxx.xxx.xxx.xxx',source_user='xxx',source_password='xxx',source_log_file='xxx',source_log_pos=xxx; 参数说明:
4)开启同步操作 # 8.0.22之后 start replica; # 8.0.22之前 start slave; 5)查看主从同步状态 # 8.0.22之后 show replica status; # 8.0.22之前 show slave status; 格式化显示:show slave statusG; 上述图中显示 解决方案:修改任意主库和从库的 修改 [auto] server-uuid = 任意uuid 方案二:
修改完毕保存并退出,最后重启 数据测试1)登录主库 # 切换数据库 use db1; # 创建数据表t_student create table t_student(sid int primary key auto_increment,sname varchar(20) not null,sage int default 0,ssex varchar(2) default '1'); # 批量添加数据 insert into t_student(sname,sage,ssex) values('张三',26,'男'),('王五',22,'女'),('小七',23,'女'); 2)登录从库 # 切换数据库 use db1; # 查看是否存在t_student表 show tables; # 查看t_student表中是否存在数据 select * from t_student; 存在数据即 异常处理# 授权&创建用户 mysql> grant select,insert,file on test.* to test@'%' identified by '123'; ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A ? Database changed mysql> select host,user from user;(test并没有权限) +-----------+---------------+ | host | user | +-----------+---------------+ | % | root | | % | test | | localhost | mysql.session | | localhost | mysql.sys | +-----------+---------------+ 4 rows in set (0.00 sec) mysql> show grants for test; +----------------------------------+ | Grants for test@% | +----------------------------------+ | GRANT USAGE ON *.* TO 'test'@'%' |【为默认权限,所有用户都有】 +----------------------------------+ 1 row in set (0.00 sec) mysql> grant select,insert on test.* to test@'%' identified by '123'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show grants for test; +------------------------------------------------+ | Grants for test@% | +------------------------------------------------+ | GRANT USAGE ON *.* TO 'test'@'%' | | GRANT SELECT, INSERT ON `test`.* TO 'test'@'%' | +------------------------------------------------+ 2 rows in set (0.00 sec) 在创建用户时对 但最终结果是: 从上面的测试可知,使用 GRANT 创建用户其实是分为两个步骤:创建用户和授权 。 权限有问题并不影响用户的创建,上述语句会导致主库在 binlog 写 INCIDENT_EVENT,从而导致主从复制报错 故障解决 mysql> stop slave; mysql> set global sql_slave_skip_counter=1; #指定跳过事务个数 mysql> start slave; 总结以上为个人经验,希望能给大家一个参考,也希望大家多多支持 。 |