原因

在以下情况下可能会发生此错误:
a) ASM 磁盘在操作系统上不可见。

b) 未在 ASM 实例上正确设置 asm_diskstring 参数
c) 磁盘中的 ASM 元数据被覆盖或者损坏

如果我们看到此错误或者其他指示 ASM 元数据损坏的错误,并且已验证磁盘在操作系统上具有正确权限且正确设置,并且 asm_diskstring 参数设置正确,则 ASM 元数据可能已损坏。
如果是这种情况,我们可能需要重新创建 ASM 实例和磁盘组。

欢迎来到之路教程(on itroad-com)

重建步骤

  1. 确保我们有一个使用 ASM 的所有数据库的预先 RMAN 备份
  2. 关闭你的 ASM 实例
  3. 重新创建 ASM 磁盘组
  4. 恢复数据库

步骤 1:确保我们有一个使用 ASM 的所有数据库的先前 RMAN 备份

我们可以从 ASM 元数据损坏中恢复的唯一方法是在不受 ASM 实例中断影响的区域中进行数据库的预先 RMAN 备份。

RMAN 备份示例:

  1. 将RMAN连接到目标数据库进行备份
$ rman nocatalog target /
  1. 现在备份数据库、存档日志和控制文件。
    例子:
RMAN> backup device type disk format '/home/oracle/backup/%U' database plus archivelog;
RMAN> backup device type disk format '/home/oracle/backup/ctrlf_%U' current controlfile;
  1. 手动制作 spfile 的副本。
    例子:
$ export ORACLE_SID=mydb
SQL> CREATE PFILE='/home/oracle/initmydb.ora' FROM SPFILE='/+DATA/MYDB/PARAMETERFILE/spfile.ora';

如果我们没有对所有数据库(数据文件、控制文件、重做日志、存档日志)进行良好的备份,请不要继续步骤 1!

步骤2:关闭 ASM 实例

使用 sqlplus 或者 srvctl (RAC) 停止数据库实例和 ASM 实例
SQLPLUS 示例:

$ export ORACLE_SID=+ASM
$ sqlplus '/ as sysdba'
SQL> shutdown immediate
$ export ORACLE_SID=mydb
$ sqlplus '/ as sysdba'
SQL> shutdown immediate

SRVCTL (RAC) 示例:

$ srvctl stop asm -n [node name 1]
$ srvctl stop asm -n [node name 2]
$ srvctl stop database -d [DB_NAME]

步骤 3:重新创建 ASM 磁盘组

将 ORACLE_SID 设置为 ASM 实例并创建一个新的磁盘组。
例子:

$ export ORACLE_SID=+ASM
$ sqlplus '/ as sysdba'
SQL> startup nomount
SQL> create diskgroup data external redundancy disk '/dev/rdsk/c1t4d0s4' force;
SQL> shutdown immediate
SQL> startup mount

步骤4:恢复数据库

  1. 使用步骤 1 中 pfile 的本地副本启动实例。
$ export ORACLE_SID=mydb
$ sqlplus '/ as sysdba'
SQL> startup nomount pfile=initmydb.ora
  1. 使用 RMAN 恢复控制文件和数据库。
    例子:
$ rman target /
RMAN> restore controlfile from '/home/oracle/backup/ctrlf_[string]'; -- where [string] is the unique string generated by %U.
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open resetlogs;
  1. 连接到 ASM 实例并获取控制文件名。
    例子:
$ export ORACLE_SID=+ASM
$ sqlplus '/ as sysdba'
SQL> select name, alias_directory from v$asm_alias;

在 CONTROLFILE 目录下查找控制文件名,例如:Current.256.1

  1. 编辑 init[sid].ora 并将 control_files 参数更改为指向从 ASM v$asm_alias 视图中标识的参数。

  2. 重新创建 spfile。
    例子:

SQL> create spfile='+DATA/MYDB/PARAMETERFILE/spfilemydb.ora' from pfile='/home/oracle/initmydb.ora';
  1. 关闭并重新启动实例以使用新创建的 spfile。

  2. 对其他数据库重复“步骤 5”部分。

如何重新创建 ASM 磁盘组

如果我们无法挂载 ASM 磁盘组,我们将无法使用这些磁盘组启动任何数据库。
以下是挂载 ASM 磁盘组时报告的可能错误:

SQL> startup mount
ORA-15032: not all alterations performed
ORA-15063: diskgroup "[DISK GROUP NAME]"" lacks quorum of 2 PST disks; 0 found
日期:2020-09-17 00:11:23 来源:oir作者:oir