表空间的迁移

一 移动表空间中数据文件的路径

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

  

猜你喜欢

转载自www.cnblogs.com/black-start/p/11040610.html