|
概述
的主从复制()是一种数据复制解决方案,将主数据库的(数据定义语言)和(数据操纵语言)操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而是的从库和主库的数据保存同步。支持将数据从一个服务器(主服务器)复制到一个或多个其他服务器(从服务器),从库同时也可以作为其他从服务器的主库,实现链状复制。
主从复制的优点主要包含以下三个方面:
主库出现问题,可以快速切换到从库提供服务;实现读写分离,降低主库的访问压力;可以在从库中执行备份,以避免备份期间影响主库服务;
需要注意的是,的主从复制是异步的,这意味着从服务器的数据可能会与主服务器的数据存在一定的延迟。因此,在使用主从复制时,需要根据具体的业务场景和需求来选择合适的配置和策略。
工作原理
从上图来看,主从复制分成三步:
- 主库在事务提交时,会把数据变更记录在二进制日志文件中;
- 从库读取主库的二进制日志文件,写入到从库的中继日志;
- 重做中继日志中的事件,将改变数据更新同步到从库中;
说白了就是主库上执行的增删改的语句同步到对应的从库上,然后再在从库中同样再次执行一遍语句以作备份。
综合案例
前期准备
准备两台虚拟机,需要提前安装好数据库(必须要开启二进制日志)。
如下所示:
主从库IP地址主库192.168.111.135从库192.168.111.137
注意:以上只是示例说明,具体以自己的虚拟机情况为主。
例外如果克隆的两台虚拟机IP地址一致,可根据以下操作修改实现动态ip(基于mac地址发配IP)
切换目录到:/etc/netplan 并且编辑00-installer-config.yaml文件
如下图指定位置加入:dhcp-identifier: mac(严格缩进格式要求)
重启网络刷新修改:netplan apply
主库配置
修改主库服务器的核心配置文件- /etc/mysql/mysql.conf.d/mysqld.cnf
复制代码 ,并添加如下配置信息(开启二进制日志):- [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
复制代码
- 注意:这里和配置项没有指定,默认同步所有数据库信息。
- 从 MySQL 5.7 开始,的优先级高于。这意味着即使某个数据库被指定,如果它同时出现在的列表中,那么它的更改将不会被记录到二进制日志中
重启服务器。(追求安全,否则可跳过)登录数据库,创建远程连接的账号,并授予主从复制权限。- # 创建xx用户,并设置密码,该用户可在任意主机连接该MySQL服务
- create usxx'@'%' identified with mysql_native_password by 'xx1234';
- # 为'xx'@'%'用户分配主从复制权限
- grant replication slave on *.* to 'zking'@'%';
复制代码 通过指令,查看二进制日志坐标从库配置
1)修改从库服务器的核心配置文件- /etc/mysql/mysql.conf.d/mysqld.cnf
复制代码 ,并添加如下配置信息:- [mysqld]
- ...
- # 开启二进制日志(必须)
- log-bin = mysql-bin
- # MySQL服务ID,保证整个集群环境中唯一,默认为1(必须)
- server-id = 2
- # 二进制日志格式,默认ROW(可选)
- binlog_format = ROW
- # 是否只读,1代表只读,0代表读写
- read-only = 1
复制代码 2)重启服务器。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;
复制代码 参数说明:
参数名含义8.0.23之前source_host主库IP地址master_hostsource_user连接主库的用户名master_usersource_password连接主库的密码master_passwordsource_log_filebinlog日志文件名master_log_filesource_log_posbinlong日志文件位置master_log_pos4)开启同步操作- # 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 status\G;
上述图中显示,很明显主从复制开启失败。经过问题分析之后,发现是虚拟机是克隆的,导致主库和从库的的都是一样的。
解决方案:修改任意主库和从库的即可解决问题。
修改文件。将属性修改为唯一值即可。- [auto]
- server-uuid = 任意uuid
复制代码 方案二:
- 停止mysql服务
- 删除auto.cnf
- 启动mysql服务
修改完毕保存并退出,最后重启服务后,并再次登录查看主从复制是否成功。
数据测试
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)
复制代码 在创建用户时对库授予 SELECT、INSERT、FILE 权限,因 FILE 权限不能授予某个数据库而导致语句执行失败。
但最终结果是:创建成功,授权部分失败。
从上面的测试可知,使用 GRANT 创建用户其实是分为两个步骤:创建用户和授权。
权限有问题并不影响用户的创建,上述语句会导致主库在 binlog 写 INCIDENT_EVENT,从而导致主从复制报错
故障解决- mysql> stop slave;
- mysql> set global sql_slave_skip_counter=1; #指定跳过事务个数
- mysql> start slave;
复制代码 总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://www.jb51.net/database/330772ej7.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|