2月9号的时候分享了篇Oracle针对大表在线修改的脚本,主要是使用Oracle自带的在线重定义功能,对于表结构的修改,非常的方便,强列推荐使用。
脚本下载地址:oracle大表字段类型修改在线重定义脚本.txt
最近在客户现场测试最大的24亿行记录的分区表,整个变更过程花费3个多小时,符合预期。
网上相关的文章比较多,但都只是告诉我们怎么用,对于大表环境下的坑,讲的都比较少,如下是我在一线客户现场测试上10亿的大表字段修改过程中所遇到的问题汇总及规避方法,希望能帮助到大家。
每次看大神的文章第一时间就是看看什么版本、什么环境,心心想自己的环境适用不,废话有点多,直接看配置吧。
CPU:物理4个,每个10核心,共计80个Processor(Intel® Xeon® CPU E7-4820 v3 @ 1.90GHz)
内存:500 GB
OS版本:redhat Linux release 7.5 (Maipo)。
存储:huawei 某型号。
DB版本:Oracle 12c RAC nocdb(12.2.0.1.0)。
一. 简单介绍一下Oracle在线重定义
1. 在线重定义表是什么
Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL、DML操作,使得前端的DML根本感觉不到表结构实际上已经发生了变化,对于用户而言是完全透明的。当然在线重定义期间,前端性能会稍微有所下降。Oracle提供的重定义包dbms_redefinition即是用与完成此操作。其实质是Oracle使用了智能物化视图及物化视图日志的方式。在对象结构重组期间,表现为一个本地对象的复制,重组期间发生的任何变化都会被刷新到最新。
2. 在线重定义表的主要功能,如下:
修改表或簇的存储参数.
为表添加,修改或删除列
为表添加或删除分区,改变分区结构
增加并行查询支持
重建表以减少碎片
将堆表变为索引组织表或相反
普通表转为分区表
分区表转普通表
改变物化视图日志或者Streams Advanced Queuing queue 表结构
将表移动到相同或不同schema下不同的tablespace(如果不要求表始终可用的话,也可以直接使用alter table move 实现)
3. 支持数据库版本
mos上查询到是支持10.2.0.4及更高版本 - Doc ID 1304838.1.
二、实施过程中需要避免的坑
创建临时表 - [仅创建基础表结构和注释]
临时表的表结构即是我们最终要的表结构。创建临时表时只创建基础的表和注释,不要创建索引、主键、及其它约束,针对小表可以使用COP