暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

了解MySQL的一些常识(一)

若安知鱼之乐 2020-09-10
104

【MySQL的发展历程】   

MySQL开始由MySQL AB公司开发,2008年1月被Sun公司收购,2009年4月Oracle公司收购Sun公司。

- RDBMS(Relational Database Management System)
- 基于socket编写的C/S架构
【MySQL数据的应用场景有哪些?】
MySQL项目源代码开放,而且可以免费使用,受到web网站开发比较青睐的数据库,且安装配置也比较简单,在网络上有比较全面的技术支持,适合大部分的应用场景,像web网站、日志记录系统、数据仓库系统以及嵌入式系统。

【MySQL的事务简介】

数据库事务(mysql事务只有在InnoDB引擎层实现)是指一组sql语句组成的数据库逻辑处理单元,是一个不可分割的工作逻辑单元,在系统上执行并发操作时,事务时最小的控制单元,事务执行要么全部成功,要么全部rollback,通过事务来保证数据的一致性。

MySQL的事务有四大特性ACID:

  • 原子性(Atomicity)
    一个原子事务操作,必须是完整的,全部成功执行,否则全部失败,不存在执行部分的情况。原子型的实现是基于日志的Redo/undo机制。

  • 一致性(Consistant)
    事务开启后的所有执行结束后,数据库的完整性约束没有被破坏,既数据一致性,例如:A向B转账的一个事务,A的账户减少了100元,B的账户就应该收到100元。

  • 隔离性(Isalotion)
    数据库允许事务并发运行,隔离性是为了避免并发运行时数据交叉执行而导致数据不一致。

  • 持久性(Durable)
    事务提交后,事务执行的结果被永久的写入到数据库中。
【事务隔离级别】
在MySQL事务中的隔离级别主要分为4大等级,读未提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)、串行化(serializable)。

MySQL事务中可能存在的问题:

  • 脏读:能读取到其他事务未提交的数据,这些数据可能会回滚。例如:当前事务A可以读取到其他事务B的未提交的数据(脏数据)。

  • 不可重复读:同一事务读取同一个数据(已提交的数据),两次读取的结果不一样。

  • 幻读:在事务中按照某个条件进行查询两次,两次查询的结果的条数不同。

事务隔离就是为了解决上述几个问题,事务隔离的级别越高,系统性能开销就越大。

隔离级别与问题的对应关系如下:
事务隔离级别脏读
不可重复读
幻读
读未提交(Read uncommitted)可能
可能可能
读提交(Read commited)不可能可能可能
可重复读(Repeatable read)不可能不可能可能
串行化(serializable)不可能不可能不可能


# 查询隔离级别
mysql> select @@transaction_isolation; # MySQL5.7.20之前
mysql> select @@tx_isolation;    # MySQL5.7.20之前
# 设置隔离级别未read uncommitted
mysql> set global transaction isolation level read uncommitted;
mysql> select @@transaction_isolation;
复制
……
【MySQL锁机制】
MySQL的锁在数据操作类型划分为共享锁/读锁(Shared Locks)、排他锁/写锁(Exclusive Locks);从对数据操作的粒度划分为表级锁(Table Locks)、行级锁(Record Locks)以及页面锁。
数据在读取时使用Shared Lock,不能进行Write;写的时候加Exclusive Lock,阻塞其他事务的Write和Read,(若一个事务长时间不能写入,则会出现timeout)。   
在InnoDB中行级别锁有三种Record Locks、Gap Locks、Next-key Locks,其中Gap Locks会锁定两个Index之间的区间,目的是为了防止同一事物的两次当前读出现幻读(Phantom Read)的情况;Next-key Locks相比较GapLocks包含两个边界索引。
Record Locks的粒度大,加锁快,开销小,但锁冲突的概率大,并发度低。 它也是MyISAM和InnoDB的区别之一,InnoDB支持行锁并且支持事务。
【MySQL的MVCC机制及原理】
  • MySQL中的InnoDB引擎支持MVCC

  • 应对高并发事务,MVCC比单纯的行级锁更有效,性能开销也更低

  • MVCC在RC和RR级别起作用

  • MVCC即可以基于乐观锁也可以基于悲观锁实现

1、什么是当前读和快照读?
  • 当前读
    读取最新的数据记录,读取时要保证其他并发事务不能修改当前记录,在读取数据的时候加锁。

  • 快照读
    快照读的前提是隔离级别不是串行级别,快照读的实现是基于多并发版本控制即MVCC。

2、什么是MVCC?
MVCC(Multi-VersionConcurrency Control)是一种并发控制的方法,一般在数据库管理系统中实现对数据库并发访问,在MySQLInnoDB中主要是为了实现提高数据库并发性能,更好的处理读-写冲突。
数据库的并发场景有三种:
并发读读:不存在任何问题,也不需要并发控制;
并发读写:有线程问题,会引起事务隔离性问题,比如说脏读、不可重复读、幻读;
并发写写:有线程问题,可能会引起数据更新丢失问题;

3、MVCC的原理是什么?
MVCC的目的在于多版本并发控制,解决并发读写场景的冲突,实现的原理主要是依赖记录中的3个隐式字段、undo日志以及ReadView来实现的。

隐式字段:
- DB_ROW_ID      6byte,(隐藏主键),ID自增

- DB_TRX_ID       6byte,事务ID

DB_ROLL_PTR  7byte,回滚指针,指向这条记录的上一个版本(rollback segment)

undo日志(2种):

  • - insert undo log
    代表事务在insert新纪录时产生undo log,只在事务回滚时需要,并且在事务提交后可以被立即丢弃

  • - update undo log
    事务在进行update或者delete时产生undo log;不仅在事务回滚时需要,在快照读取的时候也需要;所以不能随便删除,只有在快速或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清楚;

undo log对于MVCC来说就是存在rollback segment的旧记录链。

Read View:

Read view 就是事务在进行快照读操作的时候生成的读视图,在该事务进行快照读的那一刻起,会生成一个带有版本号以及当前活跃事务ID的快照记录。从这一点出发,可以判断当前事务读取操作的数据版本是哪一个,有可能是最新的,也有可能是历史的。

Read View有3个全局属性:

trx_list: 一个数值列表,用来维护Read View生成时刻系统正活跃的事务ID;

up_limit_id: 记录trx_list列表中事务ID最小的ID;

low_limit_id: Read View生成系统尚未分配的下一个事务ID,即最大事务ID+1;

RC隔离级别:

  1. 每次快照读都会生成一个最新的Read View;

  2. 开始比较DB_TRX_ID与up_limit_id,如果小于,这当前事务能看到db_trx_id所在的记录;否则进行下一个判断;

  3. 比较DB_TRX_ID与low_limit_id,如果大于等于则代表DB_TRX_ID所在的记录在Read View生成以后出现的,对当前事务不可见;

  4. 判断DB_TRX_ID是否在活动事务列表之内,trx_list_contains(DB_TRX_ID),如果在,则表示该事务在生成ReadView时刻处于活跃状态,数据未提交,修改的数据当前事务不可见。

RR隔离级别:

同一个事务的第一个快照读取才会创建ReadView,之后的快照读取的都是在同一个Read View里进行。




  • MySQL的安全

  • MySQL数据恢复

  • 问题定位


5、MySQL的问题定位

6、常用的主从复制原理



文章转载自若安知鱼之乐,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论