mysql
文章平均质量分 71
技术菜逼
这个作者很懒,什么都没留下…
展开
-
MySQL relay_log_recovery源码分析
此处所列代码为mysql8.0.23版本,其它版本可能略有差异。relay_log_recovery按照官方文档描述,在server启动的时候,会创建新的relay_log,并将sql_thread指向新的relay_log坐标,并且引导io_thread将从master读取的event写入新的relay log中。从而跳过旧的relay log的apply,进而避免旧的relay log出现问题导致复制出现问题。但是在MTS下,在出现复制gap的时候,仍然需要在旧的relay log上将gap补齐原创 2021-03-25 01:52:16 · 1202 阅读 · 0 评论 -
使用MTS加快mysql奔溃后binlog恢复
场景是这样的:有一个mysql库,5.7.29版本的,被任务操作误删除了,需要恢复。但是日常的备份操作因为没有安装xtrabackup热备工具,导致日常的全备曾备没有正常进行,好在binlog基本都有备份(缺了中间一个binlog文件,这个在后面细说)。也就是说,我们只能通过重放binlog进行恢复。WTF!全部的binlog是108个文件,每个512M大小。需要尽可能快的恢复。对于上面的场景,个人认为有以下几种方案:1,使用mysqlbinlog结合mysql进行重放。具体是将binlog文件列表列原创 2021-03-16 23:27:26 · 429 阅读 · 0 评论 -
MySQL:Waiting for dependent transaction to commit
这是一个stage,定义在mysqld.cc文件的11321行。mysql在sql/rpl_mts_submode.cc文件的wait_for_last_committed_trx方法中进入此stage。#rpl_mts_submode.ccbool Mts_submode_logical_clock::wait_for_last_committed_trx( Relay_log_info *rli, longlong last_committed_arg) { THD *thd =原创 2021-03-09 23:32:29 · 2543 阅读 · 0 评论 -
MySQL MTS多线程复制模型源码解析
本文基于mysql8.0.23版本代码。其他版本代码可能有稍许不同。这里主要阐述基于logical_lock方式的并行,基于DB的并行实际中用的不多,就略过了。MySQL MTS(multi threads slave)多线程复制主要是基于三种类型的线程:1,slave io线程,单线程。用以连接到master,并从master dump出binlog文件内容,并写入到slave的relay log文件中。2,slave coordinator,应用协调器线程,单线程。用于从slave的rela原创 2021-03-09 01:11:11 · 523 阅读 · 2 评论 -
MySQL查询MyISAM表的阻塞session,Waiting for table level lock
今天遇到一个问题,一个同事给我截了一个图,上面有大量的“Waiting for table level lock”,问我怎么处理。我想当然了一下,myisam表都是表锁,并发的insert出现“Waiting for table level lock”不是很正常么,于是就把我的想法告诉他了:使用批量插入或者用lock...unlock; 包裹多条insert。过了一会儿,同事说解决了,并发过来一个截图,上面有一个对myisam表的select session。无语,wtf!其实这个问题如果仔细看一下是.原创 2021-02-19 17:32:49 · 937 阅读 · 0 评论 -
mysql语句的digest和sampling
语句的digest发生在解析器(parser)中,performance_schema中虽然作为digest其中一个存储的地方,但是并不计算digest(语句的归一化Normalization过程)。而仅仅是将parser计算出来的digest文本与digest SHA256哈希值进行转储。因此performance schema作为解析器计算digest的其中一个充分条件而不是必要条件。解析器计算语句digest只要下面三个条件中的任一个满足即可:1,Performance Schema diges.原创 2021-02-01 10:14:11 · 932 阅读 · 0 评论 -
[ERROR] [FATAL] InnoDB: Over 95 percent of the buffer pool is occupied by lock heaps or the adaptive
[ERROR] [FATAL] InnoDB: Over 95 percent of the buffer pool is occupied by lock heaps or the adaptive。这个问题是发生在mysql 5.7系列5.7.20及之前的版本,8.0系列8.0.3及之前的版本的bug,在5.7.21/8.0.4上已修复。在这个错误发生时,可以通过select * from performance_schema.memory_summary_global_by_event_name原创 2021-01-11 15:48:34 · 802 阅读 · 1 评论 -
mysql cpu飙高的处理案例2
被告知一个现场的mysql服务器cpu 100%了需要处理下,然后就接手了。说下处理过程。是一台windows机器,操作系统server 2008,CPU 4个物理核心,偏少。国际惯例,先检查各项指标,show engine innodb status 查看一下库总体状态,发现Log sequence number -Pages flushed up to 差不多500多M,而库的redo文件大小是2个512M,问题不大,但是谨慎起见,调到2个2G大小。Free buffers/Innodb_buffe.原创 2020-12-26 17:44:56 · 293 阅读 · 1 评论 -
MySQL加密连接与基于RSA的密码交换
随着mysql8.0的使用,mysql更换了创建用户时默认的密码认证插件,从之前的mysql_native_password插件更换为caching_sha2_password插件。新的插件要求使用连接加密的方式用于mysql server与client之间的tcp连接,或者如果不满足使用加密连接的条件下,改为使用通过rsa加密的密码交换。首先来看看加密连接。先看一张图:上面这张图描述了SSL/TLS协议在TCP/IP模型中的位置,Mysql通过在服务端与客户端之间的连接上使用ssl/tls协议实现原创 2020-12-17 19:40:23 · 1029 阅读 · 0 评论 -
mysql:Row size too large (> 8126)
这个错误简单理解就是单行记录的合计最大大小超过了8126字节,那么根据文档描述的话,使用dynamic行格式的表行最大大小可以达到65536字节(因为mysql内部使用了2个字节来表示字段长度,因此可以表示最大65535的长度)。那么,从65536到8126,这其中57140字节去哪里了呢?这其实是因为mysql默认使用16k的page size,在每个data page中,除去header、footer部分,剩下的部分需要能容纳2行的内容,那么16384/2=8192就接近8126这个值了。另外,原创 2020-12-04 14:33:38 · 19092 阅读 · 0 评论 -
mysql添加审计功能
mysql自身提供了审计功能,但是只有企业版可用。社区版的可以使用mariadb或者percona提供的审计插件来支持审计功能。使用的时候,要注意mariadb或者percona与mysql的版本对应关系。对于mariadb,可以看这里https://mariadb.com/kb/en/system-variable-differences-between-mariadb-and-mysql/其中的截图如下。对这张图,我个人是这样理解的:既然可以两两比较,那么就说明有兼容的基础,在此基础上做进一步.原创 2020-12-03 18:04:59 · 749 阅读 · 0 评论 -
mysql filesort源代码解析
filesort在核心代码前面还有很多辅助代码,辅助部分就不说了,重点放在核心代码部分。下面是一个调用栈:SELECT_LEX_UNIT::ExecuteIteratorQuery(SELECT_LEX_UNIT * const this, THD * thd) (/root/mysql-8.0.20/sql/sql_union.cc:1165)SELECT_LEX_UNIT::execute(SELECT_LEX_UNIT * const this, THD * thd) (/root/mysq原创 2020-12-02 14:32:09 · 627 阅读 · 0 评论 -
mysql global status 状态变量详解一,innodb%writ相关
Innodb_buffer_pool_write_requests:写入buffer pool的请求数。理论上这个数量也等于每一个提交的事务修改的buffer pool中页*次。同一个页在一个事务中只累加一次,多个事务修改同一个page累加多次。原因是每一个事务在commit时都会将自身修改的page添加到flush列表,每次添加一个page,都会累加Innodb_buffer_pool_write_requests。具体的实现是,每一个mtr有一个自身的memory stack来存储修改的page,这个结原创 2020-11-21 15:53:20 · 1400 阅读 · 0 评论 -
mysql innodb 双写缓冲区关键代码实现
//buf0dblwr.cc /**这个算是双写缓冲区与外部交互的接口了*/dberr_t dblwr::write(buf_flush_t flush_type, buf_page_t *bpage, bool sync) noexcept { dberr_t err; /* 对于只读的,或者临时表空间数据,或者禁用双写缓冲区,或者双写缓冲区的实例配置为空的,跳过写double-wirte文件,直接将数据写入对应的数据文件 if (sr.原创 2020-11-20 17:31:28 · 352 阅读 · 0 评论 -
mysql innodb_flush_method 参数的各种取值及其影响
innodb_flush_method用来控制innodb的redo日志文件和data数据文件采用何种flush方法。类unix/linux操作系统的取值为:fsync/0 ,O_DSYNC/1, littlesync/2 ,nosync/3 ,O_DIRECT/4 ,O_DIRECT_NO_FSYNC/5。默认取值fsync ;windows操作系统下的取值为: unbuffered/0 , normal/1 。默认值unbuffered。先看看官方文档的说明:fsyncor0:InnoDB...原创 2020-11-16 19:41:28 · 1348 阅读 · 0 评论 -
innodb_buffer_pool_reads、innodb_buffer_pool_read_requests分析与innodb 缓存命中率计算
澄清一下innodb buffer pool 缓存命中率(cachehit ratio)指标的计算,这个计算涉及到两个状态变量innodb_buffer_pool_reads和innodb_buffer_pool_read_requests。官方文档对这两个变量的解释如下:Innodb_buffer_pool_readsThe number of logical reads thatInnoDBcould not satisfy from thebuffer pool, and had...原创 2020-11-10 15:17:48 · 3677 阅读 · 1 评论 -
MySQL Group Replication 节点重新加入集群时等待时间过长
Mysql 5.7.29 el7 版本,组复制有三个节点,搭建了innodb cluster,做故障切换测试,拔掉其中一个节点的网线,使节点因为网络原因被Expelled。切换成功后使用stop group_replication;start group_replication;进行恢复重新加入集群,当然也可以通过mysqlshell操作rejoinInstance,期间节点长时间处于recovering状态,查询performance_schema.replication_group_member_sta原创 2020-11-05 19:29:28 · 817 阅读 · 1 评论 -
MySQL ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
这个错误的本质发生在同一张innodb表上的两个事务的锁阻塞。并发的两个事务,一个事务持有相同表上相同记录的锁(行锁),或者元数据锁:metadata lock,以及LOCK INSTANCE FOR BACKUP语句获取的锁信息。元数据锁指数据库对象的数据字典信息,包括并不限于表结构信息、procedure、function定义信息、视图定义,以及LOCK TABLES,FLUSH TABLES WITH READ LOCK, andHANDLER等语句获取的锁。同时另外一个事务并发的获取相同...原创 2020-09-11 10:58:37 · 1576 阅读 · 0 评论 -
mysql 会话临时表空间、全局临时表空间、临时表、内存临时表、磁盘临时表及其监控,
mysql在一些情况下会使用临时表,这些情况包括使用union 、global order by 、子查询、distinct、INSERT ... SELECT、multiple-tableUPDATE、GROUP_CONCAT()orCOUNT(DISTINCT)、窗口函数window functions等,这些条件下,如果用于临时表的内存足够,所有数据都在内存中完成运算,则称为 in-memory temporarytable,如果内存不足,则数据最终会溢出到磁盘,最终生成磁盘临时表,称为...原创 2020-07-28 11:37:24 · 1543 阅读 · 0 评论 -
mysql cpu飙高的处理案例1
mysql是一个多线程的架构,所以从linux主机上观察到的mysqld进程的cpu飙高,通常都是由其下的某个或者某几个线程消耗大量cpu资源。这种情况下,第一步要先确定具体是哪个线程消耗cpu。linux上,最简单的就是用top命令的-H选项:-H :Threads-mode operation Instructs top to display individual threads. Without this command-line option a summation ...原创 2020-07-10 00:42:06 · 1262 阅读 · 0 评论 -
[ERROR] InnoDB: Ignoring the redo log due to missing MLOG_CHECKPOINT between the checkpoint
这个问题出现在mysql 5.7之后的版本,主要的原因是mysql会在最新的checkpoint完成后都会在redo log写一个一字节的MLOG_CHECKPOINT 标记,用来标记在此之前的redo都已checkpoint完成。如果处于任何原因没有找到这个标记,那么整个redo日志文件都会被忽略。出现这个错误的话,最好是有备份进行恢复,如果没有做好备份,那按照下面的方法处理可能会有数据丢失。第一步:设置如下参数,并移除当前使用的redo日志文件:innodb_log_checksums = ON原创 2020-06-30 17:30:45 · 8357 阅读 · 0 评论 -
我理解的MYISAM引擎之八 终章,myisam的优化
终于来到了这个系列的终章,到这里整个myisam引擎就介绍的七七八八了。感慨一下,下面继续。首先从系统变量层面:myisam最重要的配置就是 key_buffer_size,配置myisam表索引使用的共享内存大小,如果你的数据库较多使用了myisam引擎表,那就需要增大这个配置。这块区域类似innodb的innodb_buffer_pool,数据库对于myisam表的索引数据是共享访问的,所有的索引key都需要先通过物理读读入这个区域,然后再由各个线程来进行读写操作。如果设置的过小,...原创 2020-06-07 15:27:32 · 348 阅读 · 0 评论 -
我理解的MYISAM引擎之七 check、analyze、optimize、repair 与myisamchk
语句 参数 作用 引擎 备注 CHECK TABLE FOR UPGRADE 检查升级后的不兼容项 MYISAM,INNODB,VIEW a)选项可以叠加使用,从上往下,校验的内容逐渐增多; b)check table会自动flush table; c) check table如果在innodb上发现了非2级索引的块损坏,会导致mysqld进程崩溃https://bugs.mysql.com/bug.php?id=10132 ...原创 2020-06-01 16:21:00 · 341 阅读 · 0 评论 -
ERROR 1031 HY000 Table storage engine for xxx does not have this option
这个问题通常是在表上做了一些表当前的存储引擎不支持的操作,或者当前表将要转换为目标存储引擎,但是有一些当前表特定的创建选项目标存储引擎不支持引起的。类似的问题都可以按照这个思路来解决。我这里遇到的问题是将一个myisam表转为innodb引擎引起的。mysql> show create table t_innodb_12;+-------------+-------------------------------------------------------------------------原创 2020-05-28 09:16:30 · 3957 阅读 · 0 评论 -
我理解的myisam引擎之六 MYI、MYD文件的解析
文件内容解析以下面的表结构和内容举例。mysql> create table t_isam_10 (id int ,id1 int ,c1 varchar(10) )engine=myisam;Query OK, 0 rows affected (0.11 sec)mysql> alter table t_isam_10 add index idx_id(id) key_block_size=2048;Query OK, 0 rows affected (0.14 sec)Reco原创 2020-05-24 21:56:46 · 1963 阅读 · 0 评论 -
[InnoDB] [FATAL] Tablespace id is xx in the data dictionary but in file .\test\t3.ibd it is xx!
这个错误字面意思看就是库名表名一致,但是表空间id已经不同了。通常innodb_file_per_table启用,当innodb表发生重建的时候,例如truncate、optimize table、repair table等会导致表重建的操作,表空间id就会发生改变。表空间id记录在两个地方,一个在系统表空间中的字典表,一个记录在表对应的ibd文件里。这个时候,不管出于何种原因,ibd文件使用了旧文件,就会报这个错误。并且导致mysqld进程崩溃退出。此时需要使用innodb_force_recovery=原创 2020-05-15 23:53:28 · 4307 阅读 · 0 评论 -
elasticsearch的分片路由与mysql ndb cluster的主键路由
突然想到一个有意思的事情,elasticsearch目前已经广为使用,其基于分片的的多节点集群提供了良好的容灾与极高的读写性能,得到了诸多大厂的青睐。那么,同样是基于主键hash路由的mysql ndb cluster,同样拥有较高的性能和可容灾性,为什么ndb没有得到广泛使用,反而大厂都劳心劳力去开发各种分库分表中间件呢?我想这其中主要的点在于两者使用方式的不同,elasticsearch没有支持多索引 join查询吧?即使是变种的parent-chiled记录,也是要基于parent_id将父子原创 2020-05-12 01:11:23 · 145 阅读 · 0 评论 -
我理解的myisam引擎之五 MyISAM key cache实现细节
key cache block的访问:1,可以以共享读的方式访问;2,一个block同时只能由一个session进行update;3,如果需要从磁盘读入一个新的block,而导致要替换cache中的一个block,那么如果被替换的block是脏的,需要先flush。另外,key_buffer_size设置不能太小,至少要能装下8个block。否则不使用buffer,仍然使用文件系统...原创 2020-04-27 14:30:39 · 326 阅读 · 0 评论 -
我理解的myisam引擎之四 myisam-block-size、key_cache_block_size、key_block_size
先简单说下myisam-block-size、key_cache_block_size、key_block_size这几个参数的含义和区别,如下是摘抄自我的另一篇文章我理解的myisam引擎之一 myisam表特征myisam-block-size:看到这里的中划线了吗?对,这是一个启动选项,只能在启动时设置并且不能动态修改,或者设置在配置文件中,或者在启动命令行上。围绕这个参数应该是一个系统变...原创 2020-04-26 16:06:39 · 883 阅读 · 0 评论 -
我理解的myisam引擎之三 myisam表常见问题 以及open、close、table_open_cache、max_connections、文件描述符
myisam表通常遇到最多的问题,一个是表MYI或者MYD文件损坏,另一个是表未正常close。文件损坏通常是由于myisam文件正在使用中的同时,mysql进程异常退出,或者机器宕机,或者磁盘坏掉,或者在mysqld运行的时候使用了myisamchk等外部工具(mysqld运行时使用check,mysqld停止时使用myisamchk没有问题),或者mysql本身的bug。以上这些原因都会造...原创 2020-04-22 00:39:33 · 402 阅读 · 0 评论 -
我理解的myisam引擎之二 MyISAM表(MYD)存储格式
MyISAM存储格式,也称行格式(存储的就是数据表行数据)。众所周知,MyISAM有三种类型的row_format行格式。fixed固定的行格式、dynamic动态行格式、compressed压缩行格式。以下来逐一说明。fixed固定行格式:当存储殷勤为myisam时,如果表不包括可变长度列(VARCHAR,VARBINARY,BLOB, orTEXT),或者即使包括(VARCHAR,...原创 2020-04-20 02:56:28 · 983 阅读 · 0 评论 -
我理解的myisam引擎之一 myisam表特征
MySQL的MyISAM引擎是基于旧有的isam引擎,并在其上添加了一些有用的扩展形成的。MyISM引擎有以下特征:这里来逐个分析这个YES or NO背后的逻辑。首先,MyISAM表存在两个文件(最新的8.0版本多一个sdi文件)MYI存放索引数据、MYD存放表数据。并且MYI使用的是B-tree结构,因此就支持了B-tree索引。接着备份和时间点恢复,这个是由mysql server提供的...原创 2020-04-08 02:05:18 · 1678 阅读 · 0 评论 -
从mysql元数据表中通过sql 构造/还原/生成 建表语句
从mysql元数据表中通过sql 构造/还原/生成 建表语句set @schema := 'zabbix';SELECT d.sql_scriptFROM (SELECT c1.* FROM (SELECT 1 typ_seq, table_name, CONC...原创 2019-12-23 12:06:00 · 436 阅读 · 0 评论 -
ERROR 1064 (42000): You have an error in your SQL syntax
mysql使用load data infile导入数据。出现如下错误:root@NoName 21:19:12> load data infile /change.csv' into table change CHARACTER SET utf8 fields terminated by ',' optionally enclosed by '"' escaped by '"' l...原创 2017-07-05 21:37:00 · 12971 阅读 · 0 评论 -
CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()
声明,这个是转的,原文出处。http://www.cnblogs.com/kerrycode/CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()2016-03-22 22:02 by 潇湘隐者, 9926 阅读, 0 评论, 收藏, 编辑在CentOS Release 6.6安装percona-xtrabackup-2.3.4时,遇到下面错误信息...转载 2018-08-30 14:00:25 · 610 阅读 · 0 评论 -
mysql中distinct()函数包裹多列时,NULL值会导致计算错误
mysql中distinct()函数包裹多列时,NULL值会导致计算错误。不清楚mysql官方怎样对待这个现象,个人认为这个可能是mysql的bug。下面看实验。mysql> select * from t_innodb;+------+------+------+| id | name | col3 |+------+------+------+| 1 | ...原创 2018-10-12 14:25:29 · 1202 阅读 · 0 评论 -
在Oracle Linux 7.5系统上 编译 mysql-8.0.12 debug版本
在Oracle Linux 7.5系统上 编译 mysql-8.0.12 debug版本这里记录一些主要的步骤。因为是做完了之后才记录的,有些细节可能描述的不清楚。如果大家看了有什么不懂的,可以留言讨论。我看到了会回的。1.首先就是下载MYSQL-8.0.12 源码包了。我下载的是community 社区GPL版的。官方下载地址https://dev.mysql.com/downloads/...原创 2018-10-14 00:35:56 · 302 阅读 · 0 评论 -
mysqldump master-data 加与不加single-transaction的事务一致性区别
这个通过mysql debug版本很容易就能看出来。例如:通过如下命令执行mysqldump:mysqldump_d -uroot -hlocalhost -P10001 --protocol=tcp --all-databases --master-data --debug=d:t:o,mysqldump_d_119.debug --log-error=mysqldump_d_119.l...原创 2018-10-14 01:54:07 · 1716 阅读 · 0 评论 -
cenos/Red Hat 7.4 编译keepalived,生成rpm包
首先下载keepalived-2.0.7,地址http://www.keepalived.org/download.html接下来解压keepalived-2.0.7.tar.gz tar -xzpvf keepalived-2.0.7.tar.gz cd keepalived-2.0.7目录中有个INSTALL的文件,我们先打开。可以看到如果是red...原创 2018-10-24 12:07:19 · 1318 阅读 · 0 评论 -
MySQL高级 之 explain执行计划详解
尊重原创,本文转载自:https://blog.csdn.net/wuseyukui/article/details/71512793 MySQL高级 之 explain执行计划详解 2017年05月09日 22:55:10 走慢一点点 阅读数:25917 ...转载 2019-02-01 09:20:20 · 140 阅读 · 0 评论