论文部分内容阅读
[摘 要]随着大型数据库系统的应用和实施,在数据库部署过程中经常需要进行数据迁移,数据迁移是数据整合中保证系统平滑升级和更新的关键部分,在新旧系统的切换过程中,必然要面临数据迁移。然而目前企业级的海量数据迁移在数据库层面会产生快照过旧的问题,本文主要论述一种海量数据迁移过程中产生快照过旧问题的解决方法。
中图分类号:TP311.13 文献标识码:A 文章编号:1009-914X(2016)09-0099-01
1、引言
目前企业级海量数据存储大部分都使用Oracle数据库,Oracle官方提供了数据泵工具来进行数据迁移。数据泵工具支持并行处理导入导出任务,导入导出时提供了非常细粒度的对象控制,通过Include/Exclude以及Query等参数可以详细制定是否包含或不包含某个对象。利用Oracle数据泵工具对系统超大数据表进行数据迁移,迁移过程中由于数据量过大而回滚段空间不足,会产生快照过旧(ORA-01555)的问题,尤其在数据表中字段类型为BLOB类型(该字段类型常用来存储图片、声音等大数据文件)时,经常会产生快照过旧的问题导致数据迁移中断。
2、现象描述
在对系统非结构化数据表 (该表中存在类型为BLOB的字段)进行迁移时,由于系统回滚表空间(undo tablespace)空间不足而导致数据迁移失败,产生如下错误:
ORA-01555:snapshot too old:rollback segment number 18 with name ‘_SYSSMU168’ is too small.
ORA-22924:snapshot too old
分析产生该错误的主要原因为回滚段设置太小,通常在UNDO回滚段中会保留数据库在某个时间点的数据,用来保证数据的一致性读。而在用户利用数据泵工具执行导出数据表操作时,又有其它用户对该表进行了修改,如果修改提交后UNDO中无足够空间,之前保存在UNDO中的数据资料就会被覆盖,从而依赖于这些数据资料的操作就无法获得一致性读,导致数据迁移过程产生以上报错。而且Oracle由参数undo_retention指定时间去释放UNDO回滚段,所以如果数据迁移时长超过undo_retention指定时间也会导致快照过旧的问题产生。
但是调整回滚段的大小并不能从根本上解决该问题,而且回滚段的大小也不能无限增大,undo_retention指定时间也有最大值限制,故针对系统超大数据表的迁移,我们采用了一种典型的解决方法来处理迁移过程中产生的快照过旧问题。
3、解决方法和步骤
针对非结构化数据表迁移过程中产生的快照过旧问题,我们进行了深入的分析,首先从报错提示入手,查看了系统表空间的使用率,调整了系统参数undo_retention指定时间的大小,仍无法解决文中报错。后续我们进行了多次尝试调整,总结出了定位并解决该问题的一套思路和方法,即按照数据库参数ROWID和ROWNUM先将记录进行排序预处理,然后将数据按照排列好的顺序分批导出,解决了快照过旧(ORA-01555)的问题。具体步骤如下:
首先,查看报错提示为系统表空间回滚段过小,通过脚本查看系统表空间的使用率得知,系统UNDO表空间使用率未超过80%,回滚段是循环使用的,其表空间使用率不高说明目前回滚段的大小足够大,足以保证被提交的数据信息保存足够长的时间去完成大事务的一致性读取,判断并非由于UNDO回滚段过小导致该问题。故考虑增加undo_retention参数的大小,使得在undo_retention规定时间内,Oracle都无法释放UNDO表空间,任何其它事务都不能覆盖当前数据。使用以下语句来修改undo_retention参数值的大小:
alter system set undo_retention=36000 scope=both;
通过以上语句将undo_retention参数值设置为10个小时(36000秒),然后利用数据泵工具进行数据迁移,结果发现继续产生快照过旧的问题。分析发现该数据表的迁移数据量共计881G,在undo_retention规定时间内并不能完成数据迁移,而将undo_retention设置过大又会影响系统性能。故我们利用Oracle数据库的ROWID和ROWNUM对表中数据排序后进行分批迁移,首先需要查询系统的非结构化数据表中共有多少条记录,将其记录为total_record。查询出数据表的记录总数后可以根据公式计算出数据迁移的数据集个数expdp_set_num=total_record/set_record_num(其中set_record_num表示单个数据集中的记录数,本文中采用的数值为100000条)。本文中total_record=756653,故数据迁移可以分为8个数据集进行,每个数据集100000条记录(其中最后一个数据集中有56653条记录),平均每个数据集的大小是110G,对每个数据集的迁移可以根据服务器当时的负载和网络情况并行处理。然后使用以下语句查询出该非结构化数据表中前100000条记录:
select * FROM (SELECT ROWNUM PNUM,rowid prowid, T.* FROM MW_SYS.MWT_OM_FSDATA T ORDER BY rowid) TT WHERE PNUM between 1 and 100000;
其中MW_SYS.MWT_OM_FSDATA为系统的非结构化数据表,以此类推就可以查询出表中其它数据集中的数据。接下来就需要使用数据泵工具的query参数来进行数据迁移脚本的编写。本次数据迁移的第一条到第100000条记录可以使用以下数据泵参数来进行导出:
TABLES=MW_SYS.MWT_OM_FSDATA
QUERY= MW_SYS.MWT_OM_FSDATA:"where rowid in(select prowid FROM (SELECT ROWNUM PNUM,rowid prowid, T.* FROM MW_SYS.MWT_OM_FSDATA T ORDER BY rowid) TT WHERE PNUM between 1 and 100000)"
采用以上方法顺利完成了系统非结构数据表的迁移,成功解决了由于超大数据表迁移产生的ORA-01555快照过旧问题。
4、浅谈经验
在实际的数据迁移过程中,我们需要根据系统情况和用户需求来对数据泵工具的相关参数进行设置,并同时考虑系统性能和数据迁移的时效性,对数据迁移的时间和空间进行合理的规划。本文提供了一种海量数据迁移过程中产生快照过旧问题的解决方法,在迁移过程中发生报错时及时进行了处理,确保数據迁移工作的正常进行。
作者简介
杨恒翔,出生于1987.06,研究生毕业于天津大学,计算机科学与技术专业。目前从事信息运维工作。
王涛,出生于1987.05,研究生毕业于河北工业大学,计算机科学与技术专业。目前从事信息运维工作。
中图分类号:TP311.13 文献标识码:A 文章编号:1009-914X(2016)09-0099-01
1、引言
目前企业级海量数据存储大部分都使用Oracle数据库,Oracle官方提供了数据泵工具来进行数据迁移。数据泵工具支持并行处理导入导出任务,导入导出时提供了非常细粒度的对象控制,通过Include/Exclude以及Query等参数可以详细制定是否包含或不包含某个对象。利用Oracle数据泵工具对系统超大数据表进行数据迁移,迁移过程中由于数据量过大而回滚段空间不足,会产生快照过旧(ORA-01555)的问题,尤其在数据表中字段类型为BLOB类型(该字段类型常用来存储图片、声音等大数据文件)时,经常会产生快照过旧的问题导致数据迁移中断。
2、现象描述
在对系统非结构化数据表 (该表中存在类型为BLOB的字段)进行迁移时,由于系统回滚表空间(undo tablespace)空间不足而导致数据迁移失败,产生如下错误:
ORA-01555:snapshot too old:rollback segment number 18 with name ‘_SYSSMU168’ is too small.
ORA-22924:snapshot too old
分析产生该错误的主要原因为回滚段设置太小,通常在UNDO回滚段中会保留数据库在某个时间点的数据,用来保证数据的一致性读。而在用户利用数据泵工具执行导出数据表操作时,又有其它用户对该表进行了修改,如果修改提交后UNDO中无足够空间,之前保存在UNDO中的数据资料就会被覆盖,从而依赖于这些数据资料的操作就无法获得一致性读,导致数据迁移过程产生以上报错。而且Oracle由参数undo_retention指定时间去释放UNDO回滚段,所以如果数据迁移时长超过undo_retention指定时间也会导致快照过旧的问题产生。
但是调整回滚段的大小并不能从根本上解决该问题,而且回滚段的大小也不能无限增大,undo_retention指定时间也有最大值限制,故针对系统超大数据表的迁移,我们采用了一种典型的解决方法来处理迁移过程中产生的快照过旧问题。
3、解决方法和步骤
针对非结构化数据表迁移过程中产生的快照过旧问题,我们进行了深入的分析,首先从报错提示入手,查看了系统表空间的使用率,调整了系统参数undo_retention指定时间的大小,仍无法解决文中报错。后续我们进行了多次尝试调整,总结出了定位并解决该问题的一套思路和方法,即按照数据库参数ROWID和ROWNUM先将记录进行排序预处理,然后将数据按照排列好的顺序分批导出,解决了快照过旧(ORA-01555)的问题。具体步骤如下:
首先,查看报错提示为系统表空间回滚段过小,通过脚本查看系统表空间的使用率得知,系统UNDO表空间使用率未超过80%,回滚段是循环使用的,其表空间使用率不高说明目前回滚段的大小足够大,足以保证被提交的数据信息保存足够长的时间去完成大事务的一致性读取,判断并非由于UNDO回滚段过小导致该问题。故考虑增加undo_retention参数的大小,使得在undo_retention规定时间内,Oracle都无法释放UNDO表空间,任何其它事务都不能覆盖当前数据。使用以下语句来修改undo_retention参数值的大小:
alter system set undo_retention=36000 scope=both;
通过以上语句将undo_retention参数值设置为10个小时(36000秒),然后利用数据泵工具进行数据迁移,结果发现继续产生快照过旧的问题。分析发现该数据表的迁移数据量共计881G,在undo_retention规定时间内并不能完成数据迁移,而将undo_retention设置过大又会影响系统性能。故我们利用Oracle数据库的ROWID和ROWNUM对表中数据排序后进行分批迁移,首先需要查询系统的非结构化数据表中共有多少条记录,将其记录为total_record。查询出数据表的记录总数后可以根据公式计算出数据迁移的数据集个数expdp_set_num=total_record/set_record_num(其中set_record_num表示单个数据集中的记录数,本文中采用的数值为100000条)。本文中total_record=756653,故数据迁移可以分为8个数据集进行,每个数据集100000条记录(其中最后一个数据集中有56653条记录),平均每个数据集的大小是110G,对每个数据集的迁移可以根据服务器当时的负载和网络情况并行处理。然后使用以下语句查询出该非结构化数据表中前100000条记录:
select * FROM (SELECT ROWNUM PNUM,rowid prowid, T.* FROM MW_SYS.MWT_OM_FSDATA T ORDER BY rowid) TT WHERE PNUM between 1 and 100000;
其中MW_SYS.MWT_OM_FSDATA为系统的非结构化数据表,以此类推就可以查询出表中其它数据集中的数据。接下来就需要使用数据泵工具的query参数来进行数据迁移脚本的编写。本次数据迁移的第一条到第100000条记录可以使用以下数据泵参数来进行导出:
TABLES=MW_SYS.MWT_OM_FSDATA
QUERY= MW_SYS.MWT_OM_FSDATA:"where rowid in(select prowid FROM (SELECT ROWNUM PNUM,rowid prowid, T.* FROM MW_SYS.MWT_OM_FSDATA T ORDER BY rowid) TT WHERE PNUM between 1 and 100000)"
采用以上方法顺利完成了系统非结构数据表的迁移,成功解决了由于超大数据表迁移产生的ORA-01555快照过旧问题。
4、浅谈经验
在实际的数据迁移过程中,我们需要根据系统情况和用户需求来对数据泵工具的相关参数进行设置,并同时考虑系统性能和数据迁移的时效性,对数据迁移的时间和空间进行合理的规划。本文提供了一种海量数据迁移过程中产生快照过旧问题的解决方法,在迁移过程中发生报错时及时进行了处理,确保数據迁移工作的正常进行。
作者简介
杨恒翔,出生于1987.06,研究生毕业于天津大学,计算机科学与技术专业。目前从事信息运维工作。
王涛,出生于1987.05,研究生毕业于河北工业大学,计算机科学与技术专业。目前从事信息运维工作。