数据迁移是DBA的平常工做,对于相应的方法、命令等,相信不少人早已了如指掌。圆满的数据迁移流程不仅仅指将数据从数据库A备份恢复到数据库B,并且要保证迁移先后数据的完整性、服务的可用性。sql
近日,在给客户作了单机到集群的数据迁移后,发现集群的在线重作日志切换频繁,进而产生了大量的归档日志,对服务器形成了不小的压力。本文是对上述问题的分析处理过程。数据库
1. 日志归档频繁服务器
在迁移完成后,须要对集群进行一段时间的深度观察。经过v$archived_log视图,分析数据库历史的归档状况,能够发现整个库的业务活动状况。架构
观察上图,不难发现迁移(6月15日)先后是一个明显得变化点,天天日志归档频率由原来的100屡次变成400屡次。这种状况要么是迁入的系统业务量确实很大,要么是迁入的数据库用户配置有问题。运维
2. 业务状况确认分布式
通过与新迁入系统的运维人员沟通确认,该系统的使用人数虽然多,但都是以查询类的动做偏多,不该该带来这么大量的日志。由于集群中还有其它系统,不能直接判断是新系统的问题。假设运维所说状况属实,那么问题的关键点就是要找到产生大量日志的操做语句,进而找到对应的应用,再确认归档状况是否正常。函数
1. 追根溯源性能
日志归档频繁,说明在线重作日志切换频繁,通常是因为产生了大量的redo。这里经过awr检查redo的生成状况。spa
一天内日志归档的详细状况.net
这里选择6月18日上午10点到11点间集群2节点的awr报告
节点1:
观察上图,能够看到在1小时内,节点1的redo的产生速率约为3.38MB/S,那么一小时就有约11.88GB。
节点2:
观察上图,能够看到在1小时内,节点2的redo的产生速率约为0.26MB/S,那么一小时就有约0.9GB。
经过查询v$archived_log视图,分类计算出10点到11点间所产生的归档日志大小约为12.3GB,这与根据awr报告推算出来的值12.78GB很是接近,能够说明以上两份awr报告的可参考性很高。
2. 顺藤摸瓜
如今已经确认是归档频繁是由大量的redo引发的,那么就须要看在问题时间区间内,致使数据块变化的缘由(sql),这个能够从awr报告的“Segments by DB Blocks Changes”部分能够找到答案:
节点1:
节点2:
由上边2个截图能够发现,用户YK***FT名下的有3个表(US***4二、US***3九、US***06)的数据块被频繁的操做,而这个用户正是新迁入系统的数据库用户。
为了更进一步了解对该3个表作了哪些操做,能够在awr报告中分别搜索表名称,找出相关的sql语句。
由上图能够看出,在1小时以内,对该3个表分别执行了60次update操做,具体的sql语句以下:
这里注意到一个数字60,看样子像是一个定时任务,首先想到的是job。通过查询,发现yk***ft用户下确实存在一个job,并且正好是每分钟执行一次!
进一步查看job执行的存储过程发现正是上边的3条语句:
经过分析US***4二、US***3九、US***06这个3个表和update中的where语句,发现那3条update语句颇有问题,符合where的数据量大,且只增不减,必需要调整。
1. 业务状况再确认
根据前边找到的线索,跟运维人员确认job(24)的业务做用,获得的反馈是以前有个需求是按期把符合要求的字段A的值写到字段B,如今该需求已再也不须要,能够删除。
2. 调整并观察
禁用job
虽然业务确承认以删除,但为了保险起见,这里将job(24)禁用,经过调用dbms_job.broken完成。
观察redo
这里选择调整以后的6月20日上午10点到11点间集群2节点的awr报告
节点1:
节点2:
由上述节点1和节点2相同时间内的awr报告的来看,redo产生速率有了很大的下降。经过观察归档日志的生成状况,发现归档频率也下降了。
通过回顾整个问题的发现、分析和解决过程,能够发现其实并无什么技术难点,问题的缘由主要仍是出在业务沟通上。在迁移以前,最好可以跟应用管理员确认清楚业务的特色,包括现有业务的压力状况、已发现的性能瓶颈、再也不须要的各种数据库对象(索引、视图、存储过程、函数、触发器等),提早作好应对措施,保证数据迁移的圆满完成。
做者:张世城