Oracle表空间跨平台跨版本迁移测试
Oracle 官方文档里说到表空间可以跨平台迁移挂版本,但是有前提条件要满足
1.源和目标数据库使用相同字节顺序(也就是说little endian与big engian)
2.目标数据库不能有和源库有相同的表空间
3.源和目标数据库拥有相同的块大小
4.必须传输自包含的对象集(我的理解是表空间内的对象不能跨表空间)
以下是测试机环境
系统 数据库版本
oracle linux 4(U8) X86 32位 10.2.0.1.0 --- 源数据库
oracle linux 6(U3) x86 32位 11.2.0.1.0 --- 目标数据库
windown xp
32位 10.2.0.1.0 --- 目标数据库
检查字节顺序
源数据库
SQL> select d.platform_name,endian_format
2 from v$transportable_platform. tp,v$database d
3 where tp.platform_name=d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
----------------------- ---------------
Linux IA (32-bit) Little
目标库:oracle linux 6.3
SQL> select d.platform_name,endian_format
2 from v$transportable_platform. tp,v$database d
3 where tp.platform_name=d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
---------------------- ------------------
Linux IA (32-bit) Little
目标库:winXP 32位
SYS@test>select d.platform_name,endian_format
2 from v$transportable_platform. tp,v$database d
3 where tp.platform_name=d.platform_name;
PLATFORM_NAME ENDIAN_FORMAT
----------------------------------- --------------------------
Microsoft Windows IA (32-bit) Little
检查版本兼容性
NAME
TYPE
VALUE
-------------------- ----------- -------------------
compatible
string
10.2.0.1.0 ---------------------->要满足平台兼容性10.0.0.0.0 以上
开始测试
---在源库
在源数据库上创建一个用户及表空间是该用户所有
SQL> create tablespace test datafile '/u01/app/oracle/oradata/orcl/test01.dbf'
2 size 10M;
SQL> create user test identified by test default tablespace test;
SQL> grant dba to test;
3.在test用户在建一个表并插入数据------------------------->保证该表空间下的对象自包含
SQL> create table t as select * from scott.dept;
4.将test表空间设置为只读
SQL> alter tablespace test read only;
5.使用exp实用程序导出test表空间元数据
[oracle@Ora10gR2 ~]$ exp \'system/oracle as sysdba\' file='test.dmp' tablespaces=test TRANSPORT_TABLESPACE=y log=exptest.log
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
Note: table data (rows) will not be exported
About to export transportable tablespace metadata...
For tablespace TEST ...
. exporting cluster definitions
. exporting table definitions
. . exporting table T
. exporting referential integrity constraints
. exporting triggers
. end transportable tablespace metadata export
Export terminated successfully without warnings.
6.将test表空间下的数据文件和刚才导出文件拷贝到目标库响应目录下
---在目标库 oracle linux 6.3
1.在目标库下创建一个名为test的用户
SQL> create user test identified by test;
2.用imp 使用程序导入test表空间元数据
[oracle@lyj-linux ~]$ imp \'sys/oracle@prod as sysdba\' file='test.dmp' tablespaces=test TRANSPORT_TABLESPACE=y \
TTS_OWNERS=test DATAFILES='/u01/app/oracle/oradata/prod/test01.dbf'
Import: Release 11.2.0.1.0 - Production on Wed Apr 3 10:08:16 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export file created by EXPORT:V10.02.01 via conventional path
About to import transportable tablespace(s) metadata...
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses WE8MSWIN1252 character set (possible charset conversion)
. importing SYS's objects into SYS
. importing SYS's objects into SYS
. importing TEST's objects into TEST
. . importing table "T"
. importing SYS's objects into SYS
Import terminated successfully without warnings.
3.导入成功后查看test表空间状态
SQL> select tablespace_name,status,plugged_in from dba_tablespaces;
TABLESPACE_NAME STATUS
PLU
--------------- --------- ---
SYSTEM
ONLINE
NO
SYSAUX
ONLINE
NO
UNDOTBS1
ONLINE
NO
TEMP
ONLINE
NO
USERS
ONLINE
NO
EXAMPLE
ONLINE
YES
TEST
READ ONLY YES
此时导入test表空间后期状态为只读,更改为读写就可以插入数据了
---- 在目标库winXP
在这个库下我值之前创建有test用户,因此在这里不需要创建了,同时在这个库下没test表空间,正好,如果已有那先重命名它,不然导入时估计会报错
此时已将元数据库test表空间元数据的导出文件及test表空间下的数据文件拷到相应目录
准备导入
C:\Documents and Settings\战鹰>imp 'sys/oracle@test as sysdba' \
file='d:\test.dmp' tablespaces=test transport_tablespace=y tts_owners=test
datafiles='D:\oracle\product\10.2.0\oradata\test\test01.db
Import: Release 10.2.0.1.0 - Production on 星期三 4月 3 22:35:45 2013
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
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入可传输的表空间元数据...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
导出客户机使用 US7ASCII 字符集 (可能的字符集转换)
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
IMP-00017: 由于 ORACLE 错误 29345, 以下语句失败:
"BEGIN sys.dbms_plugts.beginImport ('10.2.0.1.0',31,'2000',10,'Linux IA (3"
"2-bit)',51373,70001,1,0,0,0); END;"
IMP-00003: 遇到 ORACLE 错误 29345
ORA-29345: 无法使用不兼容的字符集将表空间插入到数据库中
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 2386
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1946
ORA-06512: 在 line 1
报错了 IMP-00003: 遇到 ORACLE 错误 29345 RA-29345: 无法使用不兼容的字符集将表空间插入到数据库中
估计字符集有问题,然后到网上搜了一下也清楚了迁移表空间也要保证源库金额目标库字符集要一致
看看源库的字符集
SQL>select * from sys.props$ where name='NLS_CHARACTERSET';
NAME VALUE$ COMMENT$
-------------------- ------------------------- -------------------
NLS_CHARACTERSET WE8ISO8859P1 Character set
在看看目标库(winxp)的字符集
SYS@test>select * from sys.props$ where name='NLS_CHARACTERSET';
NAME VALUE$ COMMENT$
-------------------- ------------------------- -------------------
NLS_CHARACTERSET AL32UTF8 Character set
这下清楚了确实不一样啊
这时我想把源库的字符集改为AL32UTF8,改之前还要做点准备的如下
先检测库中的数据内容是否全库可以转换为AL32UTF8字符集,检测使用oracle提供的csscan工具实现
安装csscan相关数据字典
SQL> @?/rdbms/admin/csminst.sql
csscan使用说明
[oracle@Ora10gR2 ~]$ csscan help=y
使用csscan检测当前数据库
[oracle@Ora10gR2 ~]$ csscan userid="'"sys/xifenfei as sysdba"'" full=y \
fromchar=WE8ISO8859P1 tochar=AL32UTF8 log=/tmp/check.log capture=y array=1000000 process=4
查看csscan检查日志
[oracle@Ora10gR2 ~]$ cat /tmp/check.log.txt
Database Scan Summary Report
Time Started : 2013-04-04 09:49:48
Time Completed: 2013-04-04 09:50:46
Process ID Time Started Time Completed
---------- -------------------- --------------------
1 2013-04-04 09:49:54 2013-04-04 09:50:30
2 2013-04-04 09:49:54 2013-04-04 09:50:45
3 2013-04-04 09:49:54 2013-04-04 09:50:42
4 2013-04-04 09:49:54 2013-04-04 09:50:30
---------- -------------------- --------------------
[Database Size]
Tablespace Used Free Total Expansion
------------------------- --------------- --------------- --------------- ---------------
SYSTEM 472.13M 7.88M 480.00M 684.00K
UNDOTBS1 10.25M 14.75M 25.00M .00K
SYSAUX 227.81M 2.19M 230.00M 7.99M
TEMP .00K .00K .00K .00K
USERS 448.00K 4.56M 5.00M .00K
TEST 128.00K 9.88M 10.00M .00K
------------------------- --------------- --------------- --------------- ---------------
Total 710.75M 39.25M 750.00M 8.66M
The size of the largest CLOB is 1625114 bytes
[Database Scan Parameters]
Parameter Value
------------------------------ ------------------------------------------------
CSSCAN Version v2.1
Instance Name orcl
Database Version 10.2.0.1.0
Scan type Full database
Scan CHAR data? YES
Database character set WE8ISO8859P1
FROMCHAR WE8ISO8859P1
TOCHAR AL32UTF8
Scan NCHAR data? NO
Array fetch buffer size 1000000
Number of processes 4
Capture convertible data? YES
------------------------------ ------------------------------------------------
[Scan Summary]
All character type data in the data dictionary are convertible to the new character set
All character type application data remain the same in the new character set
[Data Dictionary Conversion Summary]
Datatype Changeless Convertible Truncation Lossy
--------------------- ---------------- ---------------- ---------------- ----------------
VARCHAR2 1,890,386 0 0 0
CHAR 1,097 0 0 0
LONG 147,015 0 0 0
CLOB 19,764 786 0 0
VARRAY 21,362 0 0 0
--------------------- ---------------- ---------------- ---------------- ----------------
Total 2,079,624 786 0 0
Total in percentage 99.962% 0.038% 0.000% 0.000%
The data dictionary can be safely migrated using the CSALTER script
[Application Data Conversion Summary]
Datatype Changeless Convertible Truncation Lossy
--------------------- ---------------- ---------------- ---------------- ----------------
VARCHAR2 29,991 0 0 0
CHAR 0 0 0 0
LONG 0 0 0 0
CLOB 0 0 0 0
VARRAY 1,436 0 0 0
--------------------- ---------------- ---------------- ---------------- ----------------
Total 31,427 0 0 0
Total in percentage 100.000% 0.000% 0.000% 0.000%
[Distribution of Convertible, Truncated and Lossy Data by Table]
USER.TABLE Convertible Truncation Lossy
-------------------------------------------------- ---------------- ---------------- ----------------
MDSYS.SDO_COORD_OP_PARAM_VALS 200 0 0
MDSYS.SDO_GEOR_XMLSCHEMA_TABLE 1 0 0
MDSYS.SDO_STYLES_TABLE 78 0 0
MDSYS.SDO_XML_SCHEMAS 4 0 0
SYS.METASTYLESHEET 80 0 0
SYS.RULE$ 4 0 0
SYS.WRH$_SQLTEXT 162 0 0
SYS.WRH$_SQL_PLAN 143 0 0
SYS.WRI$_ADV_OBJECTS 5 0 0
SYS.WRI$_DBU_FEATURE_METADATA 90 0 0
SYS.WRI$_DBU_FEATURE_USAGE 2 0 0
SYS.WRI$_DBU_HWM_METADATA 17 0 0
-------------------------------------------------- ---------------- ---------------- ----------------
[Distribution of Convertible, Truncated and Lossy Data by Column]
USER.TABLE|COLUMN Convertible Truncation Lossy
-------------------------------------------------- ---------------- ---------------- ----------------
MDSYS.SDO_COORD_OP_PARAM_VALS|PARAM_VALUE_FILE 200 0 0
MDSYS.SDO_GEOR_XMLSCHEMA_TABLE|XMLSCHEMA 1 0 0
MDSYS.SDO_STYLES_TABLE|DEFINITION 78 0 0
MDSYS.SDO_XML_SCHEMAS|XMLSCHEMA 4 0 0
SYS.METASTYLESHEET|STYLESHEET 80 0 0
SYS.RULE$|CONDITION 4 0 0
SYS.WRH$_SQLTEXT|SQL_TEXT 162 0 0
SYS.WRH$_SQL_PLAN|OTHER_XML 143 0 0
SYS.WRI$_ADV_OBJECTS|ATTR4 5 0 0
SYS.WRI$_DBU_FEATURE_METADATA|INST_CHK_LOGIC 11 0 0
SYS.WRI$_DBU_FEATURE_METADATA|USG_DET_LOGIC 79 0 0
SYS.WRI$_DBU_FEATURE_USAGE|FEATURE_INFO 2 0 0
SYS.WRI$_DBU_HWM_METADATA|LOGIC 17 0 0
-------------------------------------------------- ---------------- ---------------- ----------------
[Indexes to be Rebuilt]
USER.INDEX on USER.TABLE(COLUMN)
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
网上博客里说只要Truncation和Lossy都为0就可以改字符集,不为0则去看err 日志,然后吧相关问题处理掉
修改字符集--数据库在restricted模式才能修改
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size
1218316 bytes
Variable Size
71305460 bytes
Database Buffers
92274688 bytes
Redo Buffers
2973696 bytes
Database mounted.
SQL> alter system enable restricted session;
System altered.
SQL> alter database open;
Database altered.
SQL> alter database character set internal_use AL32UTF8;
Database altered.
接着在按上面步骤吧test表空间设置为read only,再用imp导出test表空间元数据,拷贝test表空间下的数据文件
和刚才导出文件到目标库(winxp)响应目录下
再次导入
在此目标库下我也之前建了个test1, 用户,我想把导入的test表空间让它的拥有者为test1
导入
C:\Documents and Settings\战鹰>imp 'sys/oracle@test as sysdba' \
file='d:\test1.dmp' tablespaces=test transport_tablespace=y tts_owners=test1
datafiles='D:\oracle\product\10.2.0\oradata\test\test011.db
Import: Release 10.2.0.1.0 - Production on 星期四 4月 4 10:32:43 2013
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
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入可传输的表空间元数据...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
导出客户机使用 US7ASCII 字符集 (可能的字符集转换)
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
IMP-00017: 由于 ORACLE 错误 29344, 以下语句失败:
"BEGIN sys.dbms_plugts.checkUser('TEST'); END;"
IMP-00003: 遇到 ORACLE 错误 29344
ORA-29344: 所有者验证失败 - 与所有者 'TEST' 不符
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1895
ORA-06512: 在 line 1
IMP-00000: 未成功终止导入
又报错了,这回不是字符集的问题,问题是ORA-29344: 所有者验证失败 - 与所有者 'TEST' 不符,
说明我想把导入的test表空间让它的拥有者为test1是不行的,而且源库test表空间的拥有者也是test,那换回test用户吧
再导入
C:\Documents and Settings\战鹰>imp 'sys/oracle@test as sysdba' \
file='d:\test1.dmp' tablespaces=test transport_tablespace=y tts_owners=test
datafiles='D:\oracle\product\10.2.0\oradata\test\test011.db
Import: Release 10.2.0.1.0 - Production on 星期四 4月 4 10:36:34 2013
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
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入可传输的表空间元数据...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
导出客户机使用 US7ASCII 字符集 (可能的字符集转换)
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
. 正在将 TEST 的对象导入到 TEST
IMP-00015: 由于对象已存在, 下列语句失败:
"CREATE TABLE "T" ("DEPTNO" NUMBER(2, 0), "DNAME" VARCHAR2(14), "LOC" VARCHA"
"R2(13)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(SEG_FILE 5 S"
"EG_BLOCK 11 OBJNO_REUSE 51366 INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 B"
"UFFER_POOL DEFAULT) LOGGING NOCOMPRESS"
. 正在将 SYS 的对象导入到 SYS
成功终止导入, 但出现警告。
这回成功了,但又警告 IMP-00015: 由于对象已存在,我查一下目标库test用户是不是有个对象 t
TEST@test>select object_name ,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
-------------------- ------------------
T TABLE
SYS_TEMP_FBT TABLE
果然有,然后我把它drop掉,刚才导入成的test表空间及其数据文件也drop掉再导入
TEST@test>drop table t ;
SYS@test>select tablespace_name ,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------------------------------------ ----------------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
JSTBS1 ONLINE
TESTTBS ONLINE
TEST READ ONLY
已选择8行。
SYS@test>drop tablespace test including contents and datafiles;
表空间已删除。
ok,再次导入
C:\Documents and Settings\战鹰>imp 'sys/oracle@test as sysdba' file='d:\test1.dmp' \
tablespaces=test transport_tablespace=y tts_owners=test \
datafiles='D:\oracle\product\10.2.0\oradata\test\test011.dbf'
Import: Release 10.2.0.1.0 - Production on 星期四 4月 4 10:48:53 2013
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
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入可传输的表空间元数据...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
导出客户机使用 US7ASCII 字符集 (可能的字符集转换)
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
. 正在将 TEST 的对象导入到 TEST
. . 正在导入表 "T"
. 正在将 SYS 的对象导入到 SYS
成功终止导入, 没有出现警告。
这回成功了
第一次从 系统oracle linux 4.8 数据库 10.2.0.1.0 导入到 系统oracle linux 6.3 数据库 11.2.0.1.0 一切顺利,字符集问题没报错
导完两个目标库后我查了 11.2.0.1.0库的字符集
SQL> select * from sys.props$ where name='NLS_CHARACTERSET';
NAME
VALUE$
COMMENT$
---------------------- ---------------- --------------------
NLS_CHARACTERSET
WE8MSWIN1252
Character set
这个库字符集是WE8MSWIN1252,源库我没改字符集之前是WE8ISO8859P1,一对比大同小异,最后网上搜了一下两者关系
WE8ISO8859P1是WE8MSWIN1252的子集,原来是一个系列的。
总结:
迁移之前要规划好,看源库与目标库是否是同一平台,同一字节顺序,同一版本数据库,
同一字符集,另外要迁移的表空间是否自包含。这些问题弄清楚了,过程将变得简单明了。
参考博客:http://www.xifenfei.com/2237.html http://dl528888.blog.51cto.com/2382721/865850
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26861223/viewspace-757746/,如需转载,请注明出处,否则将追究法律责任。