oracle数据库的物理迁移

http://blog.csdn.net/chenxiaohua/article/details/4453764

 

 1.      概述

oracle数据库的维护过程中,经常涉及换主机什么的,在这种情况下,最好,最简单的办法就是将数据库相关的文件拷贝到另外一台主机,然后启起来。
数据库文件迁移,必须要求迁移后的新主机oracle软件版本和老的一样。

2.      数据库启动步骤和相关模式
要做数据库迁移,必须知道数据库启动的步骤和相关的模式。
数据库启动分为三步:加载初始化文件<SID>ini.ora,加载控制文件,加载数据库文件和打开数据库。

第一步:加载初始化文件
oracle9i
以后,数据库默会读取spfile<SID>.ora,这儿文件是一个二进制文件。我们可以在输入启动命令的时候,指定初始化文件的路径,如startup pfile="pfilesid.ora"或者startup spfile='spfilesid.ora'。但是二进制文件spfile只能通过alter system set paraname=paravalue来修改,而二进制文件,我们可以直接编辑。所以为了迁移的方便性,我们一般把pfile作为初始化文件迁移到新主机上。然后执行startup pfile='pfilesid.ora' nomount来启动数据库。初始化过程只需要pfile正确既可,如果提示了什么错误,可以编辑pfile,然后重新startup就可以了。

第二步:加载控制文件
控制文件的位置,是在初始化文件中定义的,加载初始化文件之后,可以通过alter systen set 来修改,也可以打开pfile直接修改。控制文件一般有三个,具体路径可以通过命令来查看show parameter control_files;如果路径不对,就用alter system set来修改,控制文件路径没问题之后,就可以加载控制文件了。命令是alter database mount。这样就加在控制文件了。
加载完控制文件之后,就可以通过一些命令来修改控制文件的参数,然数据库能正确地载入对应的数据文件。

第三步:加载数据库
加载控制文件之后,修改好数据文件路径,之后就可以执行命令alter database open来开启数据库了。
这样整个数据库启动过程完成了。

启动数据库三步对应的命令是:
初始化:startup pfile='pfilesid.ora' nomount
加载控制文件:alter database mount
加载数据库文件(完全启动数据库):alter database open

后面用一个示例来讲解一下。

3.      示例
环境描述,Oracle版本9i,主机环境red hat linux9,数据库实例名linuxdb

第一步:初始化数据库
先后从老主机上把初始化文件的pfile取到本地,获取pfilelinuxdb.ora放到$ORACLE_HOME/dbs目录。
打开pfilelinuxdb.ora文件,
修改*.background_dump_dest='/home/oracle/ora9/admin/linuxdb/bdump'指向的路径,并创建对应路径上的目录。
也可以修改控制文件的路径,但是我想用alter system命令来修改。
下面执行命令实例,加载初始化文件完成。

 

[oracle@localhost oracle]$ export ORACLE_SID=linuxdb
[oracle@localhost oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Sat Aug 15 23:25:56 2009

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to an idle instance.

SQL> startup pfile='/home/oracle/ora9/oracle/dbs/pfilelinuxdb.ora' nomount
ORACLE instance started.

Total System Global Area  236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
 
如果有错误,可以根据提示的错误信息,打开 pfilelinuxdb.ora ,修改对应的参数再重新加载。
加载成功以后,先创建一个 spfile 二进制文件,这样今后 alter system  修改的参数就可以直接写到二进制文件中。
SQL> create spfile from pfile='/home/oracle/ora9/oracle/dbs/pfilelinuxdb.ora';
SQL> alter system set control_files='/home/oracle/ora9/oradata/linuxdb/control01.ctl',
  2                                 '/home/oracle/ora9/oradata/linuxdb/control02.ctl',
  3                                 '/home/oracle/ora9/oradata/linuxdb/control03.ctl' scope=spfile;
alter system set control_files='/home/oracle/ora9/oradata/linuxdb/control01.ctl',
*
ERROR at line 1:
ORA-32001: write to SPFILE requested but no SPFILE specified at startup
 
注意由于不是从 spfile 启动的,所以还要重新送 spfile 启动,执行上面这个文件才能成功。
SQL> startup nomount
ORACLE instance started.
SQL> alter system set control_files='/home/oracle/ora9/oradata/linuxdb/control01.ctl',
  2                                 '/home/oracle/ora9/oradata/linuxdb/control02.ctl',
  3                                 '/home/oracle/ora9/oradata/linuxdb/control03.ctl' scope=spfile;

System altered.
 
这样控制文件的路径信息就写到了 spfile 中了,由于只在 spfile 生效,所以还得重新启动才行。
重新启动之后,就可以正确加载控制文件了。

第二步:加载控制文件
由于需要加载控制文件,如上命令的几个控制文件都必须从来主机上取到当前主机的对应目录。
由于上面已经加载了初始化文件,重新加载需要先关闭数据库。
顺序执行的命令是 shutdown,startup nomount,alter database mount 。示例如下:
SQL> shutdown
ORA-01507: database not mounted


ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.

Total System Global Area  236000356 bytes
Fixed Size                   451684 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
SQL> 
SQL> alter database mount
  2  ;
alter database mount
*
ERROR at line 1:
ORA-01990: error opening password file '/home/oracle/ora9/oracle/dbs/orapw'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
 
出错了,根据上面的错误信息,可以看出,是缺少密码文件。那么我们就创建密码认证文件吧,命令如下:
$cd $ORACLE_HOME/dbs
$orapwd password=chenli file=orapwlinuxdb
然后在执行 alter database mount 。这样加载控制文件就成功了。
后面我们还需要修改数据文件路径,然后加载数据文件。

第三步:加载数据文件
先看一下数据文件都是那些。
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/home/ora/ora9/oradata/linuxdb/system01.dbf
/home/ora/ora9/oradata/linuxdb/undotbs01.dbf
/home/ora/ora9/oradata/linuxdb/cwmlite01.dbf
/home/ora/ora9/oradata/linuxdb/drsys01.dbf
/home/ora/ora9/oradata/linuxdb/example01.dbf
/home/ora/ora9/oradata/linuxdb/indx01.dbf
/home/ora/ora9/oradata/linuxdb/odm01.dbf
/home/ora/ora9/oradata/linuxdb/tools01.dbf
/home/ora/ora9/oradata/linuxdb/users01.dbf
/home/ora/ora9/oradata/linuxdb/xdb01.dbf
/home/ora/tbspace/devbase_20090408.dbf
 
看到了,有 11 个数据文件。
然后,我们都把这些文件取过来到当前库的目录 /home/oracle/ora9/oradata/linuxdb
下面修改这些数据文件路径为新主机上的路径,命令如下。
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/system01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/system01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/undotbs01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/undotbs01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/cwmlite01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/cwmlite01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/drsys01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/drsys01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/example01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/example01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/indx01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/indx01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/odm01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/odm01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/tools01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/tools01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/users01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/users01.dbf';
alter   database   rename   file   '/home/ora/ora9/oradata/linuxdb/xdb01.dbf' to   '/home/oracle/ora9/oradata/linuxdb/xdb01.dbf';
alter   database   rename   file   '/home/ora/tbspace/devbase_20090408.dbf'  to   '/home/oracle/ora9/oradata/linuxdb/devbase_20090408.dbf';
 
现在可以加载数据文件了吧,先试一下。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-07446: sdnfy: bad value '/home/ora/ora9/admin/linuxdb/udump' for parameter
user_dump_dest.
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/home/ora/ora9/oradata/linuxdb/redo03.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
 
又报错了,根据错误信息我们可以知道, dump 参数和重做日志参数值不对,下面我们查看 dump 参数信息。
我们先后修改 dump 参数,修改前,我们先看一下 dump 参数,那些不正确。
SQL> show parameter dump 

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
background_core_dump                 string      partial
background_dump_dest                 string      /home/oracle/ora9/admin/linuxdb/bdump
core_dump_dest                       string      /home/ora/ora9/admin/linuxdb/cdump
max_dump_file_size                   string      UNLIMITED
shadow_core_dump                     string      partial
user_dump_dest                       string      /home/ora/ora9/admin/linuxdb/udump
 
看到了,有两个不正确,修改吧。
SQL> alter system set core_dump_dest='/home/oracle/ora9/admin/linuxdb/bdump' scope=spfile;

System altered.

SQL> alter system set user_dump_dest='/home/oracle/ora9/admin/linuxdb/bdump' scope=spfile;

System altered.
 
现在 dump 参数修改成功了,接着处理重做日志文件的问题。
重做日志提示的问题是,重做日志文件爱你路径不对。
先后看一下重做日志文件的路径。
SQL> Select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/home/ora/ora9/oradata/linuxdb/redo03.log
/home/ora/ora9/oradata/linuxdb/redo02.log
/home/ora/ora9/oradata/linuxdb/redo01.log
 
我们先把重做日志文件取到指定的目录 /home/oracle/ora9/oradata/linuxdb ,然后修改参数。
SQL> alter database rename file '/home/ora/ora9/oradata/linuxdb/redo01.log' to '/home/oracle/ora9/oradata/linuxdb/redo01.log';

Database altered.

SQL> alter database rename file '/home/ora/ora9/oradata/linuxdb/redo02.log' to '/home/oracle/ora9/oradata/linuxdb/redo02.log';

Database altered.

SQL> alter database rename file '/home/ora/ora9/oradata/linuxdb/redo03.log' to '/home/oracle/ora9/oradata/linuxdb/redo03.log';

Database altered.
 
修改成功了,现在可以加载数据库文件了。
SQL> Select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/home/oracle/ora9/oradata/linuxdb/redo03.log
/home/oracle/ora9/oradata/linuxdb/redo02.log
/home/oracle/ora9/oradata/linuxdb/redo01.log

SQL> alter database open;

Database altered.
 
现在数据库启动成功了,通过命令查看数据库中的表数据正确,数据库迁移成功。

4.      修改监听文件
虽然数据库迁移成功了,但是我们还需要启动监听才能让其他主机的用户连接到新的数据库。
打开$ORACLE_HOME/network/admin/listener.ora文件,内容如下:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /home/oracle/ora9/oracle)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = testdb)
      (ORACLE_HOME = /home/oracle/ora9/oracle)
      (SID_NAME = testdb)
    )
  )

 
修改之后的文件内容如下:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /home/oracle/ora9/oracle)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = testdb)
      (ORACLE_HOME = /home/oracle/ora9/oracle)
      (SID_NAME = testdb)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = linuxdb)
      (ORACLE_HOME = /home/oracle/ora9/oracle)
      (SID_NAME = linuxdb)
    )
  )

 
保存好之后,执行lsnrctl start结果如下:

[oracle@localhost admin]$ lsnrctl start

LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 14-AUG-2009 23:51:40

Copyright (c) 1991, 2002, Oracle Corporation.  All rights reserved.

Starting /home/oracle/ora9/oracle/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 9.2.0.4.0 - Production
System parameter file is /home/oracle/ora9/oracle/network/admin/listener.ora
Log messages written to /home/oracle/ora9/oracle/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 9.2.0.4.0 - Production
Start Date                14-AUG-2009 23:51:40
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  OFF
SNMP                      OFF
Listener Parameter File   /home/oracle/ora9/oracle/network/admin/listener.ora
Listener Log File         /home/oracle/ora9/oracle/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "linuxdb" has 1 instance(s).
  Instance "linuxdb", status UNKNOWN, has 1 handler(s) for this service...
Service "testdb" has 1 instance(s).
  Instance "testdb", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

 
根据上面打印出来的信息,监听启动成功了。

现在测试一下监听是否可以用。
在本地的tnsnames.ora中加入一个别名定义,内容如下:

 

linuxdb2 =
   (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.110)(PORT = 1521))
          (CONNECT_DATA =
        (SERVER = DEDICATED)
      (SERVICE_NAME = linuxdb)
   )
        )

 
然后在命令行中进行对tns进行测试,也测试监听配置是正确。

C:/Documents and Settings/Administrator>tnsping linuxdb2

TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 15-8月 -2009 22:37:59

Copyright (c) 1997, 2003, Oracle.  All rights reserved.

Used parameter files:
d:/oracle/product/10.1.0/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.
1.110)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = linuxdb)))
OK (30 msec)

 
根据上面的结果看得出,tns连接也会没问题的。
那么登录看一看呢。

C:/Documents and Settings/Administrator>sqlplus sys/chenli@linuxdb2 as sysdba

SQL*Plus: Release 10.1.0.2.0 - Production on 星期六 8月 15 22:40:58 2009

Copyright (c) 1982, 2004, Oracle.  All rights reserved.


Connected to:
Oracle9i Release 9.2.0.4.0 - Production
JServer Release 9.2.0.4.0 - Production

SQL>

 
成功,所有的都已经ok

5.      总结
物理迁移数据库还必须一步一步得进行,其实要完成真个动作,可以分为4步骤。
1.
修改初始化文件,初始化数据库,startup nomount。保证nomount成功。
2.
载入控制文件,alter database open,保证在初始化文件中,控制文件的路径正确。
3.
加载数据文件,包括重做日志文件,alter database open,需要保证所有的数据文件路由正确并且有效。
4.
修改监听文件,开启监听。

 

猜你喜欢

转载自gcc2ge.iteye.com/blog/2194745