如何为存储在 ASM 中的 spfile 的 RAC 实例重新创建 spfile

问题

当无法使用当前保存在该 spfile 中的参数启动 RAC 实例时,如何为存储在 ASM 中的 RAC 数据库重新创建 spfile?

spfile 有一个参数集,它不允许数据库实例开始使用 spfile。
用于启动实例的参数设置可以从实例的 alert.log 中找到。
这些条目可用于创建有效的 spfile。
如果我们有一个有效的 pfile,那么我们将不需要执行以下过程的第 1 步。

  1. 在编辑器中打开警报日志,转到上次启动或者参数设置代表数据库所需的启动。
    从每个实例的警报日志中复制这些参数,并使用它们来构建新的基于文本的参数文件。

例如,从实例 1:

具有非默认值的系统参数:

processes = 150
__shared_pool_size = 234881024
__large_pool_size = 4194304
__java_pool_size = 4194304
__streams_pool_size = 0
spfile = +RACDATA1/rac2/spfilerac2.ora
sga_target = 536870912
control_files = +RACDATA1/rac2/controlfile/current.276.638749483,
+RACOFRA1/rac2/controlfile/current.257.638749485
db_block_size = 8192
__db_cache_size = 285212672
compatible = 10.2.0.3.0
db_file_multiblock_read_count= 16
cluster_database = TRUE
cluster_database_instances= 2
db_create_file_dest = +RACDATA1
db_recovery_file_dest = +RACOFRA1
db_recovery_file_dest_size= 2147483648
thread = 1
instance_number = 1
undo_management = AUTO
undo_tablespace = UNDOTBS1
remote_login_passwordfile= EXCLUSIVE
db_domain = itnabit.net
dispatchers = (PROTOCOL=TCP) (SERVICE=rac2XDB)
remote_listener = LISTENERS_RAC2
job_queue_processes = 10
background_dump_dest = /opt/app/oracle/admin/rac2/bdump
user_dump_dest = /opt/app/oracle/admin/rac2/udump
core_dump_dest = /opt/app/oracle/admin/rac2/cdump
audit_file_dest = /opt/app/oracle/admin/rac2/adump
db_name = rac2
open_cursors = 300
pga_aggregate_target = 268435456

从实例 2:

System parameters with non-default values:
processes = 150
__shared_pool_size = 260046848
__large_pool_size = 4194304
__java_pool_size = 4194304
__streams_pool_size = 0
cluster_interconnects = 192.168.3.120
sga_target = 536870912
control_files = +RACDATA1/rac2/controlfile/current.276.638749483,
+RACOFRA1/rac2/controlfile/current.257.638749485
db_block_size = 8192
__db_cache_size = 260046848
compatible = 10.2.0.3.0
db_file_multiblock_read_count= 16
cluster_database = TRUE
cluster_database_instances= 2
db_create_file_dest = +RACDATA1
db_recovery_file_dest = +RACOFRA1
db_recovery_file_dest_size= 2147483648
thread = 2
instance_number = 2
undo_management = AUTO
undo_tablespace = UNDOTBS2
remote_login_passwordfile= EXCLUSIVE
db_domain = itnabit.net
dispatchers = (PROTOCOL=TCP) (SERVICE=rac2XDB)
remote_listener = LISTENERS_RAC2
job_queue_processes = 10
parallel_instance_group = GROUP_RAC22
background_dump_dest = /opt/app/oracle/admin/rac2/bdump
user_dump_dest = /opt/app/oracle/admin/rac2/udump
core_dump_dest = /opt/app/oracle/admin/rac2/cdump
audit_file_dest = /opt/app/oracle/admin/rac2/adump
db_name = rac2
open_cursors = 300
pga_aggregate_target = 268435456

为每个具有实例特定设置的参数添加适当的实例前缀。
新的 init.ora 将类似于以下内容:

rac22.__db_cache_size=260046848
rac21.__db_cache_size=285212672
rac21.__java_pool_size=4194304
rac22.__java_pool_size=4194304
rac21.__large_pool_size=4194304
rac22.__large_pool_size=4194304
rac22.__shared_pool_size=260046848
rac21.__shared_pool_size=234881024
rac21.__streams_pool_size=0
rac22.__streams_pool_size=0
*.audit_file_dest='/opt/app/oracle/admin/rac2/adump'
*.background_dump_dest='/opt/app/oracle/admin/rac2/bdump'
*.cluster_database_instances=2
*.cluster_database=true
rac22.cluster_interconnects='192.168.3.120'
*.compatible='10.2.0.3.0'
*.control_files='+RACDATA1/rac2/controlfile/current.276.638749483','+RACOFRA1/rac2/controlfile/curre
nt.257.638749485'
*.core_dump_dest='/opt/app/oracle/admin/rac2/cdump'
*.db_block_size=8192
*.db_create_file_dest='+RACDATA1'
*.db_domain='itnabit.net'
*.db_file_multiblock_read_count=16
*.db_name='rac2'
*.db_recovery_file_dest='+RACOFRA1'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=rac2XDB)'
rac21.instance_number=1
rac22.instance_number=2
*.job_queue_processes=10
*.open_cursors=300
rac22.parallel_instance_group='GROUP_RAC22'
*.pga_aggregate_target=268435456
*.processes=150
*.remote_listener='LISTENERS_RAC2'
*.remote_login_passwordfile='exclusive'
*.sga_target=536870912
rac22.thread=2
rac21.thread=1
*.undo_management='AUTO'
rac22.undo_tablespace='UNDOTBS2'
rac21.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/opt/app/oracle/admin/rac2/udump'

在这种情况下,参数文件被保存到 /home/oracle/rac22.ora

  1. 在更正导致问题的参数后,使用此基于文本格式的参数文件,将其中一个 RAC 实例启动到安装阶段。
SQL> startup mount pfile=/home/oracle/rac22.ora
  1. 先前用于保存 spfile 的位置是 +RACDATA1/RAC2/spfilerac2.ora,因此新文件将需要替换此文件。
    ASM 本身将 spfile 存储在 +RACDATA1/RAC2/PARAMETERFILE/spfile.298.647081589 中,并在 +RACDATA1/RAC2/spfilerac2.ora 位置链接或者别名 spfile

我们可以使用 ASMCMD 命令行工具检查 spfile 在 ASM 磁盘组中的位置。
要使用 ASMCMD,我们必须将 ORACLE_HOME 环境变量设置为包含 ASM 二进制文件的主目录。

例如:

ASMCMD> pwd
+RACDATA1/RAC2
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N spfilerac2.ora =>
+RACDATA1/RAC2/PARAMETERFILE/spfile.298.647081589
  1. 确保在尝试重新创建 spfile 之前安装了数据库实例之一。
SQL> select INSTANCE_NAME,HOST_NAME,STATUS from v$instance;
INSTANCE_NAME     HOST_NAME         STATUS
----------------  ----------------  -----------
rac22             elle.itnabit.net  MOUNTED
  1. 创建新的spfile
SQL> create spfile='+RACDATA1/rac2/spfilerac2.ora' from pfile='/home/oracle/rac22.ora';
File created.
  1. ASMCMD 将显示一个新的 spfile 已经创建,因为别名 spfilerac2.ora 现在指向 ASM 中 PARAMETER 目录下的一个新 spfile。
ASMCMD> pwd
+RACDATA1/RAC2
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N spfilerac2.ora =>
+RACDATA1/RAC2/PARAMETERFILE/spfile.298.647083581
  1. 关闭实例并使用新创建的 spfile 使用 srvctl 重新启动数据库。
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> exit
$ srvctl start database -d rac2
$ srvctl status database -d rac2
Instance rac21 is running on node halle
Instance rac22 is running on node elle
  1. ASMCMD 现在将显示此数据库的 PARAMETERFILE 目录中存在的许多 spfile。
    应该从 ASM 中删除包含阻止启动参数的 spfile。

在这种情况下,可以删除文件 spfile.284.647081527 和 spfile.297.647081495,因为 spfile.298.647083581 是当前的 spfile。

ASMCMD> pwd
+RACDATA1/RAC2
ASMCMD> cd PARAMETERFILE
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PARAMETERFILE UNPROT COARSE Nov 19 08:00:00 Y spfile.284.647081527
PARAMETERFILE UNPROT COARSE Nov 19 08:00:00 Y spfile.297.647081495
PARAMETERFILE UNPROT COARSE Nov 19 09:00:00 Y spfile.298.647083581
ASMCMD> rm spfile.284.647081527
ASMCMD> rm spfile.297.647081495
ASMCMD> ls
spfile.298.647083581
on  It Road.com

总结

如果 ASM 中的 spfile 别名链接到类似于 spfilerac2.ora => +RACDATA1/DB_UNKNOWN/PARAMETERFILE/SPFILE.284.647080599 的 spfile,则意味着新的 spfile 是在数据库实例关闭时创建的,我们将需要重新创建它使用从每个实例的 alert.log 条目创建的 pfile 启动和安装实例。
在 RAC 环境中,要使用 sqlplus 启动实例,我们需要在 $ORACLE_HOME/dbs 中有一个 init.ora,其中有一个 spfile 参数条目指向基于 ASM 的 spfile 的位置。
当使用 srvctl 启动数据库或者实例时,OCR 资源应该具有与使用 srvctl modify database 设置的资源相关联的 spfile 指针。

例如:

ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N spfilerac2.ora =>
+RACDATA1/DB_UNKNOWN/PARAMETERFILE/SPFILE.284.647080599
日期:2020-09-17 00:11:23 来源:oir作者:oir