mysql checksum用法_MySQL checksum理解_mysql
mysql checksum了解
在主从复制中Checksum常常需要对某些重要的表进行一致性检查。
Checksum Table在逻辑备份时候前后是否可以用于验证数据一致性。扩展一下发现有一些有趣的问题,比如数据插入顺序不同、表引擎不同、操作系统位数不同等。
插入顺序不同是否有影响
我们知道全表扫描是可以有很多种顺序的,尤其当表里面出现过delete动作以后,逻辑导出再导入另外一个表后,两个表的全表扫描结果可能不同。
Checksum table计算返回值的逻辑大致如下:
ha_checksum crc= 0; foreach(row in table) { row_crc= get_crc(row); crc+= row_crc; } return crc;
可以看到只要总行数以及行内容相同,与读取行的顺序无关。
从这个逻辑还能得到一下几个结论:
1)与使用的引擎无关,也就是说即使主备不用同一个引擎,checksum也可用于检查。虽然InnoDB有隐藏行,但这里无视。
2)与是否有索引无关。row_crc只用行本身的数据来计算,并不包括索引数据。
也就是说如果能够保证两个表里面的数据一样,表结构(列内容和顺序一样),操作系统一样,MySQL版本一致,是能够保证checksum的结果的。
字段顺序不同是否有影响
在个row计算row_crc时,是每个字段依次计算的。但计算过程中会将上一个字段的结果作为计算下一个值的输入。
switch (f->type()) { case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_BIT: { String tmp; f->val_str(&tmp); row_crc= my_checksum(row_crc, (uchar*) tmp.ptr(), tmp.length()); break; } default: row_crc= my_checksum(row_crc, f->ptr, f->pack_length()); break; }
因此字段顺序会影响结果。
字段长度不同是否有影响
即使看到相同的内容,也有可能得到不同的checksum。
从上面计算每个field的crc上看,若为变长字段(varchar等),由于用于计算的是实际长度,因此不会影响。比如将表的varchar(20)字段改成varchar(25),不会改变checksum的值。
但若将char(20)改成char(25),或者int改成bigint,则会改变checksum。
操作系统位数不同
因为返回值是unsigned long,我们就担心32位和64位机器的溢出问题。所幸在计算过程中的ha_myisam直接定义为uint32,只是在返回的时候才转成unsigned long,因此无影响。
字符集不同
这个问题其实一直比较含糊。实际上与输入字符集有关。但有一个结论是肯定的:若表里面字段的unhex()值相同,得到的checksum即相同。
通过下面的代码进行对表进行检查 返回一个唯一值
mysql > checksum table test ;
欢迎大家阅读《MySQL checksum理解_mysql》,跪求各位点评,by 搞代码
微信 赏一包辣条吧~
支付宝 赏一听可乐吧~
mysql checksum用法_MySQL checksum理解_mysql相关推荐
- mysql 触发器 for each row 理解_MySQL触发器中的“ FOR EACH ROW”如何工作?
实际上," FOR EACH ROW"意味着每个匹配的行都将被更新或删除.换句话说,我们可以说触发器没有应用于每一行,它只是说要为每个受影响的表行执行触发器主体.我们可以通过以下示 ...
- mysql in从数据库取数_MySQL数据库中 where in 用法详解
本文主要向大家介绍了MySQL数据库中 where in 用法详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 这里分两种情况来介绍 WHERE column IN (valu ...
- mysql explain 实例_Mysql实例mysql explain用法学习
<Mysql实例mysql explain用法学习>要点: 本文介绍了Mysql实例mysql explain用法学习,希望对您有用.如果有疑问,可以联系我们. 导读:本节内容:mysql ...
- mysql 分片 数据迁移_简述MySQL分片中快速数据迁移_MySQL
推荐阅读:MySQL 数据库跨操作系统的最快迁移方法 mysql 备份与迁移 数据同步方法 操作实践背景: travelrecord表定义为10个分片,尝试将10个分片中的2个分片转移到第二台MySQ ...
- mysql 登录默认实例_【MySQL案例】mysql本机登录-S失灵_mysql
[mysql案例]mysql本机登录-S失效 1.1.1. mysql本机登录mysql时,-S参数失效 [环境描述] mysql5.5.14 [问题描述] 配置了多实例 实例1 实例2 datadi ...
- mysql checksum_mysql8 参考手册--CHECKSUM TABLE语句
CHECKSUM TABLE tbl_name [, tbl_name] ... [QUICK | EXTENDED] CHECKSUM TABLE报告 表内容的校验和.您可以使用此语句来验证备份,回 ...
- MySQL之日期时间处理函数_MySQL之日期时间处理函数
本文给大家分享的是MySQL之日期时间处理函数 ,非常的详细,也很实用,非常适合初学者,有需要的小伙伴参考下. 以下基本包含MySQL所有日期时间函数-- MySQL日期时间处理函数 -- 当前日期: ...
- mysql 怎么创建B Tree索引_MySQL为什么选择B+Tree做索引
MySQL为什么选择B+Tree? 首先理解MySQL索引的几个原则 是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 工作机制 如上图:以id创建索引,索引数据结构里存储了索引键(关键字 ...
- mysql获取当前时间的订单_mysql获取当前时间,及其相关操作
1.1 获得当前日期+时间(date + time)函数:now() 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp() curren ...
最新文章
- Hive的Security配置
- Spring Security 实战干货:OAuth2授权回调的核心认证流程
- Java程序员的日常—— IOUtils总结
- linux mysql库文件路径设置_MySQL_linux修改mysql数据库文件的路径,mysql更改数据文件的存放路径 - phpStudy...
- FFT(FastFourier Transform,快速傅立叶变换)
- ivms4200 远程桌面访问测试过程及问题汇总
- 【Uly】微软产品开发中的“战争与和平”
- 服务器的所有网站共用443,多个ssl证书共用443端口apache
- 临床数据库挖掘系列3-手把手教你使用R语言对seer数据库清洗
- 使用antd-design-vue配合vue框架搭建项目使用组件显示英文的解决办法
- Web前端人员如何实现状态保存 常用方法就什么
- 快速搞懂htpp原理
- 使用VUE组件创建SpreadJS自定义单元格(二)
- 小白如何从零开始打造一台DIY脑控智能机器人
- C4D-学习笔记-4-渲染(ProRender渲染介绍)
- 知乎不能改用户名吗_不知道不能随便改名字吗
- 基于python3在windows下安装gmpy2
- 关于谷歌浏览器74以上无法自动加载flash问题的解决
- 程序员必须克服的十大编程禁忌
- 黑鹰基地VIP美工教程系列笔记