`

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空间数据库的迁移

    Oracle数据库因其强大的功能和稳定性,被广泛应用于地理信息系统(GIS)和其他需要处理空间数据的场景。本篇文章将深入探讨Oracle空间数据库的物理迁移和逻辑迁移,帮助你理解和掌握这两种方法。 一、Oracle空间...

    oracle数据库迁移

    在 Oracle 中,表空间是指数据库中存储数据的物理存储空间。可以通过 CREATE TABLESPACE 命令创建表空间。例如,CREATE TABLESPACE PMS_DATA DATAFILE '/home/oracle/tablespaces/PMS_DATA.dbf' SIZE 10240M UNIFORM...

    oracle项目--DataBase Migration(数据库迁移)PPT

    Oracle数据库迁移项目是IT行业中常见的任务,涉及到将数据和结构从一个数据库系统迁移到另一个,例如从SQL Server迁移到Oracle。以下是对四种数据库迁移方案的详细说明: **方案一**: 此方案主要依赖于手动操作和...

    基于Linux和虚拟化平台的Oracle数据库迁移.pdf

    基于Linux和虚拟化平台的Oracle数据库迁移是指将Oracle数据库从Windows操作系统迁移到基于Linux和虚拟化平台的操作系统,以提高系统的性能、可靠性、稳定性和安全性。这种迁移方案可以满足医院业务系统对性能、可靠...

    Oracle数据库数据迁移整理.pdf

    Oracle数据库数据迁移是一个复杂的过程,涉及多个步骤和组件,确保数据在迁移过程中的一致性、完整性和可用性。以下是对标题和描述中所提及的知识点的详细解释: 1. **概述**: - 迁移的目标是将一个Oracle数据库...

    Oracle 数据库Storage存储迁移笔记

    在Oracle中,存储迁移可以通过多种方式进行,例如使用RMAN(恢复管理器)进行物理迁移,或者通过导出导入(expdp/impdp)工具进行逻辑迁移。RMAN提供了备份和恢复的强大功能,而逻辑迁移则允许在不同表空间之间移动...

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

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

    Oracle数据库迁移之物理迁移

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

    Oracle数据库数据迁移技术研究.pdf

    Oracle数据库数据迁移技术是企业在系统升级或转型过程中不可或缺的关键步骤,尤其在电信、银行等对数据连续性要求极高的行业中,不停库的数据迁移显得尤为重要。本文主要探讨Oracle数据库的数据迁移技术,包括各种...

    oracle数据库迁移-精选.pdf

    物理迁移通常包括加载初始化文件、控制文件、数据库文件和最后启动数据库。确保控制文件路径正确至关重要,否则可能导致迁移失败。 在实践中,例如将数据库从文件系统迁移到ASM磁盘组,ASM(Automatic Storage ...

    Oracle数据库试题100题(附答案)

    Oracle数据库是甲骨文公司推出的一个功能强大的关系数据库管理系统,它广泛应用于金融、电信、制造等行业。Oracle数据库试题能够帮助相关岗位的应聘者或者数据库管理人员加深对Oracle数据库的理解。本次提供的100题...

    oracle数据库数据文件迁移的方法1

    ### Oracle数据库数据文件迁移的方法详解 #### 背景与目的 在Oracle数据库管理中,随着业务的增长,可能会遇到磁盘空间不足的情况。此时,为了确保业务连续性和数据安全性,通常需要将某些数据文件迁移到其他存储...

    Oracle数据库备份与恢复.pdf

    Oracle数据库提供了多种备份方法,包括物理备份和逻辑备份。 ##### 1. 物理备份 物理备份是指直接复制数据库的物理文件,如数据文件、控制文件和重做日志等。这种备份方式保留了数据库的物理结构和内容,可以快速...

    ORACLE数据库迁移1

    ORACLE 数据库迁移指南 在 ORACLE 数据库迁移过程中,有多种方法可以选择,本文将介绍三种常用的迁移方案:exp/imp 方案、expdp/impdp 方案和 RMAN 方案。每种方案都有其优缺,选择哪种方案取决于实际情况。 exp/...

    Oracle数据库基于XTTS技术的数据库迁移技术探讨.pdf

    在 XTTS 技术中,TTS 技术是 Oracle 8i 开始引入的基于表空间传输的物理迁移方法,仅支持相同平台、相同块大小之间的表空间传输。XTTS 技术是在 TTS 基础上做了一些更新,支持了跨平台、不同块大小、增量备份等功能...

    Oracle数据库中行迁移、行链接的问题

    在Oracle数据库中,行迁移(Row Migration)和行链接(Row Chaining)是两种与数据存储和空间管理紧密相关的现象。这两个概念对于理解和优化数据库性能至关重要。 行迁移是指当一个数据库行在一个分配的块中无法...

    Oracle数据库迁移方案

    Oracle数据库迁移方案是一项复杂的技术任务,涉及到数据库的多个核心概念,如数据库名、SID、域名、服务名以及网络服务名。以下是对这些关键概念的详细解释: 1. **数据库名** (DB_NAME): 这是数据库的唯一标识,...

    ORACLe数据库管理员教程

    Oracle数据库管理员还需要熟悉诸如SQL*DBA、SQL*Loader、Export & Import等工具,它们分别用于数据库管理、数据导入导出和数据迁移。通过学习这些工具的使用,DBA可以更有效地进行数据库维护和管理。 为了深入学习...

    ORACLE数据库跨平台迁移的方法.pdf

    1. **物理迁移**:这种方法涉及直接复制数据库文件(如控制文件、数据文件、日志文件等)到Linux系统,然后启动新的数据库实例。这种方法适用于小规模数据库,但可能不适用于大规模或复杂的环境,因为可能需要处理...

Global site tag (gtag.js) - Google Analytics