《Mysql技术内幕》札记(下)

第七章 事务

一、redo和undo

当一个事务开始时,会记录这个事务的日志序列号,当此事务执行时,会往日志缓冲池插入数据,当事务提交时,日志缓冲区的数据存入磁盘。(innodb_flush_log_at_trx_commit=1时)

show engine innodb status
---
LOG
---
Log sequence number 1759155   (当前的lsn )
Log flushed up to  1759155(已经被刷新到重做日志lsn )
Last checkpoint at 1759155(已经被刷新到磁盘的lsn )

重做日志的增量= Log flushed up to- Lastcheckpoint at

Undo当事务或语句因为某些原因失败了,就利用undo段事务回滚。他不像重做日志以日志文件存在,他以段的形式存在。Undo是逻辑回滚,回滚时执行的语句恰恰相反(前面是insert 回滚时就用delete)。在共享文件中 当事务提交后undo段不是马上回收,是由master thread慢慢回收。

二、事务控制
begin 显示开启事务 
Commit work指事务提交后做什么 
Completion_type=0不做任何操作
=1时提交后自动开启新事务 
=2提交 断开与服务器连接 所有参数都没了

TPS是Mysql性能监控的重要参数

show global status like ‘%commit%‘;
+----------------+-------+
| Variable_name  |Value |
+----------------+-------+
| Com_commit     |1     |显示提交   |
| Handler_commit | 214  |隐式提交
+----------------+-------+
 
show global status like ‘%rollback%‘;
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Com_rollback               | 0     |
| Handler_rollback           | 0     |
+----------------------------+-------+

TPS=(Com_commit+ Handler_commit+ Com_rollback+ Handler_rollback)/time

分布式本机事务参与全局调配 其隔离级别使用串行的 修改过程不能读

三、不好的事务习惯

1.

create procedure load()
…………
While s<=count do
Insert into t1 select NULL,c
Commit  
........
end

实例一中,忘记mysql有自动提交功能,自己又写了commmit,引起两次刷新到重做日志。

2.事务的控制语句最好由客户端来完成,因为程序可以轻松抓取错误信息。存储过程只完成逻辑操作。

第八章   备份

一、备份分类

备份的方法:热备,冷备,温备
温备对服务器有影响。

冷备:需要共享表空间文件,独立表空间文件,frm文件,重做日志文件

优点:恢复快,操作简单。缺点:文件大(包括undo段,插入缓冲等)
备份内容:逻辑备份,裸文件备份
逻辑备份:备份文件可读的,比如通过outfile和mysqldump方法导出的数据(行数据或sql语句)但恢复时间长
数据库备份内容:完全备份,增量备份,日志备份
增量备份页原理:该页当前日志点大于全量备份的日志点,就备份该页。
日志备份 结合全量备份和日志备份可以将数据库恢复到一个点的数据
二、逻辑备份

1.mysqldump
如果数据库中有myism 有innodb存储引擎备份时只能用--lock-tables选项。--lock-tables与--single-transaction两个互斥,备份时只能选择一个。--lock-tables选项在备份时虽然是依次锁住架构的表级锁,但表可以读取 
Mysqldump 如果有二进制就要用--hex-blob选项,将二进制用16进制显示,否则二进制字符不可见 
Mysqldump 可以不能导出视图

Single transaction 一致性不能隔离ddl语句,即隐式提交(注:将ddl语句前未提交的语句也一并提交)。

2. Mysqlimport 多个文件导入
Mysqlimport可以并发倒入多个表 use-thread可以定义并发数

/usr/local/mysql/bin/mysqlimporttest --use-threads=2 /opt/a6.txt /opt/a9.txt

并发导入文件名/opt/ a6.txt/opt/a9.txt 到test.a6和test. a9表中,文件名就是表名

三、有关binlog和重做日志参数

INNODB_FLUSH_LOG_AT_TRX_COMMIT针对的是重做日志

=1:每次提交都将log buffer刷新到logfile硬盘上

=0:每秒将log buffer数据刷新到logfile硬盘里

=2:每次提交将log buffer的数据刷新到ios内存里,每秒将ios内存的数据刷新到磁盘

SYNC_BINLOG针对binlog的

=0 mysql不控制binlog的刷新

=n 每提交n次事务刷新到磁盘

innodb_support_xa=1(事务二段式提交)保证binlog与重做日志的一致性。当事务提交时,将数据刷新到重做日志日志文件并标为prepare ,当数据写到binlog后,重做日志将数据prepare状态改为commit状态。

具体的介绍可以参考:

http://www.woqutech.com/?p=769

http://www.linuxidc.com/Linux/2015-11/124942.htm

四、复制的状态参数解析

mysql> show slave status\G
***************************1. row ***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host: 192.168.188.211
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000487
          Read_Master_Log_Pos: 841366505
               Relay_Log_File: relaylog.000548
                Relay_Log_Pos: 841366648
        Relay_Master_Log_File: binlog.000487
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:voyage_intelligence,voyage_massive,voyage_static_zh_cn,voyage_static_zh_tw
          Replicate_Ignore_DB:mysql,test,information_schema
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 841366505
              Relay_Log_Space: 841366837
              Until_Condition: None

Read_Master_Log_Pos表示已经从主库拉到从库的读到的偏移位置(841366505表示已经同步读到了binlog.000487的802M)

Exec_Master_Log_Pos表示已经同步了的偏移量

Sql线程延迟=Read_Master_Log_Pos-Exec_Master_Log_Pos

(841366505-841366505=0,表示没有sql延迟)

主库

mysql> show master status\G

***************************1. row ***************************

File: binlog.000487

Position: 842561811

Binlog_Do_DB:voyage_massive,voyage_intelligence,voyage_static_zh_cn,voyage_static_zh_tw

Binlog_Ignore_DB:

1 row in set (0.00sec)

io线程延迟= Position- Read_Master_Log_Pos(可以看出io延迟有1M之差)


            第九章 性能调优

一、数据库分类
数据库根据应用分类:oltp(在线事务处理),olap(在线事务分析)
oltp操作简单,数据容量小但并发大

Olap则恰恰相反
消耗Cpu:语句复杂 比较 排序 连接 
Olap 密集在cpu oltp密集在io

mysql 只有一个进程,修改innodb_read_io_threads和innodb_write_io_threads来提高io线程

mysql> set innodb_read_io_threads=1;

ERROR 1238 (HY000): Variable ‘innodb_read_io_threads‘ isa read only variable

可以看到这个参数的修改需要重启服务器,然后修改配置表才能修改线程个数。

二、内存的重要性

缓冲池的增大,每秒处理事务的能力也线性增加,当缓冲池的大小大于数据文件本身时,TPS性能不再提高

缓冲池的命中率

mysql> show global status like ‘%innodb%read%‘;  (查看数据库运行状况)
+---------------------------------------+--------------+
| Variable_name                         | Value     |
+---------------------------------------+--------------+      |
| Innodb_buffer_pool_read_ahead         | 101128   |(预读的次数)
| Innodb_buffer_pool_read_ahead_evicted | 805        |(预读没被选中页)
| Innodb_buffer_pool_read_requests  | 761299912003 |(从缓存读取页次数)
| Innodb_buffer_pool_reads              | 645038 |(从磁盘读取页次数)
| Innodb_data_read                     | 29097275392|(总共读入字节数)
| Innodb_data_reads              | 79435  |(读取请求次数,一次多个页)|
+---------------------------------------+--------------+

缓冲池命中率= Innodb_buffer_pool_read_requests / (Innodb_buffer_pool_read_requests+Innodb_buffer_pool_read_ahead+ Innodb_buffer_pool_reads)

缓冲命中率为=761299912003/761300658169=99.99%

缓冲池命中率不小于99%说明内存是够用的不存在瓶颈

第三、磁盘RAID

RAID0:读取速度最快,一个数据被分成多段,数据并行写在各个的磁盘上,但没有冗余,易丢失 
RAID1 最可靠,两两做镜像,读取速度慢 
RAID5 (常用)在存数据时还增加了奇偶检验信息,数据和检验存储到各个磁盘,一个磁盘坏了,可以通过其他磁盘的检验信息恢复磁盘,需要至少三磁盘。
RAID10(常用)先做RAID1 再做raid0。两个为一组组内备份,组间并行。与raid0的区别在于会将数据做条带,分别存储于不同的备份组里

RAID6 和RAID5相比有两个校验盘,以应对两个磁盘同时坏的问题。

参考:http://xuegodlinux.blog.51cto.com/10844319/1709964

时间: 2024-10-14 19:37:52

《Mysql技术内幕》札记(下)的相关文章

MySQL技术内幕-InnoDB存储引擎-读书笔记(二)

MySQL技术内幕-InnoDB存储引擎-读书笔记(二) 作为php开发,使用mysql总是少不了的 系列文章博客链接 http://itsong.net/articles/466.html 第三章 文件 mysql与innodb几个类型的文件 参数文件,配置路径.初始化参数.内存大小等 日志文件,包括错误日志,二进制日志,慢查询日志,查询日志 socket文件,用unix域套接字,unix domain socket来进行连接时需要的文件,这一般是本机连接,比通常tcp快 pid文件,进程id

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

一.mysql架构 mysql是一个单进程多线程架构的数据库. 二.存储引擎 InnoDB: 支持事务 行锁 读操作无锁 4种隔离级别,默认为repeatable 自适应hash索引 每张表的存储都是按主键的顺序记性存放 支持全文索引(InnoDB1.2.x - mysql5.6) 支持MVCC(多版本并发控制)实现高并发 MyISAM: 不支持事务 表锁 支持全文索引 三.InnoDB体系架构 1.后台线程 Master Thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性 IO

mysql技术内幕InnoDB存储引擎-阅读笔记

mysql技术内幕InnoDB存储引擎这本书断断续续看了近10天左右,应该说作者有比较丰富的开发水平,在源码级别上分析的比较透彻.如果结合高可用mysql和高性能mysql来看或许效果会更好,可惜书太厚,还在啃当中,希望能早点读完……. 应该说与oracle相比,mysql数据库还是相对比简单,以后还是深入学习下oracle去. 搞数据库也比搞应用运维相对单纯,不用知道各种应用架构,不用写各种脚本工具,只要掌握这个软件就足够了.当然希望自己的知识还是全面一些好.

Mysql技术内幕——表&amp;索引算法和锁

表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示的定义主键则innodb如按照如下方式选择或者创建主键.首先表中是否有唯一非空索引(unique not null),如果有则该列即为主键.不符合上述条件,innodb存储引擎会自动创建一个6字节大小的指针,rowid(). 4.2.innodb逻辑存储结构 innodb的逻辑存储单元由大到小分别是

MySQL技术内幕-InnoDB存储引擎-读书笔记(一)

MySQL技术内幕-InnoDB存储引擎-读书笔记(一) 作为php开发,使用mysql总是少不了的 博客链接 http://itsong.net/articles/466.html 第一章 MySQL体系结构和存储引擎 MySQL被设计为一个单进程多线程架构的数据库 ./mysql --help | grep my.cnf 可以查看mysql数据库实例启动时,它会在哪些位置查找配置文件. 配置文件中有一个datadir参数,指定了数据库所在的路径.默认为/usr/local/mysql/dat

《Mysql技术内幕》札记(上)

第一章   MYSQL体系结构和存储引擎 一.数据库的概念 数据库:数据库文件类型的集合,以frm与ibd结尾等. 数据库实例:数据库后台的进程/线程 以及共享内存组成,实例操作数据库文件数据库与实例一一对应,一个实例对应一个数据库Mysql是单进程多线程,这就意味着一个实例一个进程 MYSQL架构    SQL接口组件   查询分析器组件    优化器组件    缓存                       插件式存储引擎(基于表)                           物理

《Mysql技术内幕》札记(中)

 第四章   表 一.innodb逻辑结构 Innodb存储引擎表,每张表都有个主键,如果没有显示的主键,则innodb存储引擎会按如下的方式选择或创建主键. 是否有非空的唯一索引,如果有即为主键 不符合上述条件,innodb自动创建一个6个字节大小的指针 表空间由段,区,页组成. Innodb_file_per_table选项,每张表的表空间内存放的只是数据,索引和插入缓冲.其他类型undo信息,系统事务信息,二次写缓冲等还是存放在原来的共享表空间内.即使在Innodb_file_per_ta

InnoDB Insert(插入)操作(下)--mysql技术内幕

接上一篇文章,最后做的那个实验,我是想证明mysql innodb存储引擎,commit操作与flush数据到磁盘之间的关系,当与同事交流之后,他说,你应该把innodb_buffer_size的大小考虑到里面,其实我是有考虑的,在开始的部分就有做过假设,假如buffer大小为1G,数据大小为2G,那么在进行事务插入操作时,势必是要在commit操作之前,将缓存数据进行写入磁盘的吧. 再者而言,接上篇实验,我分别进行了两组,一组是进行了rollback操作,另外一组是进行了commit,发现,r

MySQL技术内幕(SQL编程)-数据类型

一:MySQL存储引擎 MySQL插件式存储引擎可以让存储引擎层的开发人员设计他们希望的存储层(满足事务需求.满足数据放到内存中等),常见的存储引擎如下: InnoDB存储引擎:支持事务,面向联机事务处理的应用.特点是行锁设计.支持外键.默认读取操作不会产生锁.最为常用的引擎,5.5.8版本后的默认存储引擎. MyISAM:表锁设计.支持全文索引.不支持事务,面向OLAP数据库应用,5.5.8版本前曾是默认存储引擎.其缓冲池只缓存索引文件,不缓存数据文件. NDB:集群存储引擎,结构是share