- 浏览: 599727 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
在主从复制中Checksum常常需要对某些重要的表进行一致性检查。
Checksum Table在逻辑备份时候前后是否可以用于验证数据一致性。扩展一下发现有一些有趣的问题,比如数据插入顺序不同、表引擎不同、操作系统位数不同等。
插入顺序不同是否有影响
我们知道全表扫描是可以有很多种顺序的,尤其当表里面出现过delete动作以后,逻辑导出再导入另外一个表后,两个表的全表扫描结果可能不同。
Checksum table计算返回值的逻辑大致如下:
可以看到只要总行数以及行内容相同,与读取行的顺序无关。
从这个逻辑还能得到一下几个结论:
1)与使用的引擎无关,也就是说即使主备不用同一个引擎,checksum也可用于检查。虽然InnoDB有隐藏行,但这里无视。
2)与是否有索引无关。row_crc只用行本身的数据来计算,并不包括索引数据。
也就是说如果能够保证两个表里面的数据一样,表结构(列内容和顺序一样),操作系统一样,MySQL版本一致,是能够保证checksum的结果的。
字段顺序不同是否有影响
在个row计算row_crc时,是每个字段依次计算的。但计算过程中会将上一个字段的结果作为计算下一个值的输入。
因此字段顺序会影响结果。
字段长度不同是否有影响
即使看到相同的内容,也有可能得到不同的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即相同。
通过下面的代码进行对表进行检查 返回一个唯一值
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 技术内幕学习
2018-10-22 12:42 611... -
mysql 全文索引(fulltext)学习
2018-10-15 11:09 552使用索引是数据库性能优化的必备技能之一。在MySQL数据库中, ... -
mysql cast和convert函数学习(将字符串转数字)
2018-08-03 11:12 1012MySQL 的CAST()和CONVERT()函数可用来获取一 ... -
mysql 外键锁机制
2014-12-09 10:25 1127在mysql的多个存储引擎中,innodb支持外键,但是由于外 ... -
mysql 常见函数总结
2014-11-06 19:41 736--获取当前的database se ... -
Mysql 常见命令总结
2014-11-04 20:01 3471.linux下启动mysql的命令: mysqladm ... -
MySql 数据库的创建和查看
2014-11-04 19:51 387使用SHOW语句找出在服务器上当前存在什么数据库 mys ... -
MySQL独立表空间VS共享表空间
2014-11-04 19:19 554在使用Innodb引擎时将要 ... -
mysql Multiversion Concurrency Control机制(mvcc)
2014-09-11 17:46 690在进行多事务 ... -
mysql 操作索引FORCE INDEX
2014-09-01 17:14 16971、创建索引 索引的创建可以在CREATE TABLE语句中 ... -
InnoDB Insert Buffer(插入缓冲)
2014-08-30 11:40 1135插入缓冲,并不是缓存的 ... -
mysql 存储过程例子
2014-08-28 11:36 545(1)循环遍历值 drop procedure if e ... -
MySQL if case语句使用总结
2014-08-26 19:47 566Mysql的if既可以作为表达式用,也可在存储过程中作为流程控 ... -
mysql 事务隔离级别
2014-08-25 12:00 671用户可以用SET TRANSACTION语句改变单个会话或者所 ... -
mysql cpu占100%调优案例
2014-08-23 21:44 504解决 MYSQL CPU 占用 100% 的经验总结 ... -
mysql cursor使用
2014-08-22 20:24 863一,什么是游标(cursor) 个人觉得就是一个cursor, ... -
mysql 查看表数据量
2014-08-22 16:55 484数据库中有几十上百张表,那么哪些表的数据量比较大呢,总不 ... -
mysql mysqldump导入导出
2014-08-22 16:32 1042我们来看几个常用用例: (1)导出整个数据库 mysqld ... -
mysql DATE_FORMAT() 函数
2014-08-22 16:23 460定义和用法 DATE_FORMAT() 函数用于以不同的格式显 ... -
MySQL性能调优 - Table_cache(table_open_cache)
2014-08-14 16:12 0table_cache是一个非常重 ...
相关推荐
9. **高可用性与集群**:了解MySQL集群和复制模式,如Multi-Master、Group Replication等,以及如何设计和实施高可用性的解决方案。 10. **数据库设计与范式理论**:回顾关系数据库设计的基本原则,如第一范式(1NF...
7. **源码分析**:对于深入理解MySQL主从复制的工作原理,可以查看MySQL的源码,了解`binlog`日志的生成、网络传输和从服务器的解析执行过程。 8. **工具辅助**:有许多工具可以帮助我们管理和优化MySQL主从复制,...
在Java开发中,了解并掌握MySQL主从同步能够提升应用程序的稳定性和性能。 1. **主从同步原理** - MySQL主从同步基于异步复制机制,主服务器上的写操作先执行,然后将变更记录到二进制日志(binlog)。 - 从...
同时,了解MySQL的故障诊断工具,如pt-table-checksum、pt-online-schema-change等。 最后,对最新版本MySQL的新特性有所了解,比如InnoDB Cluster、JSON支持、窗口函数等,会让你在面试中更具竞争力。 总结来说,...
在压缩包"gt-checksum-master"中,包含了GT-Checksum的源代码,开发者可以深入了解其工作原理,并根据实际需求进行定制或扩展。 总结,GT-Checksum作为一款强大的数据库校验修复工具,不仅简化了数据一致性检查的...
- 数据类型与索引:了解MySQL中的各种数据类型,如INT、VARCHAR、DATE等,以及B-Tree、Hash、R-Tree等不同类型的索引,对数据库性能有直接影响。 - 并发控制:MySQL使用InnoDB存储引擎时,涉及事务处理、MVCC(多...
总结,MySQL主从不一致问题的解决需要全面了解其成因,结合多种检查方法找出不一致点,并选择合适的修复策略。同时,预防措施同样重要,通过合理的配置和管理,可以有效避免和降低不一致的发生。希望这些内容能对你...
4. **Percona Toolkit**:这是一套用于MySQL性能优化和诊断的开源工具,包括pt-query-digest用于分析查询日志,pt-table-checksum用于检测数据不一致,pt-stalk则可以帮助定位慢查询。 5. **pt-query-digest**:此...
- **功能**:汇总MySQL服务器的配置及状态信息,方便快速了解服务器状况。 - **使用场景**:日常运维、服务器审计。 ### 复制工具 - **pt-slave-delay** - **功能**:控制MySQL从服务器的复制延迟,以实现延迟...
了解MySQL主从复制的底层原理,可以深入阅读MySQL的源码,理解binlog和复制的实现细节。此外,有很多开源工具可以辅助管理主从复制,如Percona Toolkit(包含pt-table-sync和pt-table-checksum等工具)、Maatkit等。...
4. **使用第三方工具**:如 `pt-table-checksum` 和 `pt-table-sync` 可以帮助检测主从数据一致性,`Percona Monitoring and Management (PMM)` 或者 `MySQL Enterprise Monitor` 提供图形化的监控界面。 5. **定期...
- 使用`EXPLAIN`分析SQL执行计划,了解表扫描方式、索引使用等。 - `PROFILE`可以查看SQL执行过程中的各个阶段耗时,帮助定位瓶颈。 7. **备份与恢复**: - `mysqldump`用于逻辑备份,生成SQL脚本。 - `...
4. **pt-table-checksum**和**pt-table-sync**:这两个工具用于检测和修复数据不一致。它们通过在多个复制节点间对比数据,发现并解决潜在的差异,确保数据的完整性。 5. **pt-index-usage**:分析查询日志以确定...
- 使用EXPLAIN分析查询计划,了解索引使用情况和潜在问题。 - 通过PROFILE查看查询执行阶段的时间消耗,定位性能瓶颈。 - 监控数据库性能,设置慢查询日志,定期分析优化。 10. **大规模数据库重启**: - 可能...
MySQL复制是一种分布式数据库技术,它允许数据从一个MySQL服务器(主服务器)实时同步到其他一个或多个服务器(从服务器)。...了解和掌握MySQL复制的相关知识,对于管理和维护大型MySQL集群至关重要。
在实际应用中,结合标签“源码”和“工具”,开发者还可以深入研究MySQL的源代码,了解复制的内部机制,或者利用各种工具来辅助管理和维护复制环境。而提供的文档《理解MySQL——复制(Replication).docx》和《MySQL-...
`binlog_checksum`参数在TDSQL中设置为`NONE`,而在MySQL 5.6中为`CRC32`,这意味着TDSQL可能不校验二进制日志的完整性,可能与性能优化有关。 `query_alloc_block_size`决定了查询分配块的大小,TDSQL为16384字节...
6. **数据一致性检查**:使用`mk-table-checksum`工具检查新主从的数据一致性。 7. **启动服务**:更新mycat配置文件并启动mycat实例。 这两种方法各有优缺点。使用`mysqldump`的方法虽然中断业务时间相对较长,但...