oracle中假如碰到表损坏,而没有rman备份可以恢复,或者碰到不明原因的bug,需要重建表测试,如何重建表?
1.用plsql工具把表的SQL创建语句导出来,
2.用sqlplus 账套名/passwd 登录
/*
drop table table_name;
drop table table_name_bak;
create table table_name(a int primary key,b int );
insert into table_name values(1,1);
commit;
*/
--假定table_name是我们要重建的表,
3. 获取表的创建语句,这步也可以用sqldeveloper, pl/sql developer, TOAD等工具,通过图形界面取得
SET SERVEROUTPUT ON
SET LINESIZE 1000
SET FEEDBACK OFF
set long 999999
SET PAGESIZE 1000
--上面 set 这五句在sqldeveloper, pl/sql developer, TOAD等工具中则不必执行
DECLARE
BEGIN
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
END;
/
--除去多余的参数
SELECT DBMS_METADATA.GET_DDL('TABLE','TABLE_NAME') FROM DUAL;
--取表创建语句
得到类似以下语句,把语句复制出来,将会在第6步用到
-- CREATE TABLE "LUO"."TABLE_NAME"
-- ( "A" NUMBER(*,0),
-- "B" NUMBER(*,0),
-- PRIMARY KEY ("A")
-- USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
-- TABLESPACE "USERS" ENABLE
-- ) SEGMENT CREATION IMMEDIATE
-- PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
-- NOCOMPRESS LOGGING
-- TABLESPACE "USERS"
4.执行下面语句,得到重命名索引的执行语句,使索引用回原来的名字,把结果复制出来
select 'ALTER INDEX '||index_name||' rename to '||index_name||'_BAK;' from user_indexes where table_name='TABLE_NAME';
--ALTER INDEX SYS_C0011753 rename to SYS_C0011753_BAK;
5.重命名表,必须使用账套名登录,注意不能以sysdba,sysem登录
rename TABLE_NAME to TABLE_NAME_BAK;
6.创建与原来名称相同的空表,注意:这步脚本来自3步的结果
CREATE TABLE "LUO"."TABLE_NAME"
( "A" NUMBER(*,0),
"B" NUMBER(*,0),
PRIMARY KEY ("A")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE "USERS" ENABLE
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
TABLESPACE "USERS"
7.把原来备份的表的数据还原新创建的表
insert into TABLE_NAME select * from TABLE_NAME_BAK;
commit;
8.确认数据已经插入进去
select count(*) from table_name;
oracle中假如碰到表损坏,而没有rman备份可以恢复,或者碰到不明原因的bug,需要重建表测试,如何重建表?
本文2024-09-22 20:22:24发表“eas cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-eas-113210.html