Mysql主从同步,不同步删除的数据

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

操作要求:

Mysql中某个库每天产生的数据较大,在mysql需要把这个库里面数据清空,并且里面的数据需要做查询。首先想到的是数据库主从,只需要同步的时候把delete table 和 truncate table或drop database 命令去掉,不同步删除的数据,只是没有查到相应的软件,所以有下面的操作


操作思路:

利用数据库的主从同步,在主数据库执行清除命令,不同步到从数据库

以下主数据库为A(192.168.1.80),从数据库为B(192.168.1.81)。A里面的gamelog数据库每天清理一次(gamelog数据库,里面一个表 goldenLog),并且在B数据库保留所有的gamelog库信息。假设在晚上23:52  A执行清除mysql数据命令,


实现方法:

1  系统centos 6.4 64位

2,  配置mysql 5.5.37 主从同步,过程略过 http://bbotte.blog.51cto.com/6205307/1424662 

3,  23:50 A中刷新日志 为的是接下来进行处理的日志较小,更方便的修改,导入到从服务器

/usr/local/mysql/bin/mysql -e "flush binarylogs;   show master status\G"|grep -E "File|Position" |awk '{print $2}'

1
2
mysql-bin.000023
107

4,  23:51  B中停止同步,并且记录position

/usr/local/mysql/bin/mysql -e "stop slave;  show slavestatus\G" |grep -E "Master_Log_File|Read_Master_Log_Pos" |awk'{print $2}'|awk 'NR < 3'

1
2
mysql-bin.000023
196

5,  23:52  A中保留表结构,清除表中的内容

/usr/local/mysql/bin/mysql -e "show master status\G"|grep -E "File|Position"|awk '{print $2}'  > sqlstatus | /usr/local/mysql/bin/mysql -nse 'show tables' gamelog|while read table;do /usr/local/mysql/bin/mysql -e "truncate table $table" gamelog;done

查看现在的Position位置 ,

1
2
3
cat  sqlstatus
mysql-bin.000023
1136417

清理数据后执行刷新log,从服务器同步就从刷新后日志position的107开始向主请求同步

/usr/local/mysql/bin/mysql -e "flush binary logs;   show master status\G"|grep -E "File|Position"|awk '{print $2}'|sed -n 1p

B同步A中的内容就利用这个位置 

1
mysql-bin.000024

6,  A中把二进制日志导出为sql命令并发送给从

1
/usr/local/mysql/bin/mysqlbinlog  mysql-bin.000023 > 000023.sql

下面是清空数据库里面表内容的命令,需要把这一条语句给删除,然后发送给从服务器

1
2
3
4
5
6
#at 1136417
#14061016:22:45 server id 1  end_log_pos 1136417       Query  \
#               thread_id=22 exec_time=0     error_code=0
SETTIMESTAMP=1402388565/*!*/;
truncate table goldenLog
/*!*/;
1
2
3
grep  -rn  "end_log_pos 1136417"  000023.sql | cut  -d: -f1
51502
sed  -i 51503,51505d 000023.sql

把修改的sql传到B  这里需要配置双机互信,具体过程略过

1
scp  000023.sql 192.168.1.81: /root/

7,  B中 mysql 导入数据 000023.sql 此时导入的数据没有清空表内容的命令,所以内容就不会被删除

1
2
3
/usr/local/mysql/bin/mysql   <<EOF
source /root/000023 .sql;
>EOF

8,  B 开始向A请求同步  mysql-bin日志为(上面第五条5,)A执行刷新log后的bin log

/usr/local/mysql/bin/mysql-e "change master to master_log_file='mysql-bin.000024',master_log_pos=107;"

9,     B中 开始恢复主从同步

1
/usr/local/mysql/bin/mysql  -e  "slave start;"

查看B中状态

/usr/local/mysql/bin/mysql -e "show slavestatus\G " | grep -E "Slave_IO_Running|Slave_SQL_Running" |awk'{print $2}'


改写自动化:

A中脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#crontab
#50 23 * * * sh /root/master.sh
 
mysqlbin_num=` /usr/local/mysql/bin/mysql  -e  "flush binary logs; show master status\G" | grep  -E  "File|Position"  | awk  '{print $2}' | grep  mysql-bin | cut  -d\. -f2`
sleep  10
/usr/local/mysql/bin/mysql  -e  "show master status\G" | grep  -E  "File|Position" | awk  '{print $2}'  > sqlstatus| /usr/local/mysql/bin/mysql  -nse  'show tables'  gamelog| while  read  table; do  /usr/local/mysql/bin/mysql  -e  "truncate table $table"  gamelog; done
 
/usr/local/mysql/bin/mysql  -e  "flush binary logs;   show masterstatus\G" | grep  -E  "File|Position" | awk  '{print $2}' | sed  -n 1p
 
/usr/local/mysql/bin/mysqlbinlog  /var/mysql/log/mysql-bin .${mysqlbin_num} >  /root/ ${mysqlbin_num}.sql
line=` grep  -n  "truncate table goldenLog"  /root/ ${mysqlbin_num}.sql| cut  -d: -f1`
line1=$((${line}-3))
line2=$((${line}+1))
sed  -i ${line1},${line2}d  /root/ ${mysqlbin_num}.sql
 
scp  /root/ ${mysqlbin_num}.sql 192.168.1.81: /root/


B中脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
#crontab
#50 23 * * * sh /root/slave.sh
sleep  5
/usr/local/mysql/bin/mysql  -e  "stop slave;  show slavestatus\G" | grep  -E  "Master_Log_File|Read_Master_Log_Pos"  | awk  'NR< 3'
 
sleep  20
 
sqlbin_num=` find  /root/ *.sql| cut  -d\/ -f3| cut  -d. -f1| sort  -n| tail  -n 1`
 
/usr/local/mysql/bin/mysql  <<EOF
source  /root/ ${sqlbin_num}.sql;
EOF
 
mysqllog_num=` /usr/local/mysql/bin/mysql  -e  "show slave status\G"  | grep  -E  "Master_Log_File|Read_Master_Log_Pos"  | awk  '{print $2}' | awk  'NR <3'  | grep  mysql-bin | cut  -d. -f2 |perl -pe  's/\b0+//g' `
sql_num=$((${mysqllog_num}+1))
mysqllog=` printf  %06d ${sql_num}`
 
sleep5
 
/usr/local/mysql/bin/mysql  -e  "change master to master_log_file='mysql-bin.${mysqllog}',master_log_pos=107;"
 
/usr/local/mysql/bin/mysql  -e  "slave start;"









本文转自 bbotte 51CTO博客,原文链接:http://blog.51cto.com/bbotte/1425487,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
40 6
|
22天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
29天前
|
关系型数据库 MySQL
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
21 0
|
1月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
21 1
|
1月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
2天前
|
存储 数据可视化 关系型数据库
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
本文探讨MySQL中时间类型的选择,阐述datetime、timestamp、整形时间戳等类型特点以及它们在千万级数据量下的查询性能
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
|
16天前
|
SQL 关系型数据库 MySQL
mysql主从同步出错解决办法
mysql主从同步出错解决办法
10 0
|
27天前
|
关系型数据库 MySQL
MySQL查询当天昨天明天本月上月今年等数据
MySQL查询当天昨天明天本月上月今年等数据
19 2
|
28天前
|
关系型数据库 MySQL 开发工具
MySQL分组后,组内排序,然后取每组的第一条数据
MySQL分组后,组内排序,然后取每组的第一条数据
15 1
|
29天前
|
canal SQL 关系型数据库
MySQL数据直接实时同步到ES
MySQL数据直接实时同步到ES
33 0