技术分享 | 使用 sync_diff_inspector 对两个 MySQL 进行数据校验

TiDB 数据一致性校验实现:Sync-diff-inspector 优化方案 在数据同步的场景下,上下游数据的一致性校验是非常重要的一个环节,缺少数据校验,可能会对商业决策产生非常负面的影响。。Sync-diff-inspector 是 Data Platform 团队开发的一款一致性校验工具,它能对多种数据同步场景的上下游数据进行一致性校验,如多数据源到单一目的(mysql 中分库分表到 TiDB 中)、单一源到单一目的( TiDB 表 到 TiDB 表)等,在数据校验过程中,其效率和正确性是至关重要的。 阅读详情

作者:沈光宇

爱可生南区 DBA 团队成员,主要负责 MySQL 故障处理和性能优化。对技术执着,为客户负责。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、sync-diff-inspector简介

sync-diff-inspector 是由 PingCAP 开源的数据校验工具,用于校验MySQL/TiDB中两份数据是否一致。

主要功能如下:

  • 对比表结构和数据
  • 如果数据不一致,则生成用于修复数据的 SQL 语句
  • 支持不同库名或表名的数据校验
  • 支持分库分表场景下的数据校验
  • 支持 TiDB 主从集群的数据校验
  • 支持从 TiDB DM 拉取配置的数据校验

sync-diff-inspector 的使用限制

  • 对于 MySQL 和 TiDB 之间的数据同步不支持在线校验,需要保证上下游校验的表中没有数据写入,或者保证某个范围内的数据不再变更,通过配置 range 来校验这个范围内的数据。
  • FLOAT、DOUBLE 等浮点数类型在 TiDB 和 MySQL 中的实现方式不同,在计算 checksum 时会分别取 6 位和 15 位有效数字。如果不使用该特性,需要设置 ignore-columns 忽略这些列的检查。
  • 支持对不包含主键或者唯一索引的表进行校验,但是如果数据不一致,生成的用于修复的 SQL 可能无法正确修复数据。

本文将介绍使用 sync-diff-inspector 工具对两个 MySQL 实例中的数据进行校验,两个 MySQL 实例之间使用 DTS 工具来同步数据。

二、sync-diff-inspector工具下载安装

#sync-diff-inspector已集成在TiDB工具包中,直接下载TiDB工具包即可
shell> wget https://download.pingcap.org/tidb-community-toolkit-v6.4.0-linux-amd64.tar.gz
shell> tar zxvf tidb-community-toolkit-v6.4.0-linux-amd64.tar.gz
shell> ls -lh tidb-community-toolkit-v6.4.0-linux-amd64 | grep sync_diff_inspector
-rwxr-xr-x 1 tidb tidb  98M Nov 17 11:41 sync_diff_inspector
shell> ./sync_diff_inspector  -V
App Name: sync_diff_inspector v2.0
Release Version: v6.4.0
Git Commit Hash: f7e65073b35538def61ae094cd4a8e57e705344b
Git Branch: heads/refs/tags/v6.4.0
UTC Build Time: 2022-11-04 07:21:08
Go Version: go1.19.2

三、sync-diff-inspector工具使用示例

1.配置文件通用部分

shell> cat config.toml
check-thread-count = 4             # 检查数据的线程数量
export-fix-sql = true              # 如果开启,若表数据存在不一致,则输出用于修复的SQL语句
check-struct-only = false          # 只对比表结构而不对比数据
[data-sources]                    
[data-sources.mysql1]              # 上游MySQL数据库配置(源端)
    host = "10.186.65.57"          
    port = 3306
    user = "sgy"
    password = "admin"
    route-rules = ["rule1"]        # 映射匹配规则,通过配置相应的规则可以对单个、多个schema或table进行校验
                                   # 如有多个rule时,可配置成 ["rule1", "rule2"]
[data-sources.mysql2]              # 下游MySQL数据库配置(目标端)
    host = "10.186.65.89"
    port = 3309
    user = "sgy"
    password = "admin"

2.基于schema的数据校验

  • 对单个schema进行数据校验
#映射匹配规则部分,需要将此部分放到置配置文件通用部分的后面
[routes]                               # 映射关系,如上下游schema不同名可在此配置
[routes.rule1]
    schema-pattern = "sbtest"          # 匹配上游数据库的的库名
    target-schema = "sbtest"           # 匹配下游数据库的库名

[task]
    output-dir = "./output"
    source-instances = ["mysql1"]   # 上游数据库,内容是 data-sources 声明的唯一标识 id,分库分表场景下支持多个上游数据库,如:["mysql10", "mysql20"]
    target-instance = "mysql2"      # 下游数据库,内容是 data-sources 声明的唯一标识 id
    target-check-tables = ["sbtest.*"]    # 需要比对的下游数据库的表
    
 # 进行数据校验
shell> ./sync_diff_inspector  --config=./config.toml
A total of 8 tables need to be compared

Progress [>------------------------------------------------------------] 0% 0/0
Comparing the table structure of ``sbtest`.`sbtest4`` ... equivalent     #表结构一致
Comparing the table structure of ``sbtest`.`sbtest5`` ... equivalent
.......................................................
Comparing the table data of ``sbtest`.`sbtest2`` ... equivalent          #表中数据一致
Comparing the table data of ``sbtest`.`sbtest8`` ... equivalent
_____________________________________________________________________________
Progress [============================================================>] 100% 0/0
A total of 8 table have been compared and all are equal.
You can view the comparision details through './output/sync_diff.log'
  • 对多个schema进行数据校验
#由于对多个schema进行数据校验,routes包含了rule1、rule2,配置文件通用部分需要做以下修改
[data-sources.mysql1] 
    route-rules = ["rule1","rule2"]
    
#映射匹配规则部分,需要将此部分放到配置文件通用部分的后面
[routes]
[routes.rule1]
    schema-pattern = "sbtest*"       #使用正则匹配sbtest开头的schema,如sbtest,sbtest1,sbtest2,sbtest3
    target-schema = "sbtest*"

[routes.rule2]
    schema-pattern = "sgy"           #匹配schema:sgy
    target-schema = "sgy"

[task]
    output-dir = "./output"
    source-instances = ["mysql1"]     # 上游数据库,内容是 data-sources 声明的唯一标识 id,分库分表场景下支持多个上游数据库,如:["mysql10", "mysql20"]
    target-instance = "mysql2"        # 下游数据库,内容是 data-sources 声明的唯一标识 id
    target-check-tables = [ "sbtest*.*","sgy.*"]   #对源、目标实例中的sgy及以sbtest开头的schema所有表进行校验

#进行数据校验
shell> ./sync_diff_inspector --config=./config.toml
A total of 24 tables need to be compared

Progress [>------------------------------------------------------------] 0% 0/0
Comparing the table structure of ``sgy`.`sbtest2`` ... equivalent
Comparing the table data of ``sgy`.`sbtest2`` ... equivalent
.......................................................
Comparing the table data of ``sbtest`.`sbtest1`` ... equivalent
Comparing the table data of ``sbtest3`.`sbtest1`` ... equivalent
Comparing the table data of ``sbtest2`.`sbtest1`` ... equivalent
Comparing the table data of ``sbtest1`.`sbtest2`` ... equivalent
_____________________________________________________________________________
Progress [============================================================>] 100% 0/0
A total of 24 table have been compared and all are equal.
You can view the comparision details through './output/sync_diff.log'

3.基于table的数据校验

  • 对单个table进行数据校验
#映射匹配规则部分,需要将此部分放置到配置文件通用部分的后面
[routes]
[routes.rule1]
    schema-pattern = "sbtest"
    target-schema = "sbtest"

[task]
    output-dir = "./output"
    source-instances = ["mysql1"]      # 上游数据库,内容是 data-sources 声明的唯一标识 id,分库分表场景下支持多个上游数据库,如:["mysql10", "mysql20"] 
    target-instance = "mysql2"         # 下游数据库,内容是 data-sources 声明的唯一标识 id
    target-check-tables = ["sbtest.sbtest1"]      #只校验表: sbtest.sbtest1
 
#进行数据校验 
shell> ./sync_diff_inspector --config=./config.toml
A total of 1 tables need to be compared

Progress [>------------------------------------------------------------] 0% 0/0
Comparing the table structure of ``sbtest`.`sbtest1`` ... equivalent
Comparing the table data of ``sbtest`.`sbtest1`` ... equivalent
_____________________________________________________________________________
Progress [============================================================>] 100% 0/0
A total of 1 table have been compared and all are equal.
You can view the comparision details through './output/sync_diff.log'
  • 对多个table进行数据校验
#对schema进行数据校验也是对多个table进行数据校验的一种,这里以指定多个具体表名为例
#由于对多个table进行数据校验,routes包含了rule1、rule2,配置文件通用部分需要做以下修改
[data-sources.mysql1] 
    route-rules = ["rule1","rule2"]
    
#映射匹配规则部分,需要将此部分放置到配置文件通用部分的后面
[routes]
[routes.rule1]
    schema-pattern = "sbtest*"
    target-schema = "sbtest*"

[routes.rule2]
    schema-pattern = "sgy"
    target-schema = "sgy"

[task]
    output-dir = "./output"
    source-instances = ["mysql1"]       # 上游数据库,内容是 data-sources 声明的唯一标识 id,分库分表场景下支持多个上游数据库,如:["mysql10", "mysql20"]
    target-instance = "mysql2"          # 下游数据库,内容是 data-sources 声明的唯一标识 id
    #只校验sbtest.sbtest8,sgy.sbtest4,sbtest1.sbtest1,sbtest2.sbtest2这四个表
    target-check-tables = [ "sbtest.sbtest8","sgy.sbtest4","sbtest1.sbtest1","sbtest2.sbtest2"]
    
#进行数据校验 
shell> ./sync_diff_inspector --config=./config.toml
A total of 4 tables need to be compared

Progress [>------------------------------------------------------------] 0% 0/0
Comparing the table structure of ``sbtest2`.`sbtest2`` ... equivalent
Comparing the table data of ``sbtest2`.`sbtest2`` ... equivalent
Comparing the table structure of ``sgy`.`sbtest4`` ... equivalent
Comparing the table structure of ``sbtest1`.`sbtest1`` ... equivalent
Comparing the table data of ``sgy`.`sbtest4`` ... equivalent
Comparing the table data of ``sbtest1`.`sbtest1`` ... equivalent
Comparing the table structure of ``sbtest`.`sbtest8`` ... equivalent
Comparing the table data of ``sbtest`.`sbtest8`` ... equivalent
_____________________________________________________________________________
Progress [============================================================>] 100% 0/0
A total of 4 table have been compared and all are equal.
You can view the comparision details through './output/sync_diff.log'
  • 对单表进行范围校验

#映射匹配规则部分,需要将此部分放置到配置文件通用部分的后面
[routes]
[routes.rule1]
    schema-pattern = "sbtest"
    target-schema = "sbtest"

[task]
    output-dir = "./output"
    source-instances = ["mysql1"]      # 上游数据库,内容是 data-sources 声明的唯一标识 id,分库分表场景下支持多个上游数据库,如:["mysql10", "mysql20"]
    target-instance = "mysql2"         # 下游数据库,内容是 data-sources 声明的唯一标识 id
    target-check-tables = ["sbtest.sbtest1"]      # 指定校验目标实例上的sbtest.sbtest1表
    target-configs = ["config1"]                  # 对部分表的额外配置

[table-configs.config1] 
target-tables = ["sbtest.sbtest1"]                # 指定校验目标实例上的sbtest.sbtest1表
range = "id > 10 AND id < 100"                    # 指定校验目标表的具体范围,相当于SQL中的where条件
#数据校验见数据修复功能部分

4.数据修复功能

#为了演示数据修复,在目标端表中删除一些数据
shell> mysql -usgy -padmin -h 10.186.65.89 -P 3309 -e "delete from sbtest.sbtest1 where id in (11,22,33,44,55,66,77,88,99);"

# 使用对单表进行范围校验配置,对sbtest.sbtest1表进行范围校验
shell> ./sync_diff_inspector  --config=./config.toml
A total of 1 tables need to be compared

Comparing the table structure of ``sbtest`.`sbtest1`` ... equivalent     #sbtest.sbtest1表结构一致
Comparing the table data of ``sbtest`.`sbtest1`` ... failure             #sbtest.sbtest1表数据有差异
_____________________________________________________________________________
Progress [============================================================>] 100% 0/0
The data of `sbtest`.`sbtest1` is not equal

The rest of tables are all equal.
The patch file has been generated in 
        'output/fix-on-mysql2/'                 # 生成修复SQL输出到此目录
You can view the comparision details through './output/sync_diff.log'

# 查看输出修复SQL
shell> cat output/fix-on-mysql2/sbtest\:sbtest1\:0\:0-0\:0.sql 
-- table: sbtest.sbtest1
-- range in sequence: Full
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (11,50148,'69183965773-14680923687-92934799461-07606242492-78811530738-23241332728-92911647895-70477201282-85254929997-06214236905','33737501839-63208420999-35708593012-95906952636-68691055996');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (22,41538,'14140185946-16271766410-68340573738-46226480462-08989140676-29936780681-56784925909-45742390296-67137862436-18242076592','25112986220-19824650341-42825248958-70186905082-33867163574');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (33,50105,'48402160130-78797253227-05588677001-93556313541-39295466587-91364622063-58862572731-27837539373-64526858273-89372384747','72073637794-12055602042-16862397531-87496431032-85451396141');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (44,49917,'98096713237-15265478716-72025332919-62964308854-01270604715-12000922788-50929365082-43513513022-28543412388-57790852446','33907865533-62267179125-36062850111-84091551774-69847376840');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (55,50259,'68826640374-18002055907-53999869701-72145793168-90893177888-85273641163-24331745145-62755454379-79511152711-99618812770','02724012569-91405199011-30257626349-21678066897-42535351703');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (66,41995,'58396552954-26907336026-99506693837-77815822050-42927030403-40927779227-58101279219-11438233008-00344004393-35806649113','02348992414-65327666387-20632806790-74456238429-90933031209');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (77,49757,'73705207329-00308504929-05904865650-29498186065-09990420614-84131302024-40320022420-77358683577-34731688411-70665402097','92567035674-84728177369-79087155038-84461952379-45481760225');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (88,50497,'77112982215-98755241853-36424062009-45217742824-83650985380-60232607362-47569976121-30091332050-97996374956-97911403909','88977046077-43519705750-51246090615-77629911610-94055348738');
REPLACE INTO `sbtest`.`sbtest1`(`id`,`k`,`c`,`pad`) VALUES (99,49977,'63255973711-62890656114-72914458941-22277906368-32619356110-31219579310-16762665782-69578495131-76043317830-28240408380','08589883275-03392784968-00244590156-39735355951-95769933801');

#将生成的修复SQL导入目标库
shell> mysql -usgy -padmin -h 10.186.65.89 -P 3309 < output/fix-on-mysql2/sbtest\:sbtest1\:0\:0-0\:0.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

#再次检验,发现数据已经一致
shell> ./sync_diff_inspector  --config=./config.toml
A total of 1 tables need to be compared

Comparing the table structure of ``sbtest`.`sbtest1`` ... equivalent
Comparing the table data of ``sbtest`.`sbtest1`` ... equivalent
_____________________________________________________________________________
Progress [============================================================>] 100% 0/0
A total of 1 table have been compared and all are equal.
You can view the comparision details through './output/sync_diff.log'

四、相关问题

  • 修改配置文件后需要手动删除outputDir目录
shell> vim config.toml
shell> ./sync_diff_inspector --config=./config.toml     #将output-dir删除即可解决
Fail to initialize config.
failed to init Task: config changes breaking the checkpoint, please use another outputDir and start over again!
  • 表建议使用utf8mb4字符集,不支持MySQL8.0的utf8mb3字符集
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.30    |
+-----------+
1 row in set (0.00 sec)

mysql> alter table sgy.sbtest4 CHARSET=utf8;
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> show create table sgy.sbtest4 \G
*************************** 1. row ***************************
       Table: sbtest4
Create Table: CREATE TABLE `sbtest4` (
  `id` int NOT NULL AUTO_INCREMENT,
  `k` int NOT NULL DEFAULT '0',
  `c` char(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  `pad` char(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_4` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb3     
1 row in set (0.00 sec)   

#执行数据校验时报错
shell> ./sync_diff_inspector --config=./config.toml
There is something error when initialize diff, please check log info in output/sync_diff.log

#查看日志文件
shell> cat output/sync_diff.log  |grep utf8mb3
[2023/02/19 11:13:04.980 +08:00] [FATAL] [main.go:120] ["failed to initialize diff process"] [error="get table sgy.sbtest4's information error [parser:1115]Unknown character set: 'utf8mb3'\ngithub.com/pingcap/errors.

更详细的使用说明,请参考 sync-diff-inspector 官方文档:https://docs.pingcap.com/zh/tidb/stable/sync-diff-inspector-overview

TiDB-从0到1-sync-diff-inspector数据校验工具 TiDB原生数据对比工具,高度兼容MySQL 阅读详情

相关推荐

如何判断数据库中的两个表是否相同?比较数据库中的两个表是否完全相同,包括字段和每条记录

在数据库应用程序中,经常需要比较两个表是否相同,包括表的结构和数据。通过以上步骤,我们可以比较数据库中的两个表是否完全相同,包括字段和每条记录。请注意,上述示例代码中的数据库连接信息需要根据实际情况进行修改,以便连接到正确的MySQL数据库。现在,我们可以将两个表的结构信息进行比较,以确定它们是否相同。最后,我们需要比较两个表的数据是否完全相同,包括每条记录的值。我们可以逐行比较两个表的数据,确保每个字段的值都相同。接下来,我们需要获取两个表的数据,以便比较每条记录是否相同。步骤5:比较表的数据。

StyVue的博客 858

一文了解TiDB的数据对比工具sync-diff-inspector

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/23f49fc7 ...

TiDB 社区干货传送门 989

储能变流器(Power Control System——PCS)设计原理

储能变流器(Power Control System——PCS)可控制蓄电池的充电和放电过程,进行交直流的变换,在无电网情况下可以直接为交流负荷供电。PCS 由 DC/AC 双向变流器、控制单元等构成。PCS 控制器通过通讯接收后台控制指令,根据功率指令的符号及大小控制变流器对电池进行充电或放电,实现对电网有功功率及无功功率的调节。 PCS 控制器通过 CAN 接口与 BMS 通讯,获取电池组状态信息,可实现对电池的保护性充放电,确保电池运行安全。   储能变流器(PCS)可控制蓄电池的充电和放电过程,进

Zhouengineer的博客 5万+

sync-diff-inspector 使用实践

作者: banana_jian 原文来源: https://tidb.net/blog/7ffd821a ...

TiDB 社区干货传送门 694

映泰TB250-BTC主板魔改BIOS支持8/9代CPU实战与开机故障排查

BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,负责初始化硬件和提供运行时服务。其工作原理是通过存储在主板芯片中的固件程序,在上电自检(POST)阶段完成对CPU、内存等关键组件的检测与配置。魔改BIOS的技术价值在于突破硬件限制,通过修改微码和电源管理模块,让旧平台支持新处理器,从而以极低成本实现性能跃升,在预算有限或追求极致性价比的DIY、办公和软路由等应用场景中极具吸引力。本文以映泰TB250-BTC矿板为例,详细解析了通过软刷方式刷入魔改BIOS,并重点解决了刷写后常见的“开机风扇转一

weixin_29164185的博客 405

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全。版本:SolidWorks2021。电脑:惠普战66四代。软件安装不困难!

qq_43596278的博客 11万+

tidb-sync-diff-inspector(1)(数据校验)概念、适用场景

5.比对源端和目标端的chunk切片的校验核checksun(类似md5),如果某个chunk的校验核不一样,trunk拆分开,再次校验,以此类推(二分法),直到一个比较小的范围,然后逐条比较。并进行检查点存储,每10秒进行记录一次,防止sync-diff-inspector异常宕机,下次继续,可以直接从检查点继续。sharding参数,默认会去比对分片,想比较test1.haha1和test2.haha2,会自动把test2.haha2也拉进来一起和目标端比。

汪灵骅的博客 592

手把手教你用ZLMediaKit搭建WebRTC直播:本地推流与播放实战

本文详细介绍了如何使用ZLMediaKit搭建WebRTC直播系统,涵盖从环境准备、编译部署、SSL证书配置到本地推流与播放的完整实战流程。通过一步步的指导,帮助开发者快速掌握基于ZLMediaKit的WebRTC推拉流技术,构建低延迟的实时音视频应用。

weixin_28842367的博客 347

MySQL平替就选TiDB | 从调研、测试、迁移、上线全流程实施方案

TiDB 的 DDL 操作全部在线进行,无需外部工具,在千万级表上增加、删除字段,修改数据精度或变更数据类型等操作均秒级完成,且与数据量无关,不阻塞查询和写入,极大提升业务和运维效率。分库分表场景中,DM 平台通过配置路由规则,将分散数据合并为单表形式存储于 TiDB,简化数据维护与查询操作,同时进行实时增量数据比对,确保数据同步准确性。TiDB 则在内核层面提供强大闪回支持,可实现集群、库、表的快速闪回,还能闪回查询,基于多版本数据管理(MVCC)技术,将误操作数据找回,操作简便高效,降低业务中断风险。

bisal的专栏 227

基于STM32LXXX的模数转换芯片ADC(CMS24AD2001)驱动C程序设计

/ 电压 = (原始值 / 2^23) * Vref (注意:24位有符号数范围为 -2^23 到 2^23-1)//---------------- 硬件端口映射 (请根据实际电路修改) ----------------ADC_SCLK_HIGH();- PGA 放大倍数可选:1、2、4、8、16、32、64、128、256;//---------------- 宏定义操作 -------------------//---------------- 函数声明 -------------------

myron6688的博客 159

【异常】OpenClaw 上下文溢出问题(100% context used 309.9k/200k`)排查与解决

摘要:OpenClaw 运行出现"100% context used 309.9k/200k"报错,表示上下文窗口超出200k Token限制。解决方法包括:1) 重启服务或新建会话清空缓存;2) 修改配置文件提升context_window值;3) 长期优化如限制历史对话轮数、分批处理长文本。该问题通常由输入过长或多轮对话累积导致,需控制单次输入量在阈值内。

奶爸的编程之路,也就一周冷个三天 3232

TiDB | 如何进行跨版本升级

整挺好~

在数字化道路无限探索 527

【STK】手把手教你利用STK进行关联分析仿真01-STK/CAT模块介绍

今天主要介绍接近分析工具CAT。

weixin_44184852的博客 1104

工作中使用到的单词(软件开发)_第五版

本文摘要: 本文为软件开发相关的术语与技术要点整理,主要包含2020-2025年间四版内容更新(No.01-41)。重点包括: 证书文件格式(PEM/P12)差异 外部API通信注意事项(Accept头设置、HTTPS连接问题) Postman工具使用技巧(Cookie管理、请求头设置) WAS配置相关经验(JVM设置、SSL连接问题) 数据库操作命令(DB2表结构修改) IBM安全管理组件(TAM/iv-user机制) 网络通信细节(chunked传输编码特性) 常用开发工具(curl、Postman)的

sun0322 2516

100天精通Python(爬虫篇)——第119天:基于selenium实现隐藏浏览器指纹特征(反反爬策略)

1. 什么是浏览器指纹? 2. 爬虫隐藏浏览器指纹特征的好处? 3. 手动打开浏览器指纹情况 4. 无界面模式打开浏览器 5. 脚本隐藏浏览器指纹特征

努力让自己发光,对的人才能迎着光而来 8万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

tidb-sync-diff-inspector(2)(数据校验)部署、使用

schema-pattern = "test" # 匹配数据源的库名,支持通配符 "*" 和 "?table-pattern = "table-[1-2]" # 匹配数据源的表名,支持通配符 "*" 和 "?table-pattern = "table-3" # 匹配数据源的表名,支持通配符 "*" 和 "?table-pattern = "table-*" # 匹配数据源的表名,支持通配符 "*" 和 "?# 如果开启,若表存在不一致,则输出用于修复的 SQL 语句。

汪灵骅的博客 1041

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TiDB实战篇-Sync-Diff-Inspector校验数据

TiDB实战篇-Sync-Diff-Inspector校验数据

S1124654的博客 520

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

sync-diff-inspector 用户文档

https://docs.pingcap.com/zh/tidb/v2.1/sync-diff-inspector-overview

qq_27342265的博客 270

sync_diff_inspector 表结构比较功能探索

作者: yangzhj 原文来源: https://tidb.net/blog/91ad0e37 ...

TiDB 社区干货传送门 500

【go-mysql-elasticsearch记录, 先看第五条】

go-mysql-elasticsearch使用记录: Windows11 环境下使用 go-mysql-elasticsearch 使得mysql数据导入es:` 1. 启动命令 .\go-mysql-elasticsearch.exe -config=D:\soft\go-mysql-elasticsearch\etc\river.toml 指定目录的go-mysql-elasticsearch.exe 加上指定位置的river.toml配置文件 否则会默认使用./ect/river.toml, 大

qq_39319117的博客 1115

TiDB 3.0 GA Release Notes

Overview 2019 年 6 月 28 日,TiDB 发布 3.0 GA 版本,对应的 TiDB Ansible 版本为 3.0.0。 相比于 V2.1,V3.0.0 版本在以下方面有重要改进: 稳定性方面,显著提升了大规模集群的稳定性,集群支持 150+ 存储节点,300+ TB 存...

chigangdou7652的博客 278

player.getcurrentposition() 与暂停时设置的值不一致_跨云迁移过程中的数据一致性实践...

随着互联网业务发展和对容灾的需求,以及对访问加速、多供应商成本控制等要求,互联网公司通过跨云部署和迁移来更好的控制成本逐渐成为刚需,跨云部署和迁移也就成为运维圈子里的一个热门话题,而在此过程中,对运维和研发最头痛就是数据的迁移和分布。粤语中有一句谚语“上屋搬下屋,搬洒一箩谷”,意思是在各种各样的搬动过程中,或多或少都会伴随一些资产的流失,这对于互联网业务来说是难以接受的。通过对最近几次客户的多云部...

weixin_39623355的博客 327

DM 源码阅读系列文章(一)序

作者:杨非 前言 TiDB-DM 是由 PingCAP 开发的一体化数据同步任务管理平台,支持从 MySQL 或 MariaDB 到 TiDB 的全量数据迁移和增量数据同步,在 TiDB DevCon 2019 正式开源。作为一款连接 MySQL/MariaDB 生态和 TiDB 生态的中台类型产品,DM 获得了广泛的关注,很多公司、开发者和社区的伙伴已经在使用 DM 来进行数据迁移和管理。随着大...

weixin_34336526的博客 230
上一篇: OB运维 | 连接 kill 中的 session_id
下一篇: 技术分享 | OceanBase 集群扩容缩容
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值