1.创建一个新的表空间 newspaces (原来的表空间oldspaces)
2.从原来的表空间里面导出数据(test.dmp),然后在新的表空间里面导入之前导出的数据(test.dmp),选择从用户到用户的方式导入
3.执行下面这个SQL:
select ‘alter table ‘ ||table_name || ‘ move tablespace 目标表空间名称;‘ from user_all_tables
将结果集导出,然后在导出的文件里面把查询拼接的SQL全部复制到plsql里面执行。
说明:至此表迁移以及完成,但由于表里面涉及到索引,所以我们还必须将索引页迁移过来,迁移索引之前,因为存在有的索引是大字段(LOB)类型的,还需要先处理大字段。
4.处理大字段
执行下面这个SQL,查询出存在大字段的表
select ui.table_name from user_indexes ui where ui.index_type=‘LOB‘
接下来需要一个个点开查看存在大字段的表,找出使用大字段的列
把表的名称,和大字段的列名放到下面的SQL中执行(同一个表,可以把所有的列名都放在一个SQL里面执行,多个表,创建多条SQL来处理):
ALTER TABLE 表明 move tablespace govhrdb LOB(列名1,列名2) STORE AS (TABLESPACE ywj);
也可以直接使用下面语句进行查询自动生成:
select ‘alter table ‘ || tsb.table_name || ‘ move tablespace ‘ ||
tsb.TABLESPACE_NAME || ‘ LOB(‘ || tsb.col ||
‘) STORE AS (TABLESPACE 迁移到的表空间名字);‘
from (select table_name,
ltrim(sys_connect_by_path(column_name, ‘,‘), ‘,‘) as col,
TABLESPACE_NAME
from (select table_name,
column_name,
TABLESPACE_NAME,
row_number() over(partition by table_name order by column_name) rn,
count(*) over(partition by table_name) cnt
from (SELECT cols.table_name,
cols.column_name,
cols.data_type,
dd.TABLESPACE_NAME
FROM all_tab_cols cols
left join all_tables dd
on dd.table_name = cols.table_name
WHERE cols.table_name in
(select ui.table_name
from user_indexes ui
where ui.index_type = ‘LOB‘)
and data_type like ‘%LOB‘)) a
where level = cnt
start with rn = 1
connect by prior table_name = table_name
and prior rn = rn - 1) tsb;
5.迁移基本类型的索引
执行下面的SQL
select ‘alter index ‘ ||index_name || ‘ rebuild tablespace 目标表空间名称;‘ from user_indexes
将结果集导出,然后在导出的文件里面把查询拼接的SQL全部复制到plsql里面执行,如果遇到提示直接跳过。
6.数据导出
由于在迁移索引的时候,造成了对索引值的影响,如果使用普通的exp命令导出,下次导入的时候会报错,针对这个问题,使用下面的命令来导出数据,让数据保持一致性,再次导入的时候就不会存在错误了
导出命令:exp 用户名/密码@数据库名 file=导出文件路径 consistent=y
consistent=y表示保持文件的完整性
说明:只需要在迁移后第一次导出的时候使用上面命令导出即可,之后的数据导入,导出都不按正常的步骤来,不需要加consistent=y 如果遇到导入索引报错,参考分区数据导入报错问题解决方案
oracle导入数据的时候,有时会出现分区数据不能导入的问题,以及在迁移表空间的时候可能存在的索引状态为‘UNUSABLE‘的隐患,下面为解决方案:
--查询出所有的状态为UNUSABLE的索引,并生成出来SQL
select ‘alter index ‘ || index_name || ‘ rebuild ;‘ from user_indexes where status=‘UNUSABLE‘;
--例子:
alter index PK_UN_ORGANIZATION_FUNCTION rebuild ;
alter index PK_OA_NOTICE rebuild ;
alter index AK_KEY_2_CORE_MES rebuild ;
alter index PK_CORE_MESSAGE_POOL rebuild ;
alter index AK_KEY_2_CORE_LOG rebuild ;
alter index PK_CORE_LOG rebuild ;
alter index PK_UN_ORGANIZATION_BASIS rebuild ;
alter index PK_OA_ORGCONFIG rebuild ;
执行查询产生的SQL语句即可