20 日大早上还在睡眠中,就被电话吵醒了,监控值班同事打电话告诉有一台生产数据库连接失败,出现紧急事件,今天刚好我值班,便开始了今日的远程工作,迷迷糊糊、朦朦胧胧地打开电脑便去登陆环境,可能当时没睡醒脑子还不好使吧,当登陆上去后发现数据库实例确实宕机了,庆幸的是还有另一个节点可以正常访问,便不慌不忙的在 SQLPLUS 命令行敲了启动命令,便出现了如下的画面。。。
ORA-01105、ORA-01677 错误,便知道此问题是由于参数不一致所致,说明当前实例的某些参数设置和 RAC 其他实例设置的不符,并不能说明导致错误的真正原因。后面又联想到同事昨天是准备搭建备库的,联系确认了下便是此缘故导致,说在 /home/oracle 备份了参数才做的修改,于是乎便去 找备份的参数。
使用备份的参数文件去启动实例依然没法解决,实例启动瞬间宕机。
于是便尝试通过spfile 生成的 pfile 来启动实例,但还是报错。
SQL> create pfile=’/tmp/pfile.bak’ from spfile;
这时同事提供了关键信息说主要修改的参数有哪些发给我,一看却是是出现问题的参数。
其中:
Alter system set db_file_name_convert=’+DATA’,’+DATA’ scope=spfile;
Alter system set log_file_name_convert=’+ARCH’,’+ARCH’ scope=spfile;
这两个参数是静态参数修改后重启数据库才会生效,但他就这么修改了,当时没法重启便过去了,这就导致很坑了。这两个参数主要是用于当主备库目录结构不一致时读取此参数设置的路径才生效,但我们搭建的备库目录路径和主库一样,此参数是没有必要设置的,可他不管三七二十一就复制粘贴过去了。。。节点一重启后参数生效了,但节点2没生效故产生了参数不一致的情况。
由于节点2是正常的,通过 spfile 生成的 pfile 里查看到
db_file_name_convert=’+DATA’,’+DATA’
但通过节点 2 查看 db_file_name_convert 时是为空
SQL> show parameter db_file_name_convert
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
这就很清楚了,节点2没有重启还是之前的状态,参数为空,节点1重启后读取了 spfile 里的参数导致参数不一致。
于是就去修改节点 1 的 pfile,但这里也遇到了一点小小的问题,修改时直接置为空了,但还是启动时报错
*.db_file_name_convert=’ ’,’ ’
还是报错,估计还是修改的问题,那么这次就狠一点,直接将 db_file_name_convert 和 log_file_name_convert 参数删除,这次启动便可以成功启动了,此时节点1便可以是 pfile 文件启动了。那么为了填此坑,spfile 里还是存在着这两个参数,所以要再次修改一下,可遗憾的是报错了。。。
最后突然想起了 reset ,使用 reset 重置了这两个参数, sid 也可以单独指定某一个实例,“*” 代表所有实例,事情便终于算是解决完了,整个人也清醒了。
Alter system reset db_file_name_convert scope=spfile sid=’*’;
Alter system reset log_file_name_convert scope=spfile sid=’*’;
有关Data Guard更多参数描述信息请参考Oracle官方文档:
10G 官方文档:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14239/init_params.htm#i88512
11G 官方文档:
https://docs.oracle.com/cd/E11882_01/server.112/e40402/toc.htm
Oracle Database Documentation
Oracle 官方联机文档,以下是各个版本的入口,从 11g 到 20c 都有,可自行查看。
https://docs.oracle.com/en/database/oracle/oracle-database/index.html
最后,可以看到 Oracle 官方即将发布的 20C 的官方文档也已经发布了,可以在线查看