共计 3016 个字符,预计需要花费 8 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 oracle10g 如何删除数据文件 / 表空间,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1. 获取开启
select alter table || owner || . || table_name || enable row movement; from dba_tables where tablespace_name= USERS
select alter table || owner || . || table_name || shrink space CASCADE; from dba_tables where tablespace_name= USERS
oracle 删除 (释放) 数据文件 / 表空间流程
生产环境:数据库里空间不足,niptest 表空间 251G,只使用了 17G
再 alter database datafile …../niptest1 resize 10G; 的时候说超出了范围要求
由于表变动比较频繁,高水位值比较大
(高水位 HWM“High Water Mark“:oracle 中 block 有没有使用的分界线,它会随着数据的 insert 而上升,但它并不会随数据的 delete 而下降,因此全表扫描的时间并不因数据的 delete 而减少,相反可能由于块清除反而全表扫描时间增加)
删除表空间步骤:
1) 批量将 niptest 表空间中的表 move 到 USERS 表空间,再删除表空间 niptest
首先看下此表空间内的表 move 到其他表空间 防止数据丢失
select * from dba_tables where tablespace_name= NIPTEST
select * from dba_extents where tablespace_name= NIPTEST
select * from dba_segments where tablespace_name= NIPTEST
SELECT alter table ||owner|| . ||table_name|| move tablespace USERS; FROM DBA_tables WHERE TABLESPACE_NAME= NIPTEST 批量把表移动到其他表空间
****** move(降低高水位)
优点:可以移动表到其他表空间,在执行命令时不需要执行 alter table table_name enable row movement
缺点:表 move 会导致表中的索引失效,要 rebuild;同时表会产生行级锁 ……;在此如果表中有 LOB 字段 时要用一下命令来实现表空间移动:alter table owner.table_name move tablespace tablespace_name lob (lob_column) store as lob segment tablespace tablespace_name; 也可以单独 move lob,index 要 rebuild
****** shrink space
优点:降低高水位时索引不会失效
缺点:不能将表移动到其他表空间;高水位降低效果没有 move 明显;同时在执行命令前要先执行 (alter table table_name enable row movement 允许行移动) 也会表会产生行级锁 …….,shrink 比 move 更耗费 cpu, 产生很多 current block 这样生成巨大的 redo 与 undo 如果表中索引很少可以建议使用 move 降低高水位
2) 移动完表发现 主键和索引还是在源表空间
SELECT * FROM DBA_extents WHERE TABLESPACE_NAME= USERS — 查看原表空间的主键和索引
alter index XX rebuild tablespace ;
— 批量执行索引重建
SELECT alter index ||owner|| . ||segment_name|| rebuild tablespace USERS; FROM DBA_extents WHERE TABLESPACE_NAME= NIPTEST 批量将主键索引重建到其他表空间
select * from dba_segments where tablespace_name= NIPTEST 弄完上面的操作,这里还有数据,不要在意,那是回收站的,无需修改直接删表空间即清空
(3) 表都移动完了 之后 先把数据文件 offline drop 再删除数据文件
alter database datafile /home/oracle/app/oracle/oradata/kfdb/niptest1 offline drop;
— 查看下数据文件状态
select status from dba_tablespaces v$datafile where tablespace_name= NIPTEST —–offline
— 再删除表空间
drop tablespace niptest; — 删除表空间,但不删除其文件
drop tablespace niptest including contents; — 删除表空间同时删除表空间的数据对象
drop tablespace niptest including contents and datafiles;
— 删除表空间时删除数据对象及其 OS 系统文件一起删除,,以便释放空间, 前提表空间不能是数据库默认表空间
否则会 报错:ORA-12919: Can not drop the default permanent tablespace
(4) 怎么查看下数据库的默认表空间是什么:
select * from database_properties where property_name = DEFAULT_PERMANENT_TABLESPACE
如果您删除的表空间是数据库默认表空间要用一下命令来
更换数据库默认表空间:alter database default tablespace users;
再执行:drop tablespace niptest including contents and datafiles;
[root@kfdb49 kfdb]# df -hl — 看下 OS 系统空间情况 — 表空间释放
—— 创建表空间的语句:
create tablespace niptest datafile /home/oracle/app/oracle/oradata/kfdb/niptest1 size 10G autoextend on next XXM maxsize XXm extent management local;
有的人会想着再创建一个 niptest 为 10G 的表空间,避免后期 imp 时源表的表空间是 niptest
:其实不需要,如果库中没有 niptest 表空间,就算 imp 源表的表空间是 niptest,也会导入到用户的默认表空间,有 niptest 表空间的话则会导入到 niptest 表空间(如果后续不想拥有 niptest 表空间 就要斩草除根的将 niptest 删除之后不要创建)
回收 unlimited tablespace 给予额外权限 niptest 表空间权限会正常导入,否则报错
额外权限和用户默认表空间是一个的话可以正常导入,否则知道表结构到用户默认表空间
以上是“oracle10g 如何删除数据文件 / 表空间”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!