首先搞两个Mysql,端口号为3307,3308,本文中用到navicat来可视化数据库
其中3307为主,3308为从
先要保证3307和3308数据一样(库,表,数据相同)
my.ini 配置文件增加如下
主
server-id=1
log-bin=mysql-bin
binlog_format=row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
binlog-do-db=air_bag
expire_logs_days = 10
从
server-id=2
log-bin=mysql-bin
binlog_format=row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
binlog-do-db=air_bag
expire_logs_days = 10
参数解释
server-id 表示id 唯一不能重复
log-bin 开启logbin日志记录
binlog_format binlog记录形式,其他参数百度
log-slave-updates=true 必须
gtid-mode=on 主从模式开启
binlog-do-db=air_bag 需要同步的数据库(如果有多个 复制此行改变库名,多个库同步未测试,如果没有此行,会默认同步所有的库)
expire_logs_days = 10 binlog缓存10天
修改好my.ini后 重启两个mysql
在主中 show master status;
查看GTID是否配置成功
在主中创建用户给从做同步使用
create user 'sync'@'127.0.0.1' identified by '123456';
grant replication slave on *.* to 'sync'@'127.0.0.1' identified by '123456';
在从中配置需要同步的服务地址
change master to master_host='127.0.0.1';
change master to master_port=3307;
change master to master_user='sync';
change master to master_password='123456';
change master to master_auto_position=1;
然后启动从库的同步,执行如下
start slave;
查看从库是否同步成功
show slave status;
显示如图 两个yes代表成功,可以修改主库数据查看是否同步成功
在实际需求中,需要主库只保存一个月内的记录,也就是主中只有一个月的记录,从中是所有记录,
实际使用环境是上位机是主,存储服务器是从,所以有此需求
增加函数和事件如下
drop PROCEDURE IF EXISTS `prc_del_clip`;
CREATE PROCEDURE `prc_del_clip`(IN date_inter int) COMMENT '自动删除日志'
BEGIN
set sql_log_bin=0;
delete from clip where (TO_DAYS(NOW()) - TO_DAYS(create_time))>=date_inter;
select @dataMaxId:=max(id) from clip_data where (TO_DAYS(NOW()) - TO_DAYS(create_time))>=date_inter;
DELETE from clip_data where id<@dataMaxId;
select @cameraMaxId:=max(id) from clip_camera where (TO_DAYS(NOW()) - TO_DAYS(create_time))>=date_inter;
DELETE from clip_camera where id<@cameraMaxId;
set sql_log_bin=1;
END;
drop EVENT IF EXISTS `auto_delete_clip`;
CREATE EVENT `auto_delete_clip` ON SCHEDULE EVERY 1 DAY STARTS '2021-01-01 00:00:00'
ON COMPLETION PRESERVE ENABLE COMMENT '自动删除60天以前的日志统计数据' DO call prc_del_clip(60);
主要特点就是在删除数据前后增加了set sql_log_bin=0;...=1 来关闭和打开logbin日志记录
这样在删除的时候,删除数据就不会同步到从中,导致从也删除数据
从的数据量会很大,这样又要考虑从中定期分表
以下为思路
rename table test to test_2021_04;
CREATE TABLE `test` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
先重命名,再新建表,此方法需要在数据库没有数据新增修改时执行,比如定时每月15号0点
需要根据自己的实际需求来确定是否使用此方法
以上为此次在GTID主从备份建立中整理的实现流程,仅供参考,如果有不对的地方,请指出
特别参数解释那里,只是测试出有哪些参数是必须的,然后增加了一些我需要用到的参数