ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle 9i传输表空间导入到10G数据库

Oracle 9i传输表空间导入到10G数据库

原创 Linux操作系统 作者:wdnmg 时间:2011-03-15 10:36:26 0 删除 编辑

 目前完成,从Linux系统的9i数据库使用表空间传输导出数据,到Windows系统的10G数据库。


传输表空间的限制条件:
1)源和目标数据库必须处于相同的平台;
2)源和目标数据库必须使用相同的字符集和国家字符集;
3)目标数据库不能已经包含同名的表空间;
4)目标数据库必须存在源数据库传输表空间的用户;
5)传输表空间不支持:物化视图或复制、基于函数的索引、Scoped REFs和兼容性设置为8.0时,带有多个收件人的高级队列。
6)使用传输表空间应该使源和目标数据库的兼容性都在8.1以上,如果源数据库中的表空间的block_size和目标数据库的db_block_size不相等,那么目标数据库的兼容性必须设置为9.0以上。

上面的限制条件,经过测试发现9i到10G是可以进行传输表空间操作的。

检查要迁移的表空间是否自包含
EXEC DBMS_TTS.TRANSPORT_SET_CHECK('WIND_DATA,WIND_IDX',true);

验证表空间是否是自包含的,被传输的表空间必须是自包含的。自包含的含义是在被传输的表空间集合里的所有对象,不会参考到这个集合以外的其它对象。
下面列出的是违反自包含条件的几种最常见的情况:
1)索引在这个表空间集合内,但是索引指向的表在集合之外;
2)分区表的部分分区在集合之外;
3)完整性约束的参考对象在集合之外;
4)表中包含的LOB对象存储在集合之外。

Oracle提供了过程dbms_tts.transport_set_check来检查一个表空间集合是否是自包含的。这个过程有三个参数,第一个是表空间名字的列表,用逗号分隔,第二个参数指出是否检查完整性约束,第三个参数指出检查集合内参考集合外的同时是否反过来检查集合外是否参考了集合内的对象。执行完过程后,查询视图TRANSPORT_SET_VIOLATIONS查看检查结果。解决视图中给出的错误后,就完成了第一步。

显示自包含检查结果
SELECT * FROM TRANSPORT_SET_VIOLATIONS;

查询数据库平台信息(10G)
select PLATFORM_ID,PLATFORM_NAME from v$database;

col PLATFORM_NAME format a40
SELECT PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM;
 检查源和目录数据库操作系统平台字节顺序是否相同

检查字符集
Set linesize 100
Col name format a20;
Col VALUE$ format a20;
Col COMMENT$ format a30
select * from sys.props$ where name='NLS_CHARACTERSET';
select * from nls_database_parameters;
检查源和目的数据库的字符集是否兼容,最好相同或目的数据库字符集是源数据库字符集的绝对超集。

注意NLS_LANGUAGE和NLS_TERRITORY参数设置是否相同,如果不同,需要修改并得启数据库,如果设置重启数据库后,还没有修改过来,需要删除数据库重新建库。
ALTER SYSTEM SET nls_language = "AMERICAN" SCOPE=SPFILE
ALTER SYSTEM SET nls_territory = "AMERICA" SCOPE=SPFILE

还要注意,环境变量的设置是否和数据库中字符集设置是否相同,不同的要设置相同。
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
或 set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

如果出现字符集不相同的情况,使用下面的操作步骤修改目的数据库字符集:
shutdown immediate;
startup mount;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
alter database open;
alter session set events '10046 trace name context forever,level 12';
alter database character set INTERNAL_USE ZHS16GBK;-- 加INTERNAL_USE参数数据库在变更时不会判断子集和超集的关系
shutdown immediate;
startup

可以使用CSSCAN扫描
1, 安装Csscan Csmig Schema
cd $ORACLE_HOME/rdbms/admin
set oracle_sid=
sqlplus /nolog
SQL>conn / as sysdba
SQL>set TERMOUT ON
SQL>set ECHO ON
SQL>spool csminst.log
SQL>@?/rdbms/admin/csminst.sql
2, 使用CSSCAN程序扫描数据库
set oracle_sid=
set PATH=
csscan system full=y tochar=ZHS32GB18030 capture=y array=1000000 process=2
查看日志,转换的字符集是否有严重损坏,或者能否有其它方式转换后进行变更.如果确认没问题的话,可以进行下一步.注意由于不是Oracle支持的方式,请动作前备份系统.

检查db_block_size是否相同
show parameter db_block_size;

检查表空间名及大小
SELECT a.tablespace_name,
       a.total,
       b.free,
       round((b.free/a.total)*100) "free%"
FROM ( SELECT tablespace_name, round(sum(bytes/(1024*1024))) total FROM dba_data_files GROUP BY tablespace_name) a,
     ( SELECT tablespace_name, round(sum(bytes/(1024*1024))) free FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name and a.tablespace_name IN ('WIND_DATA','WIND_IDX')
ORDER BY a.tablespace_name;

检查数据文件名及大小
col FILE_NAME format a40;
col TABLESPACE_NAME format a20;
set linesize 300;
select TABLESPACE_NAME,
       FILE_NAME,
       round(bytes/1024/1024) bytes_m
from dba_data_files
where tablespace_name IN ('WIND_DATA', 'WIND_IDX');
order by tablespace_name;

如果发现有表空间名字重名时修改表空间名
ALTER TABLESPACE TEST_TBS RENAME TO TBS239;

获取源数据库用户授权的角色和权限:
SELECT 'GRANT ' || GRANTED_ROLE || ' TO ' || GRANTEE || ';'
FROM DBA_ROLE_PRIVS
WHERE GRANTEE=’WIND’
ORDER BY GRANTEE, GRANTED_ROLE;

SELECT 'GRANT ' || PRIVILEGE || ' TO ' || GRANTEE || ';'
FROM DBA_SYS_PRIVS
WHERE GRANTEE='WIND'
      AND PRIVILEGE NOT IN (SELECT PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE IN ('CONNECT', 'RESOURCE'))
ORDER BY GRANTEE;
利用上面的授权,就可以在目标数据库建立用户,并授权

将源数据库中移动表空间设为只读状态
ALTER TABLESPACE TEST READ ONLY;

导出源数据库数据文件
exp \'/ as sysdba\' tablespaces=wdnmg,wdnmg_idx transport_tablespace=y file=wdnmg.dmp

导出时错误处理:
1、EXP-00091: Exporting questionable statistics.
 解决:
select * from nls_database_parameters t where t.parameter='NLS_CHARACTERSET';
PARAMETER           VALUE
------------        --------------------------
NLS_CHARACTERSET    ZHS16CGB231280

在命令行执行:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
在进行导出操作不再报EXP-00091错误。

拷贝导出文件到目的服务器
将表空间的数据文件和上步生成的dmp文件拷贝一份到目的数据库的数据文件所目录中

相同平台直接导入
imp '/ as sysdba' fromuser=wind touser=wind tablespaces=wdnmg,wind_idx transport_tablespace=y file= c:\oradata\wdnmg.dmp datafiles=c:\oradata\wdnmg.dbf,c:\oradata\wdnmg_idx.dbf ignore=y

对字节顺序相同平台不同的目的数据库进行相应处理
字节顺序相同而平台不同时,可以进行下面处理后导入,以从Linux导到Windows数据库为例:

找一个Windows平台的数据文件,取出数据文件最前面的8192字节保存到文件中
dd if=USERS01.DBF f=header.dbf bs=8192 count=1

去掉导出数据文件的前8192字节
dd if=wdnmg.dbf f=wdnmg.dbf.bak bs=8192 skip=1

用生成的两个新文件组合成要导入的新文件
copy /b header.dbf+wdnmg.dbf.bak wdnmg.dbf.new
 注意:要对创建的导入文件进行备份,以防导入出现错误。

对字节顺序不相同的目的数据库进行处理(10G)
字节转换的注意内容:
1、对于CONVERT DATAFILE, CONVERT TABLESPACE以及CONVERT DATABASE的所有应用,需要注意:
  CONVERT操作并不会改变源文件,转换操作也并不是在本地完成,而是直接写入目的地。
  源库和目标库的初始化参数中COMPATIBLE参数至少被设置为10.0
  在10g之前,CLOB字段做为变长字符集创建,CONVERT命令并不会转换这些列,而直接将其传输到目标库。直到后续有读取操作时,自动将其转换为目标字节顺序格式并保存。10g之后CLOB列的字符集被设置为AL16UTF16,完全平台无关,所以就更加不用考虑了。
  CONVERT命令并不会转换用户自定义的数据类型。如果你希望在数据库之间传输平台指定格式的映射对象,应该调用Data Pump。
  在传输到其它平台之前,要传输的表空间至少要被置为read-write状态一次(为什么?因为数据文件的文件头必须能够识别其所属的原平台是什么)。因此对于那些read-only的待传输表空间,你必须先将其置为read-write,然后再置为read-only。
2、对于CONVERT DATAFILE和CONVERT TABLESPACE操作的一些注意事项:
  如果在源库平台操作,必须使用CONVERT TABLESPACE... TO PLATFORM,不能使用CONVERT DATAFILE转换个别数据文件。而如果是在目标库平台操作,则必须使用CONVERT DATAFILE... FROM PLATFORM... TO PLATFORM而不能用CONVERT TABLESPACE。因为目标库还没有表空间的信息,自然也找到其对应的数据文件。
  FORMAT和DB_FILE_NAME_CONVERT参数可以同时使用,也可以都不使用,如果两个参数都不使用的话,目标平台中的文件路径会默认引用源平台中的路径。
  并非所有的平台都支持CONVERT,通过查询V$TRANSPORTABLE_PLATFORM视图确认所操作的平台是否支持CONVERT命令。要跨平台的传输表空间必须源和目标平台都在视图中的平台列表才可以。
  由于操作系统命令不支持直接操作文件到ASM,你可以通过CONVERT TABLESPACE或CONVERT DATAFILE移动文件到ASM中即使不涉及endian format的转换。使用CONVERT命令可以提供与操作系统的copy操作等同的功能,所不同的是CONVERT操作的是ASM。
3、对于CONVERT DATABASE的操作,除了上述第1条中的限制外,还有些其它的注意事项:
对于传输整个数据库而言最主要的一个限制是源平台和目标平台必须拥有相同的endian format(只能有限跨平台了)。例如,你可以从Windows系统传输数据库到Linux x86系统,或者从HP-UX到AIX,但是如果你想从Solaris传输整个数据库到Linux x86的话就不能应用这项特性了。当然如果必须在这种情况下传输的话,可以选择手工建库,然后通过CONVERT TABLESPACE或CONVERT DATAFILE命令传输:)
 
 
rman target /
CONVERT DATAFILE
'C:\oradata\ora10g\wdnmg.dbf','C:\oradata\ora10g\wdnmg_idx.dbf'
FROM PLATFORM='Microsoft Windows IA (32-bit)'
TO PLATFORM='AIX-Based Systems (64-bit)'
DB_FILE_NAME_CONVERT='C:\oradata\ora10g','/u01/oraprod/proddata';
  
目的数据库进行导入
imp '/ as sysdba' fromuser=wdnmg touser=wdnmg tablespaces=(wdnmg,wdnmg_idx) transport_tablespace=y file=wdnmg.dmp datafiles=c:\oradata\wdnmg\wdnmg.dbf,c:\oradata\wdnmg\wdnmg_idx.dbf
注意在导入时,数据文件所在目录,导入时数据文件所以目录就是以后
  
将源、目数据库的表空间状态由只读改为可读写
ALTER TABLESPACE wdnmg READ WRITE;
ALTER TABLESPACE wdnmg_idx READ WRITE;
修改用户的默认表空间为导入的表空间
ALTER user wdnmg default tablespace wdnmg;

检查导入的表及数据是否正确
select tablespace_name,status from dba_tablespaces;
select file_name,tablespace_name,status from dba_data_files;
select username,default_tablespace from dba_users where username='WDNMG';
select count(*) from wdnmg.wdnmg;

 如果在检查时,发现导入出现错误,可以删除目前的表空间,再导入。
drop tablespace wdnmg including contents;
drop tablespace wdnmg_idx including contents;
 删除导入后的数据文件,使用前面备份的新生成的数据文件重新导入。

详细内容查看附件:http://space.itpub.net/batch.download.php?aid=27988

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/70109/viewspace-689473/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-01-31

  • 博文量
    53
  • 访问量
    145418