MySQL优化班13期课后作业,20180807

1、MySQL事务课程总结,主要知识要点:
a. 事务隔离级别
b. 脏读、幻读、不可重复读
c. 当前读、快照读
 
2、⽤用xtrabackup备份全实例例数据时,会造成锁等待吗?如果是mysqldump呢
已邀请:

k2865 - A793-文彦章-成都

赞同来自:

1、MySQL事务课程总结,主要知识要点:ABC
2、⽤用xtrabackup备份全实例例数据时,会造成锁等待吗?如果是mysqldump呢
     需需要锁等待,都会有FTWRL,

k2865 - A793-文彦章-成都

赞同来自:

事务总结:1.mysql事务隔离级别有4种:RU,RC,RR,Serializable,最常见的是是RC和RR,如果业务要求强一致性读就用RR,其他可以用RC.
2.脏读,读到其他事务没有提交的修改数据.
3.幻读,一个事务读取到了另外事务提交的insert的数据
4.不可重复读,一个事务读到另一个事务update的数据.
5.快照读,读前创建一个一致性快照,不管数据怎么变都只会读到快照创建时的数据(RR)
6.当前读,读取数据实时更新的数据.,select ...for update,delete,insert都会触发当前读.

aaron8219 - Oracle DBA

赞同来自:

1、MySQL事务课程总结,主要知识要点:
a.事务隔离级别
MySQL innodb引擎支持事务,支持MVCC,主要是基于innodb的行锁来实现的,事务隔离级别主要用于并发事务读取时,对一致性的控制
MySQL中主要有以下4种事务隔离级别:
RU,读未提交(也称脏读,基本不用,不符合事务一致性要求)
RC,读已提交(解决的问题:避免脏读)
RR,可重复读(解决的问题:避免不可重复读,MySQL默认的隔离级别,innodb 引擎的 MVCC通过next-key lock也做到了避免幻读)
Serializable,可串行化(解决的问题:避免幻读)

b. 脏读、幻读、不可重复读
脏读:例如,在RU隔离级别下,事务2可以读取到事务1中未提交的数据,这是任何事务型关系数据库都需要避免的问题
幻读:例如,在RC隔离级别下,t1时刻,事务1先发起了一个读取t1表的操作,t2时刻,事务2往t1表插入了一条数据并提交,t3时刻,事务1又进行了一次查询,则会发现多了一条数据
不可重复读:例如,在RC隔离级别下,t1时刻,事务1对t2表发起了一个select操作,t2时刻,事务2对t2的同一行记录进行了update,t3时刻,事务1再次查询这行记录时,发现数据不一致

c. 当前读、快照读
innodb引擎中,为了保证MVCC,执行查询时会创建一个read view来对并发读进行控制
RC隔离级别下,采用的是当前读,每次在事务中执行select操作的时候,会生成一个read view
RR隔离级别下,采用的是快照读,每次在事务中执行第一次select操作的时候,会生成一个read view

2、用xtrabackup备份全实例数据时,会造成锁等待吗?如果是mysqldump呢?
在MySQL 5.7中,由于MyISAM引擎表的存在,如果使用的是社区版,无论是采用Xtrabackup(物理备份)还是mysqldump(逻辑备份)备份全实例数据库时,都会有一个全局读锁(FTWRL),区别主要为:
Xtrabackup持有锁的时间取决于实例中非事务引擎表的数量,因为最后一步UNLOCK TABLES是在拷贝完所有MYI,MYD,frm以后才进行的,如果有大量的MyISAM表,则会持有较长时间的锁
mysqldump持有锁的时间要看备份时采用的参数,如果仅仅指定了“--single-transaction和--master-data=2 -A”来备份,那么这个FTWRL的时间很短暂,仅仅在开启RR隔离级别并且获取到GTID_PURGED变量,执行SHOW MASTER STATUS之后,就进行了UNLOCK TABLES操作,持有锁的时间很短暂,虽然也会备份MyISAM的表,但是是属于非一致性备份,因此MyISAM表建议使用-x或-l进行单独备份,持有锁的时间取决于MyISAM表的数量
 
另外:在percona版本中,开启general日志测试了两个工具,发现略有不同
Xtrabackup(2.4.12),会把全局读锁(FTWRL)改变为LOCK TABLES FOR BACKUP,这是一个比FTWRL更轻量级的锁,可以更有效地减少备份过程中对整个实例的影响
mysqldump,指定了“--single-transaction和--master-data=2 -A”进行备份时,同样是设置为RR隔离级别,没有了FTWRL和SHOW MASTER STATUS,替换成了两个SHOW STATUS LIKE 'binlog_snapshot_%',在第2个SHOW STATUS LIKE 'binlog_snapshot_%'后,执行了UNLOCK TABLES,其他基本都一致

总结:
1)两种备份工具在备份时,一般都是需要上全局读锁(FTWRL)的
2)Xtrabackup的全局读锁(或备份锁)时间的长短,取决于非事务表的数量
3)mysqldump的全局读锁可以很快释放,但是对于非事务表的备份是非一致性的,需要用-x或-l单独进行一致性备份,此时持有锁的时间取决于非事务表的数量
4)如果在没有非事务表的情况下,两个备份工具持有全局读锁都是非常短暂的

liyh

赞同来自:

1、 
a)事务的隔离级别:read uncommit 读未提交,read commit 读提交,reap read 可重复读,serializable 串行
b)
i.   脏读,读取到未提交的数据,RU隔离级别会出现。
ii.   不可重复读,在同一事物中多次读取的相同条件的数据,得到结果不一致。RU,RC隔离级别可以出现。针对已提交事务,读取到的数值发生变化。
iii.   幻读,在同一事物中,多次读取同条件数据,得到结果记录条数不同。RU,RC隔离级别可以出现,RR级别只有设置了参数 innodb_locks_unsafe_for_binlog  才会出现幻读,一般情况不出现幻读。
c)  当前读是读取到最新提交的数据状态,一般是select……for update。
快照读,是对读取的瞬间做一致性快照,普通的select ,和mysqldump 备份时会发起一致性快照读。

2、xtrabackup备份会锁等待。xtrabackup备份时会短暂获取全局读锁FTWL(flush table with read lock),来获得frm、MYD、MYI 已经binlog文件。
mysqldump 备份可能会发生所等待。如果加--single-transaction 不会产生全局读锁FTWL,如果要加--master-data 就会获取binlog信息,这种情况会短暂加锁。
(题二参考了叶老师的答案,自己复习了一下,老师别找我要版权哦~)
 

要回复问题请先登录注册