环境说明:
1、windows 2008R2 64位
2、oracle 11g R2 11.2.0.1.0
3、有一个数据库名为ceshi的数据库,数据文件位于D:\app\Administrator\oradata\ceshi目录下。我们计划将该目录下所有数据文件,临时文件、联机日志文件、控制文件全部迁移到E:\oracledataceshi目录下
基本步骤:
1、备份spfile文件,以备操作失败后使用该备份打开数据库
2、关闭数据库,手动拷贝控制文件到新目录下,启动数据库到nmount状态,更改control_files参数,将控制文件指向新的目录
3、重启数据库到mount,将所有文件拷贝到目标目录下
4、保持数据库在mount状态,将所有数据文件、联机日志、临时文件rename到新的目录
5、启动数据库到open状态,进行验证
详细步骤
1、备份spfile文件,以备操作失败后使用该备份打开数据库
C:\Users\Administrator>set oracle_sid=ceshi
C:\Users\Administrator>sqlplus “/as sysdba”
SQL*Plus: Release 11.2.0.1.0 Production on 星期五 4月 17 11:31:50 2020
Copyright © 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> create pfile=‘e:\b.ora’ from spfile;
文件已创建。
2、关闭数据库,手动拷贝控制文件到新目录下,启动数据库到nmount状态,更改control_files参数,将控制文件指向新的目录
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 4275781632 bytes
Fixed Size 2182592 bytes
Variable Size 2298479168 bytes
Database Buffers 1962934272 bytes
Redo Buffers 12185600 bytes
SQL>ho copy D:\app\Administrator\oradata\ceshi\control01.ctl E:\oracledataceshi\control01.ctl
已复制 1 个文件。
SQL>ho copy D:\app\Administrator\oradata\ceshi\control02.ctl E:\oracledataceshi\control02.ctl
已复制 1 个文件。
SQL> alter system set control_files=‘E:\oracledataceshi\control01.ctl’, ‘E:\oracledataceshi\control02.ctl’ scope=spfile;
SQL> shutdown immediate;
3、拷贝所有数据文件到新的目录下
SQL> @e:\transfer_db_files.sql
通过脚本,由transfer_db_files.sql脚本生成拷贝数据文件的脚本cp_files.sql
其中transfer_db_files.sql脚本内容如下:
Prompt
Prompt Step 1, Coping file to destination from source
Prompt ============================================
Prompt
set linesize 200
set heading off verify off feedback off termout off pagesize 999
define src_dir=‘D:\APP\ADMINISTRATOR\ORADATA\CESHI’
define tar_dir=‘E:\oracledataceshi’
spool e:\cp_files.sql
SELECT ‘ho copy ’ || name || ’ ’ || REPLACE (name,’&src_dir’,’&tar_dir’) FROM vKaTeX parse error: Double superscript at position 55: …' || name || ' '̲ || REPLACE (na…tempfile
UNION ALL
SELECT ‘ho copy ’ || MEMBER || ’ ’ || REPLACE (MEMBER,’&src_dir’,’&tar_dir’) FROM v$logfile;
spool off;
要注意数据库中保存的原目录都是大写字母表示,因此我们src_dir参数赋值是一定要是大写字母,否则替换时找不到对应目录就无法替换
生成的cp_files.sql脚本内容如下:
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\SYSTEM01.DBF E:\oracledataceshi\SYSTEM01.DBF
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\SYSAUX01.DBF E:\oracledataceshi\SYSAUX01.DBF
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\UNDOTBS01.DBF E:\oracledataceshi\UNDOTBS01.DBF
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\USERS01.DBF E:\oracledataceshi\USERS01.DBF
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\YU.DBF E:\oracledataceshi\YU.DBF
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\TEMP01.DBF E:\oracledataceshi\TEMP01.DBF
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\REDO03.LOG E:\oracledataceshi\REDO03.LOG
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\REDO02.LOG E:\oracledataceshi\REDO02.LOG
ho copy D:\APP\ADMINISTRATOR\ORADATA\CESHI\REDO01.LOG E:\oracledataceshi\REDO01.LOG
执行cp_files.sql脚本完成数据文件、日志文件、临时文件的拷贝
SQL> @e:\cp_files.sql
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
已复制 1 个文件。
SQL>
4、保证数据库mount状态,将所有数据文件、联机日志、临时文件rename到新的目录
由脚本rename_cntl.sql生成update_cntl.sql脚本,update_cntl.sql脚本中是renmae所有数据文件的命令。
SQL> @e:\rename_cntl.sql
set termout on
Prompt
Prompt Step 2, updating files to control file
Prompt ============================================
Prompt
set termout off
set linesize 200
set heading off verify off feedback off termout off pagesize 999
define src_dir=‘D:\APP\ADMINISTRATOR\ORADATA\CESHI’
define tar_dir=‘E:\oracledataceshi’
spool e:\update_cntl.sql
SELECT ‘alter database rename file ‘’’
|| name
|| ‘’’ to ‘’’
|| REPLACE (name, ‘&src_dir’, ‘&tar_dir’)
|| ‘’’’
|| ‘;’
FROM vKaTeX parse error: Expected 'EOF', got '&' at position 135: …EPLACE (name, '&̲src_dir', '&tar…tempfile
UNION ALL
SELECT ‘alter database rename file ‘’’
|| MEMBER
|| ‘’’ to ‘’’
|| REPLACE (MEMBER, ‘&src_dir’, ‘&tar_dir’)
|| ‘’’’
|| ‘;’
FROM v$logfile;
spool off;
set termout on;
最后执行update_cntl.sql脚本完成文件的rename工作
@e:\update_cntl.sql
set heading on verify on feedback on termout on
为了执行脚本时每一步骤都是成功的,所以我们将脚本分成了多个
,其实为了方便,可以将3、4步骤所有的脚本都写到一个脚本文件中,执行一次就可以。
5、启动数据库到open状态,进行验证
SQL> select member from v$logfile;
E:\ORACLEDATACESHI\REDO03.LOG
E:\ORACLEDATACESHI\REDO02.LOG
E:\ORACLEDATACESHI\REDO01.LOG
已选择3行。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 4275781632 bytes
Fixed Size 2182592 bytes
Variable Size 2298479168 bytes
Database Buffers 1962934272 bytes
Redo Buffers 12185600 bytes
数据库装载完毕。
数据库已经打开。
SQL>
以上就完成了所有的数据文件、联机日志、临时文件的在同一主机不同目录之间的迁移工作