请教下有关重建datafile的问题

zjwssg 2010-09-07 10:41:32
环境 :10G,windows
客户的oracle数据库由于维护不规范,导致现在那几个datafile大小严重不一致,有的5G,有的500M,
客户想统一搞成2G大小的

我目前见解:
500M的搞成2G容易,限制最大为2g就行,
但已经存在的5G的文件,是无法resize到2G的,因为里面没3G的空闲空间,请问应该怎么做啊?
...全文
81 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjwssg 2010-09-13
  • 打赏
  • 举报
回复
虽然没好办法,还是给分结贴了,手头分紧啊
zjwssg 2010-09-07
  • 打赏
  • 举报
回复
楼上说的第一点,等于没有说嘛.

第二点倒是说了不少,谢谢了,但感觉不实用啊,生产库这么搞我接受不了啊.
minitoy 2010-09-07
  • 打赏
  • 举报
回复
哈哈,是有点累,不过还真想不出好办法
zjwssg 2010-09-07
  • 打赏
  • 举报
回复
不会吧 这么搞要累死人的
minitoy 2010-09-07
  • 打赏
  • 举报
回复
新建几个2g的表空间,然后把表create table as select到新表空间,然后删除老表,把新表rename成老表名.
zjwssg 2010-09-07
  • 打赏
  • 举报
回复
有具体的实战代码范例吗?
xieyu_zy 2010-09-07
  • 打赏
  • 举报
回复
我的办法可能和二楼有些类似,不过有一点区别:
1、创建一个新的表空间即可,这个表空间的每一个数据文件都是最大2G,而不是创建多个最大值为2G的表空间,不过所有数据文件大小不得小于以前的最大大小。

2、当前系统的表、索引通过DBA_TABLES、DBA_INDEXES等等信息(分区表和分区索引另当别论),根据这些信息自动生成表空间移动的脚本,其实这部分脚本都可以通过一些手段自动生成,比如我喜欢用:
select 'ALTER TABLE '||t.table_name||' MOVE TABLESPACE DST_TABLESPACE;'
FROM USER_TABLES t
where t.temporary='N' and t.partitioned='NO';
生成将当前用户下“非临时表、非分区表”的移植到指定的目标表空间的脚本,这些内容打印结果,将其拷贝到记事本内部,就直接引用执行了。

移动单个表使用ALTER TABLE table_name MOVE TABLESPACE tablespace_name;而索引将其提取DDL进行重建即可,当然主要是表,其余都是比较好说,移植了表一定重编译索引,呵呵。
分区表移动的语法:
ALTER TABLE table_name MOVE PARTITION partition_name TABLESPACE tablespace_name;
二级分区表的二级分区:
ALTER TABLE table_name MOVE SUBPARTITION sub_partition_name TABLESPACE tablespace_name;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧