oracle 交換表空間

2021-09-01 08:56:44 字數 4124 閱讀 5085

設定檔案輸出路徑:

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;

建立索引分割槽:

create

index

ind_t_rangetest

ont_rangetest(object_id)

local (

partition

object_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)

建立索引

create

index

ind_t_rangetest

ont_rangetest(object_id)

local (

partition

object_id_30000 ,

partition

object_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表空間 表

表 table 表空間是對儲存系統檔案 使用者資訊等資料的乙個空間。oracle表空間屬於oracle中的儲存結構,是由資料檔案組成,乙個資料庫例項可以有n個表空間,每個資料庫至少有乙個表空間 system表空間 乙個表空間下可以有n張表。可以通過表空間來實現對oracle的調優 oracle資料庫...

Oracle 表空間和臨時表空間

表空間 此空間是用來進行資料儲存的 表 function 儲存過程等 所以是實際物理儲存區域。臨時表空間 主要用途是在資料庫進行排序運算 如建立索引 order by及group by distinct union intersect minus sort merge及join analyze命令 ...

oracle表空間的空間管理

表空間 tablespace 為資料庫提供使用空間的邏輯結構,其對應物理結構是資料檔案,乙個表空間可以包含多個資料檔案.本地管理表空間 locally managed tablespace簡稱lmt 8i以後出現的一種新的表空間的管理模式,通過本地位圖來管理表空間的空間使用。字典管理表空間 dict...