Oracle考试中看到一个题目
问:Oracle在mount状态时,能做哪些动作。
其中就有renaming off datafile;
这个一开始认为Oracle在mount stage,已经载入了control file不能再重命名数据文件了。而实际却恰恰相反,只有到control file被载入后,重命名数据文件的改动才会写入到control file中。犯了一个先后颠倒的错误。
重命名控制文件,需要注意:在mount阶段,首先将数据文件更名为需要改动的目标名称(在这里是test02.dbf),再执行更名命令。
在此之前,我认为Oracle的重命名命令会自动将物理的数据文件命名为新的名称,但是从实验中可以看到,需要手工去先把物理的数据文件更名。
以下是一些实验的步骤:
SQL> alter tablespace fund_table rename datafile 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF';
alter tablespace fund_table rename datafile 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
*
ERROR 位于第 1 行:
ORA-01525: 重命名数据文件时出错
ORA-01121: 无法重命名数据库文件 29 - 文件在使用中或在恢复中
ORA-01110: 数据文件 29: 'E:\ORACLE\ORADATA\LYON\TEST01.DBF'
SQL> shutdowm immediate;
SP2-0734: 未知的命令开头 "shutdowm i..." - 忽略了剩余的行。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
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> alter tablespace fund_table rename datafile 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF';
alter tablespace fund_table rename datafile 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
*
ERROR 位于第 1 行:
ORA-01109: ??????
SQL> alter database mount;
数据库已更改。
SQL> alter tablespace fund_table rename datafile 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF';
alter tablespace fund_table rename datafile 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
*
ERROR 位于第 1 行:
ORA-01109: ??????
SQL> alter database rename file 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF';
alter database rename file 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
*
ERROR 位于第 1 行:
ORA-01511: ?????/???????
ORA-01141: ??????? 29 ??? - ?????? 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
ORA-01110: ???? 29: 'E:\ORACLE\ORADATA\LYON\TEST01.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/S-Error: (OS 2) O5M3UR2;5=V86(5DND
SQL> alter database nomount;
alter database nomount
*
ERROR 位于第 1 行:
ORA-02231: ?????? ALTER DATABASE ??
SQL> shutdown immediate;
ORA-01109: ??????
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup nomount U1;
SP2-0714: 无效的 STARTUP 选项组合
SQL> startup mount U1;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
ORA-01504: ????'U1'??? db_name 'orcl'???
SQL> startup mount orcl;
ORA-01081: ????????? ORACLE --- ?????
SQL> alter database mount;
数据库已更改。
SQL> alter database rename file 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
2 ;
alter database rename file 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
*
ERROR 位于第 1 行:
ORA-01511: ?????/???????
ORA-01141: ??????? 29 ??? - ?????? 'E:\ORACLE\ORADATA\LYON\TEST02.DBF'
ORA-01110: ???? 29: 'E:\ORACLE\ORADATA\LYON\TEST01.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/S-Error: (OS 2) O5M3UR2;5=V86(5DND
SQL> alter database rename file 'E:\ORACLE\ORADATA\LYON\TEST01.DBF' to 'E:\ORACLE\ORADATA\LYON\TEST02.DBF';
数据库已更改。
SQL>
最终在最后一个步骤执行成功了。
另外,在mount阶段,也可以更改数据库的归档模式:
alter database archivelog/noarchivelog;
但是对于drop user这样的操作,在mount阶段是不能做的。个人分析原因在于mount阶段所有v$/dba/user视图都尚未启用(只启用了x$视图),而user与这些视图关系密切,所以不能在这个阶段做此操作。