windows下oracle 10G数据库移植到linux平台

原作者:soonwind
(通过文件直接复制方法)
最近学习了一下oracle数据库启动原理,于是,就把在windows创建起来做测试的数据库
移植到linux下使用,前几天把linux移植到windows成功,但windows移植到linux碰到问题会多,
在windows用习惯人会不区分大小写,但在linux是区分的,这点务必请大家注意,下面让我们一起去这过程吧!
还是和上面讲的一样,我直接通过文件复制,把原来在windows下使用的数据库移植到linux下,
而不需要通过其他工具。
虽然此移植在实际生产用途不大,但对一个刚oracle来说,确实能从中学到很多东西,所以写
下此文以供大家参考,欢迎提出宝贵介意。
系统环境:linux 下是32 位平台,linux内存,CPU等硬件条件和windows是一样。
如果硬件条件不一至,下面讲的数据迁移可能会碰到其他问题。
软件环境:linux平台和windows平台装的oracle软件版本是
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
都是以企业版安装。
如果两边版本不一至,还没有实验过。
我粗略讲一下过程,把windows下的数据文件,控制文件,重做日志组文件,
参数文件,复到到linux下,然后把参数文件里的控制文件改成linux目录
下结构,同时使数据重新生成控制文件。详细步骤如下:

linux平台下的数据库配制如下
数据库是以文件系统管理
实例名:orcl
数据库名:orcl
ORACLE_BASE=/u01/app/oracle/
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
数据库文件存放位置:/u02/oradata/orcl
windows平台下的数据库配制如下
数据库是以文件系统管理
实例名:orcl     
数据库名:orcl  由于数据库是从windows文件直接复制过来,所以数据库名是不能更改的
ORACLE_BASE=D:\oracle
ORACLE_HOME=D:\oracle\product\10.2.0\db_1
ORACLE_SID=orcl
数据库文件存放位置:D:\oracle\oradata\orcl

步骤如下:

--登录到windows下数据库
c:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 7月 1 14:53:23 2008
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
--创建参数pfile文件
SQL> create pfile='initorcl.ora' from spfile;
文件已创建。
--关毕数据库
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
linux平台如输入如下创建文件夹
mkdir -o /u02/oradata/orcl
复制参数文件,控制文件,数据文件,重做日志组文件到linux平台下的目录,
我这里是在linux开了一个samba服务,然后把/u02/oradata/orcl文件夹共享
也可以在linux开个FTP,通过FTP把文件传到linux机器上

windows平台数据文件,,重做日志组文件和控制文件放在 D:\oracle\oradata\orcl
linux平台下的数据文件 /u02/oradata/orcl

linux平台下的实例参数文件window平台下的 D:\oracle\product\10.2.0\db_1\database\initorcl.ora
复制到linux平台下的目录
/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora
注意这里的文件名,linux下文件名是区分大小写的,所以把全部改成小写的

以下是linux平台输入如下命令来创建文件夹:
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /u01/app/oracle/admin/orcl/bdump
mkdir -p /u01/app/oracle/admin/orcl/cdump
mkdir -p /u01/app/oracle/admin/orcl/dpdump
mkdir -p /u01/app/oracle/admin/orcl/pfile
mkdir -p /u01/app/oracle/admin/orcl/udump
如果/u01/app/oracle/flash_recovery_area也不存在,也创建
mkdir -p /u01/app/oracle/flash_recovery_area
设计环境变量
set ORACLE_SID=linux
或者更改oracle用户下的.bash_profile文件
ORACLE_SID=orcl; export ORACLE_SID
把ORACLE_SID改成orcl
用vi打开文件/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora
把windows下的目录结构改成linux下的目录结构。
注意下,在linux下文件名和文件夹都是区分大小写的,请确保下面参数实际文件名大小写一至,否则就起动不了数据库。
下面文件是我的参数文件信息。供参考:

orcl.__db_cache_size=75497472
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__shared_pool_size=75497472
orcl.__streams_pool_size=4194304
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='DB'
*.background_dump_dest='/u01/app/oracle/admin/orcl/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u02/oradata/orcl/CONTROL01.CTL','/u02/oradata/orcl/CONTROL02.CTL','/u02/oradata/orcl/CONTROL03.CTL'
*.core_dump_dest='/u01/app/oracle/admin/orcl/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.job_queue_processes=10
*.open_cursors=300
*.pga_aggregate_target=16777216
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=167772160
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/orcl/udump'

创建密码文件
orapwd file=/u01/app/oracle/product/10.2.0/db_1/dbs/orapworcl password=<密码>
linux下登录数据库
[oracle@localhost ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 7 13:24:38 2008
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to an idle instance.
SQL>
--启动到mount下
SQL> startup mount pfile=/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora;
ORACLE instance started.
Total System Global Area  167772160 bytes
Fixed Size                  1218316 bytes
Variable Size              88082676 bytes
Database Buffers           75497472 bytes
Redo Buffers                2973696 bytes
Database mounted.
--创建一个spfile文件,下次以spfile文件启动
SQL> create spfile='spfileorcl.ora' from pfile;
File created.

下次启时候直接以spfile文件启动
--做一个把控制文件的内容生成到跟踪文件命令,这一部很重要,生成到跟踪文件里的就是重创控制文件的命令。
SQL> alter database backup controlfile to trace;
Database altered.
--关闭数据库
SQL> shutdown immediate;
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.

打开跟踪文件,目录为$ORACLE_BASE/admin/linux/udump
查找最新修改文件*.trc,如我的机子上是linux_ora_3647.trc
用vi打开,并查找这行:“--     Set #1. NORESETLOGS case”
选中并复制到
“-- End of tempfile additions.
--
--     Set #2. RESETLOGS case”为止。

把选中这段文字所有目录结构改成linux平台下的目录结构,
注意,linux下是区分在小写的,这里改过来,必须和实际文件名大小写一至,否则创建的控制文件不能启动。
下面是我的样例如下,请供大家参考:
--     Set #1. NORESETLOGS case
--
-- The following commands will create a new control file and use it
-- to open the database.
-- Data used by Recovery Manager will be lost.
-- Additional logs may be required for media recovery of offline
-- Use this only if the current versions of all online logs are
-- available.
-- After mounting the created controlfile, the following SQL
-- statement will place the database in the appropriate
-- protection mode:
--  ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u02/oradata/orcl/REDO01.LOG'  SIZE 50M,
  GROUP 2 '/u02/oradata/orcl/REDO02.LOG'  SIZE 50M,
  GROUP 3 '/u02/oradata/orcl/REDO03.LOG'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  '/u02/oradata/orcl/SYSTEM01.DBF',
  '/u02/oradata/orcl/UNDOTBS01.DBF',
  '/u02/oradata/orcl/SYSAUX01.DBF',
  '/u02/oradata/orcl/USERS01.DBF',
  '/u02/oradata/orcl/EXAMPLE01.DBF',
  '/u02/oradata/orcl/TEST.DBF',
  '/u02/oradata/orcl/TEST2.DBF'
CHARACTER SET ZHS16GBK
;
-- Commands to re-create incarnation table
-- Below log names MUST be changed to existing filenames on
-- disk. Any one log file from each branch can be used to
-- re-create incarnation records.
-- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2008_07_07/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2008_07_07/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2008_07_07/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2008_07_07/o1_mf_1_1_%u_.arc';
-- ALTER DATABASE REGISTER LOGFILE '/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2008_07_07/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
-- RECOVER DATABASE
--恢复数据库这条语句报错,其实数据实本也没有丢失,没必要做一次恢复操作
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
-- Commands to add tempfiles to temporary tablespaces.
-- Online tempfiles have complete space information.
-- Other tempfiles may require adjustment.
ALTER TABLESPACE TEMP ADD TEMPFILE '/u02/oradata/orcl/TEMP01.DBF' REUSE;
-- End of tempfile additions.
--
--     Set #2. RESETLOGS case

把恢复哪条语句去掉吧,本来也没有丢失数据,我在实验的时候有这知反而会报错,没有的正确。

保存一个sql语句文件,我是保存到/home/oracle/createcontrol.sql
最后在空闲例程状态下,执行/home/oracle/createcontrol.sql
在sqlplusw里执行保存的脚本,如
SQL> @/home/oracle/createcontrol.sql
ORACLE instance started.
Total System Global Area  167772160 bytes
Fixed Size                  1218316 bytes
Variable Size              88082676 bytes
Database Buffers           75497472 bytes
Redo Buffers                2973696 bytes
Control file created.

System altered.

Database altered.

Tablespace altered.

检查里面数据是否有丢失等等,如果没有丢失,证明数据库移植成功

以下是在服务器端加上监听配制,
在/u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora加上以下内容
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
      (SID_NAME = orcl)
    )
  )
LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
  )

重起监听程序
[oracle@localhost ~]$ lsnrctl stop
[oracle@localhost ~]$ lsnrctl start

在客户段配制文件tnsnames.ora 最后面加入如下内容:
LINUX =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = orcl)
      (SERVER = DEDICATED)
    )
  )

欢迎大家提出介意。由于此文时间仓足,有错别字的地方,敬请凉解。