`

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.
修改监听文件,开启监听。

 

分享到:
评论

相关推荐

    oracle 数据库数据迁移解决方案

     针对物理迁移,也即通过RMAN备份来进行还原并应用归档的方式(这里不讨论通过dd方式进行的冷迁移),虽然注意的是要将数据库设为force logging的方式,在用RMAN做全备之前,一定要执行:  否则可能会产生坏块。 ...

    Oracle空间数据库的迁移

    讲述Oracle空间数据库的物理迁移和Oracle空间数据库的逻辑迁移。十分精辟

    Oracle数据库迁移之物理迁移

    ORACLE数据库迁移有多种,先从物理迁移实验做起。  物理迁移比较简单,但是要求两个库的版本必须一样,且必须事先记录要迁移的库的SID、归档模式、数据文件、日志文件、控制文件、参数文件和密码文件。  迁移...

    Oracle数据库迁移相关技巧介绍

    Oracle数据库的迁移流程为:在迁移之前,写好方案,特别是实施的方案步骤一定要写清楚,然后进行完整的测试。针对物理迁移,也即通过RMAN备份来进行还原并应用归档的方式(这里不讨论通过dd方式进行的冷迁移),虽然...

    Oracle数据库执行计划

    Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义, 而是系统自己给加上的。...一旦一行数据插入数据库,则rowid在该行的生命周期内是唯一的,即使该行产生行迁移,行的rowid也不会改 变。

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    11.5.3将快照Standby数据库转换为物理Standby数据库 11.6主备数据库切换 11.6.1 Switchover切换 11.6.2 Failover切换 11.7本章小结 第12章 RAC备份 12.1备份与恢复基础 12.1.1备份和恢复解决方案 12.1.2...

    oracle数据库dba管理手册

    1.8.4 典型数据库物理设计 24 1.9 逻辑模型约定 25 1.9.1 一对一关系 25 1.9.2 一对多关系 26 1.9.3 多对多关系 26 1.10 创建数据库 27 1.10.1 修改创建模板的脚本文件 27 1.10.2 创建数据库后修改 MAXDATAFILES 27...

    数据库设计软件BDB 2007(for Oracle/SQLServer/MySQL/Access/SQLAnywhere) V2.1

    8、数据库物理结构定义和实体数据库之间的比对更新、同步。 9、可为可重用属性创建数据字典定义、并进行同步。 10、采用方案定义、支持多个工程模式。 11、提供自定义功能、可以根据需要扩展数据库结构定义文件。 12...

    数据库设计/自动安装工具BDB 2007 V2.3(For Oracle/MS SQLServer/Access/MySQL/SQLAnyWhere/Sybase)

    开放的数据库物理结构文件格式、并提供外部调用源程序, 包含C#、Delphi、JAVA三个版本。 8、数据库物理结构定义和实体数据库之间的比对更新、同步。 9、可为可重用属性创建数据字典定义、并进行同步。 ...

    数据库设计和数据库部署工具BDB 2007 Pro V2.3

    开放的数据库物理结构文件格式、并提供外部调用源程序, 包含C#、Delphi、JAVA三个版本。 8、数据库物理结构定义和实体数据库之间的比对更新、同步。 9、可为可重用属性创建数据字典定义、并进行同步。 10、采用方案...

    数据库设计和部署软件BDB 专业版V2.6

    BDB是贝恩软件... 开放的数据库物理结构文件格式(XML标准格式),并提供了外部调用数据库结构源程序 (包含C#/Delphi/JAVA三个版本)。 &lt;br&gt;11,支持多语言。 可根据需要增加新的语言包。

    使用RMAN迁移数据库到异机

    使用RMAN迁移数据库属于数据库的物理备份与恢复范畴,整个过程中数据库的相关信息是完整地镜像。因此,基于此种方式还原恢复的数据库用于测试会使得与真实的生产环境差异相对较小。本文描述了使用RMAN来还原Oracle ...

    BDB 2007数据库开发工具

    开放的数据库物理结构文件格式、并提供外部调用源程序, 包含C#、Delphi、JAVA三个版本。 8、数据库物理结构定义和实体数据库之间的比对更新、同步。 9、可为可重用属性创建数据字典定义、并进行同步。 ...

    如何快速转移Oracle中海量数据

    这两种方法转移数据时没有用SGA里数据缓冲区和事物处理的回滚段, 也不写联机事物日志,就象数据库装载工具Solload一样直接把数据写到物理文件,速度是很快的。在Oracle8i以后的版本都可以使用。

    数据库设计工具BDB 2007 V2.0

    开放的数据库物理结构文件格式、并提供外部调用源程序,包含C#、Delphi、JAVA三个版本。 8、数据库物理结构定义和实体数据库之间的比对更新、同步。 9、可为可重用属性创建数据字典定义、并进行同步。 10、...

    数据库设计和自动安装工具BDB V2.2(for Oracle/MS SQLServer/MySQL/Access/SQLAnywhere/Sybase)

    开放的数据库物理结构文件格式、并提供外部调用源程序, 包含C#、Delphi、JAVA三个版本。 8、数据库物理结构定义和实体数据库之间的比对更新、同步。 9、可为可重用属性创建数据字典定义、并进行同步。 ...

    数据库设计和部署软件BDB 个人版V2.6

    BDB是贝恩软件... 开放的数据库物理结构文件格式(XML标准格式),并提供了外部调用数据库结构源程序 (包含C#/Delphi/JAVA三个版本)。 &lt;br&gt;11,支持多语言。 可根据需要增加新的语言包。

    [手工整理]208个Oracle安装文档,包含各个平台各个版本的单实例RAC以及DataGuard(1).xlsx

    83 OceanStorF面向Oracle数据库OLAP最佳实践 84 OEM Cloud Control 13.3 Installation on Oracle Linux 85 OEM Cloud Control 13.3 on Oracle Linux 7 静默安装 86 OGG goldengate安装文档 87 OGG oracle12c_...

Global site tag (gtag.js) - Google Analytics