MySQL · 特性分析 · 数据一样checksum不一样

简介: 背景有一个特殊环境需要进行人肉迁移数据,对比了表里的数据一模一样,但是无论如何checksum就是不一致,那么问题出在哪里呢?问题排查数据是否一致眼睛都把屏幕盯穿了,也没发现不一致的数据。导出数据的方式checksum还是不一致,所以这个原因排除。MySQL版本嗯,这个确实不一样,源端是5.5,目的端是5.6,但是这个是checksum函数不一样吗?还是表的结构变了

背景

有一个特殊环境需要进行人肉迁移数据,对比了表里的数据一模一样,但是无论如何checksum就是不一致,那么问题出在哪里呢?

问题排查

数据是否一致

眼睛都把屏幕盯穿了,也没发现不一致的数据。

导出数据的方式

image
checksum还是不一致,所以这个原因排除。

MySQL版本

嗯,这个确实不一样,源端是5.5,目的端是5.6,但是这个是checksum函数不一样吗?还是表的结构变了?咨询了内核的同学,说checksum的源代码没变啊,接下来那应该是表结构变了?通过查手册发现:
The checksum value depends on the table row format. If the row format changes, the checksum also changes. For example, the storage format for temporal types such as TIME, DATETIME, and TIMESTAMP changes in MySQL 5.6 prior to MySQL 5.6.5, so if a 5.5 table is upgraded to MySQL 5.6, the checksum value may change.
既然这样了,那我们就来验证下是不是因为datetime的问题。
image
嗯,确实是datetime的格式导致的。

总结

这个问题总结来说是因为MySQL5.5和5.6的时间存储格式有变化,导致了checksum不一样。

这个问题知道原因后觉得非常简单,但是排查起来却不是那么简单的。遇到问题不要慌,理出要查的1,2,3,然后用排除法一步一步验证就能知道问题在哪里了。

附一详细步骤如下:

源端:

1.备份结构和数据

mysqldump -h127.0.0.1 -P源端口 -u root --default-character-set=utf8 -B drcdb>src_lingluo.sql

2.拷贝文件

scp src_lingluo.sql lingluo.sss@目的端:/tmp

目的端:

3.把数据导进去

mysql>set names utf8;source /tmp/src_lingluo.sql;

4.在两边取checksum

sh get_checksum.sh

5.目的端:

scp table_checksum.txt lingluo.sss@目的端:/tmp

6.vimdiff 对比文件

如果文件内容一样的话,说明数据一样

附二get_checksum.sh

#!/bin/sh 
port=$1

table_list='`mysql -h127.0.0.1 -P${port} -u root -A -N << EOF | tail -n +3
    use db_name;show tables
EOF`'

for i in ${table_list}
do
    table_cs='`mysql -h127.0.0.1 -P${port} -u root -A -N -D db_name -e \"checksum 
table ${i};\"`'
    echo ${table_cs} >> table_checksum.txt
done
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
存储 SQL 监控
MySQL · 源码分析 · 8.0 原子DDL的实现过程续
之前的一篇月报MySQL · 源码分析 · 原子DDL的实现过程对MySQL8.0的原子DDL的背景以及使用的一些关键数据结构进行了阐述,同时也以CREATE TABLE为例介绍了Server层和Storage层统一系统表后如何创建一张新表进行了介绍。
2139 0
|
存储 NoSQL 关系型数据库
|
SQL 关系型数据库 MySQL
MySQL 并发更新冗余索引字段导致的死锁
一 前言死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。二 案例分析2.1 业务场景业务开发同学要做业务逻辑迁移,由A表迁移到B表,B表承担所有的类型的业务,他们的业务逻辑是:...
497 0
MySQL 并发更新冗余索引字段导致的死锁
|
SQL 存储 关系型数据库
带你认识MySQL sys schema
MySQL 5.7中引入了一个新的sys schema,sys是一个MySQL自带的系统库,在安装MySQL 5.7以后的版本,使用mysqld进行初始化时,会自动创建sys库。 sys库里面的表、视图、函数、存储过程可以使我们更方便、快捷的了解到MySQL的一些信息,比如哪些语句使用了临时表、哪个SQL没有使用索引、哪个schema中有冗余索引、查找使用全表扫描的SQL、查找用户占用的IO等,sys库里这些视图中的数据,大多是从performance_schema里面获得的。目标是把performance_schema的复杂度降低,让我们更快的了解DB的运行情况。
500 0
带你认识MySQL sys schema
|
SQL 存储 Cloud Native
前沿分享|阿里云数据库高级技术专家 宋利兵:阿里云企业级自治数据库RDS详解
本篇内容为2021云栖大会-企业级云原生数据库最佳实践论坛中,阿里云数据库高级技术专家 宋利兵关于“阿里云企业级自治数据库RDS详解”的分享。
1036 0
前沿分享|阿里云数据库高级技术专家 宋利兵:阿里云企业级自治数据库RDS详解
|
缓存 网络协议 搜索推荐
网络协议之:haproxy的Proxy Protocol代理协议
代理大家应该都很熟悉了,比较出名的像是nginx,apache HTTPD,stunnel等。 我们知道代理就是代替客户端向服务器端进行消息请求,并且希望在代理的过程中保留初始的TCP连接信息,例如源和目标IP和端口等,以提供一些个性化的操作。 一般情况下,为了实现这个目标,有一些现成的解决办法,比如在HTTP协议中,可以使用“X-Forwarded-For”标头,来包含有关原始源地址,还有”X-Original-To”用来携带目的地址的信息。
|
存储 SQL 自然语言处理
MySQL8.0 - 新特性 - Instant Add Column
MySQL8.0开始对一些DDL操作做了大量的优化,例如原子DDL, 快速DDL(只修改元数据),前者解决了长期以来mysql的一大诟病,后者则提升了dba同学的生活品质 官方文档列出了一些可以快速ddl的操作,大体包括: 修改索引类型 Add column (limited) 当一条alt.
5741 0
|
SQL 存储 关系型数据库
深入解读MySQL8.0 新特性 :Crash Safe DDL
深入解读MySQL8.0 新特性 :Crash Safe DDL 深入解读MySQL8.0 新特性 :Crash Safe DDL 前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别。
2921 0
|
MySQL 关系型数据库 数据库
|
存储 关系型数据库 MySQL

相关产品

  • 云数据库 RDS MySQL 版