频繁commit导致的log file sync的诊断

背景:

2017-04-11 19:20收到开发员反馈,在某库db1上执行update语句很快,但commit很慢,至少执行了5分钟commit都没有返回。

 

问题:

是什么原因导致commit被挂起/阻塞呢?

分析:

1)当前正在运行什么后台作业呢?备份?还是之前发现的一个从18:00跑到21点的后台作业呢?

2)确认备份完成时间,发现在18:51完成,不在本次事件发生时间内。排除备份的影响。

3)查询后台作业dba_scheduler_running_jobs 发现作业job1正在运行,并根据该视图的session_id统计该作业运行时信息,具体语句如下:

select sql_id,event,count(*) from gv$active_session_history where session_id=1719

and session_serial#=45465

group by sql_id,event

order by 3 desc;

 

 

select sql_opname,count(*) from gv$active_session_history where session_id=1719

and session_serial#=45465

group by sql_opname

order by 2 desc;

4) 根据以上结果发现执行的sql语句以update,insert为主。

5) 生成awr报告,发现有大量的log file sync的等待,竟然占db time 95%,每秒处理的事务3295次,即user commit 3295次/s ,从这一刻开始,怀疑重点是“频繁commit形成队列,令其它事务commit时在队列未端,最终像挂起一样”,证据如下:

6)再查看AWR的SQL语句部份,发现有三条update语句,共运行2400万次。

7)根据sql语句的内容查询dba_source表,确认代码项:

select * from dba_source where text LIKE '%UPDATE XXXX%';

最终检查代码发现:

for v in (select id from t1 )

loop

update t2 set price=price*1.1 where id=v.id

commit;

end loop;

结论:找出问题代码,建议由每次commit改为批量commit,问题解决!

 

补充:

log file sync等待:有可能是频繁commit导致,也有可能redo logfile size太少导致,也有可能是io太慢导致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Win10中,my.ini是MySQL的配置文件。下面是一份详细的my.ini配置示例: ``` [client] port=3306 default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] port=3306 basedir="C:/Program Files/MySQL/MySQL Server 8.0/" datadir="C:/ProgramData/MySQL/MySQL Server 8.0/Data/" character-set-server=utf8mb4 default-storage-engine=INNODB sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" log-output=FILE general-log=0 general_log_file="WIN10.log" slow-query-log=1 slow_query_log_file="WIN10-slow.log" long_query_time=10 log-error="WIN10.err" max_connections=100 query_cache_size=0 table_open_cache=2000 tmp_table_size=246M thread_cache_size=10 myisam_max_sort_file_size=100G myisam_sort_buffer_size=410M key_buffer_size=8M read_buffer_size=64K read_rnd_buffer_size=256K sort_buffer_size=256K innodb_flush_log_at_trx_commit=1 innodb_log_buffer_size=1M innodb_buffer_pool_size=8M innodb_log_file_size=48M innodb_thread_concurrency=8 innodb_autoextend_increment=64M innodb_buffer_pool_instances=8 innodb_concurrency_tickets=5000 innodb_old_blocks_time=1000 innodb_open_files=300 innodb_stats_on_metadata=0 innodb_file_per_table=1 innodb_checksum_algorithm=0 back_log=80 flush_time=0 join_buffer_size=256K max_allowed_packet=4M max_connect_errors=100 open_files_limit=4161 query_cache_type=0 sort_buffer_size=256K table_definition_cache=1400 binlog_row_event_max_size=8K sync_master_info=10000 sync_relay_log=10000 sync_relay_log_info=10000 [mysqldump] quick max_allowed_packet=16M [mysql] no-auto-rehash [myisamchk] key_buffer_size=256M sort_buffer_size=256M read_buffer=2M write_buffer=2M [mysqlhotcopy] interactive-timeout ``` 以上配置文件的含义是: - [client]和[mysql]部分用于客户端设置,包括默认字符集和端口号等。 - [mysqld]部分是MySQL服务器的核心设置。其中,port是监听的端口号,basedir是MySQL的安装目录,datadir是数据存储目录,character-set-server是默认字符集。 - default-storage-engine指定默认的存储引擎为InnoDB。 - sql-mode指定SQL执行模式,其中STRICT_TRANS_TABLES表示在插入数据时,如果数据类型不一致,会产生错误。 - log-output指定日志输出方式,general-log和slow-query-log分别指定普通日志和慢查询日志的输出路径。 - long_query_time指定慢查询的时间阈值,单位为秒。 - max_connections指定最大连接数。 - query_cache_size指定查询缓存大小,table_open_cache指定表缓存大小,tmp_table_size指定临时表大小等。 - thread_cache_size指定线程缓存大小,myisam_max_sort_file_size和myisam_sort_buffer_size指定MyISAM排序文件大小和缓存大小,key_buffer_size指定键缓存大小等。 - innodb_buffer_pool_size指定InnoDB缓存大小,innodb_log_file_size指定事务日志文件大小,innodb_thread_concurrency指定并发线程数,innodb_autoextend_increment指定自动增加的大小等。 - back_log指定等待连接的队列大小,flush_time指定刷新日志的时间间隔,join_buffer_size指定连接缓存大小,max_allowed_packet指定最大数据包大小等。 - open_files_limit指定打开文件的最大数量,query_cache_type指定查询缓存类型,table_definition_cache指定表定义缓存大小等。 - binlog_row_event_max_size指定二进制日志行事件的最大大小,sync_master_info、sync_relay_logsync_relay_log_info指定同步信息的刷新时间间隔。 - [mysqldump]部分指定mysqldump的相关设置,包括max_allowed_packet等。 - [myisamchk]指定MyISAM检查的相关设置,包括key_buffer_size、sort_buffer_size等。 - [mysqlhotcopy]部分指定mysqlhotcopy的相关设置,包括interactive-timeout等。 需要注意的是,这只是一份示例配置文件,具体的配置需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值