社区
Oracle
帖子详情
急!急!]为什么在pl/sql中使用desc tablename命令不好使?弹出错误提示"ORA-01460:未实现或无理的转换请求"??
shgciom
2003-04-04 03:39:10
如题!谢谢!
...全文
250
7
打赏
收藏
急!急!]为什么在pl/sql中使用desc tablename命令不好使?弹出错误提示"ORA-01460:未实现或无理的转换请求"??
如题!谢谢!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xu_guanghui
2003-04-04
打赏
举报
回复
在PL/SQL 的COMMAND WINDOWS 下是可以用的
是不是你的PL/SQL 版本有什么问题
nicholaz
2003-04-04
打赏
举报
回复
不能用在pl/sql中
chfhy
2003-04-04
打赏
举报
回复
不是服务器配置的问题,就是不能用在pl/sql里面,可用 select column_name,data_type,data_length from all_tab_columns where table_name = 'TABLENAME'代替
shgciom
2003-04-04
打赏
举报
回复
以前好像用pl/sql连到一台服务器上用过这个命令!
是不是服务器配置的问题?
shgciom
2003-04-04
打赏
举报
回复
那为何能使用desc procname呢?
chfhy
2003-04-04
打赏
举报
回复
这是sql*plus里面的命令,不能用在pl/sql里面。
bzszp
2003-04-04
打赏
举报
回复
这是sql*plus里面的命令
不是pl/sql里面的
ora
cle恢复工具-FY_Recover_Data
不小心Truncate表的事情也是有的, 其
中
大部份时因为工具连错了库, 从儿跑错了角本. 遇到这种事情而没有备份时怎么办呢? 首先要停止数据库, 将这个表所在的表空间的文件拷贝出来, 因为
Ora
cle在Truncate只时将相应Segment的第一个块格式化掉了, 而后面的都还存在, 到下次用时到才真正地重新格式化. 下面来讲一个Truncate表后进行恢复的例子:
SQL
> CREATE
TABLE
T_TRUNCATE AS SELECT * FROM TAB;
Table
created.
SQL
> SELECT COUNT(*) FROM T_TRUNCATE; COUNT(*) ---------- 14
SQL
> ALTER SYSTEM CHECKPOINT; System altered.
SQL
> TRUNCATE
TABLE
T_TRUNCATE;
Table
truncated.
SQL
> ALTER SYSTEM CHECKPOINT; System altered. 在Truncate时只是Segment Header格式化了, 并将Data Object ID换成一个新的值, 我们可以在AUL
中
用
DES
C
命令
来查看: AUL>
des
c any
sql
.t_truncate St
ora
ge(OBJ#=9976 OBJD=9977 TS=4 FILE=4 BLOCK=5235 CLUSTER=0) No. SEQ INT Column Name Type --- --- --- ----------------------------- ---------------- 1 1 1 TNAME VARCHAR2(30) NOT NULL 2 2 2 TABTYPE VARCHAR2(7) 3 3 3 CLUSTERID NUMBER 要恢复这个表的数据, 首先要在AUL
中
运行SCAN EXTENT
命令
, 因为Segment Header被格式化了, 所以Extent Map也可能丢失, 而Scan Extent则将扫描整个数据文件并将Extent分配信息写入AULEXT.TXT文件: AUL> SCAN EXTENT FILE 4 2006-12-18 21:32:10 2006-12-18 21:32:24 恢复的关键是要获得这个表原来的Data Object ID, 在这个例子
中
我在Truncate表后什么也没有做就关闭数据库进行恢复了. 从上面的
DES
C
命令
可以看出表的Segment Header是(4,5235), 而新的Data Object ID是9977, 老的Data Object ID我们可以从Segment Header的后面一个数据块
中
得到, 如果这个表有几个Free List Group, 则可能还要再后面几个块. 用AUL的
ORA
DUMP
命令
来看一下后面一个块: AUL>
ORA
DUMP FILE 4 BLOCK 5236 RDBA=0x01001474(4/5236)=16782452,type=0x06,fmt=0xa2,seq=0x02,flag=0x04 seg/obj=0x000026f8=9976,csc=0x0000.0006caf5,itc=3,typ=1 - DATA FLG=0x32, fls=0, nxt=0x01001471(4/5233)=16782449 ...... 可以看到原来的Data Object ID是9976, 现在可以恢复了, 先不指定原来的Data Object ID试试? AUL> unload
table
any
sql
.t_truncate; 2006-12-18 21:33:37 Unload OBJD=9977 FILE=4 BLOCK=5235 CLUSTER=0 ... 2006-12-18 21:33:37 接下来指定原来的Data Object ID, 再试试? AUL> unload
table
any
sql
.t_truncate object 9976; 2006-12-18 21:33:45 Unload OBJD=9976 FILE=4 BLOCK=5235 CLUSTER=0 ... P_MV_FACT_SALES|
TABLE
TIME_DIM|
TABLE
FACT_SALES|
TABLE
MV_FACT_SALES|
TABLE
SEG$|
TABLE
NUMTEST|
TABLE
T_OBJECTS|
TABLE
T_LOBTEST|
TABLE
T_INCLOB|
TABLE
CF_XXK|
TABLE
T_TESTDMP|
TABLE
T_CLOBDEMO|
TABLE
T_BLOBDEMO|
TABLE
T_TRUNCATE|
TABLE
2006-12-18 21:33:45 可以看到14条数据全回来了, 当然数据库是复杂的, 如果是一个很大的表, 还是不能保证可以100%恢复的. 最近至少看到二次
错误
地截断(Truncate)表的例子, 并在网上询问如何恢复, 在这儿我给出AUL/MyDUL的解决方案, 下面是我用的一个测试表: A
SQL
>
DES
C TRUNCDEMO NO# NAME NULLABLE TYPE --- ----------------- -------- ------------ 1 COL1 VARCHAR2(20) A
SQL
> SELECT * FROM TRUNCDEMO; COL1 ----- ROW 1 ROW 2 2 rows returned. 接下来我们来截断表, 其实这个操作只是重新格式化了段头块(Segment Header), 并分配一个新的数据对象号(Data Object ID), 当然空间分配信息也改了, 除非加了重用空间选项(Reuse St
ora
ge). 来看一下这个操作的前后变化: A
SQL
> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS; DATA_OBJECT_ID OBJECT_NAME -------------- ----------- 13676 TRUNCDEMO 1 rows returned. A
SQL
> truncate
table
truncdemo; Truncate
Table
Succeed. A
SQL
> SELECT DATA_OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS; DATA_OBJECT_ID OBJECT_NAME -------------- ----------- 13677 TRUNCDEMO 1 rows returned. 由于在System表空间
中
已经记录了新的信息, 因此用当前的System信息是不能恢复过来的,在AUL/MyDUL
中
可以当作没有System时的情况来处理,在下面的
命令
中
, 我们用Truncate后的数据对象号就不能进行恢复, 而
使用
Truncate以前的就可以, 当然空间不能被重新利用了是恢复的前提. AUL> unload object 13676 column varchar file 4; 2006-09-18 22:38:58 ROW 1 ROW 2 2006-09-18 22:39:04 AUL> unload object 13677 column varchar file 4; 2006-09-18 22:39:10 2006-09-18 22:39:10 AUL> 因此在意外发生Truncate后, 如果没有备份可以恢复, 首先要做的事是备份一下当前的文件, 免得空间被重用. 而Truncate之前的数据对象号在AUL/MyDUL
中
是很容易找出来的. 到此已经说明了如何恢复Truncate表了. 跟据原理可以创建一个恢复包Recover_Truncate_Data,然后我们可以做个实验进行验证恢复效果如何: 第一步:创建表 create
table
truntab1 as select * from dba_objects; 第二步:查询表
中
记录数 select count(*) from truntab1; --72622 第三步:truncate表
中
业务数据 truncate
table
truntab1; 第四步:确认表
中
记录数为零 select count(*) from truntab1; -- 0 第五步:设置恢复前环境变量 set serveroutput on size 10000000 --//设置大点,默认为2000 bytes exec dbms_output.enable(999999999999999999999); --//默认为2000 bytes 注意:如果不不进行设置,为报
PL
SQL
ORA
-20000: ORU-10027: buffer overflow, limit of 10000 第六步:实施truncate表
中
数据恢复 declare tgtowner varchar2(30); tgt
table
varchar2(30); datapath varchar2(4000); datadir varchar2(30); rects varchar2(30); recfile varchar2(30); rstts varchar2(30); rstfile varchar2(30); blksz number; rectab varchar2(30); rsttab varchar2(30); copyfile varchar2(30); begin tgtowner := 'SYS'; --指定表名的属用户 tgt
table
:= 'TRUNTAB1'; --指定需要恢复的表名 datapath := 'D:\app\Administrator\
ora
data\lmis\'; --数据文件所在位置 datadir := 'FY_DATA_DIR'; Recover_Truncate_data.prepare_files(tgtowner, tgt
table
, datapath, datadir, rects, recfile, rstts, rstfile, blksz); Recover_Truncate_data.fill_blocks(tgtowner, tgt
table
, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile); Recover_Truncate_data.recover_
table
(tgtowner, tgt
table
, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz); end; 第七步:查看输出内容和构造表名: 15:32:44: Directory Name: FY_DATA_DIR4 15:32:45: Recover
Table
space: FY_REC_DATA4; Data File: FY_REC_DATA4.DAT 15:32:46: Restore
Table
space: FY_RST_DATA4; Data File: FY_RST_DATA4.DAT 15:32:48: Recover
Table
: SYS.TRUNTAB1$2 15:32:48: Restore
Table
: SYS.TRUNTAB1$$2 15:33:04: [fill_blocks] Data Blocks formatted. 15:33:05: [copy_file] begin copy file: FY_DATA_DIR4\FY_REC_DATA4.DAT => FY_DATA_DIR4\FY_REC_DATA_COPY.DAT 15:33:05: [copy_file] com
pl
eted. 15:33:05: Copy file of Recover
Table
space: FY_REC_DATA_COPY.DAT 15:33:05: begin to recover
table
SYS.TRUNTAB1 15:33:19: [restore_
table
] Trying to restore data to SYS.TRUNTAB1$$2 15:33:20: [restore_
table
] Expected Records in this round: 411 15:33:20: [restore_
table
] 411 records recovered 此处省略N行输出............................................ 15:33:44: [restore_
table
] Expected Records in this round: 0 15:33:44: [restore_
table
] 0 records recovered 15:33:44: 1033 truncated data blocks found. 15:33:44: 72622 records recovered in backup
table
SYS.TRUNTAB1$$2 15:33:44: Recovery com
pl
eted.
PL
/
SQL
procedure successfully com
pl
eted 从红色字体可以看出,恢复72622条,刚好是truncate前业务表
中
记录数,恢复临时表为:SYS.TRUNTAB1$$2 第七步:查看输出内容和构造表名: insert into truntab1 select * from SYS.TRUNTAB1$$2 第八步:验证数据是否完全恢复 select count(*) from truntab1; --72622 至此,truncate掉的数据成功恢复,并且此方法也可以恢复drop
table
table
name purge删除的数据, 第九步:清理恢复产生的表空间和数据文件 特别提醒:恢复完成后,该方法会在数据库
中
产生一个表空间:FY_RST_DATA*,恢复一次产生一个,记得及时清理!否则会导致服务器RMAN备份失败
ORA
-19566 超出损坏块限制(切记) truncate原理: ? ? ? ?TRUNCATE不会逐个清除用户数据块上的数据,而仅仅重置数据字典和元数据块上的元数据(如存储段头和扩展段图)。也就是说,此时,其基本数据并
未
被破坏,而是被系统回收、等待被重新分配————因此,要恢复被TRUNCATE的数据,需要及时备份其所在的数据文件。 ? ? 方法:用存储过程包Fy_Recover_Data ? ? 它是利用
Ora
cle表扫描机制、数据嫁接机制恢复TRUNCATE或者损坏数据的工具包,这个包是由行内有影响力的DBA大师黄炜先生通过
PL
SQL
编写的,再这里再次感谢他的无私技术分享。Fy_Recover_Data去本文附近
中
下载 好了,闲话少说,下面通过
ora
cle数据库
中
scott用户自带的emp表做测试: 步骤1:先把Fy_Recover_Data包拷贝到
ora
cle相关目录下 步骤2:在scott用户下创建test_emp表:
SQL
> conn scott/tiger; Connected.
SQL
> select * from tab; TNAME ? ? ? TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS ? ? ?
TABLE
DEPT ? ? ?
TABLE
EMP ? ? ? ? ? ? ? ?
TABLE
SALGRADE ? ? ?
TABLE
SQL
> select count(*) from emp; ? COUNT(*) ---------- 14
SQL
> create
table
test_emp ?as select * from emp;
Table
created.
SQL
> select count(*) from test_emp; ? COUNT(*) ---------- 14 步骤3:用truncate删除test_emp表:
SQL
> truncate
table
test_emp;
Table
truncated.
SQL
> select count(*) from test_emp; ? COUNT(*) ---------- 0 步骤4:在linux
中
的
ora
cle用户下解压FY_Recover_Data.zip包 $ unzip FY_Recover_Data.zip Archive: ?FY_Recover_Data.zip ? inflating: FY_Recover_Data.
SQL
? 步骤5:恢复 1)在sys用户下执行存储过程
SQL
> @/home/
ora
cle/FY_Recover_Data.
SQL
Package created. Package body created. 2)查看test_emp表在数据文件
中
的目录
SQL
> select file_name from dba_data_files f, dba_
table
s t where t.owner='SCOTT' and t.
table
_name='TEST_EMP' and t.
table
space_name = f.
table
space_name; FILE_NAME -------------------------------------------------------------------------------- /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf 3)通过脚本恢复,可以用
sql
pl
us
命令
行或者
pl
sql
developer执行 declare ? ? ? tgtowner varchar2(30); ? ? ? tgt
table
varchar2(30); ? ? ? datapath varchar2(4000); ? ? ? datadir varchar2(30); ? ? ? rects varchar2(30); ? ? ? recfile varchar2(30); ? ? ? rstts varchar2(30); ? ? ? rstfile varchar2(30); ? ? ?blksz number; ? ? ?rectab varchar2(30); ? ? ?rsttab varchar2(30); ? ? ?copyfile varchar2(30); ? ?begin ? ? ?tgtowner := 'SCOTT'; --
table
owner ? ? ?tgt
table
:= 'TEST_EMP'; ?--
table
name ? ? ?datapath := '/u03/
ora
cle/
ora
data/WUTONG/datafile/'; ? ?--必须和test.t1表所在的数据文件的目录相同 ? ? ?datadir := 'FY_DATA_DIR'; ? ? ? ?--
ora
cle
中
目录的名字,可以修改 ? ? ?Fy_Recover_data.prepare_files(tgtowner, tgt
table
, datapath, datadir, rects, recfile, rstts, rstfile, blksz); ? ? ?Fy_Recover_data.fill_blocks(tgtowner, tgt
table
, datadir, rects, recfile, rstts, 8, tgtowner, tgtowner, rectab, rsttab, copyfile); ? ? ?Fy_Recover_data.recover_
table
(tgtowner, tgt
table
, tgtowner, rectab, tgtowner, rsttab, datadir, datadir, recfile,datadir, copyfile, blksz); ? ?end; ? ?以上
SQL
脚本产生2个表空间(2个数据文件),还有1个copy文件。 4)切换到scott用户下查看会发现多了些不一样以test_emp的表,这时找到相关有数据的表,把数据插入原表test_emp
SQL
> conn scott/tiger Connected.
SQL
> select * from tab; TNAME ? ? ? TABTYPE CLUSTERID ------------------------------ ------- ---------- BONUS ? ? ?
TABLE
DEPT ? ? ?
TABLE
EMP ? ? ?
TABLE
SALGRADE ? ? ?
TABLE
TEST_EMP ? ? ?
TABLE
TEST_EMP$ ? ? ?
TABLE
TEST_EMP$$ ? ? ?
TABLE
7 rows selected.
SQL
> insert into test_emp select * from TEST_EMP$$; 14 rows created.
SQL
> commit; Commit com
pl
ete.
SQL
> select count(*) from test_emp; ? COUNT(*) ---------- 14 当你看到这一步的时候,说明truncate的表已经完全恢复了,恭喜你数据恢复成功!紧张的压力随之而释放,脸上露出灿烂的笑容和自豪感(做DBA很辛苦,数据库能保持正常运行,DBA在幕后做了大量的工作,有时是不会不被公司其他人理解的。。。。。) 步骤6:恢复数据后,把恢复时产生的2个表空间删除,再删除对应数据文件
SQL
> conn / as sysdba Connected.
SQL
> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/FY_REC_DATA.DAT /u03/
ora
cle/
ora
data/WUTONG/datafile/FY_RST_DATA.DAT 7 rows selected.
SQL
>?drop
table
space FY_REC_DATA INCLUDING CONTENTS;
Table
space dropped.
SQL
>?drop
table
space FY_RST_DATA INCLUDING CONTENTS;
Table
space dropped.
SQL
> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_system_cx3xt90z_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_sysaux_cx3xt930_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_undotbs1_cx3xt93b_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_users_cx3xt940_.dbf /u03/
ora
cle/
ora
data/WUTONG/datafile/o1_mf_wutong_cx415lcj_.dbf 然后去操作系统下把对应的数据文件删除即可 ---------------------
Ora
cle
SQL
Hand-
Ora
cle工具 v5.1.zip
Ora
cle
SQL
Hand-
Ora
cle工具,是专为
Ora
cle数据库开发人员及操作人员精心打造的一款
Ora
cle开发工具(客户端工具)。
Ora
cle
SQL
Hand-
Ora
cle工具特点如下: (1) 跨平台,能运行于平台 Windows(WIN7,XP...)、Linux 、Mac OS; (2) 不需要安装
Ora
cle客户端,解压即用,通过提供的JDBC直接连接服务器; (3) 超智能的
SQL
编辑器,具有代码跟踪
提示
功能,
弹出
提示
窗口列出关键字、关键字组合、函数名、列名、对象名、对象类型等,极大地提高
SQL
编辑效率; (4) 超方便实用的工作表用来显示和操作SELECT语句的查询结果,象操作Excel表格一样方便地选择行/列/单元格数据,可以将工作表的数据修改写入数据库表。另外,工作表还有单条记录操作、多功能拷贝、数值统计、查找替换等实用功能; (5) 能方便导出 XLS、CSV、INSERT Statement、HTML、XML等多种格式数据; (6) 方便操作常用数据字典如表、视图、索引、过程、函数、触发器等(能显示和编辑编译
PL
/
SQL
代码); (7)
中
英文双语界面并能随时切换,个性化界面设置,界面简洁清爽; (8) 运行语句“
DES
C
table
Name”清晰地显示表的所有逻辑结构信息,包括列信息、所有约束、索引、子表及触发器等; (9) 运行语句“SCHEMA objectName”显示表或视图的DDL源码; (10) 以缩进的阶梯格式清晰地显示
SQL
的解释计划; (11) 能运行和调试
PL
/
SQL
语句,能精确定位到
错误
所在的行列位置; (12)
SQL
格式美化,将杂乱的语句美化成缩进的美观格式; (13) 多线程多连接,会话在运行
中
可以
中
断,或编辑,或创建新会话; (14) 监控批量
SQL
语句的运行,在运行
中
可暂停、更正等; (15) 连接配置简单,自动重新连接; (16) 占用系统资源极少,启动快,连接快,运行快; (17) 高效的语句块操作,高亮显示配对括号; (18) 功能实用,操作简便; 鼠标双击批处理文件 start.bat 即可启动运行
ora
cle简单的操作
一些
ora
cle的简单操作,上选修课总结的,希望对大家有所帮助
ora
cle基础练习
ora
cle基础练习,最基础的东西,掌握住了就入门了
Ora
cle学习笔记
ora
cle 学习笔记,学习总结,学习用
Oracle
17,140
社区成员
55,259
社区内容
发帖
与我相关
我的任务
Oracle
Oracle开发相关技术讨论
复制链接
扫一扫
分享
社区描述
Oracle开发相关技术讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章