昨天一位网友在看完我曾经录制的《数据库手工备份与克隆》视频后 http://www.boobooke.com/v/bbk1201,
发现在做实验的过程当中,创建控制文件的时候出现了一个ORA-01970的错误,后来解决掉但是没有在视频中播放出来。
于是找了一个测试环境,重现一下这个错误。
首先找到一个LINUX服务器,已经存在一个数据库(未使用归档模式,这里只为了重现一下这个错误)。
1.关闭掉这个数据库,把系统表空间拷贝到新建的目录。
2.新建一个初始化参数文件,修改目录地址,控制文件地址。
3.export ORACLE_SID=newdb
4.startup nomount
5.新建控制文件
CREATE CONTROLFILE SET REUSE DATABASE "newdb" NORESETLOGS NOARCHIVELOG MAXLOGFILES 32 MAXLOGMEMBERS 2 MAXDATAFILES 32 MAXINSTANCES 1 MAXLOGHISTORY 449LOGFILE GROUP 1 '/path/oracle/dbs/t_log1.f' SIZE 5M, GROUP 2 '/path/oracle/dbs/t_log2.f' SIZE 5MDATAFILE '/path/oracle/dbs/system01.f'CHARACTER SET UTF8;
6.报出异常
CREATE CONTROLFILE set reuse DATABASE “test” RESETLOGS ARCHIVELOG
*
ERROR at line 1:
ORA-01970: You must specify a database name for CREATE CONTROLFILE
排错:
注意看到SET REUSE,不注意的话就觉得没有问题,但是看看语法,其实是有顺序的。
CREATE CONTROLFILE [ REUSE ] [ SET ] DATABASE database [ logfile_clause ] { RESETLOGS | NORESETLOGS } [ DATAFILE file_specification [, file_specification ]... ] [ { MAXLOGFILES integer | MAXLOGMEMBERS integer | MAXLOGHISTORY integer | MAXDATAFILES integer | MAXINSTANCES integer | { ARCHIVELOG | NOARCHIVELOG } | FORCE LOGGING } [ MAXLOGFILES integer | MAXLOGMEMBERS integer | MAXLOGHISTORY integer | MAXDATAFILES integer | MAXINSTANCES integer | { ARCHIVELOG | NOARCHIVELOG } | FORCE LOGGING ]... ] [ character_set_clause ] ;
实际上问题就出在REUSE和SET的顺序上
让我们看看解释:
REUSE
Specify
REUSE
to indicate that existing control files identified by the initialization parameter
CONTROL_FILES
can be reused, overwriting any information they may currently contain. If you omit this clause and any of these control files already exists, then Oracle Database returns an error.
SET
Use
SET
DATABASE
to change the name of the database. The name of a database can be as long as eight bytes.
把SET和REUSE的顺序颠倒就OK了,如果控制文件不存在的话把REUSE去掉也行.
CREATE CONTROLFILE REUSE SET DATABASE "newdb" NORESETLOGS NOARCHIVELOG MAXLOGFILES 32 MAXLOGMEMBERS 2 MAXDATAFILES 32 MAXINSTANCES 1 MAXLOGHISTORY 449LOGFILE GROUP 1 '/path/oracle/dbs/t_log1.f' SIZE 5M, GROUP 2 '/path/oracle/dbs/t_log2.f' SIZE 5MDATAFILE '/path/oracle/dbs/system01.f'CHARACTER SET UTF8;
这个问题告诉我们,语法一定要严谨。