一直以来采用impdp导入的时候,都会卡在导入索引的位置,持续时间几乎比导入数据的时间还要长。一般建议的办法是导入的时候,不导入索引,而是后期进行重建,可是如果索引有好几百好几千呢?有没有什么好的办法,在考虑不能对现有的硬件,操作系统,进行调整的情况下,只通过数据库设置的方式,加速索引导入
可以考虑不导出索引,而是从数据库直接获取索引创建的DDL语句,加上并行的hint,可以提高这方面的速度
评论
有用 1可以先看一下索引的大小,考虑导出的时候使用exclude选项不导出较大的索引,然后在导入之后在加并行重建索引
评论
有用 0瓶颈一般在IO层面上,CPU资源允许的情况下开并行,在导入索引存在分区的的时候效果更佳明显,排除后重建,其他的目前没有其他很好的方案
评论
有用 0impdp的时候使用SQLFILE把语句导出来,这一次impdp不会真的导数据,只是把建表、建索引、建约束、授权等等的语句导成一个文本。然后你再用impdp做真正的导入,同时exclude=index,数据导完之后,用刚才生成的文本,随便找个有替换功能的文本编辑工具,把文本中的并行度改成你想要的,然后执行。具体细节,你需要自己在实验环境上实操一下,你才晓得,这种方法可能是最快的。另外,友情提示,看文本一定要仔细,你会发现文本中已经帮你把noparallel也写好了,而且每一部分内容都是成块儿的,就是说建表的语句是一堆儿,建索引的是一堆儿,授权的是一堆儿,所以你可以很方便的将其他不需要的进行删除,只留建索引的部分。
评论
有用 1谢谢各位,你们的核心思想还是先只导数据库表,后期再导索引。至于后期采用并发重建索引的这个办法,实际上在impdp数据的时候,添加parallel参数,在导入索引的那个阶段,同样也是通过并行来执行,官方文档对parallel这个参数的说明是“Parallelism is used for loading user data and package bodies, and for building indexes.”,如果我理解没错的话。
另外,如果导入的数据库是一个RAC数据库,那么将dmp文件放置到共享存储上,同时在导入的时候将parallel参数设置大一点,利用CLUSTER=Y的功能,可以实现双节点“更”多并行度的执行,避免在同一个节点上开启过度的并发进程,那么剩下的瓶颈就完全在存储I/O了,不知道我这样理解对否?简单理解为,如果设置的parallel=4, 如果是单节点导入,开启的并行度为4,如果是双节点,实际开启的并行度为8,还是说即使是两个节点,总的并发度仍然还是只有4个?
通过我的监控和后期测试,一个大约6G的索引,在并发导入时和独立并发重建的时间,基本差不多。
要命的是,生产库的迁移,业务的同事一定要你全部搞完了,他们才会去拉业务,否则你就得背锅。所以如果要进行上千个索引的后期手工重建,也是一件挺麻烦的事情。
评论
有用 0数据库的迁移可以采取 dg或者 xtts等方案,更灵活一些,减少停机时间
评论
有用 1
墨值悬赏

