经过两天的时间,把oracle数据文件迁移的事情完成了。
问题描述:
1.web项目数据库oracle12c 安装在D盘(windows),由于D盘的空间已经不够,导致程序插入数据失败。在服务器上加了一个2T的硬盘,但是安装人员不会在原来D盘上进行扩容,而是直接挂成E盘。
2.我们设计了两种方案,
(1)迁移数据文件到E盘,将原来D盘数据文件删掉。这种方案改动较小,风险不大。
(2)重装数据库到E盘,这种方案麻烦而且风险比较大,需要卸载数据库(包括注册表等),然后重新安装,重新建表,建用户,索引,初始化数据等,工作量特别大,而且还不一定能成功。
我们优先选择第一种方案。
(一个dbf数据文件有30多G)
方法一:offline表空间
(实际操作没有成功,遇到了一些问题,最后采用的是方法二, 此处也把方法一的处理步骤写出来,供大家研究)
方法一总共分为如下4个步骤:
1、offline表空间:alter tablespace tablespace_name offline;
2、复制数据文件到新的目录;
3、rename修改表空间,并修改控制文件;
4、online表空间;
方法一具体步骤:
1、offline表空间zerone
SQL> select status, name from v$datafile;
NAME
C:\Oracle\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ZERONE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\RMANTS.DBF
已选择7行。
select * from dba_data_files
offline表空间:
SQL> alter tablespace zerone offline;
表空间已更改。
(注:zerone就是你实际的表空间名称)
示例:alter tablespace 你实际的表空间名称 offline;
2、复制数据文件到新的目录
复制数据文件C:\ORACLE\PRODUCT\10.2.0\ORADATA\ZERONE01.DBF到C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZERONE01.DBF。
3、rename修改表空间数据文件为新的位置,并修改控制文件
SQL> alter tablespace zerone rename datafile ‘c:\oracle\product\10.2.0\oradata\zerone01.dbf’ to ‘c:\oracle\product\10.2.0\oradata\orcl\zerone01.dbf’;
表空间已更改。
我的实际命令:
alter tablespace xxx_SPACE rename datafile ‘D:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\xxx_DATA_01.DBF’ to ‘E:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\xxx_DATA_01.DBF’;
….我实际共有10个dfb数据文件。
4、online表空间
SQL> alter tablespace zerone online;
表空间已更改。
示例:alter tablespace 你的实际表空间 online;
以上命令运行时报错误:ORA-01113: 文件8 需要介质恢复。
网上的解决方法:(在sql命令行运行)
recover datafile ‘E:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\xxx_DATA_01.DBF’
以上命令运行报错:
ORA-00283: 恢复会话因错误而取消
ORA-01114: 将块写入文件 8 时出现 IO 错误 (块 # 1)
ORA-01110: 数据文件 8:
‘E:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\xxx_DATA_01.DBF’
ORA-27091: 无法将 I/O 排队
ORA-27041: 无法打开文件
OSD-04002: ???????
O/S-Error: (OS 5) ???????
原因是用户没有E盘的目录的操作权限,需要设置权限。
试试其他方法:
切换到归档模式:(原来是非归档模式)
sqlplus system/数据库管理员密码@orcl as sysdba;
shutdown immediate;
conn / as sysdba
startup mount
alter database archivelog; --归档模式
alter database noarchivelog; --非归档模式
–查询你现在用的模式
select log_mode from v$database;
archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 D:\app\Administrator\virtual\product\12.2.0\dbhome_1\RDBMS
最早的联机日志序列 32216
当前日志序列 32218
再次执行recover命令,报错:
ORA-00308: 无法打开归档日志
‘D:\APP\ADMINISTRATOR\VIRTUAL\PRODUCT\12.2.0\DBHOME_1\RDBMS\ARC0000032203_0957179339.0001’
归档日志序列号不对,根本找不到错误中的文件。
至此,没有再进行下去。改用方法二进行。
- 以下是方法一的继续步骤:
SQL> select name from v$datafile;
NAME
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZERONE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\RMANTS.DBF
已选择7行。
SQL> select file_name,tablespace_name from dba_data_files where tablespace_name=‘ZERONE’;
select file_name,tablespace_name from dba_data_files where tablespace_name=‘ZERONE’;
FILE_NAME TABLESPACE_NAME
ZERONE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZERONE01.DBF
方法二:SQL修改数据文件位置
1、关闭数据库;
2、复制数据文件到新的位置;
3、启动数据库到mount状态;
4、通过SQL修改数据文件位置;
5、打开数据库;
方法二的具体步骤:
1、关闭数据库
SQL> select name from v$datafile;
NAME
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZERONE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\RMANTS.DBF
已选择7行。
sqlplus system/jky123@orcl as sysdba
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
2、复制数据文件到新的位置;
将数据文件C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ZERONE01.DBF复制到C:\ORACLE\PRODUCT\10.2.0\ORADATA\ZERONE01.DBF。
3、启动数据库到mount状态;
conn / as sysdba
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 96470372 bytes
Database Buffers 67108864 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
中间插入了几步操作(网上提供的方法):
SQL> startup mount U1;
ORACLE 例程已经启动。
SQL>alter database mount;
数据库已更改。
插入知识点:
问:Oracle在mount状态时,能做哪些动作。
其中就有renaming off datafile;
这个一开始认为Oracle在mount stage,已经载入了control file不能再重命名数据文件了。而实际却恰恰相反,只有到control file被载入后,重命名数据文件的改动才会写入到control file中。犯了一个先后颠倒的错误。
重命名控制文件,需要注意:在mount阶段,首先将数据文件更名为需要改动的目标名称(在这里是test02.dbf),再执行更名命令。
在此之前,我认为Oracle的重命名命令会自动将物理的数据文件命名为新的名称,但是从实验中可以看到,需要手工去先把物理的数据文件更名。
4、通过SQL修改数据文件位置;
SQL> alter database rename file ‘c:\oracle\product\10.2.0\oradata\orcl\zerone01.dbf’ to ‘c:\oracle\product\10.2.0\oradata\zerone01.dbf’;
数据库已更改。
(和方法一中的rename命令不同)
我的实际命令:
alter database rename file ‘D:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\xxx_DATA_01.DBF’ to ‘E:\APP\ADMINISTRATOR\VIRTUAL\ORADATA\ORCL\xxx_DATA_01.DBF’;
数据库已更改。
……我实际有10个dbf文件,重复上述操作。
5、打开数据库;
SQL> alter database open;
数据库已更改。
SQL> select name from v$datafile;
NAME
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ZERONE01.DBF
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\RMANTS.DBF
已选择7行。
SQL> select file_name,tablespace_name from dba_data_files where tablespace_name=‘ZERONE’;
FILE_NAME TABLESPACE_NAME
ZERONE C:\ORACLE\PRODUCT\10.2.0\ORADATA\ZERONE01.DBF
至此,已经操作完成。
数据可以正常插入,启动tomcat,可以正常访问。
(完)