2021-07-12

重建表的方式
这里先不谈其它,仅仅说一下重建表的方法。如下
1、为了确保所有表字段、字段类型、长度完全一样,我一般不建议使用CTAS方式来重建表。
2、一般我都是使用下面两种方法中的一个,来抽取表的定义
select dbms_metadata.get_ddl(‘TABLE’,upper(’&i_table_name’),upper(’&i_owner’)) from dual;
使用PL/SQL developer类似这样的工具,来查看表定义语句
3、重新建一张_old类型的表(根据上面的抽取的表定义),然后使用insert /*+ append */ xx select xxx 方式完成数据的转换
4、最后使用rename方式倒换这两张表的名字

重建表注意事项
索引重建:这里最关键的是,重建后索引的名字是否必须和以前的一样,如果需要一样,则必须将当前使用的索引名字先rename,否则创建的时候会出现索引名字已经存在的错误,如下:
select ‘alter index ’ || owner || ‘.’ || index_name || ’ rename to ’ ||
substr(index_name, 1, 26) || ‘_old;’
from dba_indexes a
where a.table_owner = ‘DBMON’
AND A.table_name = ‘DH_T’;
依赖对象重建:一般可以使用如下方式完成
select ‘alter ‘||decode(type,‘PACKAGE BODY’,‘PACKAGE’,type)||’ ‘||owner||’.’||name||’ compile;’
from dba_dependencies a
where a.referenced_name = ‘DH_T’
and a.referenced_owner = ‘DBMON’;
注意:
1、这里重建的只是直接依赖对象,必须考虑那些间接依赖的对象(例如 view1依赖A表,view2依赖view1),查找方法和上面差不多
2、如果这些依赖对象中存在一些私有对象(例如dblink等),我们用DBA用户重新编译是会出现编译错误,对于这种对象,必须以对应对象的所属者才能编译成功。(也可用用10g以后新出现的代理权限来完成这类任务!)
针对PL/SQL代码(包、函数、过程等),是否存在私有对象的查找方法,如下:
select *
from dba_source a
where (a.owner, a.name) in
(select owner, name
from dba_dependencies b
where b.referenced_name = ‘DH_T’
and b.referenced_owner = ‘DBMON’)
and a.TEXT like ‘%@%’;
针对视图中是否存在私有对象的查找方法,如下(由于是long类型,必须得一个一个查看):
select *
from dba_views a
where (a.owner, a.view_name) in
(select owner, name
from dba_dependencies b
where b.referenced_name = ‘DH_T’
and b.referenced_owner = ‘DBMON’
and b.type = ‘VIEW’)
权限重建:可以使用如下语句
select ‘grant ’ || PRIVILEGE || ’ on ’ || owner || ‘.’ || table_name ||
’ to ’ || grantee || ‘;’
from dba_tab_privs
where table_name = upper(’&i_table_name’)
and owner = upper(’&i_owner’);

外键重建:对于外键,现在的业务数据逻辑很多都是在应用层来实现,因此表上的外键可能都非常少,因此,导致很多DBA都忘记需要检查和重建这一部分了,从而导致业务出现问题,本章最开始说的故障案例就是因为没有重建外键而引起,因此我们一定要提高警惕。可以使用如下语句查看,哪些表引用了重建表
select a.table_name,
a.owner,
a.constraint_name,
a.constraint_type,
a.r_owner,
a.r_constraint_name,–被外键引用的约束名
b.table_name --被外键引用的表名
from dba_constraints a, dba_constraints b
where a.constraint_type = ‘R’
and a.r_constraint_name = b.constraint_name
and a.r_owner = b.owner
and b.table_name = ‘FSPARECEIVEBILLTIME’
and b.owner=’’;

物化视图:另外一个非常重要的依赖对象就是物化视图,一般来说,rename表以后,物化视图是不会有问题的,再次刷新时会自动编译,但是这可能会影响优化其选择执行计划,因此,建议手工直接编译这些失效的物化视图,如下
alter MATERIALIZED VIEW DH_T_MV compile;
备注,其实这步已经包含在依赖对象重建部分了,单独拿出来是因为这个依赖对象非常重要,不容有任何意外

物化视图日志:物化视图日志是为了快速刷新准备的,而且从dba_dependencies 这张依赖表中无法查找出来的,但是,对于这个对象,我们一定要保持谨慎和敬畏,因为如果表上存在物化视图日志对象的话,那么这张表无法完成rename(在一个变更的晚上,其它什么都OK了,突然遇到一个这样的问题,还得找开发确认,是非常被动的,整个变更很有可能因为这个无法确认而取消),会直接报错,查找表上的物化视图日志对象方法如下:
select master,log_table
from user_mview_logs a
where master in (‘DH_T’);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值