oracle数据库的物理迁移

http://www.cnblogs.com/neozhu/archive/2007/04/25/726903.html

http://www.jz123.cn/text/0629019.html

http://database.51cto.com/art/201003/190606.htm

在ORACLE中移动数据库文件

在ORACLE中移动数据库文件

--ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成。
--由于磁盘空间的变化,或者基于数据库磁盘I/O性能的调整等,
--我們可能会考虑移动数据库文件。
--下面以LUNIX平台为例,分别讨论三种数据库文件的移动方法。

一.移动数据文件:
-- 可以用ALTER DATABASE,ALTER TABLESPACE两种方法移动数据文件。

1. ALTER DATABASE方法;
-- 用此方法,可以移动任何表空间的数据文件。

STEP 1. 下数据库:
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> SHUTDOWN;
SQL> EXIT;

STEP 2.用操作系统命令移动数据文件:
-- 将数据文件 'test.ora' 从/ora/oracle/data1目录移动到/ora/oracle/data2目录下:
$ mv /ora/oracle/data1/test.ora /ora/oracle/data2

STEP 3. Mount数据库,用ALTER DATABASE命令将数据文件改名:
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE RENAME FILE '/ora/oracle/data1/test.ora' TO '/ora/oracle/data2/test.ora';

STEP 4. 打开数据库:.
SQL> ALTER DATABASE OPEN;
SQL>SELECT NAME,STATUS FROM V$DATAFILE;

2. ALTER TABLESPACE方法:
-- 用此方法,要求此数据文件既不属于SYSTEM表空间,也不属于含有ACTIVE回滚段或临时段的表空间。

STEP1. 将此数据文件所在的表空间OFFLINE:
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> ALTER TABLESPACE test OFFLINE;
SQL> EXIT;

STEP2. 用操作系统命令移动数据文件:
将数据文件 'test.ora' 从/ora/oracle/
data1目录移动到/ora/oracle/data2目录下:
$ mv /ora/oracle/data1/test.ora /ora/oracle/data2

STEP3. 用ALTER TABLESPACE命令改数据文件名:
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> ALTER TABLESPACE test RENAME DATAFILE '/ora/oracle/data1/test.ora' TO '/ora/oracle/data2/test.ora';

STEP4. 将此数据文件所在的表空间ONLINE:
SQL> ALTER TABLESPACE test ONLINE;
SQL> SELECT NAME,STATUS FROM V$DATAFILE;

二. 移动控制文件:

-- 控制文件 在 INIT.ORA文件中指定。移动控制文件相对比较简单,下数据库,
-- 编辑INIT.ORA,移动控制文件,重启动数据库。

STEP 1. 下数据库:
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> SHUTDOWN;
SQL> EXIT;

STEP 2.用操作系统命令 移动控制文件:
--将控制文件'ctl3orcl.ora' 从/ora/oracle/data1目录移动到/ora/oracle/data2目录下:
$ mv /ora/oracle/data1/ctrlorcl3.ora /ora/oracle/data2

STEP 3. 编辑INIT.ORA文件:
INIT.ORA文件的在$ORACLE_HOME/dbs目录下,
修改参数 "control_files",其中指定移动后的控制文件:
control_files = (/ora/oracle/data1/ctrlorcl1.ora,/ora/oracle/data1/ctrlorcl2.ora,/ora/oracle/data2/ctrlorcl3.ora)

STEP 4. 重启动数据库:
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> STARTUP;
SQL>SELECT name FROM V$CONTROLFILE;
SQL> EXIT;


三. 移动联机日志文件:
STEP 1. 停数据库:
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> SHUTDOWN;
SQL> EXIT;

STEP 2. 用操作系统命令移动联机日志文件:
--将联机日志文件'redolog1.ora' 从/ora/oracle/data1目录移动到/ora/oracle/data2目录下:
$ mv /ora/oracle/data1/redolog1.ora /ora/oracle/data2

STEP 3. Mount数据库,用ALTER DATABASE 命令改联机日志文件名:.
$ sqlplus /nolog
SQL> CONNECT INTERNAL;
SQL> STARTUP MOUNT ;
SQL> ALTER DATABASE RENAME FILE '/ora/oracle/data1/redolog1.ora' TO '/ora/oracle/data2/redolog1.ora';

STEP 4.重启动数据库: .
SQL> ALTER DATABASE OPEN;
SQL>SELECT MEMBER FROM V$LOGFILE;

 

按Oracle原理,启动过程分为三个步骤nomount/mount/open.
PHASE0:nomount前,即数据库完全关闭了.
此时可以将数据库control files/data files/redo log files在OS下用mv命令任意移动(实际上,只要未被open的文件都是可以mv的),然后根据各种file location在Oracle中的存放位置,采用不同的方式来告诉Oracle:"偶已将原文件移动到另一个地方了".
其中初始参数文件中的control_files参数指定了具体的control file的location.所以移动了control file可在参数文件被open前直接改参数值Oracle就明白了.(PFILE/SPFILE的具体使用此处不多累赘).

PHASE1:nomount阶段. 打开了初始参数文件和backupground_dump_dest下的   alert_sid.log和background processes 的trace files.


PHASE2:mount阶段是打开了control file.
control file中存放的东东如下:
?6?1 Database name and identifier
?6?1 Time stamp of database creation
?6?1 Tablespace names
?6?1 Names and locations of data files and redo log files
?6?1 Current redo log file sequence number
?6?1 Checkpoint information
?6?1 Begin and end of undo segments
?6?1 Redo log archive information
?6?1 Backup information
所以偶们在PHASE0中所做操作就得在PHASE3真正open这些文件之前,告诉Oracle(因为信息记录在control file中,所以又得在PHASE2中,control file被open后做),偶们已改了file location.
于是可用alter database的data file clause或log file clause的rename 命令来更新control file,于是Oracle会在PHASE3时,到新file location去找相应的文件.

PHASE3:open阶段打开所有非offline的data files和redo log files.
因为文件已打开了.所以此时,只能对已经offline或还可以offline的文件作rename操作.原理也是通过更新control file中的内容来告诉Oracle:File location has been changed.

分类: oracle
 

Oracle整库文件迁移

今天的一个故障处理记录,客户的oracle双机发生切换,客户端也连接不上,原因未知,从主机上看是虚拟内存不够,整机都是在跑oracle,看情形应该从oracle上找原因。

远程连接过去之后,从alter<sid>.log发现由于磁盘空间不足,导致无法响应,必须切换到备机。

我想磁盘不足,一般都是清理下归档就行了,现在的应用一般把归档占用的很大,记得及时备份和删除就行了。

用df看了就有点愣住了,机子上有3个共享盘,分别是/oracle,/oradata,/orarc

有问题的是/oracle,已经94%了,只能把它干掉一部分内容才行,其他2个的空间还非常多。

/oracle下面主要有admin,记录3个实例的数据,按说也没有这么大量的数据(有20G空间),只好通过du -s查看确认下。

搞鬼的地方出来了,竟然在/oracle/下面还有一个oradata目录,然后有人把库建立到/oracle/oradata下面了

很显然是放错地方了,调整一下就Ok

剩下的就简单了,很多人都做过这种操作,先和客户沟通把数据库shutdown,再通过alter database更改控制文件就行。

具体过程记录如下:
$env | grep ORACLE_SID (由于有3个实例,确认下操作对象)

$sqlplus “/as sysdba”

--准备一份新的pfile启动文件
SQL> create pfile from spfile;
  
--主要是修改控制文件的启动位置
SQL> host vi $ORACLE_HOME/dbs/init<SID>.ora
  
--删除原来的启动spfile文件
SQL> host mv $ORACLE_HOME/dbs/spfile<SID>.ora $ORACLE_HOME/dbs/spfile<SID>.bak
  
SQL> shutdown immediate
--... 耐心等待 ...
  
--拷贝所有数据文件,作为一个冷备份
SQL> host cp /oracle/oradata/sid/* /oradata/sid/
  
--默认会用新的pfile启动,就是刚才编辑的$ORACLE_HOME/dbs/init<SID>.ora
--启动到mount状态
SQL> startup mount
  
--用select name from v$datafile 查看所有的数据文件
--用select name from v$tempfile 查看临时文件
--用select member from v$logfile 查看日志文件
--依次操作所有文件,比如system,sysaux...
SQL> alter database rename file '/oracle/oradata/sid/system01.dbf'  to  '/oradata/sid/system01.dbf' ;
  
--正常open数据库
SQL> alter database open
  
--建立启动的spfile文件
SQL> create spfile from pfile;
  
sql> exit

启动后,测试业务正常。把占地方的/oracle/oradata找个空地放着,防止后期还有故障还能回退。

  http://www.zhanggang.net/y2010/38432.html
 
  http://big1102.blog.163.com/blog/static/22373335201122294738688/?fromdm&fromSearch&isFromSearchEngine=yes
 

Oracle数据库迁移可以从一个版本迁移到另一个版本(即升级),也可以从一个主版本迁移到另一个主版本(即移植),例如从Oracle7迁移到Oracle8。可以从一个系统平台迁移到另一个系统平台,例如从Windows系统迁移到Linux系统。也可以从非Oracle数据库迁移到Oracle数据库,例如从MS SQL Server迁移到Oracle数据库。

在低版本数据库向高版本数据库转换以及两个不同数据库之间进行转换时,数据库中的数据(包括结构定义)需要被转移并使之正常运行,对于中小型数据库,如FoxPro中的*.dbf,这种迁移非常简单,一般只需通过简单的Copy就能完成。但对于大型数据库系统,如Oracle数据库,数据迁移就不那么简单了,它需要利用一定的技术和经验,有步骤地按计划完成。

Oracle数据库迁移步骤:

1.实施数据迁移前,需要做好以下几个方面工作:进行完全数据备份、确定数据迁移方案、安装和配置软硬件等。

2.按照确定的数据迁移方案,正式实施数据迁移。

3.按照数据迁移测试方案,测试数据迁移效果,并对数据迁移后的数据库参数和性能进行调整,使之满足数据迁移后实际应用系统的需要。

4.将实际应用系统的应用软件移植到数据迁移后的数据库系统上,并使之正常运行。

5.正式实施数据迁移成功并且数据库参数和性能达到要求后,就可以正式运行应用系统,并投入实际使用。

Oracle数据库迁移实例

我校图书馆采用清大新洋公司GLIS 8.0版的图书馆管理系统软件,数据库采用Oracle,操作系统为Windows 2000 Server,数据库服务器采取RAID冗余备份,运行模式是7×24小时制,数据库的数据文件量为2.45GB。服务器的升级需要从Windows 2000 Server 平台把数据库迁移到RedFlag.Linux DC 4.0平台。为了实现数据库的平稳迁移,我们使用了如下两种策略方式。

1.使用导入/导出工具(Export/ Import)

Oracle导入/导出工具(Export/Import)主要是用来对数据库进行逻辑备份,利用Export导出数据库的转储二进制文件作为数据库Import输入,从而达到移植的目的。

当需要从一个非PC的系统平台迁移数据库时,导入/导出方式是一种非常有用的策略。当然,相同系统平台的数据迁移,导入/导出方式同样适用。图书馆数据库系统采用导入/导出方式迁移Oracle8l7 for Windows 2000到Oracle8l7 for Linux数据库的操作步骤如下。

(1)以正常方式关闭Windows 2000系统的Oracle817数据库系统,不要立即终止或者异常终止,然后冷备份数据库。打开数据库,使用导出工具(Export Utility)进行数据库的完全导出。

D:\>exp system/manager full=y inctype=complete constraints=y

file=full_exp_filename.dmp

(2)在RedFlag-Linux DC 4.0系统上安装Oracle8i数据库软件,并创建启动数据库。使用FTP,将文件传输到RedFlag.Linux DC4.0计算机。必须使用FTP的binary传输模式,否则,可能造成读导出转储文件错误。

(3)在RedFlag-Linux DC 4.0中使用安装数据时创建的0racle用户登录,使用导出转储文件,执行到目标数据库完全的导入。

【Oracle@RedFlagDC Oracle】#imp system/manager full=y file=full_exp_filename.dmp

注意:如果导出用户拥有DBA权限,则导入用户也必须拥有DBA权限。查看导入日志文件,确认数据库导入执行成功。

2.使用SQL*Loader工具

SQL*Loader可以将ASCII文件中的数据装入Oracle数据库,采用SQL Loader工具将数据迁到Oracle数据库的一般步骤如下:

(1)在Windows 2000操作系统端,进入SQL*PLUS运行脚本程序,如loaddata.sql sqlplus>@ loaddata.sql

(2)通过loaddata.sql脚本程序建立一个不带换码符、标题、字段名的纯数据文件,便于sql* load使用,基本内容如下:

spool a.txt

(将查询结果存入文件a.txt)

set newpage 0

(发送换页,清屏)

set space 0

(设置输出列间空格数)

set linesize 999

(一行上显示的字符数)

set pagesize 0

(禁止各种格式化信息,如标题、页中断、题目等)

set echo off

(禁止列出命令)

set feedback of

(禁止显示查询结果的记录数信息)

set heading off

(禁止打印列标题)

select * from a:

spool out

(停止假脱机)

(3)安装Oracle8i数据库,并创建一个数据库作为目标数据库。添加所需的表空间和用户到目标数据库中。安装所需的Net8软件,并配置用于连接数据库的别名。

(4)使用文本文件编辑器创建控制文件,如dataload.ctl。在命令行下使用sqlldr命令装载数据文件。

Sqlldr username/password control=dataload.ctl logfile= dataload.1og

验证数据是否正确装载。

小结

利用Oracle的Oracle导入/导出工具(Export/Import),除了可进行数据库逻辑备份、数据库移植,还可以用来提高数据库的性能:对数据库进行一次导入/导出操作能重新组织数据,消除数据库的碎片,从而使数据库的性能有较大的提高。而SQL* Loader是一个Oracle的类属实用程序,几乎能被用来装载任何类型的数据,支持直接路径装载和并行装载能力,因此,在我院图书管数据库迁移实际工作中运用了这两种方法,是非常通用和实用的程序。

以上就是对Oracle数据库迁移的详细介绍。

 

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命令来修改。
下面执行命令实例,加载初始化文件完成。

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

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。示例如下:

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。这样加载控制文件就成功了。
后面我们还需要修改数据文件路径,然后加载数据文件。

第三步:加载数据文件
先看一下数据文件都是那些。


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

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

 

一 原始信息记录及复制

  1.记录欲迁移库的sid,是否为归档模式(查看方法:以sys用户登入sqlplus后运行archive log list,建库时默认为非归档模式)以及如下文件的存放位置:参数文件,密码文件,控制文件,日志文件,数据文件

  参数文件存放在oracle\ora92\database目录下,名为

  SPFILE<sid>.ORA,例如SPFILEZJDB.ORA

  密码文件一般与参数文件存放在同一目录,名为PWD<sid>.ora,例如PWDzjdb.ora

  控制文件的位置和个数可通过查看参数文件获得,参数文件中有这样一行文字:

  *.control_files='E:\oradata\zjdb\control01.ctl','E:\oradata\zjdb\control02.ctl','E:\oradata\zjdb\control03.ctl'

  注意:不要用记事本打开参数文件,那样会破坏其格式,用写字板之类的打开,并且打开前先备份一个

  数据文件与日志文件存放的位置根据具体情况而定,一般在oradata\以实例名为名称的目录\,控制文件的位置一般也在这个目录下

  2 复制这些文件到目标主机上

  ?

  二 建立新数据库

  1 在目标主机上建个与原主机位置相同的文件夹,例如pme上所有数据文件,日志文件,控制文件均存放在E:\oradata\zjdb下,

  则在目标主机上建E:\oradata\zjdb目录

  2.在目标主机上用Database Configuration Assistant(即dbca)建立一个新的数据库,SID与原有库相同,其它各步可选用默认选项(注意是否归档模式需与原库保持一致)

  3 建好库以后,先备份一下新库的参数文件,密码文件,控制文件,日志文件,数据文件,以防迁移不成功恢复这个新库用

  4 以sys用户登入sqlplus,关闭数据库——shutdown immediate

  5 用原库的参数文件,密码文件,控制文件替换新库的相应文件

  并编辑参数文件中的如下项为实际位置

  *.background_dump_dest='F:\oracle\admin\zjdb\bdump'

  *.control_files='E:\oradata\zjdb\control01.ctl','E:\oradata\zjdb\control02.ctl','E:\oradata\zjdb\control03.ctl'

  *.core_dump_dest='F:\oracle\admin\zjdb\cdump'

  *.user_dump_dest='F:\oracle\admin\zjdb\udump'

  注意保证参数文件的格式不要被破坏

  6.将原库的所有数据文件和日志文件拷过去替换新库的相应文件(新库中只有oracle初始化建的数据文件,而原库中有我们自己建的数据文件,要将这些也拷过去,主要就是为了迁移这些数据)

  迁移完毕

  ?

  三 启动新库

  命令行下:

  Set oracle_sid=新库sid

  Sqlplus /nolog

  Conn /as sysdba

  会提示已连接到空闲例程

  SQL> startup nomount

  ORACLE 例程已经启动。

  Total System Global Area? 135338868 bytes

  Fixed Size?????????????????? 453492 bytes

  Variable Size???????????? 109051904 bytes

  Database Buffers?????????? 25165824 bytes

  Redo Buffers???????????????? 667648 bytes

  SQL>

  出现上面的字幕说明参数文件没有问题

  若提示ORA-600说明参数文件格式出问题了或者内容有问题,检查之前步骤

  startup nomount成功后

  运行create pfile from spfile;

  创建后运行 alter database mount;

  成功的话说明找到控制文件了

  成功后运行alter database open;

  成功的话说明迁移成功http://oracle.chinaitlab.com/backup/744893_2.html

 

 

你可能感兴趣的:(oracle数据库的物理迁移)