V1.0
Revision |
Author/Modifier | Comments | |
No. |
Date |
||
1.0 | 2012/2/15 | 张中靖 | |
一、 目的
说明删除表的前置条件、操作步骤,降低对对应用造成的影响及避免故障
二、 适用范围
l 所有生产数据库
三、 风险评估
l 应用评估不完善,仍有部分应用访问该表,删除后应用报错
l 跨库依赖关系没有整理,删除表后导致其他库上的应用报错
l DW有访问该表,删除表前没有通知dw,导致dw任务失败
l 重命名表时没有对erosa/otter配置进行更新,导致数据同步失败
l 误操作,登陆到其他schema下,导致删除其他表。
l 删除前未进行备份,后续无法及时进行有效的恢复
四、 操作流程
1. 准备工作
a) 整理依赖该表的对象(存储过程、视图、同义词等)及授权情况:
注意:9i库的同义词依赖在dba_dependencies没有记录,需要查dba_synonyms.
在其他库上查找访问该表所在库的dblink,如果存在dblink:
根据dblink名字查跨库依赖该表的对象:
select * from dba_dependencies where REFERENCED_LINK_NAME = ‘dblink名‘ and referenced_name=‘删除的表‘;
检查跨库的同义词依赖:
select * from dba_synonyms where DB_LINK = ‘dblink名‘ and table_name=‘删除的表‘;
根据dblink名字查使用dblink的物化视图,再检查物化视图的定义,确认是否依赖该表:
select * from dba_mviews where MASTER_LINK=‘dblink名字‘;
b) 根据表和其依赖对象,配合开发整理应用,对应用进行改造、下线处理
c) 检查数据库上的定时任务,以确实是否有访问该表及其依赖对象。如果有,跟开发确认后停掉。
d) 在监控系统(全文索引、awr报告等)中对该表进行持续一周以上的监控,监控表对应的seq值变化情况,表gmt_create,gmt_modified等字段最大值变化情况
e) 步骤a、b实施后,如表有依赖对象,先将依赖对象进行提变更将表进行重命名,请开发配合监控应用一周以上.
f) 通知平台的人,需要配合停起otter,修改表同步配置。
2. 执行过程
1
2
2.1 表重命名步骤:
a) 先备份依赖对象的脚本:
备份存储过程脚本:
使用@source取出脚本
视图备份:
select text from dba_views where owner=’视图的owner’ and view_name=’视图名字’;
物化视图备份:
select dba_mviews from dba_mviews where owner=’物化视图的owner’ and mview_name=’物化视图名字’;
同义词备份:
select ‘create synonym ‘ || owner || ‘.’ || synonym_name || ‘ for ‘ || table_owner || ‘.’ || table_name || ‘;’ from dba_synonyms
where table_owner = ’schema名字‘ and table_name = ‘表名‘;
b) 根据上面备份的脚本,修改其中表名为新名字,整理存储过程、视图、物化视图重建脚本,触发器、同义词重编译脚本
c) 从erosa配置中去掉该表并重启erosa,监控otter同步队列,等待该表的变更消费完毕
d) 重命名表:表名前加上schema以防止误操作
@conn schema/passwd
先删除步骤a 查到的依赖对象:
drop synonym 同义词; –这个需要到同义词的owner下执行
drop procedure 存储过程名;
drop view 视图名;
drop materialized view 物化视图名;
drop package body 包名;
drop package包名;
drop trigger 触发器;
–有通过dblink依赖表的关联库上也需要执行以上操作
Alter table schema.表名 rename to 新表名;
@dbcheck –检查失效对象
2.2 删除表步骤
a) 从erosa、otter配置中去掉该表的同步
b) 导出该表进行备份,导出文件保留两周
导数参数文件:
cat exp.par
direct=y
grants=y
indexes=y
triggers=y
constraint=y
tables=(表名)
log=exp_表名_日期.log
file=exp_表名_日期.dmp
执行导出:
exp userid=schema/passwd parfile=exp.par
注:如果该表比较大,由于os限制,一个dmp文件可能无法存放所有数据,可以修改上面的参数文件:
cat exp.par
direct=y
grants=y
indexes=y
triggers=y
constraint=y
tables=(新表名)
log=exp_表名_日期.log
filesize=xxxxm –这里指定文件大小,比os限制小点
file=exp_表名_日期_01.dmp, exp_表名_日期_02.dmp,…. –这里用多个文件
c) 删除表
drop table 新表名;
3. 验证方案
a) 在表所在库及其dblink关联库检查失效对象
b) 检查erosa、otter配置
c) 通知开发检查应用
五、 核心对象风险
对于核心表,关联的应用比其他表要多,风险主要在排查应用上,一般情况下核心表极少有删除需求。
六、 回退方案
上面删除表的过程中,回退可能出现在两个地方:
1. 表重命名的回退:
a) 恢复原表名:
@conn schema/passwd
alter schema 新表名 rename to 旧表名表名;
重编译触发器、同义词等
使用备份脚本重建依赖对象(存储过程、视图、物化视图等)
@dbcheck –检查失效对象
b) 根据应用需求配置数据同步
c) 通知开发检查应用
2. 表删除的回退:
a) 导入备份数据:
cat imp.par:
ignore=n
grants=y
indexes=y
constraint=y
commit=y
tables=(表名)
log=imp_表名_日期.log
file=exp_表名_日期.dmp
imp userid=schema/password parfile=imp.par
b) 恢复原表名
@conn schema/passwd
alter table 新表名 rename to 旧表名;
重编译触发器等
使用备份脚本重建依赖对象(存储过程、视图、物化视图、同义词等)
@dbcheck –检查失效对象
c) 根据应用需求配置数据同步
d) 通知开发检查应用
七、 历史故障及教训
无。