<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sunashe的个人随笔]]></title><description><![CDATA[学，以致用!]]></description><link>https://blog.youkuaiyun.com/sun_ashe</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sun_ashe]]></copyright><item><title><![CDATA[MySQL错误码去重校验bug]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/127435447</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/127435447</guid><author>sun_ashe</author><pubDate>Thu, 20 Oct 2022 21:37:32 +0800</pubDate><description><![CDATA[给MySQL官方提bug的那些年]]></description><category></category></item><item><title><![CDATA[InnoDB undo truncate流程]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/116081735</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/116081735</guid><author>sun_ashe</author><pubDate>Sat, 24 Apr 2021 09:02:05 +0800</pubDate><description><![CDATA[文章目录参数核心数据结构class Truncate成员函数成员变量核心逻辑梳理truncate标记truncate过程
MySQL 8.0引入了undo truncate机制, 允许对独立的undo tablespace进行清理操作.
参数

innodb_undo_log_truncate

truncate开关, 控制是否开启undo truncate功能
函数trx_purge_mark_undo_for_truncate

/** Iterate over all the UNDO tablesp]]></description><category></category></item><item><title><![CDATA[gnuplot 使用示例]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/107500935</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/107500935</guid><author>sun_ashe</author><pubDate>Tue, 21 Jul 2020 22:53:00 +0800</pubDate><description><![CDATA[安装部署：
#centos/redhat
yum install gnuplot
#macos
brew install gnuplot
#ubuntu
sudo apt install gnuplot

数据文件
ashe@macos:~/data/test/test_gnuplott $ cat t1.txt
1     1   2.1
2     4   4.5
3     900   6
4    16   8
5    25   10
6    36   11
7    49   12
8    ]]></description><category></category></item><item><title><![CDATA[MySQL-8.0 RESTART命令远程重启mysqld]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/106876971</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/106876971</guid><author>sun_ashe</author><pubDate>Sat, 20 Jun 2020 20:03:12 +0800</pubDate><description><![CDATA[MySQL在8.0版本中引入restart命令，实现远程重启mysqld进程的功能。好处不言而喻，可以在不登陆操作系统的情况下，执行重启操作，对于运管上来说也是一个很棒的功能。
执行restart命令需要数据库账号具备SHUTDOWN权限，并且mysqld是在systemd/mysqld_safe守护进程下启动的。
原理是mysqld_safe检测mysqld退出时的返回值，如果是16，则进行重启。bash shell如下：

#!/bin/bash

export MYSQLD_PARENT_PID=$$]]></description><category></category></item><item><title><![CDATA[多目标文件引起Clion出现某些符号无法正确被索引的问题]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/106770117</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/106770117</guid><author>sun_ashe</author><pubDate>Mon, 15 Jun 2020 19:57:08 +0800</pubDate><description><![CDATA[问题如下：

调试mysqld发现，这部分代码为灰色，并且相关符号无法被索引，但是调试时又进入了灰色区域的代码。

原因是因为MySQL项目中的另外一个可执行文件innochecksum利用UNIV_INNOCHECKSUM宏来使用innodb中的源代码，生成自己的可执行文件，而clion调试mysqld时，其实没有定义这个宏的，但是clion并没有正确识别这种场景，导致相关的符号索引失败。
临时的解决办法时，在调试时，在相应的Cmakelist中注释掉了innochecksum的配置

问题解决


..]]></description><category></category></item><item><title><![CDATA[数据导入引发slave实例异常crash的bug定位与修复]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/106041368</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/106041368</guid><author>sun_ashe</author><pubDate>Sun, 10 May 2020 20:18:33 +0800</pubDate><description><![CDATA[文章目录故障表象故障复现根因挖掘bug修复/解决方案
DB最近在搞迁移的事情，逻辑迁移过程中发现将数据从A集群迁移到B集群时，偶发B集群slave实例的crash。
整个问题的处理过程

查看故障表象
故障复现
直接问题分析
真正的问题定位
问题修复

故障表象
错误日志中记录了crash时的线程堆栈信息，如下：
As this is a crash and something is definitely wrong, the information
collection process might fai]]></description><category></category></item><item><title><![CDATA[深度解析InnoDB事务中的MVCC原理]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/105690935</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/105690935</guid><author>sun_ashe</author><pubDate>Wed, 22 Apr 2020 22:06:54 +0800</pubDate><description><![CDATA[文章目录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 开启事务并不一定需要...]]></description><category></category></item><item><title><![CDATA[MySQL中的互斥锁包装器]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/105350535</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/105350535</guid><author>sun_ashe</author><pubDate>Mon, 06 Apr 2020 20:27:56 +0800</pubDate><description><![CDATA[我们习惯性的使用互斥锁来保护某个临界区，它可能是一个变量，或者一段代码，比如在进入某个函数后，需要对mutex加锁，而无论任何情况下，只要函数退出，就要把锁释放掉，而函数可能会因为各种情况而退出，包括遇到各种异常，错误，不同的结果等等，一个可行的方案是在所有可能退出函数的地方进行锁的释放，亦或者通过goto/break等语法来控制函数在特定的位置退出，并且退出前进行锁的释放，但这些实现方式相比较今...]]></description><category></category></item><item><title><![CDATA[before_dml hook 引发的drop table阻塞事件]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/105278860</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/105278860</guid><author>sun_ashe</author><pubDate>Thu, 02 Apr 2020 20:50:48 +0800</pubDate><description><![CDATA[before_dml_hook 引发的drop table阻塞事件
现象:一条drop命令后，几乎所有写入操作都阻塞在Opening tables

对于Drop table操作，历来会出现一些问题，比如：
https://www.cnblogs.com/CtripDBA/p/11465315.html
https://blog.youkuaiyun.com/zyz511919766/article/deta...]]></description><category></category></item><item><title><![CDATA[详解MySQL processlist id增长机制，最大多少？会不会溢出？]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/104567213</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/104567213</guid><author>sun_ashe</author><pubDate>Sat, 29 Feb 2020 00:03:33 +0800</pubDate><description><![CDATA[之前就有这样的疑惑，只是一直没有真正遇到过这个问题，所以也没有去动手翻阅代码去一探究竟，而最近在写SQL洞察组件时遇到了点问题，今晚就来看一下。
其实定位这个标题中的问题也非常简单，直接定位到线程初始化阶段,
函数调用过程如下：
::pfs_spawn_thread(void *)
    ::handle_connection(void *)
        init_new_thd(Chann...]]></description><category></category></item><item><title><![CDATA[Cmake add_test]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/104527591</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/104527591</guid><author>sun_ashe</author><pubDate>Wed, 26 Feb 2020 23:19:53 +0800</pubDate><description><![CDATA[通过在项目根目录下的CMakeLists.txt配置文件中添加
enable_testing()

可以开启项目的测试功能。

一定要在根目录下的CMakeLists.txt中开启，不然执行make test时会报错。

随后项目的cmake配置文件中可以添加add_test指令
add_test(NAME &lt;name&gt; [CONFIGURATIONS [Debug|Release|....]]></description><category></category></item><item><title><![CDATA[cmake利用git tag生成内部的版本号]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/104399404</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/104399404</guid><author>sun_ashe</author><pubDate>Wed, 19 Feb 2020 20:06:16 +0800</pubDate><description><![CDATA[项目中使用git进行代码的版本控制，每次发版都会生成新的tag。
而可执行文件往往都喜欢使用-V或者–version的命令行参数来获取当前可执行文件的版本，这可以在代码中通过宏定义来实现，如下：
#define AUDIT_VERSION "1.1.1"

cout &lt;&lt; AUDIT_VERSION &lt;&lt; endl;

如果像上面的代码一样，直接在代码中写死，每次打tag时...]]></description><category></category></item><item><title><![CDATA[MySQL Debug sync功能使用简介]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/104206105</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/104206105</guid><author>sun_ashe</author><pubDate>Fri, 07 Feb 2020 09:36:01 +0800</pubDate><description><![CDATA[debug sync是MySQL提供的一种代码调试，问题分析工具， 它集成在MySQL的内部。具体作用是：

让代码执行到某个特殊的位置(同步点)时触发暂停，等待指定的某个或者多个signal
在激活同步点，并且被触发时，可以向别的线程发送signal，唤醒其他线程
在激活同步点，并且被触发时，可以被别的线程通过signal唤醒继续执行
可以设置同步点的等待超时时间

要求：只能在debug版本中...]]></description><category></category></item><item><title><![CDATA[MySQL Server层的原子操作]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/104172716</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/104172716</guid><author>sun_ashe</author><pubDate>Tue, 04 Feb 2020 17:54:28 +0800</pubDate><description><![CDATA[看如下代码
#test.cc

int i=0;

void* funcA(void* arg)
{
    for(int i=0;i&lt;10;i++)
    {
        ++i;
    }
    
}

void* funcB(void* arg)
{
    for(inti=0;i&lt;10;i--)
    {
        --i;
    }
}

int ma...]]></description><category></category></item><item><title><![CDATA[events_transactions_history_long表的内存占用]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/103674142</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/103674142</guid><author>sun_ashe</author><pubDate>Mon, 23 Dec 2019 21:54:42 +0800</pubDate><description><![CDATA[events_transactions_history_long表用于存储历史的事务信息。通过参数performance_schema_events_transactions_history_long_size来控制最多保留多少条事务记录(包含所有session)
通过操作系统直接查看内存占用来判断events_transactions_history_long表的内存占用不太可行，通过table...]]></description><category></category></item><item><title><![CDATA[events_transactions_current表的写入读取和存储方式]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/103674110</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/103674110</guid><author>sun_ashe</author><pubDate>Mon, 23 Dec 2019 21:52:51 +0800</pubDate><description><![CDATA[events_transactions_current是performance_schema中记录事务状态信息的表，它除了可以记录普通事务以外，还可以记录MySQL中的XA事务。
表结构如下：
mysql&gt; show create table  performance_schema.events_transactions_current\G
*************************...]]></description><category></category></item><item><title><![CDATA[数据库审计方案简介和功能对比]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/95189664</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/95189664</guid><author>sun_ashe</author><pubDate>Mon, 16 Dec 2019 23:22:31 +0800</pubDate><description><![CDATA[文章目录数据库审计方案简介和功能对比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. 功能对比
数据库审计方案简介和功能对比
通过数据库审计的功能，用户可以...]]></description><category></category></item><item><title><![CDATA[InnoDB缓冲池初始化]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/103572079</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/103572079</guid><author>sun_ashe</author><pubDate>Mon, 16 Dec 2019 23:18:24 +0800</pubDate><description><![CDATA[InnoDB作为MySQL的一个存储引擎插件，在启动MySQL数据库实例时，会调用插件提供的初始化函数，InnoDB启动时的入口函数是innobase_init
mysql_declare_plugin(innobase)
{
  MYSQL_STORAGE_ENGINE_PLUGIN,
  &amp;innobase_storage_engine,
  innobase_hton_name,
 ...]]></description><category></category></item><item><title><![CDATA[详解InnoDB内存堆]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/103572055</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/103572055</guid><author>sun_ashe</author><pubDate>Mon, 16 Dec 2019 23:15:38 +0800</pubDate><description><![CDATA[文章目录1. 内存堆的类型2. 内存堆的内部结构3. 内存堆的创建与内存块的分配过程4. 内存堆的使用5. 内存堆的释放6. 内存堆总结
内存管理一直是C语言程序的一个难题。
在Innodb中，并没有直接使用系统提供的malloc/free来进行动态内存的申请和释放，而是采用内存堆的形式来管理。
虽然目前Innodb大部分代码都是.cc结尾，但是还是有很多代码风格是C类型的，只是某些地方对这些C代...]]></description><category></category></item><item><title><![CDATA[malloc分配超过128kb内存-实验记录]]></title><link>https://blog.youkuaiyun.com/sun_ashe/article/details/100905985</link><guid>https://blog.youkuaiyun.com/sun_ashe/article/details/100905985</guid><author>sun_ashe</author><pubDate>Mon, 16 Sep 2019 23:38:50 +0800</pubDate><description><![CDATA[默认情况下，当malloc或者new操作一次性分配大于等于128KB的内存时，会使用mmap来进行，而在小于128KB时，使用的是brk的方式
小于128KB时的测试截图如下:

大于128KB时的测试截图如下：

128KB是可以调节的，如下，重新使用brk的方式进行内存分配。

测试代码如下：
#include &lt;iostream&gt;
#include &lt;unistd.h&gt...]]></description><category></category></item></channel></rss>