一 移动表空间中数据文件的路径
1. 首先确定数据文件的状态要为 OFFLINE
select tablespace_name,status,contents from dba_tablespaces;
查询数据文件的路径
select file_id,file_name,tablespace_name from dba_data_files where file_name like '%ORACLE%' order by file_id;
2. 将该表空间 test01 修改为OFFLINE
alter tablespace test01 offline
查看表空间状态确定修改成功
select tablespace_name,status,contents from dba_tablespaces;
3. 移动数据文件
host copy /oracle/oradata/orcldb/test01.dbf /oracle/oradata/orcldb/test01bak.dbf
asm移动文件
su - grid
asmcmd
cp +DGSYSTEM/orcl/datafile/test01.dbf +DGDATA01/orcl/datafile/test.dbf
4. 重新命名该表空间的路径和名称
alter tablespace test01
rename datafile '/oracle/oradata/itpuxdb/test01.dbf'
to
'/oracle/oradata/itpuxdb/test01bak.dbf'
5. 修改表空间的状态为 ONLINE 状态
alter tablespace itpux online
第二种方法
在数据库位 mount的模式下
1.复制表空间文件
host copy /oracle/oradata/orcldb/test01.dbf /oracle/oradata/orcldb/test01bak.dbf
asm单机模式下复制文件
su - grid
asmcmd
cp +DGSYSTEM/orcl/datafile/test01.dbf +DGDATA01/orcl/datafile/test01.dbf
2.Oracle上更改表空间文件路径
alter database rename file
'/oracle/oradata/itpuxdb/itpux01.dbf'
to
'/oracle/oradata/itpuxdb/itpux01bak.dbf'
3.打开数据库
alter database open
4.查看表空间名和文件路径
select file_name,tablespace_name from dba_data_files;
二、移动表和索引到其他表空间
conn test01/test01;
create table table01 (ID NUMBER(12),C_DATE DATE );
像表中插入数据:
insert into table01 values(1,sysdate);
insert into table01 values(2,sysdate);
insert into table01 values(3,sysdate);
insert into table01 values(4,sysdate);
insert into table01 values(5,sysdate);
commit;
创建 table01 表的索引
create index idx_table01_id on table01('id');
1. 查询该对象存放在哪个表空间
select segment_name,tablespace_name,extents,blocks
from
dba_segments
where owner='TEST01';
2.查询该对象是索引,还是表
select object_id,object_name,object_type,status,created
from dba_objects
where
owner='TEST01';
3.查询索引或者表 存放在哪个表空间
select index_name,table_name,tablespace_name,status
rom
dba_indexes
where
owner='TEST01';
4.移动表到另一个表空间
alter table test01.table01 move tablespace test02;
5. 查询该表是否移动到该表空间
select segment_name,tablespace_name,extents,blocks
from dba_segments
where
owner='TEST01';
6. 检查表是否有效,状态为 VALID 是有效
select object_id,object_name,object_type,status,created
from dba_objects
where
owner='TEST01';
7. 重建索引 并且将索引移动到另一个表空间
alter index test01.idx_table01_id rebuild tablespace test02;
8. 查询索引对应的表空间
select index_name,table_name,tablespace_name,status
from dba_indexes
where
owner='TEST01';
9.如果表空间里有大字段,那怎么操作呢?
语句
alter table USER.table move tablespcae tablespace_name lob(col_lob1,col_lob2) store as(tablespcae tablespace_name);
例:
创建一个带大字段的表
SQL> create table test(
2 id number,
3 name varchar2(10),
4 bin blob);
Table created.
SQL> desc test
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(10)
BIN BLOB
插入一条测试数据
SQL> insert into test values(1,'test','27fa');
1 row created.
SQL> commit;
Commit complete.
查询表、大字段对象所在表空间
SQL> select t.segment_name, t.segment_type, t.tablespace_name from user_segments t;
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
SYS_IL0000088731C00003$$ LOBINDEX TEST01
SYS_LOB0000088731C00003$$ LOBSEGMENT TEST01
TEST TABLE TEST01
移动表到 test02 表空间
SQL> alter table test move tablespace test02;
Table altered.
再次查看对象所在表空间
SQL> select t.segment_name, t.segment_type, t.tablespace_name from user_segments t;
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
TEST TABLE TEST02
SYS_IL0000088731C00003$$ LOBINDEX TEST01
SYS_LOB0000088731C00003$$ LOBSEGMENT TEST01
移动大字段到表空间 test02
SQL> alter table test move tablespace test02 lob (bin) store as (tablespace test02);
Table altered.
SQL> select t.segment_name, t.segment_type, t.tablespace_name from user_segments t;
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
TEST TABLE TEST02
SYS_IL0000088731C00003$$ LOBINDEX TEST02
SYS_LOB0000088731C00003$$ LOBSEGMENT TEST02