话题讨论:Oracle版本升级到底需要多少时间
我们的文章会在微信公众号“Oracle恢复实录”和博客网站“w” 同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
最近在跟客户和朋友讨论数据库版本升级时,都讨论到关于数据库升级时间的一些问题,如:
- 为什么CDB环境数据库升级的时间比NON-CDB环境更久。
- 数据库升级时间跟哪些因素有关系。
- 怎么提升数据库升级效率,降低数据库升级的时间。
今天就结合官方文档和自己在项目上的一些体会、经验来谈谈数据库升级需要消耗多少时间、消耗的时间跟哪些因素有关等。
1,为什么CDB环境数据库升级的时间比NON-CDB环境更久。
在CDB环境中会存在默认的CDB[latex]ROOT、PDB[/latex]SEED和用户自建的PDB。在NON-CDB中,只有用户自建的数据库,可以看成CDB环境中只有CDB[latex]ROOT及用户自定义的对象,没有PDB[/latex]SEED这些PDB。在CDB环境升级的时,是先升级CDB[latex]ROOT,升级完成后再升级PDB[/latex]SEED、用户自定义的PDB。在NON-CDB环境中升级,只需要升级数据库本身,没有PDB$SEED及用户自建PDB。
虽然从12.1开始数据库升级引入了并行的机制,但是在CDB环境和NON-CDB环境中并行机制还是有一些差异地方:
- CDB环境中CDB$ROOT的并行度默认是4,最大可以取值为8.
- 非CDB$ROOT的并行度是2,也就是意味着每个PDB有2个升级进程,当然也可以通过参数来修改。
- 非CDB$ROOT的PDB可以同时并行升级,并行的PDB个数由参数决定。
所以对CDB环境中升级,如果采用常规的升级方式,比NON-CDB环境需要更长的时间。
2,数据库升级时间跟哪些因素有关系
要谈到数据升级消耗的时间跟哪些因素有关系,首先明白数据库升级仅仅是更新数据库自带的对象,如自带的函数、包、视图、表、索引等等。这些对象在数据库中其实是根据组件来分类的,不同的组件对应的对象不同,组件越多,那么对应的升级对象就会越多,升级的时间就会长。组件之间的升级是串行的,虽然12.1后引入并行的升级机制,但是并行只限于单个组件内部,无法跨组件。
数据库升级就是更新对象,其实就是执行CREATE、DROP、UPDATE这些语句,影响这些语句执行的时间的因素也都会影响到数据库升级时间。如:
- 统计信息
统计信息直接影响SQL执行计划,必然会影响到SQL执行的效率,在数据库升级方案中,都会提前验证和收集字典表和固定表的统计。
- CPU/IO资源
通常情况下数据库升级操作本身并不是一个高并发和密集型的IO操作,对CPU的资源和IO的资源要求不高,所以在生产环境中正常配置的CPU/IO的资源对数据库升级的时间影响不大,但是CPU/IO配置越高,SQL运行的效率越高,数据库升级的时间就越少。
- 数据库大小
数据库升级只修改数据库自带的对象,跟数据库整体大小没有必然的关系,如升级一个40T的数据库和10T的数据库,数据库升级时间无太多差异。前面提到了数据库容量大小,其实容量大小只是反应了数据库容量,未反应数据库对象的个数。数据库对象越多,对象的DDL信息、统计信息等就会越多,这些信息都是存放在系统表中,也就意味着数据库系统表会越来越大,对系统表的相关SQL语句的性能就会下降,就会影响数据库升级的时间。
- 其它因素
如使用OGG的IE模式,SPATIAL功能都会影响数据库升级的时间。
3,怎么提升数据库升级效率,降低数据库升级的时间。
数据库升级本身操作很简单,一条命令搞定,操作简单,并不意味技术简单。数据库升级本身是一个复杂的工作,操作简单是基于前期已经做了很多完整的方案验证、业务功能测试、业务性能测试、兼容性测试、升级方案的测试等等,所以才会有最后的一条命令就可以完成升级。只有做足了测试的方案验证和测试工作,才能知道每一步需要消耗多少时间,是否存在着优化的空间。同时数据库升级工作本身涉及到工作也非常多,包括停前端应用、停监听、ADG环境的考虑、操作系统的考虑、软件的安装等等一整套的工作和流程,需要从全局来考虑怎么提升数据库升级的效率,降低因为数据库升级而影响业务停机的时间。
下面就单纯的针对怎么提升数据库升级效率,降低数据库升级时间来谈谈几个方面。
- 减少组件个数
组件越多,对象就越多,升级执行的SQL越多,升级的时间越久,要想提升升级的效率,最好的办法就是减少数据库组件的个数。这里额外的说一点,我们在DBCA创建数据库的时候,有三个选项,通用数据库、数仓、自定义数据库,建议创建数据库的时候,选择自定义数据库的方式,选择自己需要的组件。在一线做技术的时候,每个生产环境创建数据库都是选择自定义方式,并且里面的组件默认都不选。在金融、运营商行业,其实80%以上的环境都不需要选任何的组件,也能满足客户的要求。其实一直坚持的是组件越少,系统稳定性越好,需要维护的东西越少。*********这里额外的说一点,我们在DBCA创建数据库的时候,有三个选项,通用数据库、数仓、自定义数据库,建议创建数据库的时候,选择自定义数据库的方式,选择自己需要的组件。在一线做技术的时候,每个生产环境创建数据库都是选择自定义方式,并且里面的组件默认都不选。在金融、运营商行业,其实80%以上的环境都不需要选任何的组件,也能满足客户的要求。其实一直坚持的是组件越少,系统稳定性越好,需要维护的东西越少。***
- 最佳实践
每个版本的升级,Oracle官方都会有详细的操作文档,根据操作文档再结合自己环境,形成自己的最佳实践文档,有能力还可以形成自己的工具或者脚本。
- 新建CDB
在CDB环境中,可以通过新建CDB,通过拔插PDB的方式,将PDB从老版本中迁移到新版本的CDB中,节约升级CDB的时间,来减少升级PDB的升级时间。
- 特殊情况
有很多特殊的情况可能影响到数据库升级的效率,这些情况需要自己多去总结或者多观察升级本身执行的SQL语句,也能提前发现一些隐患。如11.2.0.4升级到19C,此时很多基本都增加了con_id这列,所以此时对应的表、视图等都会发生修改,如果表的数据量表达,那么肯定会消耗大量的资源,我们可以提前对数据量做一些操作,比如AWR数据,如果不需要我们可以直接情况AWR里面的数据。
话题讨论:Oracle版本升级到底需要多少时间:等您坐沙发呢!