oracle启动数据库的时候报如下错误:
SQL> startup
ORA-49601: syntax error: found "%s": expecting one of: "%s" etc..
SQL>
以nomount启动也报错一样
SQL> startup nomount
ORA-49601: syntax error: found "%s": expecting one of: "%s" etc..
SQL>
问题出现的原因,之前为了测试oracle11g新特性密码验证延迟效果,设置了event事件错误,当时设置执行的命令有误,NAME CONTEXT之间应该有空格,导致重启数据库的时候出现标题错误,错误的语句如下:
ALTER SYSTEM SET EVENT = '28401 TRACE NAMECONTEXT FOREVER, LEVEL 1' SCOPE = SPFILE;
为了解决此问题,找到initorcl.ora的文件。
/u01/app/oracle/product/11.2.0/db_1/dbs
[root@localhost dbs]# ls
hc_DBUA0.dat init.ora lkORCL spfileorcl.ora
hc_orcl.dat initorcl.ora orapworcl
[root@localhost dbs]# cat initorcl.ora
orcl.__db_cache_size=92274688
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=142606336
orcl.__sga_target=272629760
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=155189248
orcl.__streams_pool_size=8388608
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oraData/orcl/control01.ctl','/u01/app/oracle/flash_recovery_area/orcl/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4070572032
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.event='28401 TRACE NAMECONTEXT FOREVER, LEVEL 1'
*.memory_target=415236096
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
[root@localhost dbs]#
可以看到倒数第六行的event是错误的,编辑该文件,删除此event配置或者改写正确的,我是改写正确的,如下
*.event='28401 TRACE NAME CONTEXT FOREVER, LEVEL 1'
因为之前执行过 create pfile from spfile;命令,所以spfileorcl.ora文件其实也是有问题的
本来以为修改spfileorcl.ora文件,重建pfile,重启下即可解决问题的,但是启动报如下错误了:
SQL> create pfile from spfile;
create pfile from spfile
*
ERROR at line 1:
ORA-01565: error in identifying file '?/dbs/spfile@.ora'
ORA-27046: file size is not a multiple of logical block size
Additional information: 1
后面网上查找资料,spfile文件是二进制文件,不能手工修改的,修改的话会变成无效文件。
查看资料https://blog.csdn.net/shendeguang/article/details/24744695
此时可以通过以下方法解决:
1。将SPFILE中的参数拷贝到initorcl.ora文件中
2。删除DATABASE目录下的spfileorcl.ora文件。
3。启动数据库 (现在应该可以成功启动)
4。SQL> create spfile from pfile 生成spfile
使用startup命令启动数据库,,Oralce将会按照以下顺序在缺省目录中(9i,10i在oracle_home/database目录下)搜索参数文件:(1)spfileorcl.ora文件 (2)如果没有spfileorcl.ora文件就用spfile.ora文件(3) 如果没有spfile.ora文件就用initorcl.ora(4)如果没有initorcl.ora文件就用 pfile.ora
所以上面我们采取的解决方法是将破坏的spfile中的参数复制到initorcl.ora中,然后删除spfile文件,这样启动时就会用initorcl.ora文件启动,然后用create spfile from pfile 命令生成spfile
由于我们上面的操作已经把initorcl.ora文件的event改写正确了,所以直接删除spfileorcl.ora文件即可。操作如下:
[root@localhost dbs]# pwd
/u01/app/oracle/product/11.2.0/db_1/dbs
[root@localhost dbs]# ls
hc_DBUA0.dat init.ora lkORCL spfileorcl.ora
hc_orcl.dat initorcl.ora orapworcl
[root@localhost dbs]# rm -rf spfileorcl.ora
SQL> startup
ORACLE instance started.
Total System Global Area 413372416 bytes
Fixed Size 2213896 bytes
Variable Size 314574840 bytes
Database Buffers 92274688 bytes
Redo Buffers 4308992 bytes
Database mounted.
Database opened.
再次生成spfile文件。
SQL> create spfile from pfile;
File created.
发现spfileorcl.ora重新生成了。
[root@localhost dbs]# pwd
/u01/app/oracle/product/11.2.0/db_1/dbs
[root@localhost dbs]# ls
hc_DBUA0.dat hc_orcl.dat init.ora initorcl.ora lkORCL orapworcl spfileorcl.ora