- 博客(142)
- 资源 (5)
- 问答 (2)
- 收藏
- 关注
原创 MySQL Query Profiling源码深度剖析
4.1 Query Profiling用法详解Query Profiling是MySQL数据库提供的一种SQL性能诊断工具, 本节通过对Profiling的简介,原理,使用方法以及案例的介绍,让读者学会如何在SQL优化的过程中,合理的去使用它。4.1.1 Query Profiling简介Query Profiling是MySQL数据库中提供的一种SQL性能诊断方法,用户可以在开启pro...
2019-07-08 12:21:46 368 1
原创 MySQL中的委托回调机制
MySQL的插件功能通过委托回调机制来实现。拿Binlog_relay_IO_delegate(委托者的一种)来讲,它有很多委托方法,比如说after_read_event,是在读取一个binlog event之后进行回调,MySQL半同步插件就跟这个委托者相关。下面来看Binlog_relay_IO_delegate中的after_read_event委托函数是如何进行回调的,详细过程如下...
2019-02-22 22:32:32 1011
原创 InnoDB死锁分析-案例4-行锁升级next key lock
文章目录一、死锁日志二、表结构三、死锁分析四、解决办法一、死锁日志LATEST DETECTED DEADLOCK------------------------2018-12-21 13:34:32 0x7fc92c3be700*** (1) TRANSACTION:TRANSACTION 1862, ACTIVE 6 sec starting index readmysql ta...
2018-12-23 09:49:41 481
原创 MySQL源码调试入门
这篇文章可以作为MySQL源码初学者的入门指导,如有雷同,纯属意外。第一步,获取MySQL源代码有如下几种方法获取MySQL源代码 官方下载,以5.7.23为例,见如下链接https://dev.mysql.com/downloads/mysql/ 或者直接执行wget https://cdn.mysql.com//Downloads/MySQL-5.7/mys......
2018-08-05 18:27:21 5152
原创 InnoDB undo truncate流程
文章目录参数核心数据结构class Truncate成员函数成员变量核心逻辑梳理truncate标记truncate过程MySQL 8.0引入了undo truncate机制, 允许对独立的undo tablespace进行清理操作.参数innodb_undo_log_truncatetruncate开关, 控制是否开启undo truncate功能函数trx_purge_mark_undo_for_truncate/** Iterate over all the UNDO tablesp
2021-04-24 09:02:05 603
原创 gnuplot 使用示例
安装部署:#centos/redhatyum install gnuplot#macosbrew install gnuplot#ubuntusudo apt install gnuplot数据文件ashe@macos:~/data/test/test_gnuplott $ cat t1.txt1 1 2.12 4 4.53 900 64 16 85 25 106 36 117 49 128
2020-07-21 22:53:00 662
原创 MySQL-8.0 RESTART命令远程重启mysqld
MySQL在8.0版本中引入restart命令,实现远程重启mysqld进程的功能。好处不言而喻,可以在不登陆操作系统的情况下,执行重启操作,对于运管上来说也是一个很棒的功能。执行restart命令需要数据库账号具备SHUTDOWN权限,并且mysqld是在systemd/mysqld_safe守护进程下启动的。原理是mysqld_safe检测mysqld退出时的返回值,如果是16,则进行重启。bash shell如下:#!/bin/bashexport MYSQLD_PARENT_PID=$$
2020-06-20 20:03:12 2371
原创 多目标文件引起Clion出现某些符号无法正确被索引的问题
问题如下:调试mysqld发现,这部分代码为灰色,并且相关符号无法被索引,但是调试时又进入了灰色区域的代码。原因是因为MySQL项目中的另外一个可执行文件innochecksum利用UNIV_INNOCHECKSUM宏来使用innodb中的源代码,生成自己的可执行文件,而clion调试mysqld时,其实没有定义这个宏的,但是clion并没有正确识别这种场景,导致相关的符号索引失败。临时的解决办法时,在调试时,在相应的Cmakelist中注释掉了innochecksum的配置问题解决..
2020-06-15 19:57:08 1379
原创 数据导入引发slave实例异常crash的bug定位与修复
文章目录故障表象故障复现根因挖掘bug修复/解决方案DB最近在搞迁移的事情,逻辑迁移过程中发现将数据从A集群迁移到B集群时,偶发B集群slave实例的crash。整个问题的处理过程查看故障表象故障复现直接问题分析真正的问题定位问题修复故障表象错误日志中记录了crash时的线程堆栈信息,如下:As this is a crash and something is definitely wrong, the informationcollection process might fai
2020-05-10 20:18:33 369
原创 深度解析InnoDB事务中的MVCC原理
文章目录1. 事务相关的数据结构1.1 trx_t 事务结构体1.2 TrxFactory-事务工厂1.3 trx_pool_t 事务缓存池1.4 trx_pools_t 事务缓存池管理器2. MVCC相关的数据结构2.1 ReadView-事务的可见视图2.2 ReadView管理器-MVCC3. 事务/MVCC/ReadView的关系4. 事务和MVCC相关的操作4.1 开启事务并不一定需要...
2020-04-22 22:06:54 717
原创 MySQL中的互斥锁包装器
我们习惯性的使用互斥锁来保护某个临界区,它可能是一个变量,或者一段代码,比如在进入某个函数后,需要对mutex加锁,而无论任何情况下,只要函数退出,就要把锁释放掉,而函数可能会因为各种情况而退出,包括遇到各种异常,错误,不同的结果等等,一个可行的方案是在所有可能退出函数的地方进行锁的释放,亦或者通过goto/break等语法来控制函数在特定的位置退出,并且退出前进行锁的释放,但这些实现方式相比较今...
2020-04-06 20:27:56 319
原创 before_dml hook 引发的drop table阻塞事件
before_dml_hook 引发的drop table阻塞事件现象:一条drop命令后,几乎所有写入操作都阻塞在Opening tables对于Drop table操作,历来会出现一些问题,比如:https://www.cnblogs.com/CtripDBA/p/11465315.htmlhttps://blog.csdn.net/zyz511919766/article/deta...
2020-04-02 20:50:48 316
原创 详解MySQL processlist id增长机制,最大多少?会不会溢出?
之前就有这样的疑惑,只是一直没有真正遇到过这个问题,所以也没有去动手翻阅代码去一探究竟,而最近在写SQL洞察组件时遇到了点问题,今晚就来看一下。其实定位这个标题中的问题也非常简单,直接定位到线程初始化阶段,函数调用过程如下:::pfs_spawn_thread(void *) ::handle_connection(void *) init_new_thd(Chann...
2020-02-29 00:03:33 694
原创 Cmake add_test
通过在项目根目录下的CMakeLists.txt配置文件中添加enable_testing()可以开启项目的测试功能。一定要在根目录下的CMakeLists.txt中开启,不然执行make test时会报错。随后项目的cmake配置文件中可以添加add_test指令add_test(NAME <name> [CONFIGURATIONS [Debug|Release|....
2020-02-26 23:19:53 7028 2
原创 cmake利用git tag生成内部的版本号
项目中使用git进行代码的版本控制,每次发版都会生成新的tag。而可执行文件往往都喜欢使用-V或者–version的命令行参数来获取当前可执行文件的版本,这可以在代码中通过宏定义来实现,如下:#define AUDIT_VERSION "1.1.1"cout << AUDIT_VERSION << endl;如果像上面的代码一样,直接在代码中写死,每次打tag时...
2020-02-19 20:06:16 1986
原创 MySQL Debug sync功能使用简介
debug sync是MySQL提供的一种代码调试,问题分析工具, 它集成在MySQL的内部。具体作用是:让代码执行到某个特殊的位置(同步点)时触发暂停,等待指定的某个或者多个signal在激活同步点,并且被触发时,可以向别的线程发送signal,唤醒其他线程在激活同步点,并且被触发时,可以被别的线程通过signal唤醒继续执行可以设置同步点的等待超时时间要求:只能在debug版本中...
2020-02-07 09:36:01 1496
原创 MySQL Server层的原子操作
看如下代码#test.ccint i=0;void* funcA(void* arg){ for(int i=0;i<10;i++) { ++i; } }void* funcB(void* arg){ for(inti=0;i<10;i--) { --i; }}int ma...
2020-02-04 17:54:28 432
原创 events_transactions_history_long表的内存占用
events_transactions_history_long表用于存储历史的事务信息。通过参数performance_schema_events_transactions_history_long_size来控制最多保留多少条事务记录(包含所有session)通过操作系统直接查看内存占用来判断events_transactions_history_long表的内存占用不太可行,通过table...
2019-12-23 21:54:42 592
原创 events_transactions_current表的写入读取和存储方式
events_transactions_current是performance_schema中记录事务状态信息的表,它除了可以记录普通事务以外,还可以记录MySQL中的XA事务。表结构如下:mysql> show create table performance_schema.events_transactions_current\G*************************...
2019-12-23 21:52:51 700
原创 数据库审计方案简介和功能对比
文章目录数据库审计方案简介和功能对比1. MySQL自带日志功能1.1 普通日志1.2 通过慢日志2. 数据库插件形式2.1 Oracle MySQL 企业版审计插件2.2 Percona插件2.3 MariaDB插件3. 旁路机制3.1 vc-mysql-sniffer3.2 奇虎360开源产品mysql-sniffer4. 功能对比数据库审计方案简介和功能对比通过数据库审计的功能,用户可以...
2019-12-16 23:22:31 1673 4
原创 InnoDB缓冲池初始化
InnoDB作为MySQL的一个存储引擎插件,在启动MySQL数据库实例时,会调用插件提供的初始化函数,InnoDB启动时的入口函数是innobase_initmysql_declare_plugin(innobase){ MYSQL_STORAGE_ENGINE_PLUGIN, &innobase_storage_engine, innobase_hton_name, ...
2019-12-16 23:18:24 463
原创 详解InnoDB内存堆
文章目录1. 内存堆的类型2. 内存堆的内部结构3. 内存堆的创建与内存块的分配过程4. 内存堆的使用5. 内存堆的释放6. 内存堆总结内存管理一直是C语言程序的一个难题。在Innodb中,并没有直接使用系统提供的malloc/free来进行动态内存的申请和释放,而是采用内存堆的形式来管理。虽然目前Innodb大部分代码都是.cc结尾,但是还是有很多代码风格是C类型的,只是某些地方对这些C代...
2019-12-16 23:15:38 536
原创 malloc分配超过128kb内存-实验记录
默认情况下,当malloc或者new操作一次性分配大于等于128KB的内存时,会使用mmap来进行,而在小于128KB时,使用的是brk的方式小于128KB时的测试截图如下:大于128KB时的测试截图如下:128KB是可以调节的,如下,重新使用brk的方式进行内存分配。测试代码如下:#include <iostream>#include <unistd.h>...
2019-09-16 23:38:50 1380
原创 TDengine源码解析-启动
用户通过如下命令启动tdengine服务端程序taosd -c /etc/taos/taos.cfg本文主要分析taosd的启动过程,感谢作者开源这个还算不错的时序数据库产品。首先检测是否通过-c指定了配置文件,如下:for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "-c") == 0) { if (i ...
2019-08-28 22:03:23 2194
原创 TDengine 记录微秒
默认情况下,TDengine的timestamp字段只支持到毫秒,完全不够使用,官方文档说明可以通过配置文件指定enableMicrosecond来开启微秒,但是实验证明是不行的。翻了github的issues记录,开发者给出了新的解决方案,在创建数据库时指定precision "us"即可,如下:taos> create database d1 precision "us";08/2...
2019-08-28 16:59:36 1805
原创 cmake判断当前操作系统类型
CMake是为了解决美国国家医学图书馆出资的Visible Human Project专案下的Insight Segmentation and Registration Toolkit (ITK) 软件的跨平台建构的需求而创造出来的。我们在编写CmakeList.txt文件时,可以通过if判断当前所处的系统环境IF (WIN32) MESSAGE(STATUS "Now is windows"...
2019-07-09 13:42:46 4981
原创 macos调节docker内存限制
在macos平台上,通过docker命令调节docker运行内存限制时,发现不生效,如下:#docker启动命令docker run -m 8192M --privileged -it -p 7979:22 -v /data/docker/centos:/data --net staticnet --ip 192.168.0.2 ashe /usr/sbin/init#进入docker ...
2019-06-20 22:33:01 4571
原创 optimizer特性之derived_merge
文章目录MySQL optimizer特性之derived_merge1. 什么是derived table ?2. 什么是derived_merge ?3. derived_merge开启和关闭的区别4. 无法利用derived_merge的情况5. derived_merge引发的问题6. 学以致用MySQL optimizer特性之derived_merge本文主要介绍如下内容 什么......
2019-04-25 18:44:04 4202 1
原创 MySQL查询优化器源码分析-1
文章目录MySQL查询优化器源码分析handle_query(THD*, LEX*, Query_result*, unsigned long long, unsigned long long)st_select_lex::prepare(THD*)st_select_lex::setup_tables(THD*, TABLE_LIST*, bool)st_select_lex::resolve_...
2019-04-18 22:11:34 856
原创 clion在调试时在代码处自动显示变量值
clion在调试时自动显示变量的值不知道动了哪里,导致调试时无法在相应的代码位置显示变量的值,如下红框处没有显示任何信息,之前默认会显示参数的值。可以通过左下角的设置按钮,勾选show values inline,就会显示了,效果如下...
2019-04-18 22:05:50 10372 1
原创 MySQL事务提交流程(2pc)时序图
文章目录MySQL事务提交流程简介一、简化版的事务处理时序图时序图说明二、时序图说明用户下发begin操作用户进行dml操作用户下发commitMySQL事务提交流程简介最近组内在进行进阶学习培训,发现组员对于MySQL-5.7事务提交整体的流程不是特别熟悉,而网上的资料众说纷纭,所以特画此图,从上帝视角,来看事务操作的主要流程,此图为事务处理的简化时序图,在处理细节上省略了和多线程复制相关的...
2019-03-29 21:01:57 1000
原创 Innodb死锁日志分段解读-如何阅读死锁日志
死锁分析是DBA日常工作之一,一般死锁分析的步骤如下阅读死锁日志查看表机构,甚至不需要定位事务场景,进行分析而正确的理解死锁日志,是进行死锁分析的重点,下面就是对死锁日志的分段解读。一般的死锁日志如下------------------------LATEST DETECTED DEADLOCK------------------------2019-01-09 15:11:...
2019-03-10 18:13:15 1190
原创 如何查看当前Innodb的并发
文章目录如何查看当前Innodb的并发线程数?如何查看当前Innodb的并发线程数?在MySQL中:用Threads_connected表示当前数据库server层的链接数,对应参数max_connections;使用Threads_running表示已经连接的线程中,正在执行SQL的线程并发数我们还知道在Innodb中还存在一个并发数的限制,可以参照参数innodb_thr...
2019-03-09 18:35:27 564
原创 mysql中的select @@version
有些朋友问过的问题,mysql中查询版本号,有的是5.7.18,有的是 5.7.18-log ,有的是5.7.18-debug,如下mysql> select @@version;+------------------+| @@version |+------------------+| 5.7.18-debug-log |+------------------+...
2019-03-04 20:05:48 8754
原创 MySQL数据库链接无法kill的问题分析
这应该是17年的问题了,博客中分享下文章目录问题描述什么是kill?MySQL kill操作的原理为什么kill不掉?数据库堆栈信息关于kill操作的改进措施问题描述由于业务sql慢查询,急需要kill链接,添加索引来解决问题。但是kill命令批量下发后,数据库内部链接没有释放。如下| 2211362536 | ashe_ashe | ********** | ******** | Ki...
2019-02-28 22:48:16 1574
求 lldb多线程调试方法
2018-01-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人