目录
一、未开启归档情况下移动单个数据文件
方法一:此方法在数据库未开启归档的情况下想要移动数据文件,数据库需要重启一次,业务需要暂停。
需求:将数据文件/u01/app/oracle/orcl/cdr01.dbf 移到到/u01/oradata/cdr01.dbf
第一步:关闭数据库
sys@ORCL>shutdown immeidate;
第二步:在系统层面移动数据文件
[oracle@hisdb orcl]$ mv/cp cdr01.dbf /u01/oradata/
[oracle@hisdb oradata]$ ls
cdr01.dbf
第三步:启动数据库到mount状态
sys@ORCL>startup mount;
ORACLE 例程已经启动。
Total System Global Area 768294912 bytes
Fixed Size 2257192 bytes
Variable Size 473960152 bytes
Database Buffers 289406976 bytes
Redo Buffers 2670592 bytes
数据库装载完毕。
第四步:在数据库中rename移动的数据文件
sys@ORCL>alter database rename file '/u01/app/oracle/orcl/cdr01.dbf' to '/u01/oradata/cdr01.dbf';
数据库已更改。
第五步:将数据库打开到open
sys@ORCL>alter database open;
数据库已更改。
sys@ORCL>select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/orcl/system01.dbf
/u01/app/oracle/orcl/sysaux01.dbf
/u01/app/oracle/orcl/undotbs01.dbf
/u01/app/oracle/orcl/users01.dbf
/u01/oradata/cdr01.dbf
/u01/app/oracle/orcl/retest01.dbf
/u01/app/oracle/orcl/zongzi01.dbf
已选择7行。
下面是之前所有数据文件的位置,与上面对比数据文件已经移动成功,可再重启一下数据库验证。
sys@ORCL>select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/orcl/system01.dbf
/u01/app/oracle/orcl/sysaux01.dbf
/u01/app/oracle/orcl/undotbs01.dbf
/u01/app/oracle/orcl/users01.dbf
/u01/app/oracle/orcl/cdr01.dbf
/u01/app/oracle/orcl/retest01.dbf
/u01/app/oracle/orcl/zongzi01.dbf
方法二:通过offline相关表空间的方法 需求:将数据文件/u01/app/oracle/orcl/retest01.dbf移动到 /u01/oradata/retest01.dbf
第一步:将相关表空间offline
sys@ORCL>alter tablespace retest offline;
表空间已更改。
第二步:rename被移动的数据文件
sys@ORCL>alter database rename file '/u01/app/oracle/orcl/retest01.dbf' to '/u01/oradata/retest01.dbf';
数据库已更改。
第三步:将之前offline的表空间online
sys@ORCL>alter tablespace retest online;
表空间已更改。
二、开启归档情况下移动单个数据文件
需求:将数据文件/u01/oradata/retest01.dbff移动到 /u01/app/oracle/orcl/retest01.db
上面的方法一、方法二均适用
方法三:offline数据文件,必须在归档模式下
第一步:将要移动的数据文件offline
sys@ORCL>alter database datafile '/u01/oradata/retest01.dbf' offline;
或者
sys@ORCL>alter database datafile 6 offline;
第二步:移动数据文件(可在系统层面也可用rman copy)
RMAN> copy datafile 6 to '/u01/app/oracle/orcl/retest01.dbf';
启动 backup 于 21-2月 -2022 16:29:13
使用通道 ORA_DISK_1
使用通道 ORA_DISK_2
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00006 名称=/u01/oradata/retest01.dbf
输出文件名=/u01/app/oracle/orcl/retest01.dbf 标记=TAG20220221T162913 RECID=7 STAMP=1097252954
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:01
完成 backup 于 21-2月 -2022 16:29:14
第三步:用rman转换数据文件,等同于rename
RMAN> switch datafile 6 to copy;
数据文件 6 已切换成数据文件副本 "/u01/app/oracle/orcl/retest01.dbf"
第三步:恢复数据文件
RMAN> recover datafile 6;
启动 recover 于 21-2月 -2022 16:31:26
使用通道 ORA_DISK_1
使用通道 ORA_DISK_2
正在开始介质的恢复
介质恢复完成, 用时: 00:00:00
完成 recover 于 21-2月 -2022 16:31:26
第四步:将数据文件online
sys@ORCL>alter database datafile 6 online;
数据库已更改。
三、开启归档情况下移动多个数据文件
大量数据文件移动,适用于在新创建数据库时,数据文件目录未写到存储目录中,后期需要移动。
第一步:新建数据文件目录并赋权(存储目录)
root
root
第二步:关闭数据库
sql>shutdown immediate;
第三步:移动数据文件
$cd /u01/app/oracle/oradata/orcl
$ls
$cd ..
$nohup cp -rf orcl /data/oradata/ & 第三步将orcl数据文件夹复制到新的数据文件目录(是复制不是mv)后台拷贝
$cd /data/oradata/orcl
$while true
>do
>du -sh
>sleep 10
>done
拷贝观察,等待拷贝结束
拷贝结束后,将原有数据文件做备份,防止操作失误,可继续使用原有数据文件
$cd /u01/app/oracle/oradata/
$mv orcl orcl.bak
第四步:启动数据库到mount,因为控制文件目录和数据文件在同一目录,所以移动数据文件目录后需要修改控制文件路径参数。
SQL> startup mount 启动到mount,查看控制文集目录
ORACLE instance started.
Total System Global Area 6.0930E+10 bytes
Fixed Size 2268112 bytes
Variable Size 3.0333E+10 bytes
Database Buffers 3.0467E+10 bytes
Redo Buffers 127143936 bytes
ORA-00205: error in identifying control file, check alert log for more info
SQL> show parameter control;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /u01/app/oracle/oradata/orcl/c
ontrol01.ctl, /u01/app/oracle/
oradata/orcl/control02.ctl
control_management_pack_access string DIAGNOSTIC+TUNING
SQL> alter system set control_files='/oradata/dbserver/control01.ctl','/oradata/dbserver/control02.ctl' scope=spfile;
System altered.
第五步:批量rename数据文件
sql>set line 200 pages 9999
select 'alter database rename file '''||name||''' to ''/home/oracle/oradata'||substr(name,length(name)-INSTR(reverse(name),'/')+1,INSTR(reverse(name),'/'))||''';' from v$datafile
union all
select 'alter database rename file '''||name||''' to ''/home/oracle/oradata'||substr(name,length(name)-INSTR(reverse(name),'/')+1,INSTR(reverse(name),'/'))||''';' from v$tempfile
union all
select 'alter database rename file '''||member||''' to ''/data/oradata/orcl'||substr(member,length(member)-INSTR(reverse(member),'/')+1,INSTR(reverse(member),'/'))||''';' from v$logfile;
---------------------alter database rename-------------------------
alter database rename file '/home/oracle/oradata/dbserver/system01.dbf' to '/oradata/dbserver/system01.dbf';
alter database rename file '/home/oracle/oradata/dbserver/sysaux01.dbf' to '/oradata/dbserver/sysaux01.dbf';
alter database rename file '/home/oracle/oradata/dbserver/undotbs01.dbf' to '/oradata/dbserver/undotbs01.dbf';
alter database rename file '/home/oracle/oradata/dbserver/users01.dbf' to '/oradata/dbserver/users01.dbf';
alter database rename file '/home/oracle/oradata/dbserver/temp01.dbf' to '/oradata/dbserver/temp01.dbf';
alter database rename file '/home/oracle/oradata/dbserver/redo01.log' to '/oradata/dbserver/redo01.log';
alter database rename file '/home/oracle/oradata/dbserver/redo02.log' to '/oradata/dbserver/redo02.log';
alter database rename file '/home/oracle/oradata/dbserver/redo03.log' to '/oradata/dbserver/redo03.log';
第六步:打开数据库到open
sql>alter database open;
|