1.       存储过程中查看异常

 

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION

                   BEGIN

                            GET DIAGNOSTICS CONDITION 1 @v_sqlstate=RETURNED_SQLSTATE,@v_message= MESSAGE_TEXT;

                            SELECT @v_sqlstate,@v_message;

                            SET _err = 9; 

                   END;

        

BEGIN

         。。。。。。。。。。

 

2.       linux 磁盘统计

2.1  sar -b 1 10

·         tps: 每秒向磁盘设备请求数据的次数,包括读、写请求,为rtpswtps的和。出于效率考虑,每一次IO下发后并不是立即处理请求,而是将请求合并(merge),这里tps指请求合并后的请求计数。

·         rtps: 每秒向磁盘设备的读请求次数

·         wtps: 每秒向磁盘设备的写请求次数

·         bread: 每秒从磁盘读的bytes数量

·         bwrtn: 每秒向磁盘写的bytes数量

2.2   iostat -d -k -x 1 10

rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的 时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
wrqm/s
:每秒这个 设备相关的写入请求有多少被Merge
r/s
:每秒响应的读取请求数;
w/s
:每秒响应的写入请求数;
rkB/s
:每秒读取的数据量;wkB/s:每秒写入的数据量
await
:每一个IO请求的处理的平均时间(单位是微秒)。这里可以理解为IO的响应时 间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
%util
:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该 设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util100%,因 为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

 

3.    msyql 缓存

innodb_log_buffer_size (global)

  这是 InnoDB 存储引擎的事务日志所使用的缓冲区。类似于 Binlog BufferInnoDB 在写事务日志的时候,为了提高性能,也是先将信息写入 Innofb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。可以通过 innodb_log_buffer_size 参数设置其可以使用的最大内存空间。

  注:innodb_flush_log_trx_commit 参数对 InnoDB Log 的写入性能有非常关键的影响。该参数可以设置为012,解释如下:

  0log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer log file的刷新或者文件系统到磁盘的刷新操作;

  1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;

  2:事务提交会触发log buffer log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。

  此外,MySQL文档中还提到,这几种设置中的每秒同步一次的机制,可能并不会完全确保非常准确的每秒就一定会发生同步,还取决于进程调度的问题。实际上,InnoDB 能否真正满足此参数所设置值代表的意义正常 Recovery 还是受到了不同 OS 下文件系统以及磁盘本身的限制,可能有些时候在并没有真正完成磁盘同步的情况下也会告诉 mysqld 已经完成了磁盘同步。

 

innodb_max_dirty_pages_pct (global)

  这个参数和上面的各个参数不同,他不是用来设置用于缓存某种数据的内存大小的一个参数,而是用来控制在 InnoDB Buffer Pool 中可以不用写入数据文件中的Dirty Page 的比例(已经被修但还没有从内存中写入到数据文件的脏数据)。这个比例值越大,从内存到磁盘的写入操作就会相对减少,所以能够一定程度下减少写入操作的磁盘IO

  但是,如果这个比例值过大,当数据库 Crash 之后重启的时间可能就会很长,因为会有大量的事务数据需要从日志文件恢复出来写入数据文件中。同时,过大的比例值同时可能也会造成在达到比例设定上限后的 flush 操作“过猛”而导致性能波动很大。

  上面这几个参数是 MySQL 中为了减少磁盘物理IO而设计的主要参数,对 MySQL 的性能起到了至关重要的作用。

 

 

相关参数的建议值

按照 mcsrainbow 朋友的要求,这里列一下根据以往经验得到的相关参数的建议值:

  query_cache_type : 如果全部使用innodb存储引擎,建议为0,如果使用MyISAM 存储引擎,建议为2,同时在SQL语句中显式控制是否是哟你gquery cache

  query_cache_size: 根据 命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))进行调整,一般不建议太大,256MB可能已经差不多了,大型的配置型静态数据可适当调大

  binlog_cache_size: 一般环境2MB4MB是一个合适的选择,事务较大且写入频繁的数据库环境可以适当调大,但不建议超过32MB

  key_buffer_size: 如果不使用MyISAM存储引擎,16MB足以,用来缓存一些系统表信息等。如果使用 MyISAM存储引擎,在内存允许的情况下,尽可能将所有索引放入内存,简单来说就是“越大越好”

  bulk_insert_buffer_size: 如果经常性的需要使用批量插入的特殊语句(上面有说明)来插入数据,可以适当调大该参数至16MB32MB,不建议继续增大,某人8MB

  innodb_buffer_pool_size: 如果不使用InnoDB存储引擎,可以不用调整这个参数,如果需要使用,在内存允许的情况下,尽可能将所有的InnoDB数据文件存放如内存中,同样将但来说也是“越大越好”

  innodb_additional_mem_pool_size: 一般的数据库建议调整到8MB16MB,如果表特别多,可以调整到32MB,可以根据error log中的信息判断是否需要增大

  innodb_log_buffer_size: 默认是1MB,系的如频繁的系统可适当增大至4MB8MB。当然如上面介绍所说,这个参数实际上还和另外的flush参数相关。一般来说不建议超过32MB

  innodb_max_dirty_pages_pct: 根据以往的经验,重启恢复的数据如果要超过1GB的话,启动速度会比较慢,几乎难以接受,所以建议不大于 1GB/innodb_buffer_pool_size(GB)*100 这个值。当然,如果你能够忍受启动时间比较长,而且希望尽量减少内存至磁盘的flush,可以将这个值调整到90,但不建议超过90

 



乐享:知识积累,快乐无限。