关于传输表空间有一些规则 (10g前):
1)源数据库和目标数据库必须运行在相同的硬件平台上。
2)源数据库与目标数据库必须使用相同的字符集。
3)源数据库与目标数据库一定要有相同大小的数据块。
4)目标数据库不能有与迁移表空间同名的表空间。
5)SYS的对象不能迁移。
6)必须传输自包含的对象集。
7)有一些对象,如物化视图,基于函数的索引等不能被传输。
同字节序文件的跨平台可以用更换数据文件的文件头的方法
10g 支持跨平台的表空间传输,只要操作系统字节顺序相同,就可以进行表空间传输。需要使用RMAN 转换文件格式,方法略。
迁移表空间的好处:
迁移表空间时,速度快,不用停机。
[实验环境]
将WIN环境上的10.2.0.1数据库表空间TEST迁移到Linux 4 as 7上10.2.0.1数据库上。
WIN环境上数据文件存放方式为文件系统,Linux上存放方式为裸设备。
[实验步骤]
1.检查该表空间是否满足传输:
SQL > exec sys.dbms_tts.transport_set_check('TEST',true);
SQL > select * from sys.transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
Partitioned Global index LDY.PAR_PEPO_IND in tablespace TEST points to partition
P1 of table LDY.PAR_PEPO in tablespace LDY outside of transportable set
Index LDY.PK_PRODUCR_OFFER_INS in tablespace LDY enforces primary constriants o
f table LDY.PRODUCT_OFFER_INSTANCE in tablespace TEST
Default Partition (Index) Tablespace LDY for PAR_PEPO_IND not contained in trans
portable set
Partitioned Global index LDY.SKEW_ID_IND in tablespace TEST points to partition
P2 of table LDY.ZHSY_TEST_SKEW in tablespace LDY outside of transportable set
VIOLATIONS
--------------------------------------------------------------------------------
Partitioned Global index LDY.SKEW_ID_IND in tablespace TEST points to partition
P2 of table LDY.ZHSY_TEST_SKEW in tablespace LDY outside of transportable set
Partitioned Global index LDY.SKEW_ID_IND in tablespace TEST points to partition
P2 of table LDY.ZHSY_TEST_SKEW in tablespace LDY outside of transportable set
Partitioned Global index LDY.SKEW_ID_IND in tablespace TEST points to partition
P2 of table LDY.ZHSY_TEST_SKEW in tablespace LDY outside of transportable set
Partitioned Global index LDY.SKEW_ID_IND in tablespace TEST points to partition
VIOLATIONS
--------------------------------------------------------------------------------
P2 of table LDY.ZHSY_TEST_SKEW in tablespace LDY outside of transportable set
已选择8行。
可以看到,该表空间不满足传输条件,其中:
索引LDY.PAR_PEPO_IND在表空间TEST上,而该索引的表LDY.PAR_PEPO却在表空间LDY上。
表LDY.PRODUCT_OFFER_INSTANCE在表空间TEST上,而该表的索引LDY.PK_PRODUCR_OFFER_INS在表空间LDY上。
索引LDY.SKEW_ID_IND在表空间TEST上,而该索引的表LDY.ZHSY_TEST_SKEW却在表空间LDY上。
将以上几个问题都解决掉之后,再进行一次校验。
SQL > exec sys.dbms_tts.transport_set_check('TEST',true);
SQL > select * from sys.transport_set_violations;
未选定行
如果没有行选择,表示该表空间只包含表数据,并且是自包含的。
对于有些非自包含的表空间,如数据表空间和索引表空间,可以多个表空间一起传输。
2.在新库中创建用户并分配所需要的权限。
检查该TEST表空间上包含的对象的owner:
SQL> select distinct owner from dba_segments where tablespace_name='TEST';
OWNER
------------------------------
EAGLE
LDY
在迁移过去的新数据库中新建该2个用户,默认表空间可以先指定其他的表空间,但需要分配相应的权限。
create user eagle identified by eagle default tablespace users;
grant connect,resource to eagle;
create user ldy identified by ldy default tablespace users;
grant connect,resource to ldy;
3.停止当前数据库的JOB和AQ进程:
SQL> alter system set job_queue_processes=0;
SQL> alter system set aq_tm_processes=0;
4.设置表空间为只读
SQL> alter tablespace TEST read only;
5.使用TRANSPORT_TABLESPACE和TABLESPACES选项导出元数据
必须用sysdba权限才能操作,注意使用转义字符。
exp \" as sysdba\" TRANSPORT_TABLESPACE=Y TABLESPACES=TEST file=D:\transport.dmp log=D:\transport.log
Export: Release 10.2.0.1.0 - Production on 星期三 6月 30 15:25:13 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
注: 将不导出表数据 (行)
即将导出可传输的表空间元数据...
对于表空间 TEST...
. 正在导出簇定义
. 正在导出表定义
. . 正在导出表 GETS_SQL_51
. . 正在导出表 GETS_SQL_510
. . 正在导出表 GETS_SQL_52
. . 正在导出表 PRODUCT_OFFER_INSTANCE
. . 正在导出表 SALES
. 正在导出引用完整性约束条件
. 正在导出触发器
. 结束导出可传输的表空间元数据
6.拷贝dmp文件和数据文件到新的位置
将transport.dmp和TEST表空间的所有数据文件传输到Linux主机上,需要用bin方式传输。
TEST表空间下有3个数据文件,大小均为100M,文件为TEST01.DBF、TEST02.DBF、TEST03.DBF。
本例传输到linux的/u01目录。
7.将设为只读的表空间改回读写
SQL> alter tablespace TEST read write;
8.在Linux上将数据库文件dd到裸设备上
裸设备已事前建立好,每个裸设备大小为104M,映射为字符设备raw15、raw16、raw17
已知数据文件大小为100M,设置dd参数:bs=8192,count=12800
dd if=/u01/TEST01.DBF of=/dev/raw/raw15 bs=8192 count=12800
dd if=/u01/TEST02.DBF of=/dev/raw/raw16 bs=8192 count=12800
dd if=/u01/TEST03.DBF of=/dev/raw/raw17 bs=8192 count=12800
9.通过使用TRANSPORT_TABLESPACE, TABLESPACES and DATAFILES 子句将元数据导入到新的数据库中
datafile指向之前dd的裸设备上。
imp \"sys/sys as sysdba\" transport_tablespace=y tablespaces=TEST datafiles=/dev/raw/raw15,/dev/raw/raw16,/dev/raw/raw17 file=/u01/transport.dmp log=/u01/imp_transport.log buffer=10485760
buffer参数尽量设置大些,上面的例子设为10M,大分区表的SQL statement较大时,可以避免出现:IMP-00032: SQL statement exceeded buffer length错误导致的导入失败。
导入时,如果有报ORA-01917错误,是由于没有role或user无法赋权导致的,可以酌情处理或忽略
如:
IMP-00017: following statement failed with ORACLE error 1917:
"GRANT SELECT ON "GETS_SQL_51" TO "A""
IMP-00003: ORACLE error 1917 encountered
ORA-01917: user or role 'A' does not exist
10.导入之后修改TEST表空间的只读为读写
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
TEST READ ONLY
6 rows selected.
SQL> alter tablespace TEST read write;
Tablespace altered.
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
TEST ONLINE
6 rows selected.
11.检查数据
在WINDOWS和Linux上分别检查表空间对象以及数据情况,两边相同
SQL> select distinct owner,segment_name from dba_segments where tablespace_name='TEST';
OWNER SEGMENT_NAME
------------------------------ ------------------------------
LDY PK_PRODUCR_OFFER_INS
LDY GETS_SQL_510
LDY GETS_SQL_51
LDY GETS_SQL_52
LDY PRODUCT_OFFER_INSTANCE
EAGLE SALES
6 rows selected.
SQL> select count(*) from eagle.sales;
COUNT(*)
----------
110002
12.改变用户的默认表空间并分配配额
alter user ldy default tablespace test;
alter user eagle default tablespace test;
13.导入导出PL/SQL对象
如果还需要导PL/SQL对象,可以使用rows=n导出某个用户下的对象,导入时使用ignore=y导入,忽略重复的对象。
exp system/manager@$ORACLE_SID rows=n owner=demo statistics=none file=schema.dmp
imp system/manager@$ORACLE_SID ignore=y fromuser=demo touser=demo file=schema.dmp