问题
当无法使用当前保存在该 spfile 中的参数启动 RAC 实例时,如何为存储在 ASM 中的 RAC 数据库重新创建 spfile?
spfile 有一个参数集,它不允许数据库实例开始使用 spfile。
用于启动实例的参数设置可以从实例的 alert.log 中找到。
这些条目可用于创建有效的 spfile。
如果我们有一个有效的 pfile,那么我们将不需要执行以下过程的第 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
- 在更正导致问题的参数后,使用此基于文本格式的参数文件,将其中一个 RAC 实例启动到安装阶段。
SQL> startup mount pfile=/home/oracle/rac22.ora
- 先前用于保存 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
- 确保在尝试重新创建 spfile 之前安装了数据库实例之一。
SQL> select INSTANCE_NAME,HOST_NAME,STATUS from v$instance; INSTANCE_NAME HOST_NAME STATUS ---------------- ---------------- ----------- rac22 elle.itnabit.net MOUNTED
- 创建新的spfile
SQL> create spfile='+RACDATA1/rac2/spfilerac2.ora' from pfile='/home/oracle/rac22.ora'; File created.
- 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
- 关闭实例并使用新创建的 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
- 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
总结
如果 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