oracle 交换表空间

设置文件输出路径:

SQL> alter systemset db_create_file_dest='/home/oracle';

 

System altered

 

SQL> showparameter db_create_file_dest;

 

NAME                                 TYPE        VALUE

----------------------------------------------- ------------------------------

db_create_file_dest                  string      /home/oracle

 

创建两个表空间用来存储范围分区表

SQL> createtablespace ts_range_30000 datafile size 50M autoextend on;

 

Tablespacecreated

 

SQL> createtablespace ts_range_50000 datafile size 50M autoextend on;

 

Tablespacecreated

 

创建分区表:

CREATE TABLEt_rangetest

(object_idNUMBER(5),

object_nameVARCHAR2(50),

create_dateDATE,

OBJECT_TYPEVARCHAR2(20))

PARTITION BYRANGE(object_id)

(

PARTITIONobject_id_30000 VALUES LESS THAN (30000) TABLESPACE ts_range_30000,

PARTITIONobject_id_50000 VALUES LESS THAN (MAXVALUE) TABLESPACE ts_range_50000

)

 

插入数据:

INSERT INTOt_rangetest

SELECTobject_id,object_name,created,object_type from Dba_Objects;

 

 

创建索引分区:

createindex IND_T_RANGETEST onT_RANGETEST(object_id)

local

(

PARTITIONobject_id_30000 tablespace ts_range_30000 ,

PARTITION object_id_50000 tablespace ts_range_50000 )

 

确定索引分区和表未分区位于同一个表空间

 

检查能不能以表空间传递的方式导出:

SQL> execdbms_tts.transport_set_check('ts_range_30000', TRUE);

 

PL/SQLprocedure successfully completed

 

SQL> SELECT* FROM transport_set_violations;

 

VIOLATIONS

--------------------------------------------------------------------------------

DefaultPartition (Table) Tablespace SYSTEM for T_RANGETEST not contained in tra

Sys ownedobject  IND_T_RANGETEST in tablespaceTS_RANGE_30000 not allowed in pl

Sys ownedobject  T_RANGETEST in tablespaceTS_RANGE_30000 not allowed in plugga

Partitionedtable SYS.T_RANGETEST is partially contained in the transportable se

 

发现system表空间没有包含在传递的表空间中,表和索引都不允许传递

按照谭大师书中的方法解决

 

创建临时表和临时表的索引:

SQL> createtable tmp_ts_range_30000 as select * from T_RANGETEST where 1=2;

 

Table created

 

SQL> createindex IND_TMP_ts_range_30000 on tmp_ts_range_30000(object_id);

 

Index created

 

要交换的分区共包含29553条记录

SQL> altertable T_RANGETEST exchange partition object_id_30000 with tabletmp_ts_range_30000 including indexes with validation;

 

Table altered

交换完毕

发现临时表被交换到了ts_range_30000这个分区上

此时

SQL> execdbms_tts.transport_set_check('ts_range_30000', TRUE);

 

PL/SQLprocedure successfully completed.

 

SQL>  SELECT * FROM transport_set_violations;

 

VIOLATIONS

--------------------------------------------------------------------------------

Sys ownedobject  IND_TMP_TS_RANGE_30000 intablespace TS_RANGE_30000 not allowe

d in pluggableset

 

Sys ownedobject  TMP_TS_RANGE_30000 in tablespaceTS_RANGE_30000 not allowed in

 pluggable set

 

还是不行上网查了下 原来systen表空间不能这么做,晕菜

 

没办法用普通用户重复上面的工作

发现终于ok了可以交换了

SQL> altertablespace ts_range_30000 read only;

 

Tablespacealtered

SQL> createor replace directory export as '/home/oracle';

 

Directorycreated

expdp system/oracle DIRECTORY=exportDUMPFILE=tts.dmp TRANSPORT_TABLESPACES= TS_RANGE_30000 TRANSPORT_FULL_CHECK=yLOGFILE=tts.log

导出成功

 

拷贝tts.dmp和表空间文件到目标计算机上

创建分区表:

CREATE TABLE t_rangetest

(object_id NUMBER(5),

object_name VARCHAR2(50),

create_date DATE,

OBJECT_TYPE VARCHAR2(20))

PARTITION BY RANGE(object_id)

(

PARTITION object_id_30000 VALUES LESS THAN(30000) ,

PARTITION object_id_50000 VALUES LESS THAN(MAXVALUE) 

)

创建索引

createindex IND_T_RANGETEST onT_RANGETEST(object_id)

local

(

PARTITIONobject_id_30000 ,

PARTITIONobject_id_50000  )

 

可见导入成功了第一次报错:

ORA-39123: Data Pump transportabletablespace job aborted

ORA-19721: Cannot find datafile withabsolute file number 8 in tablespace TS_RANGE_30000

发现自己把数据文件拷错了重新拷下导入即可

 

查看导入的表和索引:

最后将导入的临时表交换到分区表中

 

alter table t_rangetest exchange partitionobject_id_30000 with table tmp_ts_range_30000

 including indexes with validation;

 

最后查询

临时表中已经没记录了

分区表正常了

分区表的信息也是ok的

### Oracle 数据库大表释放空间方法 对于Oracle数据库中大表释放空间的方法,可以采取多种策略来优化存储并回收未使用的空间。以下是几种常见的方式: #### 1. 删除无用的数据记录 直接从大表中移除不再需要的历史数据或冗余条目是一个有效手段。这可以通过`DELETE`语句实现,在执行前建议先备份重要信息。 ```sql DELETE FROM large_table WHERE condition; COMMIT; ``` 为了提高效率和减少锁定时间,可分批次逐步清理大量数据[^4]。 #### 2. 收缩段(Segment Shrink) 利用ALTER TABLE命令配合SHRINK SPACE子句能够在线收缩表及其索引所占的空间,从而达到整理碎片的效果。 ```sql ALTER TABLE large_table ENABLE ROW MOVEMENT; ALTER TABLE large_table SHRINK SPACE CASCADE; ``` 此过程不会影响正在运行的应用程序访问该表的能力。 #### 3. 创建新表并交换名称 另一种方式是创建一个新的结构相同但更紧凑版本的新表,将旧表中有价值的内容迁移过去之后再替换原有对象的名字。 ```sql CREATE TABLE new_large_table AS SELECT * FROM old_large_table WHERE ROWNUM=0; INSERT /*+ APPEND */ INTO new_large_table SELECT * FROM old_large_table; RENAME old_large_table TO temp_old_large_table; RENAME new_large_table TO old_large_table; DROP TABLE temp_old_large_table PURGE; ``` 这种方法适用于那些难以直接修改现有表定义的情况。 #### 4. 调整表空间参数 适当调整表所在表空间的相关属性也能间接帮助管理其内部文件的增长趋势。比如设置合理的自动扩展增量以及最大尺寸限制等措施有助于防止过度分配磁盘资源给单个表空间。 ```sql ALTER DATABASE DATAFILE '/path/to/datafile.dbf' RESIZE 5G; ALTER TABLESPACE users AUTOEXTEND ON NEXT 10M MAXSIZE 10G; ``` 上述操作可以帮助更好地控制物理存储介质上的布局安排[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值