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相关推荐

  1. mysql 触发器 for each row 理解_MySQL触发器中的“ FOR EACH ROW”如何工作?

    实际上," FOR EACH ROW"意味着每个匹配的行都将被更新或删除.换句话说,我们可以说触发器没有应用于每一行,它只是说要为每个受影响的表行执行触发器主体.我们可以通过以下示 ...

  2. mysql in从数据库取数_MySQL数据库中 where in 用法详解

    本文主要向大家介绍了MySQL数据库中 where in 用法详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 这里分两种情况来介绍 WHERE column IN (valu ...

  3. mysql explain 实例_Mysql实例mysql explain用法学习

    <Mysql实例mysql explain用法学习>要点: 本文介绍了Mysql实例mysql explain用法学习,希望对您有用.如果有疑问,可以联系我们. 导读:本节内容:mysql ...

  4. mysql 分片 数据迁移_简述MySQL分片中快速数据迁移_MySQL

    推荐阅读:MySQL 数据库跨操作系统的最快迁移方法 mysql 备份与迁移 数据同步方法 操作实践背景: travelrecord表定义为10个分片,尝试将10个分片中的2个分片转移到第二台MySQ ...

  5. mysql 登录默认实例_【MySQL案例】mysql本机登录-S失灵_mysql

    [mysql案例]mysql本机登录-S失效 1.1.1. mysql本机登录mysql时,-S参数失效 [环境描述] mysql5.5.14 [问题描述] 配置了多实例 实例1 实例2 datadi ...

  6. mysql checksum_mysql8 参考手册--CHECKSUM TABLE语句

    CHECKSUM TABLE tbl_name [, tbl_name] ... [QUICK | EXTENDED] CHECKSUM TABLE报告 表内容的校验和.您可以使用此语句来验证备份,回 ...

  7. MySQL之日期时间处理函数_MySQL之日期时间处理函数

    本文给大家分享的是MySQL之日期时间处理函数 ,非常的详细,也很实用,非常适合初学者,有需要的小伙伴参考下. 以下基本包含MySQL所有日期时间函数-- MySQL日期时间处理函数 -- 当前日期: ...

  8. mysql 怎么创建B Tree索引_MySQL为什么选择B+Tree做索引

    MySQL为什么选择B+Tree? 首先理解MySQL索引的几个原则 是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 工作机制 如上图:以id创建索引,索引数据结构里存储了索引键(关键字 ...

  9. mysql获取当前时间的订单_mysql获取当前时间,及其相关操作

    1.1 获得当前日期+时间(date + time)函数:now() 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数: current_timestamp() curren ...

最新文章

  1. Hive的Security配置
  2. Spring Security 实战干货:OAuth2授权回调的核心认证流程
  3. Java程序员的日常—— IOUtils总结
  4. linux mysql库文件路径设置_MySQL_linux修改mysql数据库文件的路径,mysql更改数据文件的存放路径 - phpStudy...
  5. FFT(FastFourier Transform,快速傅立叶变换)
  6. ivms4200 远程桌面访问测试过程及问题汇总
  7. 【Uly】微软产品开发中的“战争与和平”
  8. 服务器的所有网站共用443,多个ssl证书共用443端口apache
  9. 临床数据库挖掘系列3-手把手教你使用R语言对seer数据库清洗
  10. 使用antd-design-vue配合vue框架搭建项目使用组件显示英文的解决办法
  11. Web前端人员如何实现状态保存 常用方法就什么
  12. 快速搞懂htpp原理
  13. 使用VUE组件创建SpreadJS自定义单元格(二)
  14. 小白如何从零开始打造一台DIY脑控智能机器人
  15. C4D-学习笔记-4-渲染(ProRender渲染介绍)
  16. 知乎不能改用户名吗_不知道不能随便改名字吗
  17. 基于python3在windows下安装gmpy2
  18. 关于谷歌浏览器74以上无法自动加载flash问题的解决
  19. 程序员必须克服的十大编程禁忌
  20. 黑鹰基地VIP美工教程系列笔记

热门文章

  1. java获取明天的日期_java怎么获取昨天,今天,明天的日期?java中获取日期的函数
  2. Centos7安装subversion
  3. 企业公众号运营堪忧 微信涨粉已过黄金时代
  4. (软考)计算机硬件及操作系统
  5. STC15F2K60S2芯片A/D转换器的应用
  6. 用Python把PDF转为Word方法总结
  7. Python 爬虫 ajax爬取马云爸爸微博内容
  8. 微信好友删除了怎么找回来「快速恢复删除好友」
  9. 教你怎么批量给图片加水印
  10. c语言三级考试题库,计算机三级考试C语言上机试题.doc