技术分享 | 数据校验工具 pt-table-checksum

数据一致性校验(pt-table-checksum)(一) 可以指定 --check-slave-lag,则只检查指定服务器的 lag,而不是所有从库。如果主库或从库设置了binlog_ignore_db 或 replicate_do_db 的过滤选项,因为不能保证查询和校验和不会导致复制中断,所以执行工具会因报错而终止。但是,如果 pid 文件存在并且它包含的 pid 不再运行,则该工具将用当前 pid 覆盖该 pid 文件。工具会监视所有从库的延迟,如果某个从库延迟超过 --max-lag 的值,则暂停执行校验和,直到从库的延迟小于 --max-lag 的值。 阅读详情

作者:耿进
爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理。对数据库技术有着浓厚的兴趣。你见过凌晨四点 MySQL 的 error 吗?
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


参考文档:https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-checksum.html

1. 概述

pt-table-checksum 是 Percona-Toolkit 的组件之一,用于检测 MySQL 主、从库的数据是否一致。其原理是在主库执行基于 statement 的 SQL 语句来生成主库数据块的checksum,把相同的 SQL 语句传递到从库执行,并在从库上计算相同数据块的 checksum,最后,比较主从库上相同数据块的 checksum 值,由此判断主从数据是否一致。它能在非常大的表上工作的一个原因是,它把每个表分成行块,并检查每个块与单个替换。选择查询。它改变块的大小,使校验和查询在所需的时间内运行。分块表的目的是确保校验和不受干扰,并且不会在服务器上造成太多复制延迟或负载,而不是使用单个大查询处理每个表。这就是为什么默认情况下每个块的目标时间是 0.5 秒。

2. 场景

pt-table-checksum 默认情况下可以应对绝对部分场景,官方说,即使上千个库、上万亿的行,它依然可以很好的工作,这源自于设计很简单,一次检查⼀个表,不需要太多的内存和多余的操作;必要时,pt-table-checksum 会根据服务器负载动态改变 chunk 大小,减少从库的延迟。
为了减少对数据库的干预,pt-table-checksum 还会⾃动侦测并连接到从库,当然如果失败,可以指定 --recursion-method 选项来告诉从库在哪里。它的易用性还体现在,复制若有延迟,在从库 checksum 会暂停直到赶上主库的计算时间点(也通过选项 – 设定一个可容忍的延迟最大值,超过这个值也认为不一致)。

3. 保障措施

pt-table-checksum 有许多其他的安全措施,以确保它不会⼲扰任何服务器的操作,包括副本。为了做到这⼀点,pt-table-checksum 检测副本并⾃动连接到它们。(如果失败,可以使⽤递归⽅法选项给它⼀个提示。)
该工具持续监控副本。如果任何副本在复制过程中远远落后,pt 表校验和会暂停以使其赶上来。如果任何副本有错误,或者复制停止,pt-table 校验和将暂停并等待。此外,pt-table-checksum 查找问题的常见原因,比如复制过滤器,并且拒绝操作,除⾮您强迫它这样做。复制筛选器是危险的,因为 pt-table-checksum 执行的查询可能与它们发生冲突,并导致复制失败。
pt-table 校验和验证块是否太大而不能安全校验和。它对每个块执行解释查询,并跳过可能大于所需行数的块。您可以使用 --chunk-size-limit 选项配置此保护措施的敏感性。如果一个表因为行数少而要在单个块中对其进行校验,那么 pt-table-checksum 将额外验证该表在副本上是否过大。这避免了以下场景:表在主服务器上是空的,但在副本上非常大,并且在一个大型查询中进行检查,这会导致复制过程中出现非常长的延迟。
还有⼀些其他的保障措施。例如,pt-table-checksum 将它的会话级 innodb_lock_wait_timeout 设置为 1 秒,这样,如果存在锁等待,它将成为受害者,而不是导致其他查询超时。另一个安全措施检查数据库服务器上的负载,如果负载过高则暂停。对于如何做到这一点,没有一个正确的答案,但是默认情况下,如果有超过 25 个并发执行的查询,pt-table-checksum 将暂停。您可能应该使用 --max-load 选项为服务器设置一个合理的值。
校验和通常是一个低优先级的任务,应该让位给服务器上的其他⼯作。然而,一个必须经常重启的共工具是很难使用的。因此,pt 表校验和对错误具有很强的弹性。例如,如果数据库管理员出于任何原因需要杀死 pt-table-checksum 的查询,这就不是一个致命错误。⽤户经常运行 pt-kill 来终止任何长时间运行的校验和查询。该工具将重试一次已杀死的查询,如果再次失败,它将移动到该表的下一个块。如果存在锁等待超时,则应用相同的行为。如果发生这样的错误,工具将打印一个警告,但每个表只打印一次。如果到任何服务器的连接失败,pt-table-checksum 将尝试重新连接并继续⼯作。

4. 操作步骤

1. 创建主从架构

安装 mysql(略)

# 创建复制⽤户(⽅便切换,从库也创建)
master82 >GRANT REPLICATION SLAVE ON *.* TO repl@'10.186.63.%' IDENTIFIED BY '123';
Query OK, 0 rows affected, 1 warning (0.01 sec)
# 建⽴复制
slave83 >change master to
master_host='10.186.63.82',master_port=4380,master_user='repl',master_password='123',MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
slave83 >start slave;
Query OK, 0 rows affected (0.04 sec)
slave83 >show slave status\G
*************************** 1. row ***************************
 Slave_IO_State: Waiting for master to send event
 Master_Host: 10.186.63.82
 Master_User: repl
 Master_Port: 4380
 Connect_Retry: 60
 Master_Log_File: mysql-bin.000004
 Read_Master_Log_Pos: 220764474
 Relay_Log_File: mysql-relay.000002
 Relay_Log_Pos: 24944
 Relay_Master_Log_File: mysql-bin.000004
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
2. 造数据

使用 sysbench 造表,并且会同步至从库。

[root@node01 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-host=10.186.63.82 \
--mysql-port=4380 --mysql-user=gengjin --mysql-password=123 --mysql-db=test \
--table-size=1000000 --tables=10 --threads=50 --report-interval=3 --time=20 prepare
sysbench 1.0.17 (using system LuaJIT 2.0.4)
Initializing worker threads...
Creating table 'sbtest3'...
Creating table 'sbtest6'...
Creating table 'sbtest5'...
Creating table 'sbtest8'...
Creating table 'sbtest1'...
Creating table 'sbtest9'...
Creating table 'sbtest7'...
Creating table 'sbtest4'...
Creating table 'sbtest2'...
Creating table 'sbtest10'...
Inserting 1000000 records into 'sbtest1'
Inserting 1000000 records into 'sbtest8'
Inserting 1000000 records into 'sbtest9'
Inserting 1000000 records into 'sbtest6'
Inserting 1000000 records into 'sbtest7'
Inserting 1000000 records into 'sbtest5'
Inserting 1000000 records into 'sbtest4'
Inserting 1000000 records into 'sbtest3'
Inserting 1000000 records into 'sbtest2'
Inserting 1000000 records into 'sbtest10'
master82 >use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
master82 >show tables;
+----------------+
| Tables_in_test |
+----------------+
| sbtest1 |
| sbtest10 |
| sbtest2 |
| sbtest3 |
| sbtest4 |
| sbtest5 |
| sbtest6 |
| sbtest7 |
| sbtest8 |
| sbtest9 |
+----------------+
10 rows in set (0.00 sec)
master82 >
slave83 >use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
slave83 >show tables;
+----------------+
| Tables_in_test |
+----------------+
| sbtest1 |
| sbtest10 |
| sbtest2 |
| sbtest3 |
| sbtest4 |
| sbtest5 |
| sbtest6 |
| sbtest7 |
| sbtest8 |
| sbtest9 |
+----------------+
10 rows in set (0.00 sec)
slave83 >
3. 校验

1)下载安装 pt 工具

#下载
wget https://www.percona.com/downloads/percona-toolkit/3.1.0/binary/tarball/percona-toolkit-
3.1.0_x86_64.tar.gz
yum -y install perl-devel perl-Digest-MD5 perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL.noarch perl-Time-HiRes
cd percona-toolkit-3.1.0/
perl Makefile.PL PREFIX=/usr/local/
make
make install

2)参数

–replicate-check:执行完 checksum 查询在 percona.checksums 表中,不⼀定⻢上查看结果呀 —— yes 则马上比较 chunk 的 crc32 值并输出 DIFFS 列,否则不输出。默认 yes,如果指定为 --noreplicate-check,一般后续使用下面的 --replicate-check-only 去输出 DIFF 结果。

–replicate-check-only:不在主从库做 checksum 查询,只在原有 percona.checksums 表中查询结果,并输出数据不⼀致的信息。周期性的检测⼀致性时可能⽤到。

–nocheck-binlog-format:不检测日志格式。这个选项对于 ROW 模式的复制很重要,因为 pt-table-checksum 会在 Master 和 Slave 上设置 binlog_format=STATEMENT(确保从库也会执行 checksum SQL),MySQL 限制从库是无法设置的,所以假如行复制从库,再作为主库复制出新从库时(A->B->C),B 的 checksums 数据将无法传输。

–replicate= 指定 checksum 计算结果存到哪个库表⾥,如果没有指定,默认是 percona.checksums 。

3. 执行校验

1)场景 1

  • 标准端口

  • 检查某库下某表

  • ⼀主⼀从

  • 从库 binlog 不是 ROW 格式

[root@node01 percona-toolkit-3.1.0]# pt-table-checksum h=10.186.63.82,u=gengjin,p='123',P=3306 --
 databases=test --tables=sbtest1,sbtest2 --nocheck-replication-filters
Checking if all tables can be checksummed ...
Starting checksum ...
 TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
12-21T09:42:57 0 0 1000000 0 8 0 3.859 test.sbtest1
12-21T09:43:02 0 0 1000000 0 6 0 5.122 test.sbtest2
...
#会⾃动创建校验库表
master82 >show tables;
+-------------------+
| Tables_in_percona |
+-------------------+
| checksums |
+-------------------+
mysql> select * from checksums
 -> ;
+------+---------+-------+------------+-------------+----------------+----------------+----------+----------
+------------+------------+---------------------+
| db | tbl | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt
| master_crc | master_cnt | ts |
+------+---------+-------+------------+-------------+----------------+----------------+----------+----------
+------------+------------+---------------------+
| test | sbtest1 | 1 | 0.004363 | PRIMARY | 1 | 1000 | 949e9d20 | 1000
| 949e9d20 | 1000 | 2020-12-22 03:26:13 |
| test | sbtest1 | 2 | 0.282387 | PRIMARY | 1001 | 115598 | daeb5f19 | 114598
| daeb5f19 | 114598 | 2020-12-22 03:26:13 |
| test | sbtest1 | 3 | 0.382239 | PRIMARY | 115599 | 317495 | d748771b | 201897
| d748771b | 201897 | 2020-12-22 03:26:14 |
| test | sbtest1 | 4 | 0.462463 | PRIMARY | 317496 | 559251 | 2b9cc322 | 241756
| 2b9cc322 | 241756 | 2020-12-22 03:26:14 |
| test | sbtest1 | 5 | 0.43845 | PRIMARY | 559252 | 810981 | 1bef4fe1 | 251730
| 1bef4fe1 | 251730 | 2020-12-22 03:26:15 |
| test | sbtest1 | 6 | 0.337617 | PRIMARY | 810982 | 1000000 | 6daaef2b | 189019
| 6daaef2b | 189019 | 2020-12-22 03:26:15 |
| test | sbtest1 | 7 | 0.002212 | PRIMARY | NULL | 1 | 0 | 0
| 0 | 0 | 2020-12-22 03:26:15 |
| test | sbtest1 | 8 | 0.011642 | PRIMARY | 1000000 | NULL | 0 | 0
| 0 | 0 | 2020-12-22 03:26:15 |
| test | sbtest2 | 1 | 0.447947 | PRIMARY | 1 | 262120 | d454c57a | 262120
| d454c57a | 262120 | 2020-12-22 03:26:18 |
| test | sbtest2 | 2 | 0.507594 | PRIMARY | 262121 | 554699 | 221a4326 | 292579
| 221a4326 | 292579 | 2020-12-22 03:26:19 |
| test | sbtest2 | 3 | 0.497652 | PRIMARY | 554700 | 844644 | b47933a4 | 289945
| b47933a4 | 289945 | 2020-12-22 03:26:20 |
| test | sbtest2 | 4 | 0.286117 | PRIMARY | 844645 | 1000000 | 7246a964 | 155356
| 7246a964 | 155356 | 2020-12-22 03:26:20 |
| test | sbtest2 | 5 | 0.002235 | PRIMARY | NULL | 1 | 0 | 0
| 0 | 0 | 2020-12-22 03:26:20 |
| test | sbtest2 | 6 | 0.002173 | PRIMARY | 1000000 | NULL | 0 | 0
| 0 | 0 | 2020-12-22 03:26:20 |
+------+---------+-------+------------+-------------+----------------+----------------+----------+----------
+------------+------------+---------------------+
14 rows in set (0.01 sec)
mysql>

2)场景 2(dsn)

  • 非标准端口(主从端口不⼀致)

  • 一主多从

  • 全实例校验

# 创建校验库表
master82 >CREATE DATABASE IF NOT EXISTS percona; 
Query OK, 1 row affected (0.00 sec)
master82 >CREATE TABLE IF NOT EXISTS percona.checksums ( db CHAR(64) NOT NULL, tbl CHAR(64) NOT NULL, chunk
INT NOT NULL, chunk_time FLOAT NULL, chunk_index VARCHAR(200) NULL, lower_boundary TEXT NULL, upper_boundary
TEXT NULL, this_crc CHAR(40) NOT NULL, this_cnt INT NOT NULL, master_crc CHAR(40) NULL, master_cnt INT NULL,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (db,tbl,chunk),
INDEX ts_db_tbl(ts,db,tbl) ) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.06 sec)
# 创建dsn表
master82 >CREATE DATABASE IF NOT EXISTS percona; 
Query OK, 1 row affected, 1 warning (0.00 sec)
master82 >CREATE TABLE percona.dsns ( id int(11) NOT NULL AUTO_INCREMENT, parent_id int(11) DEFAULT NULL,
dsn varchar(255) NOT NULL, PRIMARY KEY (id) );
Query OK, 0 rows affected (0.01 sec)
master82 >show tables;
+-------------------+
| Tables_in_percona |
+-------------------+
| checksums |
| dsns |
+-------------------+
2 rows in set (0.00 sec)
# 添加从库信息
master82 >insert into percona.dsns(dsn) values('h=10.186.63.83,P=4380,u=gengjin,p=123');
Query OK, 1 row affected (0.00 sec)
master82 >
# 校验
root@node01 percona-toolkit-3.1.0]# pt-table-checksum --replicate=percona.checksums --nocheck-replicationfilters --no-check-binlog-format --max-load Threads_connected=600 h=10.186.63.82,u=gengjin,p='123',P=4380 --
recursion-method dsn=h=10.186.63.83,u=gengjin,p='123',P=4380,D=percona,t=dsns --function MD5
Checking if all tables can be checksummed ...
Starting checksum ...
# A software update is available:
 TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
12-21T09:03:19 0 0 0 0 1 0 0.358 mysql.columns_priv
12-21T09:03:19 0 0 10 0 1 0 0.497 mysql.db
12-21T09:03:20 0 0 2 0 1 0 0.497 mysql.engine_cost
12-21T09:03:20 0 0 0 0 1 0 0.497 mysql.event
12-21T09:03:21 0 0 0 0 1 0 0.497 mysql.func
12-21T09:03:21 0 0 41 0 1 0 0.498 mysql.help_category
12-21T09:03:22 0 0 699 0 1 0 0.497 mysql.help_keyword
12-21T09:03:22 0 0 1413 0 1 0 0.497 mysql.help_relation
12-21T09:03:23 0 0 643 0 1 0 0.497 mysql.help_topic
12-21T09:03:23 0 0 0 0 1 0 0.498 mysql.ndb_binlog_index
12-21T09:03:24 0 0 0 0 1 0 0.498 mysql.plugin
12-21T09:03:24 0 0 48 0 1 0 0.494 mysql.proc
12-21T09:03:25 0 0 0 0 1 0 0.501 mysql.procs_priv
12-21T09:03:25 0 0 2 0 1 0 0.492 mysql.proxies_priv
12-21T09:03:26 0 0 6 0 1 0 0.498 mysql.server_cost
12-21T09:03:26 0 0 0 0 1 0 0.498 mysql.servers
12-21T09:03:27 0 0 2 0 1 0 0.497 mysql.tables_priv
12-21T09:03:27 0 0 0 0 1 0 0.498 mysql.time_zone
12-21T09:03:28 0 0 0 0 1 0 0.496 mysql.time_zone_leap_second
12-21T09:03:28 0 0 0 0 1 0 0.497 mysql.time_zone_name
12-21T09:03:29 0 0 0 0 1 0 0.499 mysql.time_zone_transition
12-21T09:03:30 0 0 0 0 1 0 0.510 mysql.time_zone_transition_type
12-21T09:03:30 0 1 8 0 1 0 0.481 mysql.user
12-21T09:03:30 0 0 1 0 1 0 0.485 percona.dsns
12-21T09:03:31 0 0 6 0 1 0 0.485 sys.sys_config
12-21T09:03:42 0 0 1000000 0 11 0 11.002 test.sbtest1
12-21T09:03:53 0 0 1000000 0 10 0 10.662 test.sbtest10
12-21T09:04:02 0 0 1000000 0 9 0 9.797 test.sbtest2
12-21T09:04:14 0 0 1000000 0 10 0 11.497 test.sbtest3
12-21T09:04:24 0 0 1000000 0 10 0 10.495 test.sbtest4
12-21T09:04:33 0 0 1000000 0 9 0 8.996 test.sbtest5
12-21T09:04:42 0 0 1000000 0 9 0 8.198 test.sbtest6
12-21T09:04:51 0 0 1000000 0 9 0 9.302 test.sbtest7
12-21T09:05:00 0 0 1000000 0 9 0 9.141 test.sbtest8
12-21T09:05:08 0 0 1000000 0 9 0 8.345 test.sbtest9
12-21T09:05:09 0 0 1 0 1 0 0.490 universe.u_delay
查看checksums表数据(略)
MySQL主从复制数据一致性校验和修复方法及自动化实现 本文分享了MySQL复制数据一致性校验和修复的详细步骤及其自动化实现思路和方法,对MySQL复制架构运维中该项工作的实施及其自动化具有较好的借鉴意义。 阅读详情

相关推荐

MySQL之复制延迟监控与数据一致性实战指南

大家好!在MySQL复制系统的运维中,准确监控复制延迟与保障数据一致性是确保业务稳定的核心。写作本文的初衷,是希望与各位开发者、运维人员分享复制延迟的真实含义、监控方法及数据一致性校验实践,通过通俗解析和实战工具,帮助大家解决复制系统中的关键问题。文中将结合原理分析、工具使用和代码示例,助力读者掌握复制监控与维护的核心技能。欢迎随时交流探讨!

wj_rdk的博客 1311

pt-table-checksum 检测主从是否一致

学习技术需要掌握 作用、原理、安装步骤、工具使用、模拟演示、注意细节、优点缺点 一、pt-table-checksum原理和作用 作用:主要是检查mysql的主从数据是否一致 原理: 1、检查每张表的数据类型是否一致 pt工具先检查表的结构,并获取每一列的数据类型,把所有数据类型都转化为字符串,然后用concat_ws()函数进行连接,由此计算出该行的checksum值。checksum默认采用crc32,你可以自己定义效率更高的udf。 2、计算数据是否一致 如果一行一行的计算che.

u010648194的博客 2827

第五阶段【MySQL数据库:常用PT工具】04:使用pt-table-checksum进行主从数据一致性排查

使用pt-table-checksum进行主从数据一致性排查

weixin_40612128的博客 436

pt-table-checksum使用总结

1、pt-table-checksum概述 pt-table-checksum是Percona-Toolkit工具集中的一个组件,是一个检查主从复制一致性的工具,通过在主库上执行检查语句可以在线检查MySQL主从数据的一致性。它通过指定选项连接指定服务器实例,可以通过指定条件过滤库级别或表级别,每次检查一张表,所以不需要大量的内存和多余操作。即使是非常大的表也可以运行良好,这主要是因为pt-table-checksum可以将表划分为多个chunk,根据checksum query运行的时间来调整c..

qq_40770026的博客 2245

MySQL数据一致性守护者:pt-table-checksum原理与实战全解析

MySQL数据一致性校验工具pt-table-checksum解析 本文深入介绍了Percona Toolkit中的pt-table-checksum工具,它专门用于检测MySQL主从复制环境中的数据不一致问题。文章从数据一致性的重要性入手,详细剖析了该工具的核心原理:通过智能分块计算CRC32校验值,并利用复制机制比对主从库结果。工具具有动态分块、索引优化、负载保护等特性,能在不影响生产环境的情况下高效运行。文中还提供了完整的使用指南,包括安装配置、参数解析和典型应用场景(主从验证、数据迁移检查等),并解

专注于编程、AI、人工智能等多个领域内容研究和分析 912

告别手动输入!用Burp插件+ddddocr,5分钟搞定图片验证码自动识别

本文详细介绍了如何利用Burp插件和ddddocr开源库快速构建图片验证码自动识别系统,实现高效、零成本的验证码自动化解决方案。通过环境搭建、性能调优和Burp Suite深度集成,显著提升安全测试效率,特别适用于金融和电商系统的批量测试场景。

weixin_29099217的博客 202

dbd-mysql-4.011.tar.gz下载_技术分享 | 数据校验工具 pt-table-checksum

1.概述pt-table-checksum 是 Percona-Toolkit 的组件之一,用于检测 MySQL 主、从库的数据是否一致。其原理是在主库执行基于 statement 的 SQL 语句来生成主库数据块的checksum,把相同的 SQL 语句传递到从库执行,并在从库上计算相同数据块的 checksum,最后,比较主从库上相同数据块的 checksum 值,由此判断主从数据是否一致。...

weixin_40004502的博客 183

零基础小白Coze知识普及【新手必备资料!!】

AI智能体|扣子(Coze)工作流搭建【零基础小白Coze知识普及】 1、领取100+工作流源码!复制到扣子即可直接使用 2、AI认知+9节商业智能体拆解 3、500+各行业高质量提示词 4、超低价格使用即梦文生图图生视频和banana生图

Zhima0522的博客 3254

【MySQL】pt-table-checksum 实战:主从一致性校验的终极方案

pt-table-checksum 凭借低侵入性、高准确性和良好的兼容性,成为 MySQL 主从一致性校验的首选工具。在实际运维中,建议将其纳入定时任务(如每周一次),配合监控告警机制,实现主从数据一致性的常态化检测。对于核心业务库,可结合 pt-table-sync 构建 “检测 - 修复” 闭环,确保数据可靠性。最后提醒:使用前务必在测试环境验证,避免因参数配置不当影响生产环境;校验大表时建议避开业务高峰,同时做好数据备份。如果在使用过程中遇到问题,欢迎在评论区交流~

专注Java和MySQL领域知识分享 621

【Isaac Sim】无头服务器远程桌面连接实战:Turbovnc配置与常见问题解决

本文详细介绍了在无头GPU服务器上通过Turbovnc远程桌面连接并运行NVIDIA Isaac Sim的实战教程。针对无图形界面服务器运行仿真软件的核心痛点,文章提供了从Turbovnc安装配置、SSH隧道建立,到以普通用户身份启动服务、解决GLXBadFBConfig等常见图形错误的完整方案,帮助开发者在云端高效部署机器人仿真环境。

weixin_29254673的博客 774

Quanto option期权公式推导(更新中)

Quanto期权不同于以标的股票或资产的计价货币支付最终收益的普通欧式期权,它以另一种货币以预先确定的汇率支付最后的收益。以股票B的计价货币来计价的quanto看涨期权的收益为F0×max⁡(Sa(T)−K,0)×Sb(T)F_0 \times \max(S_a(T)-K, 0) \times S_b(T)F0​×max(Sa​(T)−K,0)×Sb​(T) 其中SaS_aSa​以货币A计价,SbS_bSb​以货币B计价,F0F_0F0​是预先固定的汇率. 假设上述股票均遵循几何布朗运动,可以得到以下恒等式

qq_41782124的博客 3684

第13问:pt-table-checksum 到底会不会影响业务性能?

问题 用 pt-table-checksum 时,会不会影响业务性能? 实验 实验开始前,给大家分享一个小经验:任何性能评估,不要相信别人的评测结果,要在自己的环境上测试,并**(大概)知晓原理**。 我们先建一对主从: 然后用 mysqlslap 跑一个持续的压力: 开另外一个会话,将 master 上的 general log 打开: 然后通过 pt-table-checksum 进行一次比较: 查看 master 的 general log,由于 mysqlslap 的影响,general .

ActionTech的博客 339

告别手动打点计时:用Lauterbach TRACE32的RunTime功能,5分钟搞定嵌入式代码段性能分析

本文深入解析了Lauterbach TRACE32的RunTime功能在嵌入式代码性能分析中的革命性应用。通过硬件级计时原理和非侵入式设计,该功能能快速精确测量代码执行时间,显著提升开发效率,特别适用于汽车电子和工业控制领域。文章还提供了从基础设置到高级分析的完整实战指南,帮助工程师轻松掌握这一强大工具。

weixin_30615767的博客 280

checksum什么作用_第13问:pt-table-checksum 到底会不会影响业务性能?

问题用 pt-table-checksum 时,会不会影响业务性能?实验实验开始前,给大家分享一个小经验:任何性能评估,不要相信别人的评测结果,要在自己的环境上测试,并(大概)知晓原理。我们先建一对主从:然后用 mysqlslap 跑一个持续的压力:开另外一个会话,将 master 上的 general log 打开:然后通过 pt-table-checksum 进行一次比较:查看 master ...

weixin_31838473的博客 294

【PCIe 总线及设备入门学习专栏 3.2.2 -- PCIe 中什么是 SR-IOV】

SR-IOV(Single Root I/O Virtualization)是 PCIe 规范中的一种技术,允许物理 PCIe 设备(称为 Physical Function, PF)虚拟化为多个虚拟设备(称为 Virtual Functions, VFs),使多个操作系统或虚拟机能够共享同一个物理设备。SR-IOV:一种 PCIe 虚拟化技术,允许将一个物理 PCIe 设备虚拟化为多个虚拟设备。:物理设备的主要管理接口。:PF 的轻量级副本,分配给虚拟机或操作系统。

CodingCos的博客 1514

Jupyter notebook教程系列(二)Jupyter notebook的基本用法

Jupyter notebook的基本使用   一. 主页面 如图1-1 我们先介绍一下主页面上的内容: 1.Files页面是用于管理创建文件相关类目的。 2.Running页面主要展示的是当前正在运行当中的终端和“ipynb”格式的notebook。若想要关闭已经打开的终端和“ipynb”格式的notebook,仅仅关闭其页面是无法彻底退出程序的,需要在Running页面点击其对...

dlhlSC的博客 1438

mysql从库建表报错_mysql主从一致性校验工具-pt

一、环境1、系统环境系统IP主机名说明server_idcentos6.7MasterIPmaster数据库:主177centos6.7SlaveIPslave数据库:从1482、软件环境软件版本安装方式说明pt工具3.0.4编译安装这是一个综合工具包,包含很多pt命令mysql数据库5.6.37yum安装主从环境3、需要用到库库名表名用途perconachecksums存储pt命令监测的结果,第...

weixin_42517987的博客 258

1、工作流介绍

工作流起源于办公自动化,是对软件中业务流程的抽象。通过工作流将各个任务有序组织起来形成一个完整的业务闭环。比如:请假审批流程,网上购物流程,银行贷款流程;!

leyoliu的博客 5109

【经验分享】MySQL线上使用经验

关于MySQL线上使用经验的一些分享。

weixin_43246215的博客 1125

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

在线校验两个tidb系统的数据一致性

作者:莫善 原文来源: https://tidb.net/blog/09e2fdf0 ...

TiDB 社区干货传送门 442

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Percona Toolkit入门:零基础学会5个最常用工具

通过这个工具,我们可以发现哪些索引从未被使用过(可以考虑删除),哪些查询没有使用合适的索引(需要优化)。经过一段时间的学习和实践,我发现有5个工具特别实用,几乎能满足日常80%的数据库管理和优化需求。这个工具可以监控数据库中的查询,并根据预设的条件终止长时间运行的查询。如果发现不一致,它会报告具体的差异。我试用了其中的pt-query-digest练习模块,系统会给出一个慢查询日志文件,然后引导你一步步分析,最后还会提供参考答案。它提供了交互式的练习环境,内置了示例数据集,可以随时测试这些工具的效果。

CrystalwaveStag的博客 799

DigitalOcean数据库零停机迁移实战:MySQL/PG/Redis全栈方案

数据库迁移是云原生演进中的关键工程挑战,其本质是在保障数据一致性前提下实现服务连续性。核心原理依赖于逻辑复制、在线DDL变更与流式快照等技术路径,通过分层可控策略规避黑盒工具的隐性风险。技术价值体现在将TB级数据迁移窗口压缩至秒级,显著提升SLA达标率与业务韧性。典型应用场景包括老旧IDC下线、架构升级、多活容灾建设及云厂商迁移。本文聚焦DigitalOcean托管数据库(MySQL/PostgreSQL/Redis)的真实生产环境落地,深度整合gh-ost、逻辑复制、RDB流式传输等关键技术选型与调优细节

weixin_34289454的博客 342

mysql 核对 主从_mysql主从一致性检查&修复

1.前言在mysql数据库主从环境,总会出现各种原因,导致数据库主从环境的不一致;本文就是介绍在mysql数据库主从出现了不一致的情况,如何进行修复,保持数据的一致性。本文使用:percona-toolk,这个工具包提供pt-table-checksum(检查数据),pt-table-sync修复数据两个命令行工具来实现mysql数据库主从的检查以及修复,在网上分享的mysql主从一致性检查原理的...

weixin_39593340的博客 291

MYSQL主从同步

MYSQL主从同步架构是目前使用最多的数据库架构之一,MySam引擎负责新增修改删除操作,InnoDB引擎负责查询,所谓的读写分离。尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重要,新手往往在出现主从同步错误的时候不知道如何入手,这篇文章就是根据自己的经验来详细叙述mysql主从的管理。 MYSQL主从同步的作用 (1) 数据分布 (2) 负载平衡(load balancing) (3) 备份 (4) 高可用性(high availability)和容错

GY的的专栏 1万+

数据库CI/CD工具选型指南:Liquibase、Flyway、Bytebase、Sqitch对比

在软件交付走向GitOps与流水线化的今天,数据库变更仍是有状态基础设施中最棘手的一环。数据库迁移工具通过版本记录、变更追踪与自动化执行,让结构演进变得可重复、可校验。理解这些工具如何管理schema版本、处理校验和与回滚策略,是团队实现数据库DevOps的基础。无论是轻量级SQL迁移、企业级多数据库适配,还是平台化SQL审核与GitOps协作,不同工具解决不同阶段的核心痛点。结合团队规模、数据库类型与发布频率,选择合理的迁移引擎与发布管控组合,能显著降低生产事故风险,让数据库变更像应用代码一样可控、可审计

weixin_34161083的博客 713
上一篇: 技术分享 | 如何写一个自己的 bcc 工具观测 MySQL?
下一篇: 第19期:索引设计(哈希索引数据分布与使用场景)
爱可生开源社区
博客等级 码龄8年 1937粉丝 1004原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值