- 博客(19)
- 收藏
- 关注
转载 Mysql主备-备库并行复制能力
如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能成了小时级别。而且对于一个压力持续比较高的主库来说,备库很可能永远都追不上主库的节奏。主备流程图中黑色的两个箭头。一个箭头代表了客户端写入主库,另一箭头代表的是备库上sql_thread执行中转日志(relay log)日志在备库上的执行,就是图中备库上sql_thread更新数据(DATA)的逻辑。如果是用单线程的话,就会导致备库应用日志不够快,造成主备延迟。在官方的5.6版本之前,MySQL只支持单线程复制,由此在主库并发高、
2020-06-03 11:20:04 426
转载 Mysql主备-MySQL主备延迟/主备切换策略
主备延迟主备切换可能是一个主动运维动作,比如软件升级、主库所在机器按计划下线等,也可能是被动操作,比如主库所在机器掉电。所谓主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值。同步延迟与数据同步有关的时间点主要包括以下三个:1.主库A执行完成一个事务,写入binlog,我们把这个时刻记为T1;2.之后传给备库B,我们把备库B接收完这个binlog的时刻记为T2;3.备库B执行完成这个事务,我们把这个时刻记为T3。你可以在备库上执行show slave status命
2020-05-28 15:05:03 1019 1
转载 Mysql主备-MySQL是怎么保证主备一致的?
MySQL主备的基本原理在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。主备完整流程图一个事务日志同步的完整过程:1.在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog(),这个位置包含文件名和日志偏移量。2.在备库B上执行start slave命令
2020-05-24 09:45:13 452
转载 Mysql空间回收-为什么表数据删掉一半,表文件大小不变?
一个InnoDB表包含两部分,即:表结构定义和数据。在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里。而MySQL 8.0版本,则已经允许把表结构定义放在系统数据表中了。参数innodb_file_per_table表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数innodb_file_per_table控制的:这个参数设置为OFF表示的是,表的数据放在系统共享表空间,也就是跟数据字典放在一起;这个参数设置为ON表示的是,每个InnoDB表数据存储在一个以 .
2020-05-17 15:59:38 322
转载 Mysql锁-间隙锁实战
间隙锁规则:两个“原则”、两个“优化”和一个“bug”:1.加锁的基本单位是next-key lock,next-key lock是前开后闭区间。2.查找过程中访问到的对象才会加锁。3.索引上的等值查询,给唯一索引加锁的时候,next-key lock退化为行锁。4.索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁。5.唯一索引上的范围查询会访问到不满足条件的第一个值为止。规则前提说明:MySQL后面的版本可能会改变加锁策略,所以这个规则只
2020-05-10 14:16:06 894 2
转载 Mysql锁-幻读解决方案\间隙锁
幻读:1.在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在“当前读”下才会出现。2.幻读指新插入的行,读到原本存在行的更新结果不算。因为当前读的作用就是能读到所有已经提交记录的最新值。如何解决幻读?产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。因此,为了解决幻读问题,InnoDB只好引入新的锁,也就是间隙锁(Gap Lock)。 间隙锁在可重复读隔离级别下才有效。行锁的加锁关系行锁,分成读锁和写锁。两种类型行锁的冲突
2020-05-08 19:59:27 1249
转载 Mysql事务-事务特性、隔离级别及视图介绍(1)
事务的基本要素(ACID)原子性 (Atomicity)原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。实现:利用Innodb的undo log,当事务回滚时能够撤销所有已经成功执行的sql语句,记录要回滚的相应日志信息。隔离性 (Isolation)隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。...
2020-04-28 13:58:20 288
转载 Mysql索引-普通索引和唯一索引
普通索引和唯一索引都是非簇集索引,这两种索引的唯一区别就在于会判断索引数据的唯一性。索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。语法:UNIQUE(唯一索引)ALTER TABLE table_name ADD UNIQUE (column)INDEX(普通索引)ALTER TABLE table_name ADD INDEX index_name ( col...
2020-04-27 19:12:39 283
转载 Mysql锁-锁类型
根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁顾名思义,全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和...
2020-04-26 13:27:14 755
原创 Mysql日志-日志异常场景
1:MySQL怎么知道binlog是完整的?答:一个事务的binlog是有完整格式的:statement格式的binlog,最后会有COMMIT;row格式的binlog,最后会有一个XID event。另外,在MySQL 5.6.2版本以后,还引入了binlog-checksum参数,用来验证binlog内容的正确性。对于binlog日志由于磁盘原因,可能会在日志中间出错的情况,MySQ...
2020-04-26 12:36:54 144
转载 Mysql缓存-全表扫描过程、LRU算法
在日常开发中,常因为分页查询的使用,或者SQL的语法问题导致的全表扫描,这带来的问题可能会有系统的OOM,或者频繁的GC,以及慢SQL,数据返回慢等问题。那么我们如果光从内存这个角度看这个全表扫描的问题,他是怎么样进行查询返回结果的呢?假设我的主机内存就几个G,但是全表的数据可能是它的几倍,那么机器的内存会直接用光吗?结合日常的开发工作,对大表做全表扫描,看来应该是没问题的(只看数据而言)。但...
2020-04-25 09:34:24 1137
转载 Mysql缓存-缓存与读写、数据Flush相关
在日常Mysql查询过程中,可能会出现“抖”一下?那么“抖”一下这个词后面可能会包含几种阻塞场景?我总结了下3种情况(有漏的、错的欢迎补充哈!):(1)IO问题(2)锁(3)数据flush那么,今天主要分析下数据库读写、内存与日志应用、以及数据Flush过程。了解下这篇文章涉及到的一些概念:1.当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。2.内存数据写入...
2020-04-22 16:57:43 957
转载 Mysql日志-写入机制
binlog的写入机制事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。一个事务的binlog是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。系统给binlog cache分配了一片内存,每个线程一个,参数 binlog_cache_size用于控制单个线程内binlog cache所占内存的大小。如果超过了这...
2020-04-21 16:22:04 824
转载 Mysql关键字-count
count(*)的实现方式MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count()的时候会直接返回这个数,效率很高;(where 条件的话,MyISAM表也是不能返回得这么快的)InnoDB引擎就麻烦了,它执行count()的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。为什么InnoDB不跟MyISAM一样,也把数字存起来呢?在同一个时刻的多个查询,由于多版本并发...
2020-04-19 15:52:09 703
转载 Mysql日志-RedoLog、UndoLog和BinLog
一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?以及MySQL可以恢复到半个月内任意一秒的状态,这是怎样做到的呢?InnoDB是事务的存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交(COMMIT)时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的 CO...
2020-04-19 14:55:30 3715 1
原创 数据结构-红黑树、B树以及B+树
红黑树这是一颗会自动调整树形态的树结构,比如当二叉树处于一个不平衡状态时,红黑树就会自动左旋右旋节点以及节点变色,调整树的形态,使其保持基本的平衡状态(时间复杂度为 O(logn)),也就保证了查找效率不会明显减低。比如从 1 到 7 升序插入数据节点,如果是普通的二叉查找树则会退化成链表,但是红黑树则会不断调整树的形态,使其保持基本平衡状态。红黑树的特性:(1)每个节点或者是黑色,或者是红...
2020-04-18 18:14:32 262
转载 Mysql索引-索引的常见模型
哈希表是一种以键-值(key-value)存储数据的结构,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。同一个值的情况,拉出一个链表。key值不是递增的,新增速度很快,只需要往后追加。但缺点是,因为不是有序的,所以哈希索引做区间查询的速度是很慢的,需要全表扫描。哈希表这种结构适用于只有等值查询的场景,比如Memcached及其他一些NoSQL...
2020-04-18 17:17:28 414
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人