WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2009-12-07 15:49:21
看了前面的例子,相信会对scott01.dbf文件印象深刻。这家伙不知道是哪位大员的表亲或内侍,反正后台相当强硬,*_file_name_convert这么彪悍的实权派都耐何不了它。偷偷告诉你,后台老板有可能是STANDBY_FILE_MANAGEMENT哟。话不多说,直接看示例:
手动修改数据文件路径:
JSSPDG> alter database rename file ' F:\ORACLE\ORADATA\JSSBOOK\USERS01.DBF ' to 'L:\ORADATA\JSSPDG\USERS01.DBF';
alter database rename file ' F:\ORACLE\ORADATA\JSSBOOK\USERS01.DBF ' to 'L:\ORADATA\JSSPDG\USERS01.DBF'
*
ERROR at line 1:
ORA-01511: error in renaming log/data files
ORA-01275: Operation RENAME is not allowed if standby file management is automatic.注意文件路径哟。
命令执行报错,提示需要修改standby file maangement参数为手动,好吧,听它的:
JSSPDG> show parameter standby
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_archive_dest string %ORACLE_HOME%\RDBMS
standby_file_management string AUTO
SQL> alter system set standby_file_management = MANUAL;
System altered.然后再次执行修改:
JSSPDG> alter database rename file ' F:\ORACLE\ORADATA\JSSBOOK\USERS01.DBF ' to 'L:\ORADATA\JSSPDG\USERS01.DBF';
Database altered.成功,然后再次查看当前文件路径:
JSSPDG> show parameter db_file_name_convert;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
JSSPDG > select name from v$ datafile ;
NAME
----------------------------------------------------------------------------------------------------
F:\ORACLE\ORADATA\JSSBOOK\SYSTEM01.DBF
F:\ORACLE\ORADATA\JSSBOOK\UNDOTBS01.DBF
F:\ORACLE\ORADATA\JSSBOOK\SYSAUX01.DBF
L:\ORADATA\JSSPDG\USERS01.DBF
L:\ORADATA\JSSPDG\SCOTT01.DBF显式手动修改文件路径后,即使不设置文件转换的参数,显示的也是正确的路径了(废话,我们手动指定了嘛,当然指定成什么就显示什么)。
注意这个显式手动指定的概念,这个包含的范围是很广的,不仅仅是我们手动通过alter database命令修改,alter tablespace修改肯定也好使。另外还有一条,就是standby_file_management参数的初始功能。该参数其实就用来同步Primary数据库与物理Standby数据库,当有表空间或数据文件修改操作时,是否自动同步到Standby端,默认情况下是AUTO,也就是自动同步。如果是AUTO状态,自动继承自Primary数据库的修改,那么这部分文件的路径保存在Standby数据库的控制文件中时,仍然是Primary数据库时的路径,显示时受制于*_file_name_convert参数的影响。受制于篇幅,这里就不演示standby_file_management参数在Primary和物理Standby间自动同步表空间、数据文件修改时的状态了,如果有兴趣,你可以私下自行。
另外,有没有可能,前面不生效是由于db_file_name_convert参数设置不适当造成的呢?之前都是对f:\oracle.....路径进行转换,修改一下初始化参数,显式指定l:\oradata\jsspdg试一试呢:
JSSPDG> alter system set db_file_name_convert='L:\ORADATA\JSSPDG\','L:\ORADATA\JSS\',' F:\ORACLE\ORADATA\JSSBOOK \','L:\ORADATA\JSS\' Scope=spfile;
System altered.重新启动物理Standby数据库(没办法,convert参数均无法即时生效):
JSSPDG> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
JSSPDG> startup mount
ORACLE instance started.
Total System Global Area 314572800 bytes
Fixed Size 1248720 bytes
Variable Size 96469552 bytes
Database Buffers 209715200 bytes
Redo Buffers 7139328 bytes
Database mounted.再次查看数据文件路径:
JSSPDG > select name from v$ datafile ;
NAME
----------------------------------------------------------------------------------------------------
L:\ORADATA\JSS \SYSTEM01.DBF
L:\ORADATA\JSS \UNDOTBS01.DBF
L:\ORADATA\JSS \SYSAUX01.DBF
L:\ORADATA\JSSPDG\USERS01.DBF
L:\ORADATA\JSSPDG\SCOTT01.DBF未显式修改过的文件的路径已经做了转换,但其它两个文件的路径毫无变化,看起来对于这类文件手动指定过的文件路径,即使设置*_file_name_convert参数,也无法对它们的文件路径做转换。如果这类文件路径有误或需要修改,唯一的方式,只能是显式通过命令手动修改其路径。接着,我们再来探讨一个问题,什么情况下*_file_name_convert参数能够"真正"起作用呢?