GVKun编程网logo

oracle asm disk被格式化为ntfs文件系统(oracle asm盘符变了)

1

在本文中,我们将带你了解oracleasmdisk被格式化为ntfs文件系统在这篇文章中,我们将为您详细介绍oracleasmdisk被格式化为ntfs文件系统的方方面面,并解答oracleasm盘符

在本文中,我们将带你了解oracle asm disk被格式化为ntfs文件系统在这篇文章中,我们将为您详细介绍oracle asm disk被格式化为ntfs文件系统的方方面面,并解答oracle asm盘符变了常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的.asm 和 .asm.1 之间的区别?、ASM 单实例由 Oracle Restart 引发的系列故障分析 (Final Version)、asm 学习 2-java 类在 asm 里的基本描述、ASM 管理的 Oracle 19C 数据库ADG的搭建及主备切换

本文目录一览:

oracle asm disk被格式化为ntfs文件系统(oracle asm盘符变了)

oracle asm disk被格式化为ntfs文件系统(oracle asm盘符变了)

数据库实例日志: 

Tue Mar 01 12:18:12 2016

SUCCESS: diskgroup ORADISKGRP1 was dismounted

SUCCESS: diskgroup ORADISKGRP1 was dismounted

Errors in file C:\APP\ORACLE\PRODUCT\11.2.0\diag\rdbms\bflex\bflex1\trace\bflex1_ckpt_6376.trc:

ORA-00206: error in writing (block 3, # blocks 1) of control file

ORA-00202: control file: ''+ORADISKGRP1/bflex/controlfile/current.287.925642037''

ORA-15078: ASM diskgroup was forcibly dismounted

ORA-15078: ASM diskgroup was forcibly dismounted


再看asm日志

Tue Mar 01 12:18:12 2016

ASM Health Checker found 1 new failures

Dirty Detach Reconfiguration complete

Tue Nov 01 12:18:12 2016

WARNING: dirty detached from domain 1

NOTE: cache dismounted group 1/0x5DD073B7 (ORADISKGRP1)

SQL> alter diskgroup ORADISKGRP1 dismount force /* ASM SERVER:1573942199 */

Tue Nov 01 12:18:12 2016

NOTE: cache deleting context for group ORADISKGRP1 1/0x5dd073b7

GMON dismounting group 1 at 6 for pid 30, osid 7684

NOTE: Disk ORADISKGRP1_0000 in mode 0x7f marked for de-assignment

NOTE: Disk ORADISKGRP1_0001 in mode 0x7f marked for de-assignment

NOTE: Disk ORADISKGRP1_0002 in mode 0x7f marked for de-assignment

SUCCESS: diskgroup ORADISKGRP1 was dismounted

SUCCESS: alter diskgroup ORADISKGRP1 dismount force /* ASM SERVER:1573942199 */

SUCCESS: ASM-initiated MANDATORY DISMOUNT of group ORADISKGRP1



这里的asm日志很明显由于asm disk无法正常访问,报ORA-27072错误,磁盘组被强制dismount. 一般出现这样故障的原因大多都是人为误操作造成的,比如挂到A机的裸盘被挂至B机,然后被误格式化。


处理办法:

先用kfed恢复磁盘头

C:\Users\Administrator> kfed repair ''\\.\J:''
C:\Users\Administrator>kfed read ''\\.\J:''
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh. type :                            1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                     254 ; 0x004: T=0 NUMB=0xfe
kfbh.block.obj:              2147483654 ; 0x008: TYPE=0x8 NUMB=0x6
kfbh.check:                   717599272 ; 0x00c: 0x2ac5b228
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr:    ORCLDISKDATA6 ; 0x000: length=13
kfdhdb.driver.reserved[0]:   1096040772 ; 0x008: 0x41544144
kfdhdb.driver.reserved[1]:           54 ; 0x00c: 0x00000036
kfdhdb.driver.reserved[2]:            0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]:            0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]:            0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]:            0 ; 0x01c: 0x00000000


使用asmtool  -list查看相关磁盘信息

wKiom1g3qObDQrT3AABG8ADhcIY692.jpg-wh_50


然后用dbv检测是否有坏块,没有就好办了。幸好asm有备份,用备份恢复即可。


SQL> recover database ;
完成介质恢复。
SQL> alter database open ;
 
数据库已更改。

本文同步分享在 博客“xjsunjie”(51CTO)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

.asm 和 .asm.1 之间的区别?

.asm 和 .asm.1 之间的区别?

如何解决.asm 和 .asm.1 之间的区别?

我试图在 Fusion Autodesk 中打开一个保存为 .asm.1 文件的文件。 Fusion Autodesk 说它可以处理 .asm 文件,我很困惑,不知道有什么区别,或者是否有办法从 .asm.1 转换为 .asm 以便我可以在软件中处理这个文件?>

ASM 单实例由 Oracle Restart 引发的系列故障分析 (Final Version)

ASM 单实例由 Oracle Restart 引发的系列故障分析 (Final Version)

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

ASM 单实例由 Oracle Restart 引发的系列故障分析 (Final Version)

置顶 aaron8219 2013-08-26 03:35:50   5816   收藏
分类专栏: Oracle ASM
版权
今天重新打开上次安装完的一个 ASM 单实例环境,突然报错

SQL> startup
ORA-01078: failure in processing system parameters
ORA-01565: error in identifying file ''+DATA/asmsingle/spfileasmsingle.ora''
ORA-17503: ksfdopn:2 Failed to open file +DATA/asmsingle/spfileasmsingle.ora
ORA-29701: unable to connect to Cluster Synchronization Service

以为是监听问题造成的无法读取 asm 磁盘组,于是运行 netca 删除监听和服务名,准备重新创建。

当我删除监听后,准备再重新创建一个时,报了一个错误,如下图:

 

需要重启 Oracle Restart 后再配置 netca,否则不能注册到 Oracle Restart

google 了一下,Oracle Restart 是 11gR2 用来管理单实例组件的一个组件,在装完 Grid Infrastructure 以后自动安装的

但是我的环境现在 crsctl 命令也不能用,看来是 GI 环境配置有点问题

在安装 GI 的时候,执行完 root.sh 脚本后,通常要执行一下 roothas.pl,如:

[root@dg1 ~]# /u01/app/11.2.0/grid/root.sh
Performing root user operation for Oracle 11g


The following environment variables are set as:
    ORACLE_OWNER= grid
    ORACLE_HOME=  /u01/app/11.2.0/grid


Enter the full pathname of the local bin directory: [/usr/local/bin]:
The contents of "dbhome" have not changed. No need to overwrite.
The contents of "oraenv" have not changed. No need to overwrite.
The contents of "coraenv" have not changed. No need to overwrite.


Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.


To configure Grid Infrastructure for a Stand-Alone Server run the following command as the root user:
/u01/app/11.2.0/grid/perl/bin/perl -I/u01/app/11.2.0/grid/perl/lib -I/u01/app/11.2.0/grid/crs/install /u01/app/11.2.0/grid/crs/install/roothas.pl


To configure Grid Infrastructure for a Cluster execute the following command:
/u01/app/11.2.0/grid/crs/config/config.sh
This command launches the Grid Infrastructure Configuration Wizard. The wizard also supports silent operation, and the parameters can be passed through the response file that is available in the installation media.

[root@dg1 ~]# /u01/app/11.2.0/grid/crs/install/roothas.pl
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
User ignored Prerequisites during installation
Improper Oracle Grid Infrastructure configuration found on this host
Deconfigure the existing cluster configuration before starting
to configure a new Grid Infrastructure
run ''/u01/app/11.2.0/grid/crs/install/roothas.pl -deconfig''
to configure existing failed configuration and then rerun root.sh

根据执行 roothas.pl 失败的指示,先用 - deconfig 参数来删除原来 GI 的配置:

[root@dg1 ~]# /u01/app/11.2.0/grid/crs/install/roothas.pl -deconfig
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Oracle Restart stack is not active on this node
Restart the SIHA stack (use /u01/app/11.2.0/grid/bin/crsctl start has) and retry
Failed to write the checkpoint:'''' with status:FAIL.Error code is 256
Failed to verify HA resources

注意上面红色部分字体,提示 Oracle Restart 并没有在本节点启动,也无法删除原有 GI 配置,难道没办法删除了吗?

[root@dg1 ~]# /u01/app/11.2.0/grid/crs/install/roothas.pl -deconfig -force -verbose
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
CRS-4639: Could not contact Oracle High Availability Services
CRS-4000: Command Stop failed, or completed with errors.
CRS-4639: Could not contact Oracle High Availability Services
CRS-4000: Command Delete failed, or completed with errors.
CLSU-00100: Operating System function: opendir failed with error data: 2
CLSU-00101: Operating System error message: No such file or directory
CLSU-00103: error location: scrsearch1
CLSU-00104: additional error information: cant open scr home dir scls_scr_getval
CRS-4544: Unable to connect to OHAS
CRS-4000: Command Stop failed, or completed with errors.
Successfully deconfigured Oracle Restart stack

发现提示不一样了,已经顺利地重新配置了 Oracle Restart,然后重新执行 roothas.pl 来启动 Oracle Restart:

[root@dg1 ~]# /u01/app/11.2.0/grid/crs/install/roothas.pl
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
User ignored Prerequisites during installation
LOCAL ADD MODE
Creating OCR keys for user ''grid'', privgrp ''oinstall''..
Operation successful.
LOCAL ONLY MODE
Successfully accumulated necessary OCR keys.
Creating OCR keys for user ''root'', privgrp ''root''..
Operation successful.
CRS-4664: Node dg1 successfully pinned.
Adding Clusterware entries to inittab


dg1     2013/08/25 23:30:16     /u01/app/11.2.0/grid/cdata/dg1/backup_20130825_233016.olr
Successfully configured Oracle Grid Infrastructure for a Standalone Server

成功地重新配置完成了一个 Stand-Alone,此时 crsctl 命令已经可以使用了,再执行 root.sh 中提示的那条命令就会报错了,提示已经配置了 CRS:

[root@dg1 ~]# /u01/app/11.2.0/grid/perl/bin/perl -I/u01/app/11.2.0/grid/perl/lib -I/u01/app/11.2.0/grid/crs/install /u01/app/11.2.0/grid/crs/install/roothas.pl
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
User ignored Prerequisites during installation
CRS is already configured on this node for crshome=/u01/app/11.2.0/grid
Cannot configure two CRS instances on the same cluster.
Please deconfigure before proceeding with the configuration of new home.

[grid@dg1 ~]$ crsctl check has
CRS-4638: Oracle High Availability Services is online

[grid@dg1 ~]$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ons
               OFFLINE OFFLINE      dg1                                          
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        OFFLINE OFFLINE                                                  
ora.diskmon
      1        OFFLINE OFFLINE                                                  
ora.evmd
      1        ONLINE  ONLINE       dg1

Oracle Restart 问题暂时解决了,但是随后又发现一个问题:

[grid@dg1 ~]$ ocrcheck
Status of Oracle Cluster Registry is as follows :
         Version                  :          3
         Total space (kbytes)     :     262120
         Used space (kbytes)      :        152
         Available space (kbytes) :     261968
         ID                       : 1711295372
         Device/File Name         : /u01/app/11.2.0/grid/cdata/localhost/local.ocr
                                    Device/File integrity check succeeded


                                    Device/File not configured


                                    Device/File not configured


                                    Device/File not configured


                                    Device/File not configured


         Cluster registry integrity check succeeded


         Logical corruption check bypassed due to non-privileged user

按理说 OCR 磁盘的路径应该在 + DATA/asmsingle 上的,怎么变成 /u01/... 这个本地路径了,而且 grid 用于居然执行不了下面这条命令:

[grid@dg1 ~]$ crsctl query css votedisk
Parse error:
  ''css'' is an invalid argument

此时突然醒悟,怎么这里主机名是 dg1 呢?明明之前配置过 /etc/hosts 里的主机名是 asm-single 的,查看一下:

[root@dg1 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain localhost
::1               localhost6.localdomain6 localhost6
192.168.1.99    asm-single

用 hostname 重新改一下:

[root@dg1 ~]# hostname asm-single

[root@dg1 ~]#su - grid

[grid@dg1 ~]# exit

[root@asm-single ~]#

修改完以后切换下用户就显示正确的主机名了,再查看一下 GI 资源情况:

[grid@asm-single ~]$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ons
               OFFLINE OFFLINE      dg1                                          
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        OFFLINE OFFLINE                                                  
ora.diskmon
      1        OFFLINE OFFLINE                                                  
ora.evmd
      1        ONLINE  ONLINE       dg1

仍然是 dg1 作为主机名,看来要重新执行 roothas.pl 再配置一次了

[root@asm-single ~]# /u01/app/11.2.0/grid/crs/install/roothas.pl -deconfig -force -verbose
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Failed to write the checkpoint:'''' with status:FAIL.Error code is 256
Can''t open /etc/oracle/scls_scr/asm-single/grid/ohasdstr for write: No such file or directory at /u01/app/11.2.0/grid/crs/install/s_crsconfig_lib.pm line 1332.

该命令无法执行,提示找不到 asm-single 路径,查看了一下,确实没有 asm-single 这一路径:

[root@asm-single ~]# cd /etc/oracle/scls_scr

[root@asm-single scls_scr]# ll
total 4
drwxr-x--- 4 root oinstall 4096 Aug 25 23:29 dg1
[root@asm-single scls_scr]#

既然已经认定主机是 dg1,那么就先将错就错一下吧,把主机名改回 dg1,直接修改 /etc/hosts 中的内容

然后用 NETCA 重新配置一下监听和 NET SERVICE NAME,并把监听和数据库实例添加到 Oracle Restart 配置中:

[grid@dg1 ~]$ srvctl add database -d asmsingle -o /u01/app/oracle/product/11.2.0/dbhome_1
PRCD-1025 : Failed to create database asmsingle
PRKH-1014 : Current user "grid" is not the oracle owner user "oracle" of oracle home "/u01/app/oracle/product/11.2.0/dbhome_1"

应该是 grid 用户没有操作 ORACLE_HOME 的权限,用 oracle 用户试一下:

[oracle@dg1 ~]$ srvctl add database -d asmsingle -o /u01/app/oracle/product/11.2.0/dbhome_1

没有报错,此时再用 grid 用户查看一下 Oracle Restart 资源配置情况:

[grid@dg1 ~]$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       dg1                                          
ora.ons
               OFFLINE OFFLINE      dg1                                          
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.asmsingle.db
      1        OFFLINE OFFLINE                                                  
ora.cssd
      1        OFFLINE OFFLINE                                                  
ora.diskmon
      1        OFFLINE OFFLINE                                                  
ora.evmd
      1        ONLINE  ONLINE       dg1

可以看到,数据库实例已经添加进去了,同时监听也自动进来了,但是 ASM 和磁盘组都还没有,试试启动 CRS

[grid@dg1 ~]$ crsctl start crs
CRS-4013: This command is not supported in a single-node configuration.
CRS-4000: Command Start failed, or completed with errors.

这是 RAC 中使用的命令,这里单实例 ASM 不能用它来启动全部资源,查看一下数据库的配置:

[grid@dg1 ~]$ srvctl config database -d asmsingle
Database unique name: asmsingle
Database name:
Oracle home: /u01/app/oracle/product/11.2.0/dbhome_1
Oracle user: oracle
Spfile:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Database instance: asmsingle
Disk Groups:
Services:
[grid@dg1 ~]$

此处可以看到,与 ASM 有关的都没有相应内容,先启动 ASM 实例,配置磁盘组 DG

[grid@dg1 ~]$ export ORACLE_SID=+ASM
[grid@dg1 ~]$ sqlplus ''/as sysdba''


SQL*Plus: Release 11.2.0.3.0 Production on Mon Aug 26 01:27:04 2013


Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup
ORA-01078: failure in processing system parameters
ORA-29701: unable to connect to Cluster Synchronization Service

启动错误,无法连接 CSS,查看一下 CSS 进程:

SQL> !
[grid@dg1 ~]$ crsctl check css
CRS-4530: Communications failure contacting Cluster Synchronization Services daemon
[grid@dg1 ~]$ ps -ef|grep cssd
grid     13704 13680  0 01:28 pts/5    00:00:00 grep cssd
[grid@dg1 ~]$ ps -ef|grep has
root     11620     1  0 Aug25 ?        00:00:00 /bin/sh /etc/init.d/init.ohasd run
grid     11652     1  0 Aug25 ?        00:00:21 /u01/app/11.2.0/grid/bin/ohasd.bin reboot
grid     13706 13680  0 01:28 pts/5    00:00:00 grep has
[grid@dg1 ~]$ ps -ef|grep d.bin
grid     11652     1  0 Aug25 ?        00:00:21 /u01/app/11.2.0/grid/bin/ohasd.bin reboot
grid     11834     1  0 Aug25 ?        00:00:06 /u01/app/11.2.0/grid/bin/oraagent.bin
grid     11850     1  0 Aug25 ?        00:00:00 /u01/app/11.2.0/grid/bin/evmd.bin
grid     11887 11850  0 Aug25 ?        00:00:00 /u01/app/11.2.0/grid/bin/evmlogger.bin -o /u01/app/11.2.0/grid/evm/log/evmlogger.info -l /u01/app/11.2.0/grid/evm/log/evmlogger.log
grid     13156     1  0 00:51 ?        00:00:00 /u01/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit
grid     13714 13680  0 01:28 pts/5    00:00:00 grep d.bin

[grid@dg1 ~]$ crsctl check has
CRS-4638: Oracle High Availability Services is online

has 进程正常启动的,但是没有找到 cssd 的 demon 进程

[grid@dg1 ~]$ crs_stat -t
Name           Type           Target    State     Host        
------------------------------------------------------------
ora....ER.lsnr ora....er.type ONLINE    ONLINE    dg1        
ora....ngle.db ora....se.type OFFLINE   OFFLINE              
ora.cssd       ora.cssd.type  OFFLINE   OFFLINE              
ora.diskmon    ora....on.type OFFLINE   OFFLINE              
ora.evmd       ora.evm.type   ONLINE    ONLINE    dg1        
ora.ons        ora.ons.type   OFFLINE   OFFLINE      

这里发现 cssd 和 diskmon 都是 OFFLINE 的,这 2 个服务是依赖于 HAS 维护的,分别查看这 2 个进程的参数:        

[grid@dg1 ~]$ crs_stat -p ora.cssd
NAME=ora.cssd
TYPE=ora.cssd.type
ACTION_SCRIPT=
ACTIVE_PLACEMENT=0
AUTO_START=never
CHECK_INTERVAL=30
DESCRIPTION="Resource type for CSSD"
FAILOVER_DELAY=0
FAILURE_INTERVAL=3
FAILURE_THRESHOLD=5
HOSTING_MEMBERS=
PLACEMENT=balanced
RESTART_ATTEMPTS=5
SCRIPT_TIMEOUT=600
START_TIMEOUT=600
STOP_TIMEOUT=900
UPTIME_THRESHOLD=1m

[grid@dg1 ~]$ crs_stat -p ora.diskmon
NAME=ora.diskmon
TYPE=ora.diskmon.type
ACTION_SCRIPT=
ACTIVE_PLACEMENT=0
AUTO_START=never
CHECK_INTERVAL=3
DESCRIPTION="Resource type for Diskmon"
FAILOVER_DELAY=0
FAILURE_INTERVAL=3
FAILURE_THRESHOLD=5
HOSTING_MEMBERS=
PLACEMENT=balanced
RESTART_ATTEMPTS=10
SCRIPT_TIMEOUT=60
START_TIMEOUT=600
STOP_TIMEOUT=60
UPTIME_THRESHOLD=5s

发现他们并不会随 HAS 启动而自己启动,于是手动启动它们:

[grid@dg1 ~]$ crsctl start res ora.cssd
CRS-2672: Attempting to start ''ora.cssd'' on ''dg1''
CRS-2672: Attempting to start ''ora.diskmon'' on ''dg1''
CRS-2676: Start of ''ora.diskmon'' on ''dg1'' succeeded
CRS-2676: Start of ''ora.cssd'' on ''dg1'' succeeded

这里发现启动了 cssd 后,diskmon 也被启动了,其实他们是被绑在一起的 2 个服务,随便先启动哪个,另一个也会跟着启动,查看一下 HAS 资源情况

[grid@dg1 ~]$ crs_stat -t
Name           Type           Target    State     Host        
------------------------------------------------------------
ora....ER.lsnr ora....er.type ONLINE    ONLINE    dg1        
ora....ngle.db ora....se.type OFFLINE   OFFLINE              
ora.cssd       ora.cssd.type  ONLINE    ONLINE    dg1        
ora.diskmon    ora....on.type OFFLINE   OFFLINE              
ora.evmd       ora.evm.type   ONLINE    ONLINE    dg1        
ora.ons        ora.ons.type   OFFLINE   OFFLINE              

但事实好像有点出入,尽管现实 diskmon 也是 succeeded,但这里仍然是 OFFLINE 状态,就算单独再启动一次 diskmon,也是一样

[grid@dg1 ~]$ crsctl start res ora.diskmon
CRS-2672: Attempting to start ''ora.diskmon'' on ''dg1''
CRS-2676: Start of ''ora.diskmon'' on ''dg1'' succeeded
[grid@dg1 ~]$ crs_stat -t
Name           Type           Target    State     Host        
------------------------------------------------------------
ora....ER.lsnr ora....er.type ONLINE    ONLINE    dg1        
ora....ngle.db ora....se.type OFFLINE   OFFLINE              
ora.cssd       ora.cssd.type  ONLINE    ONLINE    dg1        
ora.diskmon    ora....on.type OFFLINE   OFFLINE              
ora.evmd       ora.evm.type   ONLINE    ONLINE    dg1        
ora.ons        ora.ons.type   OFFLINE   OFFLINE

先不管 diskmon 服务了,用 grid 启动 ASM 实例:

[grid@dg1 ~]$ sqlplus ''/as sysdba''


SQL*Plus: Release 11.2.0.3.0 Production on Mon Aug 26 01:46:13 2013


Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup
ORA-00099: warning: no parameter file specified for ASM instance
ORA-01031: insufficient privileges
SQL> exit
Disconnected

注意:这里必须要用 sysasm 来连接 ASM 实例,在管理 ASM 时,他的权限比 sysdba 还要大

[grid@dg1 ~]$ export ORACLE_SID=+ASM
[grid@dg1 ~]$ sqlplus ''/as sysasm''


SQL*Plus: Release 11.2.0.3.0 Production on Mon Aug 26 01:46:57 2013


Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup
ORA-00099: warning: no parameter file specified for ASM instance
ASM instance started


Total System Global Area  283930624 bytes
Fixed Size                  2227664 bytes
Variable Size             256537136 bytes
ASM Cache                  25165824 bytes
ORA-15110: no diskgroups mounted

先查看一下磁盘组,那些磁盘没有挂载,这里并没有显示:

SQL> select name,state,type from v$asm_diskgroup;


no rows selected

因为环境是自己搭建的,所以知道有 2 个磁盘组,分别是 DATA 和 FRA,直接进行挂载:

SQL> alter diskgroup DATA mount;
alter diskgroup DATA mount
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15017: diskgroup "DATA" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DATA"


SQL> alter diskgroup FRA mount;
alter diskgroup FRA mount
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15017: diskgroup "FRA" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "FRA"

DATA 和 FRA 是之前为单实例创建的 2 个磁盘组,用的是 EXTERNAL 模式,DATA 给了 4 个盘,FRA 给了 3 个盘,每个盘都是 3G

现在挂载失败,提示发现数量不足,EXTERNAL 模式应该没理由盘不够啊,查看一下 asm_diskstring 参数:

SQL> show parameter string


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
asm_diskstring                       string

原来 asm_diskstring 参数值为空,难怪说磁盘数量不足,原来是找不到磁盘,一个盘都没有,数量当然不足了

SQL> alter system set asm_diskstring=''/dev/asm*'';                              


System altered.


SQL> show parameter string


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
asm_diskstring                       string      /dev/asm*
SQL> alter system set asm_diskstring=''/dev/asm*'' scope=both;
alter system set asm_diskstring=''/dev/asm*'' scope=both
*
ERROR at line 1:
ORA-32001: write to SPFILE requested but no SPFILE is in use

这里本来是想把变更加到 spfile 里去的,但是这里并不是用 spfile 启动的,所以报错了,先不管,再试试挂载一下磁盘组

SQL> alter diskgroup DATA mount;


Diskgroup altered.


SQL> alter diskgroup FRA mount;


Diskgroup altered.

此处其实还有另外一条命令可以用:

SQL> alter system set asm_diskgroups=data,fra;(用此法加入磁盘组后是否直接是挂载状态还有待测试)

再查看一下数据库的配置情况:

[grid@dg1 ~]$ srvctl config database -t asmsingle
PRKO-2002 : Invalid command line option: -t
[grid@dg1 ~]$ srvctl config database -d asmsingle
Database unique name: asmsingle
Database name:
Oracle home: /u01/app/oracle/product/11.2.0/dbhome_1
Oracle user: oracle
Spfile:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Database instance: asmsingle
Disk Groups:
Services:

磁盘组依旧没有添加进内容,查看参数 asm_diskgroup 已经有这 2 个磁盘组了

SQL> show parameter asm_diskgroup


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
asm_diskgroups                       string      DATA, FRA

 

SQL> select name,state,type from v$asm_diskgroup;


NAME                           STATE       TYPE
------------------------------ ----------- ------
DATA                           MOUNTED     EXTERN
FRA                            MOUNTED     EXTERN

SQL> !
[grid@dg1 ~]$ asmcmd
ASMCMD> lsdg
State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512   4096  1048576     12288    10350                0           10350              0             N  DATA/
MOUNTED  EXTERN  N         512   4096  1048576      9216     8984                0            8984              0             N  FRA/

磁盘组已经正常挂载了,由于是用 pfile 启动的,想把结果保存到 spfile 中去:

SQL> show parameter spfile


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string
SQL> create spfile from pfile
  2  ;
create spfile from pfile
*
ERROR at line 1:
ORA-29786: SIHA attribute GET failed with error [Attribute ''SPFILE'' sts[200]
lsts[0]]

可能是由于 ASM 资源并没有注册到 HAS

[grid@dg1 ~]$ srvctl config asm
PRCR-1001 : Resource ora.asm does not exist
[grid@dg1 ~]$ srvctl add asm
[grid@dg1 ~]$ srvctl config asm
ASM home: /u01/app/11.2.0/grid
ASM listener: LISTENER
Spfile:
ASM diskgroup discovery string: ++no-value-at-resource-creation--never-updated-through-ASM++

这里不知道为何没有值,按理说应该已经能够识别到 asm_diskstring 了

ASM 的 alert 日志在路径 /u01/app/grid/diag/asm/+asm/+ASM/trace/alert_+ASM.log

查看了一下,有如下报错信息:

Mon Aug 26 02:25:32 2013
NOTE: failed to discover disks from gpnp profile asm diskstring
Errors in file /u01/app/grid/diag/asm/+asm/+ASM/trace/+ASM_rbal_14046.trc:
ORA-29786: SIHA attribute GET failed with error [Attribute ''ASM_DISKSTRING'' sts[200] lsts[0]]

[grid@dg1 ~]$ srvctl status asm
ASM is not running.
[grid@dg1 ~]$ srvctl start asm

[grid@dg1 ~]$ srvctl status asm
ASM is running on dg1

[grid@dg1 ~]$ crs_stat -t
Name           Type           Target    State     Host        
------------------------------------------------------------
ora....ER.lsnr ora....er.type ONLINE    ONLINE    dg1        
ora.asm        ora.asm.type   ONLINE    ONLINE    dg1        
ora....ngle.db ora....se.type OFFLINE   OFFLINE              
ora.cssd       ora.cssd.type  ONLINE    ONLINE    dg1        
ora.diskmon    ora....on.type OFFLINE   OFFLINE              
ora.evmd       ora.evm.type   ONLINE    ONLINE    dg1        
ora.ons        ora.ons.type   OFFLINE   OFFLINE

SQL> create spfile from pfile;
create spfile from pfile
*
ERROR at line 1:
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file
''/u01/app/11.2.0/grid/dbs/init+ASM.ora''

查看了一下路径,确实没有 init+ASM.ora 这个 pfile,所以用 pfile 来创建 spfile 这个方法看来不行了

SQL> create spfile from memory;


File created.

但是可以从内存创建 spfile,但是要注意,这条命令执行以后,会在 $GRID_HOME/dbs 创建 spfile,全名是”spfile+ASM.ora“

对于单实例而言,这个问题还不大,如果是 RAC 环境,则必须要在 spfile 文件名后面指定在 ASM 中的路径,如:”+DATA/asmsingle/spfile+ASM.ora“

那么这里,我再重新创建一个 spfile,来修改默认的 spfile 存放路径,这里涉及到 GPNP profile 内容的更新问题,原则是,会按照最新的保存位置来更新 spfile

SQL> shutdown immediate

ASM diskgroups dismounted
ASM instance shutdown
SQL> startup
ORA-32004: obsolete or deprecated parameter(s) specified for ASM instance
ASM instance started


Total System Global Area  283930624 bytes
Fixed Size                  2227664 bytes
Variable Size             256537136 bytes
ASM Cache                  25165824 bytes
ASM diskgroups mounted
SQL> show parameter spfile


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/11.2.0/grid/dbs/spfil
                                                 e+ASM.ora

我们可以来看一下 ASM 中文件的存放路径:

ASMCMD> ls
DATA/
FRA/
ASMCMD> cd data
ASMCMD> ls
ASM/
ASMSINGLE/
ASMCMD> cd asmsingle
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileasmsingle.ora

ASMCMD> cd parameterfile

ASMCMD> ls
spfile.266.824164223

注意,如果是 RAC 环境,刚才的创建 spfile 的语句就要改成:SQL> create spfile=''+DATA/asmsingle/'' from memory;

否则会造成 RAC 中其他节点无法访问 spfile 而破坏 RAC 环境,这个 spfile.266.824164223 的文件是系统自动生成的,具体作用还未研究过

注意这里 RAC 用的 spfile 是上面那个 spfileasmsingle.ora,这点千万不要搞错了

做完以上全部操作以后,再启动数据库:

[oracle@dg1 ~]$ sqlplus ''/as sysdba''


SQL*Plus: Release 11.2.0.3.0 Production on Mon Aug 26 03:26:14 2013


Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup
ORACLE instance started.


Total System Global Area  313159680 bytes
Fixed Size                  2227944 bytes
Variable Size             117440792 bytes
Database Buffers          188743680 bytes
Redo Buffers                4747264 bytes
Database mounted.
Database opened.

[grid@dg1 ~]$ srvctl config database -d asmsingle
Database unique name: asmsingle
Database name:
Oracle home: /u01/app/oracle/product/11.2.0/dbhome_1
Oracle user: oracle
Spfile:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Database instance: asmsingle
Disk Groups: DATA,FRA
Services:

[grid@dg1 ~]$ crs_stat -t
Name           Type           Target    State     Host        
------------------------------------------------------------
ora.DATA.dg    ora....up.type ONLINE    ONLINE    dg1        
ora.FRA.dg     ora....up.type ONLINE    ONLINE    dg1        
ora....ER.lsnr ora....er.type ONLINE    ONLINE    dg1        
ora.asm        ora.asm.type   ONLINE    ONLINE    dg1        
ora....ngle.db ora....se.type ONLINE    ONLINE    dg1        
ora.cssd       ora.cssd.type  ONLINE    ONLINE    dg1        
ora.diskmon    ora....on.type OFFLINE   OFFLINE             
ora.evmd       ora.evm.type   ONLINE    ONLINE    dg1        
ora.ons        ora.ons.type   OFFLINE   OFFLINE  

OK, 故障解决

PS:关于本测试还有 2 个疑问

1. 测试重新在 ASM 上创建一个 spfile,看默认是不是用这个 spfile 启动,即 GPNP profile 有没有生效 (已解决)

ASMCMD> spget
/u01/app/11.2.0/grid/dbs/spfile+ASM.ora
ASMCMD> pwd
+data/asmsingle -- 注意这里是数据库实例,是我搞错了,应该进入的路径是 + data/asm
ASMCMD> ls -l
Type           Redund  Striped  Time             Sys  Name
                                                 Y    CONTROLFILE/
                                                 Y    DATAFILE/
                                                 Y    ONLINELOG/
                                                 Y    PARAMETERFILE/
                                                 Y    TEMPFILE/
                                                 N    spfileasmsingle.ora => +DATA/ASMSINGLE/PARAMETERFILE/spfile.266.824164223

spfileasmsingle.ora->spfile.266.824164223 (OMF 格式) 是一个映射关系,都是数据库实例的 spfile

ASMCMD> spset +DATA/asmsingle/spfileasmsingle.ora -- 之前错把数据库实例的 spfile 当做了 asm 实例的 spfile,这里 spset 了一个错误的路径
ASMCMD> spget
+DATA/asmsingle/spfileasmsingle.ora
ASMCMD> exit
[grid@dg1 ~]$ srvctl config asm -a
ASM home: /u01/app/11.2.0/grid
ASM listener: LISTENER
Spfile: +DATA/asmsingle/spfileasmsingle.ora
ASM diskgroup discovery string: ++no-value-at-resource-creation--never-updated-through-ASM++
ASM is enabled.

(注:上面的 spfile 其实是数据库实例的,而并不是 asm 实例的,所以这里 ASM diskgroup discovery string 提示没有值)

SQL> show parameter diskgroup


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
asm_diskgroups                       string      DATA, FRA
SQL> show parameter diskstring


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
asm_diskstring                       string     /dev/asm*  -- 其实是有 diskgroup string 的


用 spset 设置 spfile 新的路径后是即时生效的,但前提是设置的这个 spfile 必须本来就是存在的,否则,只有通过下面的办法先创建一个 ASM 实例的 spfile:

SQL>create spfile=''+DATA/asm/asmparameterfile/asmspfile.ora'' from pfile=''$ORACLE_HOME/dbs/init+ASM.ora'';

SQL> create spfile=''+DATA/asm/asmparameterfile/asmspfile.ora'' from pfile; -- 此处可以省略 pfile 的路径,默认就是去 dbs 路径下去找 init+ASM.ora 文件的

File created.

SQL> !
[grid@dg1 ~]$ asmcmd
ASMCMD> cd data/asm
ASMCMD> ls
ASMPARAMETERFILE/
ASMCMD> cd asmparameterfile
ASMCMD> ls
REGISTRY.253.824517131
asmspfile.ora
ASMCMD> spget
+DATA/asm/asmparameterfile/asmspfile.ora

可以看到,创建完后会直接更新 GPNP profile,现在 ASM 实例的 spfile 已经是新指定的 + DATA 路径了
这里 REGISTRY.253.824517131 是系统自动生成的 ASM 实例的 spfile 文件,是 OMF 格式的,下面的 asmspfile.ora 是刚才那条命令创建的
此时如果以不带参数文件的 startup 启动 ASM 实例,则使用的是 + DATA 这一 ASM 磁盘上的 spfile,而不再是之前本地磁盘上的 spfile 了

SQL> startup force
ORA-32004: obsolete or deprecated parameter(s) specified for ASM instance
ASM instance started

Total System Global Area  283930624 bytes
Fixed Size                  2227664 bytes
Variable Size             256537136 bytes
ASM Cache                  25165824 bytes
ASM diskgroups mounted
SQL> show parameter spfile


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      +DATA/asm/asmparameterfile/asm
                                                 spfile.ora
注意:这里已经用了刚才新创建的 spfile 指定的路径了,之前的理论得到验证

ASMCMD> cd +data/asm/asmparameterfile
ASMCMD> pwd
+data/asm/asmparameterfile
ASMCMD> ls -l
Type              Redund  Striped  Time             Sys  Name
ASMPARAMETERFILE  UNPROT  COARSE   AUG 27 00:00:00  Y    REGISTRY.253.824517131
                                                    N    asmspfile.ora => +DATA/ASM/ASMPARAMETERFILE/REGISTRY.253.824517131
当我们在 ASM 磁盘组上创建 spfile 后,不仅是更新 GPNP profile 后直接生效,还会把新建的 spfile 和系统原有的 spifle 做一个映射,asmspfile.ora->REGISTRY.253.824517131 的映射,这个和数据库实例的 spifle 是类似的

最后在来验证一下:
ASMCMD> exit
[grid@dg1 ~]$ srvctl config asm -a
ASM home: /u01/app/11.2.0/grid
ASM listener: LISTENER
Spfile: +DATA/asm/asmparameterfile/asmspfile.ora
ASM diskgroup discovery string: /dev/asm*
ASM is enabled.
这时候发现 ASM diskgroup discovery string 里的值已经可以正确识别了,因为配置了正确的 ASM 实例的 spfile

2. 为何状态都正常的情况下,ora.diskmon 还是 OFFLINE 状态 (已解决)

关于 ora.diskmon 这个 resource 是专门为 EXADATA 环境准备的,对于 11.2.0.3 的非 EXADATA 环境,默认是被 DISABLE 的,我也是查了一篇帖子才知道,

它和 CSS 有依赖关系,虽然 CSS 启动的时候 diskmon 也显示 succeeded,但是默认不会启动,让我困惑了好一会

这个是关于 ora.diskmon 在非 EXADATA 环境会 DISABLE 的链接:http://blog.csdn.net/mrluoe/article/details/7525457

后记:当从 pfile 创建 spfile 后,启动 asm 实例时,又引发了另一个错误:ORA-32004: obsolete or deprecated parameter (s) specified for ASM instance

为 ASM 指定的参数过期或废弃了

SQL> set line 200 pages 999
SQL> col name for a30
SQL> col value for a50
SQL> select t.NAME,t.value from v$parameter t where t.ISDEPRECATED=''TRUE'';

NAME                           VALUE
------------------------------ --------------------------------------------------
lock_name_space
remote_os_authent              FALSE
background_dump_dest           /u01/app/grid/diag/asm/+asm/+ASM/trace
user_dump_dest                 /u01/app/grid/diag/asm/+asm/+ASM/trace
sql_trace                      FALSE

发现有 5 个过期参数,asm 实例的报警日志里也记录了 2 个参数,内容如下:

Deprecated system parameters with specified values:
  background_dump_dest    
  user_dump_dest          
End of deprecated system parameter listing

都共同指向了 background_dump_dest 和 user_dump_dest,那我们只要把这两个参数注释掉,就可以解决问题了

先修改 pfile,把其中的关于这两个参数的行注释掉,然后重新用 pfile 再创建一次 spfile,再用 spfile 启动:

SQL> startup force pfile=''/u01/app/11.2.0/grid/dbs/init+ASM.ora'' -- 用注释掉那 2 个参数的本地 pfile 启动
ASM instance started


Total System Global Area  283930624 bytes

Fixed Size                  2227664 bytes
Variable Size             256537136 bytes
ASM Cache                  25165824 bytes
ASM diskgroups mounted

SQL> create spfile=''+DATA/asm/asmparameterfile/asmspfile.ora'' from pfile; -- 重新用修改好的 pfile 创建一次 spfile

File created.

SQL> startup force -- 重新启动后,不报 ORA-32004 错误了
ASM instance started

Total System Global Area  283930624 bytes
Fixed Size                  2227664 bytes
Variable Size             256537136 bytes
ASM Cache                  25165824 bytes
ASM diskgroups mounted

至此,一路碰到的 ASM 单实例故障全部解决,完!
————————————————
版权声明:本文为 CSDN 博主「aaron8219」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aaron8219/java/article/details/10313397

asm 学习 2-java 类在 asm 里的基本描述

asm 学习 2-java 类在 asm 里的基本描述

上节里有关于 asm 的一些基本概念,比如:visit 里的第一个类版本,方法的描述、引用描述等,下面将一一介绍。

类版本

一个 Java 二进制的类文件,都有一个版本,对应于不同的 jdk 版本。因此 ASM 中提供了几个常量来指定一个类的版,这些常量定义在 org.objectweb.asm.Opcodes 接口中,如下:

asm 中类版本标识 对应 jdk 版本
public static final int V1_1 = 196653;
public static final int V1_2 = 46; 1.2
public static final int V1_3 = 47; 1.3
public static final int V1_4 = 48; 1.4
public static final int V1_5 = 49; 1.5
public static final int V1_6 = 50; 1.6
public static final int V1_7 = 51; 1.7
public static final int V1_8 = 52; 1.8

内部名字

在 Java 二进制文件中使用的是 JVM 的内部名字,而不是我们所熟悉的以 “.” 分割的全限定名,内部名字是以 “/” 替代 “.” 的全名。例如:java.lang.String 在 JVM 中的内部名字是 java/lang/String。

在 ASM 中可以使用 org.objectweb.asm.Type 类中的静态方法 getInternalName (final Class c) 来获得,如下:

package net.zq.test;

import org.objectweb.asm.Type;

public class ttt
{

	public static void main(String[] args)
	{
		System.out.println(Type.getInternalName(String.class));
		System.out.println(Type.getInternalName(Integer.class));
		System.out.println(Type.getInternalName(ttt.class));
	}
}

运行结果:

java/lang/String
java/lang/Integer
net/zq/test/ttt

类型描述

我们知道 JAVA 类型分为基本类型和引用类型,在 JVM 中对每一种类型都有与之相对应的类型描述

基本类型描述如下:

java 基本类型
jvm 中的描述
boolean Z
byte B
char C
short S
int I
long J
float F
double D

引用类型描述如下: 

 一般引用类型为:“L 该类型类描述符; ”。如:String 类型的域描述符为 Ljava/lang/String;  

 对于数组,其为:“[其类型的域描述符;”。如: int [ ]     其描述符为 [I

多维数组其则为: N 个 [该类型的域描述符,N 代表的是几维数组。如:int  [][ ] 其描述符为 [[I

java 引用类型 jvm 中的描述
String Ljava/lang/String;
Object Ljava/lang/Object;
int[] [I
float[] [F
String[] [Ljava/lang/String;
Object[] [Ljava/lang/Object;
int[ ][ ]  [[I
float[ ][ ] [[F

在 ASM 中要获取类的内部描述,可以使用 org.objectweb.asm.Type 类中的 getDescriptor (final Class c) 方法,如下:

package net.zq.test;

import org.objectweb.asm.Type;

public class ttt
{

	public static void main(String[] args)
	{
		System.out.println(Type.getDescriptor(ttt.class));  
                System.out.println(Type.getDescriptor(String.class));  
	}
}

运行结果:

Lnet/zq/test/ttt;
Ljava/lang/String;

方法描述

分两部分:

  1. 括号中参数部分:用括号括起来里面的参数描述

  2. 返回值类型部分:返回值值类型的描述符

  3. 综合在一起即为:(参数的描述符 - 按原顺序)返回类型描述符

    1. 如:void a (int i,float f) 表示为 (IF) V

  4. 对于无返回值的,用 V(表示 void)表示

如下:

java 层的方法描述
二进制文件中的方法描述
String test()
Ljava/lang/String;
void a(int i,float f) (IF)V
void a(Object o) (Ljava/lang/Object;)V
int a(int i,String s) (ILjava/lang/String;)I
int[] a(int[] i) ([I)[I
void set (byte[ ] bytes) ([B)V

获取一个方法的描述,在 ASM 用 org.objectweb.asm.Type.getMethodDescriptor 来获取,如下:

package net.zq.test;

import org.objectweb.asm.Type;

public class ttt
{

	public static void main(String[] args) throws NoSuchMethodException, SecurityException
	{
		java.lang.reflect.Method m = String.class.getMethod("substring", int.class);  
                System.out.println(Type.getMethodDescriptor(m));   
	}
}

运行结果 如下:

(I)Ljava/lang/String;

在 org.objectweb.asm.Type 类中还提供了其他很多方法让我们去了解一个类,有兴趣的可以可以深看一下,对于理解类会有很大帮助。

ASM 管理的 Oracle 19C 数据库ADG的搭建及主备切换

ASM 管理的 Oracle 19C 数据库ADG的搭建及主备切换

-- 主备库Grid及Oracle Home 目录

/u01/app/grid/product/19.0.0/gihome_1

/u01/app/oraInventory

/u01/app/oracle/product/19.0.0/dbhome_1



-- 主库开启强制日志模式、归档模式

SQL> alter database force logging;  

SQL> select force_logging from v$database; 



SQL> archive log list; 

SQL> shutdown immediate 

SQL> startup mount 

SQL> alter database archivelog; 

SQL> alter database open;  



SQL> alter system set sga_max_size=180G scope=spfile;

SQL> alter system set sga_target=180G scope=spfile;

SQL> alter system set pga_aggregate_target=30G scope=spfile;



-- 主库查询添加 stby redo logfile

SQL> select group#, members, bytes from v$log; 

SQL> select member from v$logfile; 



SQL> alter database add standby logfile group 7 (''+DATA'') size 1G;

SQL> alter database add standby logfile group 8 (''+DATA'') size 1G;

SQL> alter database add standby logfile group 9 (''+DATA'') size 1G;

SQL> alter database add standby logfile group 10 (''+DATA'') size 1G;

SQL> alter database add standby logfile group 11 (''+DATA'') size 1G;

SQL> alter database add standby logfile group 12 (''+DATA'') size 1G;

SQL> alter database add standby logfile group 13 (''+DATA'') size 1G;



-- 分别在主备库配置监听并启动,直接使用 netmgr 工具生成 添加如下内容

$ vi listener.ora

-- prmy

SID_LIST_LISTENER =

 (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = ynsb)

      (ORACLE_HOME =/u01/app/oracle/product/19.0.0/dbhome_1)

      (SID_NAME = ynsb)

    )

 )

-- stby

SID_LIST_LISTENER =

 (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = ynsbsby)

      (ORACLE_HOME =/u01/app/oracle/product/19.0.0/dbhome_1)

      (SID_NAME = ynsbsby)

    )

 )

$ lsnrctl reload



-- 主备库配置 tnsnames.ora 内容如下

$ vi tnsnames.ora 

LISTENER_YNSB =

  (ADDRESS = (PROTOCOL = TCP)(HOST = sjz)(PORT = 1521))



YNSB =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = sjz)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ynsb)

    )

  )

  

YNSBSBY =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = sjz)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ynsbsby)

    )

  )

-- 配置好后拷贝到备库

$ scp $ORACLE_HOME/network/admin/ * oracle@172.30.2.54:$ORACLE_HOME/network/admin/



-- 在备库创建必要的目录,参考主库的pfile中的路径:

$ mkdir -p /u01/app/oracle/fast_recovery_area

$ mkdir -p /u01/app/oracle/oradata/... ... 

$ mkdir -p /u01/app/oracle/admin/ynsb/adump



ASMCMD> cd +DATA

ASMCMD> mkdir YNSBSBY

ASMCMD> cd YNSBSBY

ASMCMD> mkdir DATAFILE

ASMCMD> mkdir CONTROLFILE

ASMCMD> mkdir ONLINELOG

ASMCMD> mkdir PARAMETERFILE

ASMCMD> mkdir TEMPFILE



-- 主库创建 pfile 文件并修改 pfile 如下参数

*.DB_NAME=''ynsb''

*.DB_UNIQUE_NAME=''ynsb''

alter system set standby_file_management=''AUTO'';

alter system set LOG_ARCHIVE_CONFIG=''DG_CONFIG=(ynsb,ynsbsby)''; -- DB_UNIQUE_NAME

alter system set LOG_ARCHIVE_DEST_1=''LOCATION=/arch/archive_log/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ynsb'';

alter system set LOG_ARCHIVE_DEST_2=''SERVICE=YNSBSBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) LGWR AFFIRM SYNC DB_UNIQUE_NAME=ynsbsby'';

*.LOG_ARCHIVE_DEST_STATE_1=''ENABLE''

*.LOG_ARCHIVE_DEST_STATE_2=''ENABLE''

*.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc

*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

*.archive_lag_target=1800

*.LOG_ARCHIVE_MAX_PROCESSES=30

-- TNSNAME

alter system set FAL_SERVER=''YNSB'';

alter system set FAL_CLIENT=''YNSBSBY'';

alter system set LOG_FILE_NAME_CONVERT=''/arch/archive_log/'',''/arch/archive_log/'' scope=spfile;

alter system set DB_FILE_NAME_CONVERT=''+DATA/YNSB/DATAFILE/'',''+DATA/YNSBSBY/DATAFILE/'',''+DATA/YNSB/TEMPFILE/'',''+DATA/YNSBSBY/TEMPFILE/'' scope=spfile;



-- 将主库的口令文件及修改后的参数文件copy到备库

$ scp /home/oracle/temp.ora oracle@192.168.1.101:/home/oracle/temp.ora

$ scp $ORACLE_HOME/dbs/orapwdprmy oracle@192.168.1.101:$ORACLE_HOME/dbs/orapwdstby



-- 主库的参数文件copy到备库并修改如下参数

*.db_unique_name=''ynsbsby''

*.log_archive_config=''dg_config=(ynsb,ynsbsby)''

*.log_archive_dest_1=''location=/arch/archive_log/ valid_for=(all_logfiles,all_roles) db_unique_name=ynsbsby''

*.log_archive_dest_2=''service=YNSB valid_for=(online_logfiles,PRIMARY_ROLE) lgwr affirm sync db_unique_name=ynsb''

*.log_archive_dest_state_1=enable

*.log_archive_dest_state_2=enable

*.standby_file_management=''auto''

*.fal_server=''YNSB'' -- TNSNAME

*.fal_client=''YNSBSBY''



-- 用新参数重启主数据库:

SQL> shutdown immediate 

SQL> create spfile from pfile;

SQL> startup 

SQL> alter pluggable database pdborcl open;

 

-- 用 spfile 将备库启动到nomount 状态

SQL> startup nomount pfile=''/home/oracle/temp.ora''

SQL> create spfile=''+DATA/YNSBSBY/PARAMETERFILE/spfileynsbsby.ora'' from pfile=''/home/oracle/temp.ora'';

SQL> shutdown immediate 



-- 添加注册数据库到 ASM 中

$ srvctl add database -db ynsbsby -o /u01/app/oracle/product/19.0/db_1

$ srvctl modify database -db ynsbsby -role physical_standby -spfile ''+DATA/YNSBSBY/PARAMETERFILE/spfileynsbsby.ora''



-- 开始进行 Active duplicate, 执行完毕后,数据库自动进入mount状态

$ rman target sys/oracle123@YNSB auxiliary sys/oracle123@YNSBSBY;

RMAN> duplicate target database for standby from active database;



-- 主库配置

rman target /

CONFIGURE ARCHIVELOG DELETION POLICY TO applied on standby;



-- 打开备库并并启动 apply

SQL> select open_mode from v$database; 

SQL> alter database open;



-- 备库是只读的

-- 查看主备库 

SQL> select log_mode,open_mode ,database_role from v$database;



-- 备库启动 real-time apply:

SQL> alter database recover managed standby database using current logfile disconnect from session;

SQL> select open_mode from v$database;



-- 验证DG

SQL> alter system switch logfile;



-- 主备切换

-- 正常切换:主库:

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

-- 备库:

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;



-- 主切备

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL standby;

SQL> startup nomount;

SQL> alter database mount standby database;

SQL> ALTER DATABASE RECOVER MANAGED standby DATABASE DISCONNECT FROM SESSION;



-- 备切主

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO primary;

SQL> select status from v$instance;

SQL> alter database open;



-- 打开备库

-- 注:如打开新备库出现如下错误的解决方式:

SQL> alter database open;

SQL> alter database recover managed standby database cancel;

SQL> alter database open;

SQL> alter database recover managed stby database using current logfile disconnect ; 

-- 注意:切换后验证DG



-- 主备启停

-- 先启动备库:

$ lsnrctl start

SQL> STARTUP MOUNT;

SQL> ALTER DATABASE OPEN READ ONLY;

SQL> ALTER DATABASE RECOVER MANAGED standby DATABASE DISCONNECT FROM SESSION;

-- 查看备库状态和模式

SQL> select name,open_mode,protection_mode,database_role from v$database;

-- 再启动主库:

$ lsnrctl start

SQL> startup



-- 查看主库状态和模式:

SQL> select name,open_mode,protection_mode,database_role from v$database;

-- 在主库归档当前日志:

SQL> alter system archive log current;



-- 监控备库:

-- 查看stby库的log_archive_dest_1下应该有archive产生。

-- 查寻v$archived_log,有新的日志记录出现。最大sequence#,应该为主库v$log中current状态日志的序列号减一。

SQL>select sequence#,applied,first_time,next_time,resetlogs_change#,completion_time from v$archived_log order by sequence#;

-- 查看服务是否启动:

SQL> select process,status,client_process,sequence#,BLOCK# from v$managed_standby;

-- 查看是否有遗漏的归档日志

SQL> select * from v$archive_gap;



-- 关闭 dataguard

-- 先关闭主库:

SQL> alter system archive log current;

SQL>SHUTDOWN IMMEDIATE;

-- 再关闭备库:

SQL> ALTER DATABASE RECOVER MANAGED standby DATABASE CANCEL;

SQL>SHUTDOWN IMMEDIATE;

关于oracle asm disk被格式化为ntfs文件系统oracle asm盘符变了的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.asm 和 .asm.1 之间的区别?、ASM 单实例由 Oracle Restart 引发的系列故障分析 (Final Version)、asm 学习 2-java 类在 asm 里的基本描述、ASM 管理的 Oracle 19C 数据库ADG的搭建及主备切换的相关知识,请在本站寻找。

本文标签: