Oracle入门(十二H)之设置、恢复和删除不可用列

转载自 Oracle设置和删除不可用列

一、不可用列的定义

1、不可用列是什么?

就是表中的1个或多个列被ALTER TABLE…SET UNUSED 语句设置为无法再被程序利用的列。

2、使用场景? 
If you are concerned about the length of time it could take to drop column data from 
all of the rows in a large table, you can use the ALTER TABLE…SET UNUSED statement.

如果你担心从一个大表中删除一列可能花费大量时间,你可以使用ALTER TABLE…SET UNUSED语句。

如果你有这个需求,要删除某一个读写频繁的大表上的某些列, 
如果你在业务繁忙时间直接执行 ALTER TABLE ABC DROP (COLUMN); 
可能会收到 ORA-01562 - failed to extend rollback segment number string, 
这是因为在这个删除列的过程中你可能会可能消耗掉整个回滚表空间,造成这样的错误出现。

3、使用理由(原理和优势)? 
3.1 设置不可用列 
This statement marks one or more columns as unused, but does not actually remove 
the target column data or restore the disk space occupied by these columns。 
a column that is marked as unused is not displayed in queries or data dictionary 
views, and its name is removed so that a new column can reuse that name.

该语句可将一个或多个列标识为不可用,但实际上并不是移除了列数据或回收了这些列占用的空间。 
一个不可用列不会在查询或数据字典视图中显示, 其列名被删除以至于新增的列可以重用其列名。

In most cases, constraints, indexes, and statistics defined on the column are also removed. 
在多数情况下,列上的约束,索引,和统计信息也被移除。

The exception is that any internal indexes for LOB columns that are marked unused are not removed. 
例外情况是被标识为不可用的LOB列的内部索引不会被移除。


二、 删除不可用列 

ALTER TABLE…DROP UNUSED COLUMNS 语句仅针对不可用列,用于正式删除被标识为不可用的列(物理上删除列同时回收被占用的空间)。

In the ALTER TABLE statement that follows, the optional clause CHECKPOINT is specified. 
This clause causes a checkpoint to be applied after processing the specified number of 
rows, in this case 250. Checkpointing cuts down on the amount of undo logs 
accumulated during the drop column operation to avoid a potential exhaustion of 
undo space.

在接下来的ALTER TABLE语句中个,指定了可选条件 CHECKPOINT。 
这个条件将在处理过程达到指定行数时触发一个检查点,此处为250. 检查点削减了在删除列操作中累积的undo logs的数量, 
从而避免潜在的undo空间耗尽。

ALTER TABLE hr.admin_emp DROP UNUSED COLUMNS CHECKPOINT 250;

4、使用限制? 
1)无法删除属于 SYS 的表中的列 
2)

5、语法结构? 
ALTER TABLE…SET UNUSED(C1,C2..) 
ALTER TABLE…DROP UNUSED COLUMNS

例如: 
ALTER TABLE hr.admin_emp SET UNUSED (hiredate, mgr); 
ALTER TABLE hr.admin_emp DROP UNUSED COLUMNS;

5、数据字典 
USER_UNUSED_COL_TABS 
ALL_UNUSED_COL_TABS 

DBA_UNUSED_COL_TABS

SELECT * FROM DBA_UNUSED_COL_TABS;
OWNER TABLE_NAME COUNT
--------------------------- --------------------------- -----
HR ADMIN_EMP 2

–count列代表不可用列数量

6、使用案例?

SCOTT@orcl> create table tmp_all_objects2  AS3  SELECT object_id, object_name4  from dba_objects5  ;表已创建。

SYS@orcl> exec show_space('TMP_ALL_OBJECTS','SCOTT');
Unformatted Blocks  ....................               0
FS1 Blocks (0-25)   ....................               0
FS2 Blocks (25-50)  ....................               0
FS3 Blocks (50-75)  ....................               0
FS4 Blocks (75-100) ....................               0
Full Blocks         ....................             352
Total Blocks ...........................             384
Total Bytes  ...........................       3,145,728
Total MBytes ...........................               3
Unused Blocks...........................              18
Unused Bytes ...........................         147,456
Last Used Ext FileId....................               4
Last Used Ext BlockId...................          14,592
Last Used Block.........................             110PL/SQL 过程已成功完成。SYS@orcl> DESC DBA_UNUSED_COL_TABS名称                                     是否为空? 类型---------------------------------------- -------- ---------------------------OWNER                                    NOT NULL VARCHAR2(30)TABLE_NAME                               NOT NULL VARCHAR2(30)COUNT                                             NUMBERSYS@orcl> SELECT * FROM DBA_UNUSED_COL_TABS;未选定行SCOTT@orcl> ALTER TABLE TMP_ALL_OBJECTS SET UNUSED(OBJECT_NAME);表已更改。SYS@orcl> SELECT * FROM DBA_UNUSED_COL_TABS;OWNER                          TABLE_NAME                          COUNT
------------------------------ ------------------------------ ----------
SCOTT                          TMP_ALL_OBJECTS                         1SYS@orcl> exec show_space('TMP_ALL_OBJECTS','SCOTT');
Unformatted Blocks  ....................               0
FS1 Blocks (0-25)   ....................               0
FS2 Blocks (25-50)  ....................               0
FS3 Blocks (50-75)  ....................               0
FS4 Blocks (75-100) ....................               0
Full Blocks         ....................             352
Total Blocks ...........................             384
Total Bytes  ...........................       3,145,728
Total MBytes ...........................               3
Unused Blocks...........................              18
Unused Bytes ...........................         147,456
Last Used Ext FileId....................               4
Last Used Ext BlockId...................          14,592
Last Used Block.........................             110PL/SQL 过程已成功完成。--删除不可用列
SCOTT@orcl> ALTER TABLE TMP_ALL_OBJECTS DROP UNUSED COLUMNS CHECKPOINT 250;表已更改。SYS@orcl> SELECT * FROM DBA_UNUSED_COL_TABS;未选定行SYS@orcl> exec show_space('TMP_ALL_OBJECTS','SCOTT');
Unformatted Blocks  ....................               0
FS1 Blocks (0-25)   ....................               0
FS2 Blocks (25-50)  ....................               1
FS3 Blocks (50-75)  ....................             350
FS4 Blocks (75-100) ....................               1
Full Blocks         ....................               0
Total Blocks ...........................             384
Total Bytes  ...........................       3,145,728
Total MBytes ...........................               3
Unused Blocks...........................              18
Unused Bytes ...........................         147,456
Last Used Ext FileId....................               4
Last Used Ext BlockId...................          14,592
Last Used Block.........................             110PL/SQL 过程已成功完成。--move操作,减少碎片
SCOTT@orcl> ALTER TABLE TMP_ALL_OBJECTS MOVE;表已更改。SYS@orcl> exec show_space('TMP_ALL_OBJECTS','SCOTT');
Unformatted Blocks  ....................               0
FS1 Blocks (0-25)   ....................               0
FS2 Blocks (25-50)  ....................               0
FS3 Blocks (50-75)  ....................               0
FS4 Blocks (75-100) ....................               0
Full Blocks         ....................             113
Total Blocks ...........................             128
Total Bytes  ...........................       1,048,576
Total MBytes ...........................               1
Unused Blocks...........................               5
Unused Bytes ...........................          40,960
Last Used Ext FileId....................               4
Last Used Ext BlockId...................          14,808
Last Used Block.........................               3PL/SQL 过程已成功完成。--可以看到总块数下降--删除测试表
SCOTT@orcl> drop table TMP_ALL_OBJECTS;表已删除。

三、关于不可用列的恢复(以下摘自网络) 

刚才有个人问我如何修复被设置为UNUSED的字段,我考虑了一下,以下的方法可以恢复(以下步骤执行前要做好备份),没有经验的DBA不要轻易尝试。

1、创建实验表TTTA

SQL> CREATE TABLE TTTA ( A INTEGER,B INTEGER,C VARCHAR2(10),D INTEGER);
表已创建。
SQL> INSERT INTO TTTA VALUES (1,2,'3',4);
已创建 1 行。
SQL> INSERT INTO TTTA VALUES (2,3,'4',5);
已创建 1 行。
SQL> COMMIT;
提交完成。
ALTER TABLE TTTA SET UNUSED COLUMN C;

2、以下进行恢复

SQL> SELECT OBJ# FROM OBJ$ WHERE NAME='TTTA';OBJ#
----------32067
SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=32067;COL#    INTCOL# NAME
---------- ---------- ------------------------------1          1 A2          2 B0          3 SYS_C00003_08031720:09:55$   被UNUSED的字段3          4 D
SQL> SELECT COLS FROM TAB$ WHERE OBJ#=32067;COLS
----------3      ------字段数变为3了SQL> UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=32067;
已更新4行。
SQL> UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=32067;
已更新 1 行。
UPDATE COL$ SET NAME='C' WHERE OBJ#=32067 AND COL#=3;
UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=32067;
SQL> COMMIT;

3、重启数据库

SQL> SELECT * FROM SCOTT.TTTA;A          B C                   D
---------- ---------- ---------- ----------1          2 3                   42          3 4                   5

恢复完成


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9.内核级线程代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 【说明】 本文中提到的父线程可以理解为父进程因为进程包括运行资源和执行指令,又执行指令表示为线程,所以也可以说 进程包括…

python 列表生成表格_【转】Python 列表生成式

原文:https://blog.csdn.net/heartyhu/article/details/509880071. 生成列表要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11):>>> range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]但如果要生成[1x1, 2x2, 3x3, ……

Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi(跨平台)

1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有了很多这方面的文章,故而我就想我是写还是不…

10.操作系统演进过程

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》的《操作系统的那棵树》,内容非常棒,墙裂推荐; 2.思维僵化与发散 the mind is not a vessel that needs filing, but wood that needs igniting. 头脑不是需要归档的容器&am…

Oracle入门(十二I)之误删除数据的恢复方法

转载自 oracle误删除数据的恢复方法今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)删除表中数据有三种方法:delete(删除一条记录)drop或truncate删除表格中数…

Oracle入门(七A)之表空间配额(quota)

转载自 oracle表空间配额(quota)一、quota相关视图 1)dba_ts_quotas(查看所有用户的表空间配额) BYTES字段表示用户已经使用的空间;MAX_BYTES如果为-1表示没有限制,其他值表示限制配额 --只有用alter user user_name quota on tab…

python嵌套列表字典_python中嵌套列表转为字典

题目:# 有一组用例数据如下:cases [[case_id, case_title, url, data, excepted],[1, 用例1, www.baudi.com, 001, ok],[4, 用例4, www.baudi.com, 002, ok],[2, 用例2, www.baudi.com, 002, ok],[3, 用例3, www.baudi.com, 002, ok],[5, 用例5, www.ba…

.NET之全平台一体化的体验

一、前言 近来利用空闲时间研究了一下Xamarin的技术,想想既然提供了如此好的支持,就该尝试一切可能,来一个”大小通吃“。 何为全平台:APP包括Android、IOS、WP,WEB可在Window和Linux部署运行(进可攻,退可守…

11.cpu调度策略与schedule调度函数

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.cpu调度: 指的是 cpu从就绪队列中选择一个进程来执行;选择哪一个进程是调度算法的执行结果; 3. 相关定义&…

Oracle入门(十二)之SQL的DDL

一、数据类型 Character 数据类型Number 数据类型Date 数据类型Raw 和 Long Raw 数据类型 LOB 数据类型 注:Oracle数据类型详解二、表 (1)创建表 create table emp ( emp_id char (10) primary key, emp_name varchar2 (30), sal number (…

2016微软开发者峰会在京举办 纳德拉要来做演讲

还有不到一个月的时间,2016 微软开发者峰会就要在北京举办了。 在这场开发者的盛会上,微软 CEO、技术牛人,还有来自微软亚洲研究院、亚太研发集团、Xamarin 团队以及微软中国开发体验的专家们将对各平台的开发进行技术探讨。 据了解&#xff…

centos 卸载ffmpeg_Linux下ffmpeg的完整安装

最近在做一个企业项目, 期间需要将用户上传的视频转成flv格式或mp4格式并用flash插件在前端播放, 我决定采用ffmpeg (http://www.ffmpeg.org/ )实现. 当然以前也用过ffmpeg, 但是没有安装额外的库, 只是源代码下简单地 ./configure, 最后发现好多功能都用不了, 比如最流行的x26…

1.概率论-组合分析

【README】 本文总结自《概率论基础教程》 by M.Ross ,墙裂推荐; 【1.3】排列(考虑顺序) 1)例3d: 用6个字母 PEPPER排列,共有多少种不同的排列方式? 2)推理 对于n个元素,如果其中n1个元素相同,其他n2个元素相同,......,nr个元素也相同,一共有 种不同排列方式;…

Oracle入门(十二B)之表创建

一、创建表(1)简单表 Create Table emp (Emp_id char(10) primary key,Emp_name varchar2(30),Sal number(5),Tel varchar2(20) ); (2)带参数的表格创建 create table emp (emp_id char (10) primary key,emp_name varchar2 (30),…

我的创作纪念日:感恩、感谢、感激!

/bin/bash 机缘 感恩、感谢、感激! 第一次进入到csdn,还是当初老师傅叫我们可以借鉴一下这里的文章 所以! 一开始进入到csdn网站,还以为这里也是和某些贴吧一样,一样的灌水呢! 但是正式在这里书写文章之后&#…

python中seaborn画swarm图_Python可视化 | Seaborn5分钟入门(四)——stripplot和swarmplot

微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易&#xf…

第四篇 Entity Framework Plus 之 Batch Operations

用 Entity Framework 进行 增,删,改。都是基于Model进行的,且Model都是有状态追踪的。这样Entity Framework才能正常增,删,改。 有时候,要根据某个字段,批量更新或者删除数据,用Ent…

2.概率论-概率论公理

【README】 本文总结自《概率论基础教程》 by M.Ross ,墙裂推荐; 【2.2】样本空间和事件 1)样本空间 所有可能的结果构成的集合,称为该实验的样本空间,记为S;2)事件(一个集合,或样本空间的子集) 样本空间的任一子集E称为事件;或样本空间中选取若干个结果构成的集合…

Oracle入门(十二C)之表修改

一、列操作 (1)添加列alter table 表名 add (列名 数据类型 [default 表达式], ..);alter table tableName add temp varchar2(30);(2)修改列A.修改列类型和属性alter table 表名 modify (列名 数据类型 [default 表达式], ..)…

在ThoughtWorks工作12年的技术主管,所总结的12条技术人经验

原文: 12 years, 12 lessons working at ThoughtWorks 作者: Patrick,ThoughtWorks的技术主管兼敏捷顾问 编译: 孙薇 本文作者在ThoughtWorks工作了12年之久, 回顾了往昔工作之后,他得出了12条经验心得&…