DB-hub Technology Oracle Lab – ASM DB Grid Install 12.2

Oracle Lab – ASM DB Grid Install 12.2

1.环境准备

Linux 主机安装,请参考实验一和实验二。

主机名:poc12d
IP地址:192.168.1.107
数据库:SLOTH
内存: 4GB
硬盘:60GB

Oracle Database 12.2
OS: CentOS Linux 7.9

安装包:
linuxx64_12201_grid_home.zip
linuxx64_12201_database.zip

vi /etc/hosts
192.168.1.107 poc12d poc12d.lab.com

1.1.用户,组,安装目录

groupadd oinstall
groupadd dba
groupadd oper
groupadd asmadmin
groupadd asmdba
groupadd asmoper

usermod -g oinstall -G dba,oper,asmadmin,asmdba,asmoper oracle

1.2.Prepare directory

ORACLE_BASE=/oracle/app/oracle
ORACLE_HOME=/oracle/app/oracle/product/12.2.0.1/db
GRID_HOME=/oracle/app/oracle/product/12.2.0.1/grid


cd /
mkdir -p /oracle/app/oracle/product/12.2.0.1/db
mkdir -p /oracle/app/oracle/product/12.2.0.1/grid
chown -R oracle:oinstall /oracle
chmod -R 775 /oracle

1.3.oracle profile

登录oracle

vi .bash_profile

export ORACLE_SID=SLOTH
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=#ORACLE_BASE/product/12.2.0.1/db
export GRID_HOME=#ORACLE_BASE/product/12.2.0.1/grid
export TNS_ADMIN=#ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=#ORACLE_HOME/lib:#LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

export PATH=#ORACLE_HOME/bin:#GRID_HOME/bin:#PATH

export DISPLAY=localhost:10.0

export PS1='[\u@\h:`pwd`]'

alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'

2.配置共享存储

2.1.共享磁盘

打开Command Prompt窗口,CD到VMware安装目录,运行以下命令:

vmware-vdiskmanager.exe -c -s 5g -a lsilogic -t 2 C:\VMWare\poc12d-vdisk\data.vmdk

vmware-vdiskmanager.exe -c -s 5g -a lsilogic -t 2 C:\VMWare\poc12d-vdisk\fra.vmdk

vmware-vdiskmanager.exe -c -s 5g -a lsilogic -t 2 C:\VMWare\poc12d-vdisk\crs.vmdk

2.2.虚拟机加载共享磁盘

关闭虚拟机,关闭orapg窗口。
用记事本打开orapg.vmx
添加以下:

#shared disks configure
disk.locking = "FALSE"
diskLib.dataCacheMaxSize = "0"
diskLib.dataCacheMaxReadAheadSize = "0"
diskLib.dataCacheMinReadAheadSize = "0"
diskLib.maxUnsyncedWrites = "0"

scsi1.present = "TRUE"
scsi1.virtualDev = "lsilogic"
scsil.sharedBus = "VIRTUAL"

scsi1:0.present = "TRUE"
scsi1:0.mode = "independent-persistent"
scsi1:0.fileName = "C:\VMWare\poc12d-vdisk\data.vmdk"
scsi1:0.deviceType = "disk"
scsi1:0.redo = ""

scsi1:1.present = "TRUE"
scsi1:1.mode = "independent-persistent"
scsi1:1.fileName = "C:\VMWare\poc12d-vdisk\fra.vmdk"
scsi1:1.deviceType = "disk"
scsi1:1.redo = ""

scsi1:2.present = "TRUE"
scsi1:2.mode = "independent-persistent"
scsi1:2.fileName = "C:\VMWare\poc12d-vdisk\crs.vmdk"
scsi1:2.deviceType = "disk"
scsi1:2.redo = ""

2.3.重新打开虚拟机vmx文件

3.安装ASM

3.1.ASM安装包

$yum search oracleasm
Loaded plugins: langpacks, ulninfo
============================ N/S matched: oracleasm ============================
kmod-oracleasm.x86_64 : oracleasm kernel module(s)
oracleasm-support.x86_64 : The Oracle Automatic Storage Management support
                         : programs.

3.2.安装oracleasm包

yum -y install kmod-oracleasm.x86_64
yum -y install oracleasm-support.x86_64
rpm -ivh oracleasmlib-2.0.12-1.el7.x86_64.rpm

3.3.初始化ASM

#sudo oracleasm configure -i
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver.  The following questions will determine whether the driver is
loaded on boot and what permissions it will have.  The current values
will be shown in brackets ('[]').  Hitting <ENTER> without typing an
answer will keep that current value.  Ctrl-C will abort.

Default user to own the driver interface []: oracle
Default group to own the driver interface []: asmadmin
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done

#sudo oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Configuring "oracleasm" to use device physical block size
Mounting ASMlib driver filesystem: /dev/oracleasm

查看设置结果:

$oracleasm configure
ORACLEASM_ENABLED=true
ORACLEASM_UID=oracle
ORACLEASM_GID=asmadmin
ORACLEASM_SCANBOOT=true
ORACLEASM_SCANORDER=""
ORACLEASM_SCANEXCLUDE=""
ORACLEASM_SCAN_DIRECTORIES=""
ORACLEASM_USE_LOGICAL_BLOCK_SIZE="false"

3.4.ASM磁盘分区

cd /dev
$ls -l sd*
brw-rw---- 1 root disk 8,  0 Jan 22 22:19 sda
brw-rw---- 1 root disk 8,  1 Jan 22 22:19 sda1
brw-rw---- 1 root disk 8,  2 Jan 22 22:19 sda2
brw-rw---- 1 root disk 8, 16 Jan 22 22:19 sdb
brw-rw---- 1 root disk 8, 32 Jan 22 22:19 sdc
$fdisk sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x906c3ce9.

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759
Partition 1 of type Linux and of size 5 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

虚拟磁盘sdc,sdd执行相同的操作。

3.5.创建ASM磁盘

$ls -l sd*
brw-rw---- 1 root disk 8,  0 Jan 22 22:19 sda
brw-rw---- 1 root disk 8,  1 Jan 22 22:19 sda1
brw-rw---- 1 root disk 8,  2 Jan 22 22:19 sda2
brw-rw---- 1 root disk 8, 16 Jan 22 23:21 sdb
brw-rw---- 1 root disk 8, 17 Jan 22 23:21 sdb1
brw-rw---- 1 root disk 8, 32 Jan 22 23:22 sdc
brw-rw---- 1 root disk 8, 33 Jan 22 23:22 sdc1

# sudo oracleasm createdisk DATA sdb1
Writing disk header: done
Instantiating disk: done
# sudo oracleasm createdisk FRA sdc1
Writing disk header: done
# sudo oracleasm createdisk CRS sdd1
Writing disk header: done

删除磁盘命令,仅供参考:

oracleasm deletedisk FRA
Instantiating disk: done

3.6.验证

#sudo oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...

#sudo oracleasm listdisks
CRS
DATA
FRA

4.预安装检查

If you do not use an Oracle Preinstallation RPM, and you want to use the Cluster Verification Utility, then you must install the cvuqdisk RPM.
Without cvuqdisk, Cluster Verification Utility cannot discover shared disks, and you receive the error message “Package cvuqdisk not installed” when you run Cluster Verification Utility. Use the cvuqdisk RPM for your hardware (for example, x86_64).

4.1.解压Grid安装包

解压缩安装包到$GRID_HOME目录

unzip /home/oracle/linuxx64_12201_grid_home.zip -d $GRID_HOME
rm /home/oracle/linuxx64_12201_grid_home.zip

4.2.安装cvuqdisk

Locate the cvuqdisk RPM package, which is located in the directory Grid_home/cv/rpm. Where Grid_home is the Oracle Grid Infrastructure home directory. Ex: /oracle/product/12.2.0.1/grid
Copy the cvuqdisk package to each node on the cluster. You should ensure that each node is running the same version of Linux.
Set the environment variable CVUQDISK_GRP to point to the group that owns cvuqdisk, typically oinstall.
For example:
export CVUQDISK_GRP=asmadmin
Log in as root. In the directory where you have saved the cvuqdisk RPM, install the cvuqdisk package. For example:
rpm -ivh cvuqdisk-1.0.10-1.rpm
If you have an existing version of cvuqdisk, then enter the following command to deinstall the existing version:
rpm -e cvuqdisk

cd $GRID_HOME/cv/rpm
export CVUQDISK_GRP=asmadmin
sudo rpm -ivh cvuqdisk-1.0.10-1.rpm

4.3.运行runcluvfy.sh

cd $GRID_HOME
./runcluvfy.sh stage -pre crsinst -n poc12d root -verbose

Pre-check for cluster services setup was successful.

CVU operation performed:      stage -pre crsinst
Date:                         Mar 2, 2020 11:39:05 AM
CVU home:                     /home/grid/cvuqdisk/
User:                         grid

或者提供root password:

./runcluvfy.sh stage -pre crsinst -n poc12d -method root -verbose

问题1: 内存不足,安装12.2 grid 需要至少8GB内存。

Verifying Physical Memory ...FAILED
poc12d: PRVF-7530 : Sufficient physical memory is not available on node
        "poc12d" [Required physical memory = 8GB (8388608.0KB)]

可以忽略

问题2:

Verifying /dev/shm mounted as temporary file system ...FAILED
poc12d: PRVE-0421 : No entry exists in /etc/fstab for mounting /dev/shm

CVU在不适用的RHEL7上执行了/dev/shm安装检查。
MOS:如果在RHEL7上执行/dev/shm安装检查,可忽略此问题。

问题3:

Verifying Network Time Protocol (NTP) ...FAILED
Verifying Daemon "avahi-daemon" not configured and running ...FAILED
poc12d: PRVG-1360 : Daemon process "avahi-daemon" is running on node "poc12d"

可以忽略

5.安装Grid软件

5.1.启动安装程序

$GRID_HOME/gridSetup.sh &

选择为独立服务器配置集群件:

5.2.磁盘组

disk group name: CRS
Set the redundancy to “External” and select your disks

NORMAL REDUNDANCY – Two-way mirroring, requiring two failure groups.
HIGH REDUNDANCY – Three-way mirroring, requiring three failure groups.
EXTERNAL REDUNDANCY – No mirroring for disks that are already protected using hardware RAID or mirroring

If you don’t see your disks straight away then click the “Change Discovery Path” button and set the path to “/dev/oracleasm/disks/*”

5.3.ASMSNMP

ASMSNMP Password: oracle

5.4.Enterprise Manager (EM)

5.5.System Group

5.6.Installation Location

5.7.Create Inventory

5.8.Root Script Execution

5.9.Prerequisite Checks

ignore All:

5.10.Summary

5.11.Install

5.12.Finish

ASM实例已经自动启动:

ps -ef|grep asm
avahi       776      1  0 19:28 ?        00:00:01 avahi-daemon: running [asm1.local]
oracle    27241      1  0 20:28 ?        00:00:00 asm_pmon_+ASM
oracle    27243      1  0 20:28 ?        00:00:00 asm_clmn_+ASM
oracle    27245      1  0 20:28 ?        00:00:00 asm_psp0_+ASM
oracle    27248      1  2 20:28 ?        00:00:02 asm_vktm_+ASM
oracle    27252      1  0 20:28 ?        00:00:00 asm_gen0_+ASM
oracle    27254      1  0 20:28 ?        00:00:00 asm_mman_+ASM
oracle    27258      1  0 20:28 ?        00:00:00 asm_gen1_+ASM
oracle    27262      1  0 20:28 ?        00:00:00 asm_diag_+ASM
oracle    27264      1  0 20:28 ?        00:00:00 asm_pman_+ASM
oracle    27266      1  0 20:28 ?        00:00:00 asm_dia0_+ASM
oracle    27268      1  0 20:28 ?        00:00:00 asm_dbw0_+ASM
oracle    27270      1  0 20:28 ?        00:00:00 asm_lgwr_+ASM
oracle    27272      1  0 20:28 ?        00:00:00 asm_ckpt_+ASM
oracle    27274      1  0 20:28 ?        00:00:00 asm_smon_+ASM
oracle    27276      1  0 20:28 ?        00:00:00 asm_lreg_+ASM
oracle    27278      1  0 20:28 ?        00:00:00 asm_pxmn_+ASM
oracle    27280      1  0 20:28 ?        00:00:00 asm_rbal_+ASM
oracle    27282      1  0 20:28 ?        00:00:00 asm_gmon_+ASM
oracle    27284      1  0 20:28 ?        00:00:00 asm_mmon_+ASM
oracle    27286      1  0 20:28 ?        00:00:00 asm_mmnl_+ASM
oracle    27322      1  0 20:28 ?        00:00:00 asm_o000_+ASM
oracle    27324      1  0 20:28 ?        00:00:00 oracle+ASM_o000_+asm (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    27417      1  0 20:28 ?        00:00:00 asm_ars0_+ASM
oracle    27898      1  0 20:28 ?        00:00:00 asm_fd00_+ASM
export ORACLE_HOME=/oracle/app/oracle/product/12.2.0.1/grid
export ORACLE_SID=+ASM
asmcmd
ASMCMD> ls
CRS/
DATA/
FRA/
ASMCMD> cd CRS
ASMCMD> ls
ASM/
orapwasm
ASMCMD> cd asm
ASMCMD> ls
ASMPARAMETERFILE/
PASSWORD/

6.配置ASM磁盘组

6.1.启动asmca

运行: asmca

6.2.Create Disk Group

7.安装Oracle 12.2

7.1.上传oracle 数据库安装文件

解压缩安装包:

cd /home/oracle
unzip linuxx64_12201_database.zip
rm linuxx64_12201_database.zip

7.2.启动安装程序

cd /home/oracle/database
./runInstaller

7.3.Installation Option

7.4.Install Type

7.5.Database Edition

7.6.Installation Location

7.7.System Groups

7.8.Prerequisite Checks

7.9.Summary

7.10.Install

7.11.Finish

rm -rf /home/oracle/database

8.建数据库

8.1.启动dbca

运行dbca

8.2.creation Mode

8.3.Deployment Type

8.4.Database Identification

8.5.Storage Option

Database files storage type: ASM
Database files location: +DATA/{DB_UNIQUE_NAME}
Multiplex redo logs and control files:

File Location Variables:

8.6.Fast Recovery Option

Archive log destinations use FRA by default:

8.7.Network Configuration

8.8.Database Options

8.9.Configuration Options

Use ASMM:

Process: 150
Character sets: default
Connection mode:default
Sample schemas: default

如果选AMM,出错:

解决方法:使用Automatic Shared Memory Management(ASMM)。
官方的Administrator guide上的说明: 11g的文档中,官方建议使用自动内存管理(AMM)。12c的官方文档上,官方也建议使用自动内存管理(AMM),但是 SGA+PGA 不要超过4G。

8.10.Management Options

8.11 User Credentials

8.12.Creation Option

8.13.Summary

8.14.Progress Page

8.15.Finish

9.数据库管理

9.1.检查cluster所有资源状态

[oracle@orapg:/home/oracle]$crsctl status res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       poc12d                   STABLE
ora.FRA.dg
               ONLINE  ONLINE       poc12d                   STABLE
ora.asm
               ONLINE  ONLINE       poc12d                   Started,STABLE
ora.ons
               OFFLINE OFFLINE      poc12d                   STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        ONLINE  ONLINE       poc12d                   STABLE
ora.diskmon
      1        OFFLINE OFFLINE                               STABLE
ora.evmd
      1        ONLINE  ONLINE       poc12d                   STABLE
ora.sloth.db
      1        ONLINE  ONLINE       poc12d                   Open,HOME=/oracle/ap
                                                             p/oracle/product/12.
                                                             2.0.1/db,STABLE
--------------------------------------------------------------------------------

9.2.查看数据库

#srvctl status database -d SLOTH

Database is running.

#srvctl config database -d SLOTH -a

Database unique name: SLOTH
Database name: SLOTH
Oracle home: /oracle/app/oracle/product/12.2.0.1/db
Oracle user: oracle
Spfile: +DATA/SLOTH/PARAMETERFILE/spfile.266.1063736511
Password file:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups: DATA,FRA
Services:
Database is enabled
OSDBA group:
OSOPER group:
Database instance: SLOTH

9.3.查service name

srvctl status service -d SLOTH

9.4.启动和停止数据库实例

srvctl stop database -d SLOTH

srvctl start database -d SLOTH

srvctl stop  database -d SLOTH -o immediate
srvctl start database -d SLOTH -o nomount

SQL> set linesize 500
SQL> col host_name format a10;
SQL> select host_name,inst_id,instance_name,version from gv$instance;

HOST_NAME     INST_ID INSTANCE_NAME    VERSION
---------- ---------- ---------------- -----------------
poc12d              1 SLOTH            12.2.0.1.0

9.5.启动,停止和查看ASM信息

#srvctl status asm
ASM is running on orapg

#srvctl status asm -a
ASM is running on orapg
ASM is enabled.

sqlplus / as sysasm
SQL> shutdown immediate;
ASM diskgroups dismounted
ASM instance shutdown

9.6.启动和停止磁盘组,HAS

srvctl start diskgroup -g DATA
srvctl start diskgroup -g FRA

crsctl stop has
CRS-2791: Starting shutdown of Oracle High Availability Services-managed resources on 'dg4'
CRS-2673: Attempting to stop 'ora.LISTENER.lsnr' on 'dg4'
CRS-2673: Attempting to stop 'ora.evmd' on 'dg4'
CRS-2677: Stop of 'ora.LISTENER.lsnr' on 'dg4' succeeded
CRS-2677: Stop of 'ora.evmd' on 'dg4' succeeded
CRS-2673: Attempting to stop 'ora.cssd' on 'dg4'
CRS-2677: Stop of 'ora.cssd' on 'dg4' succeeded
CRS-2793: Shutdown of Oracle High Availability Services-managed resources on 'dg4' has completed
CRS-4133: Oracle High Availability Services has been stopped.

9.7.查看数据库文件

select name from v#datafile
union
select member from v#logfile
union
select name from v#controlfile
union
select name from v#tempfile;


NAME
--------------------------------------------------------------------------------
+DATA/SLOTH/CONTROLFILE/current.257.1063734835
+DATA/SLOTH/DATAFILE/sysaux.262.1063734841
+DATA/SLOTH/DATAFILE/system.261.1063734839
+DATA/SLOTH/DATAFILE/undotbs1.263.1063734843
+DATA/SLOTH/DATAFILE/users.265.1063734849
+DATA/SLOTH/ONLINELOG/group_1.258.1063734835
+DATA/SLOTH/ONLINELOG/group_2.259.1063734837
+DATA/SLOTH/ONLINELOG/group_3.260.1063734837
+DATA/SLOTH/TEMPFILE/temp.264.1063734843
+FRA/SLOTH/CONTROLFILE/current.256.1063734835
+FRA/SLOTH/ONLINELOG/group_1.257.1063734835
+FRA/SLOTH/ONLINELOG/group_2.258.1063734837
+FRA/SLOTH/ONLINELOG/group_3.259.1063734837

13 rows selected.

9.8.Space used in ASM Disk Groups

SET LINESIZE  145
SET PAGESIZE  9999
SET VERIFY    off
COLUMN group_name             FORMAT a10           HEAD 'Disk Group|Name'
COLUMN sector_size            FORMAT 99,999        HEAD 'Sector|Size'
COLUMN block_size             FORMAT 99,999        HEAD 'Block|Size'
COLUMN allocation_unit_size   FORMAT 999,999,999,999   HEAD 'Allocation|Unit Size'
COLUMN state                  FORMAT a11           HEAD 'State'
COLUMN type                   FORMAT a6            HEAD 'Type'
COLUMN total_gb               FORMAT 999,999.9     HEAD 'Total(GB)'
COLUMN used_gb                FORMAT 999,999.9     HEAD 'Used(GB)'
COLUMN pct_used               FORMAT 999.99        HEAD 'Used%'

break on report on disk_group_name skip 1
compute sum label "Grand Total: " of total_gb used_gb on report

SELECT
    name                                     group_name
  , sector_size                              sector_size
  , block_size                               block_size
  , allocation_unit_size                     allocation_unit_size
  , state                                    state
  , type                                     type
  , total_mb/1024                            total_gb
  , (total_mb - free_mb) /1024               used_gb
  , ROUND((1- (free_mb / total_mb))*100, 2)  pct_used
FROM
    v$asm_diskgroup
ORDER BY
    name
/

Disk Group            Sector   Block   Allocation
Name                    Size    Size    Unit Size State       Type   Total Size (MB) Used Size (MB) Pct. Used
-------------------- ------- ------- ------------ ----------- ------ --------------- -------------- ---------
DATA                     512   4,096    4,194,304 CONNECTED   EXTERN           5,116          2,800     54.73
FRA                      512   4,096    4,194,304 CONNECTED   EXTERN           5,116            736     14.39
                                                                     --------------- --------------
Grand Total:                                                                  10,232          3,536

9.9.Disks contained within Disk Groups

SET ECHO        OFF
SET FEEDBACK    6
SET HEADING     ON
SET LINESIZE    180
SET PAGESIZE    50000
SET TERMOUT     ON
SET TIMING      OFF
SET TRIMOUT     ON
SET TRIMSPOOL   ON
SET VERIFY      OFF

CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES

COLUMN disk_group_name        FORMAT a25           HEAD 'Disk Group Name'
COLUMN disk_file_path         FORMAT a30           HEAD 'Path'
COLUMN disk_file_name         FORMAT a20           HEAD 'File Name'
COLUMN disk_file_fail_group   FORMAT a20           HEAD 'Fail Group'
COLUMN total_mb               FORMAT 999,999,999   HEAD 'File Size (MB)'
COLUMN used_mb                FORMAT 999,999,999   HEAD 'Used Size (MB)'
COLUMN pct_used               FORMAT 999.99        HEAD 'Pct. Used'

BREAK ON report ON disk_group_name SKIP 1

COMPUTE sum LABEL ""              OF total_mb used_mb ON disk_group_name
COMPUTE sum LABEL "Grand Total: " OF total_mb used_mb ON report

SELECT
    NVL(a.name, '[CANDIDATE]')                       disk_group_name
  , b.path                                           disk_file_path
  , b.name                                           disk_file_name
  , b.failgroup                                      disk_file_fail_group
  , b.total_mb                                       total_mb
  , (b.total_mb - b.free_mb)                         used_mb
  , ROUND((1- (b.free_mb / b.total_mb))*100, 2)      pct_used
FROM
    v#asm_diskgroup a RIGHT OUTER JOIN v#asm_disk b USING (group_number)
ORDER BY
    a.name
/

9.10.List of ASM files as well as its volume information

SET ECHO        OFF
SET FEEDBACK    6
SET HEADING     ON
SET LINESIZE    180
SET PAGESIZE    50000
SET TERMOUT     ON
SET TIMING      OFF
SET TRIMOUT     ON
SET TRIMSPOOL   ON
SET VERIFY      OFF

CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES

COLUMN full_path              FORMAT a75                  HEAD 'ASM File Name / Volume Name / Device Name'
COLUMN system_created         FORMAT a8                   HEAD 'System|Created?'
COLUMN size_gb                FORMAT 999,999.9            HEAD 'Size MB'
COLUMN allocated              FORMAT 999,999.9            HEAD 'Allocated MB'
COLUMN type                   FORMAT a18                  HEAD 'File Type'
COLUMN redundancy             FORMAT a12                  HEAD 'Redundancy'
COLUMN striped                FORMAT a8                   HEAD 'Striped'
COLUMN creation_date          FORMAT a20                  HEAD 'Creation Date'
COLUMN disk_group_name        noprint

BREAK ON report ON disk_group_name SKIP 1

COMPUTE sum LABEL ""              OF size_gb allocated ON disk_group_name
COMPUTE sum LABEL "Grand Total: " OF size_gb allocated ON report

SELECT
    CONCAT('+' || db_files.disk_group_name, SYS_CONNECT_BY_PATH(db_files.alias_name, '/')) full_path
  , db_files.size_gb
  , db_files.allocated
  , NVL(LPAD(db_files.type, 18), '<DIRECTORY>')  type
  , db_files.creation_date
  , db_files.disk_group_name
  , LPAD(db_files.system_created, 4) system_created
FROM
    ( SELECT
          g.name               disk_group_name
        , a.parent_index       pindex
        , a.name               alias_name
        , a.reference_index    rindex
        , a.system_created     system_created
        , f.bytes/1024/1024    size_gb
        , f.space/1024/1024    allocated
        , f.type               type
        , TO_CHAR(f.creation_date, 'DD-MON-YYYY HH24:MI:SS')  creation_date
      FROM
          v#asm_file f RIGHT OUTER JOIN v#asm_alias     a USING (group_number, file_number)
                                   JOIN v#asm_diskgroup g USING (group_number)
    ) db_files
WHERE db_files.type IS NOT NULL
START WITH (MOD(db_files.pindex, POWER(2, 24))) = 0
    CONNECT BY PRIOR db_files.rindex = db_files.pindex
UNION
SELECT
    '+' || volume_files.disk_group_name ||  ' [' || volume_files.volume_name || '] ' ||  volume_files.volume_device full_path
  , volume_files.size_gb
  , volume_files.allocated
  , NVL(LPAD(volume_files.type, 18), '<DIRECTORY>')  type
  , volume_files.creation_date
  , volume_files.disk_group_name
  , null
FROM
    ( SELECT
          g.name               disk_group_name
        , v.volume_name        volume_name
        , v.volume_device      volume_device
        , f.bytes/1024/1024    size_gb
        , f.space/1024/1024    allocated
        , f.type               type
        , TO_CHAR(f.creation_date, 'YYY-MON-DD HH24:MI:SS')  creation_date
      FROM
          v#asm_file f RIGHT OUTER JOIN v#asm_volume    v USING (group_number, file_number)
                                   JOIN v#asm_diskgroup g USING (group_number)
    ) volume_files
WHERE volume_files.type IS NOT NULL
/

f.bytes: Number of bytes in the file (f.bytes/1024/1024 size_gb)
f.space: Number of bytes allocated to the file(f.space/1024/1024 allocated)

9.11.Disks performance metric

SET ECHO        OFF
SET FEEDBACK    6
SET HEADING     ON
SET LINESIZE    256
SET PAGESIZE    50000
SET TERMOUT     ON
SET TIMING      OFF
SET TRIMOUT     ON
SET TRIMSPOOL   ON
SET VERIFY      OFF

CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES

COLUMN disk_group_name    FORMAT a20                    HEAD 'Disk Group Name'
COLUMN disk_path          FORMAT a30                    HEAD 'Disk Path'
COLUMN reads              FORMAT 999,999,999,999        HEAD 'Reads'
COLUMN writes             FORMAT 999,999,999,999        HEAD 'Writes'
COLUMN read_errs          FORMAT 999,999,999            HEAD 'Read|Errors'
COLUMN write_errs         FORMAT 999,999,999            HEAD 'Write|Errors'
COLUMN read_time          FORMAT 999,999,999,999        HEAD 'Read|Time'
COLUMN write_time         FORMAT 999,999,999,999        HEAD 'Write|Time'
COLUMN mb_read            FORMAT 999,999,999            HEAD 'Read|MB'
COLUMN mb_written         FORMAT 999,999,999            HEAD 'Written|MB'

BREAK ON report ON disk_group_name SKIP 2

COMPUTE sum LABEL ""              OF reads writes read_errs write_errs read_time write_time mb_read mb_written ON disk_group_name
COMPUTE sum LABEL "Grand Total: " OF reads writes read_errs write_errs read_time write_time mb_read mb_written ON report

SELECT
    a.name                      disk_group_name
  , b.path                      disk_path
  , b.reads                     reads
  , b.writes                    writes
  , b.read_errs                 read_errs 
  , b.write_errs                write_errs
  , b.read_time                 read_time
  , b.write_time                write_time
  , b.bytes_read/1024/1024      mb_read
  , b.bytes_written/1024/1024   mb_written
FROM
    vasm_diskgroup a JOIN vasm_disk b USING (group_number)
ORDER BY
    a.name
/

Disk Group Name      Disk Path                                 Reads           Writes       Errors       Errors             Time             Time           MB           MB
-------------------- ------------------------------ ---------------- ---------------- ------------ ------------ ---------------- ---------------- ------------ ------------
DATA                 /dev/oracleasm/disks/DATA                83,971          285,382            0            0               43            9,944        1,286        9,441
********************                                ---------------- ---------------- ------------ ------------ ---------------- ---------------- ------------ ------------
                                                              83,971          285,382            0            0               43            9,944        1,286        9,441


FRA                  /dev/oracleasm/disks/FRA                  4,239          216,928            0            0                2              110           98        3,901
********************                                ---------------- ---------------- ------------ ------------ ---------------- ---------------- ------------ ------------
                                                               4,239          216,928            0            0                2              110           98        3,901


                                                    ---------------- ---------------- ------------ ------------ ---------------- ---------------- ------------ ------------
Grand Total:                                                  88,210          502,310            0            0               44           10,054        1,384       13,342

9.12.find orphaned ASM files

SET VERIFY OFF

SET LINESIZE 200
SET SERVEROUTPUT ON
SET PAGESIZE 50000
SET TRIMSPOOL ON


BEGIN
   FOR c IN (SELECT name Diskgroup
               FROM V#ASM_DISKGROUP)
   LOOP
      FOR l
         IN (SELECT 'rm ' || files files
               FROM
                    (SELECT '+' || c.Diskgroup || files files, TYPE
                       FROM (    SELECT UPPER (SYS_CONNECT_BY_PATH (aa.name, '/'))
                                        files
                                      , aa.reference_index
                                      , b.TYPE
                                   FROM (SELECT file_number
                                              , alias_directory
                                              , name
                                              , reference_index
                                              , parent_index
                                           FROM v#asm_alias
                                           where ALIAS_INDEX NOT IN (
                                               select ALIAS_INDEX from v#asm_alias
                                               where file_number IN (
                                                    select file_number from v#asm_alias 
                                                       where SYSTEM_CREATED = 'N'
                                                         and group_number =
                                                           (SELECT group_number
                                                              FROM v#asm_diskgroup
                                                             WHERE name = c.Diskgroup
                                                           )
                                                    )
                                                    and SYSTEM_CREATED = 'Y'
                                                    and group_number =
                                                           (SELECT group_number
                                                              FROM v#asm_diskgroup
                                                             WHERE name = c.Diskgroup
                                                             )
                                            )
                                            and group_number =
                                                    (SELECT group_number
                                                        FROM v#asm_diskgroup
                                                      WHERE name = c.Diskgroup
                                                     )
                                        ) aa
                                      , (SELECT parent_index
                                           FROM (SELECT distinct parent_index
                                                   FROM v#asm_alias
                                                  WHERE group_number =
                                                               (SELECT group_number
                                                                  FROM v#asm_diskgroup
                                                                 WHERE name = c.Diskgroup)
                                                    AND alias_index<50
                                                )
                                        ) a
                                      , (SELECT file_number, TYPE
                                           FROM (SELECT file_number, TYPE
                                                   FROM v#asm_file
                                                  WHERE group_number =
                                                           (SELECT group_number
                                                              FROM v#asm_diskgroup
                                                             WHERE name = c.Diskgroup)
                                                )
                                        ) b
                                  WHERE     aa.file_number = b.file_number(+)
                                        AND aa.alias_directory = 'N'
                                        AND aa.file_number != 4294967295
                                        AND b.TYPE IN
                                               ('DATAFILE'
                                              , 'ONLINELOG'
                                              , 'CONTROLFILE'
                                              , 'TEMPFILE')
                             START WITH aa.PARENT_INDEX = a.parent_index
                             CONNECT BY PRIOR aa.reference_index = aa.parent_index
                            )
                      WHERE SUBSTR
                            (
                               files
                             ,   INSTR (files, '/', 1, 1)
                             ,   INSTR (files, '/', 1, 2)
                               - INSTR (files, '/', 1, 1)
                               + 1
                            ) =
                               (SELECT dbname
                                  FROM (SELECT    '/'
                                               || UPPER (db_unique_name)
                                               || '/'
                                                  dbname
                                          FROM v#database)
                                )
                     MINUS
                       (
                           SELECT UPPER (name) files, 'DATAFILE' TYPE FROM v#datafile
                           UNION ALL
                           SELECT UPPER (name) files, 'TEMPFILE' TYPE FROM v#tempfile
                           UNION ALL
                           SELECT UPPER (name) files, 'CONTROLFILE' TYPE FROM v#controlfile WHERE name LIKE '+' || c.Diskgroup || '%'
                           UNION ALL
                           SELECT UPPER (name), 'CONTROLFILE' TYPE FROM v#datafile_copy WHERE deleted = 'NO'
                           UNION ALL
                           SELECT UPPER (MEMBER) files, 'ONLINELOG' TYPE FROM v#logfile WHERE MEMBER LIKE '+' || c.Diskgroup || '%'
                       )
                    )
            )
      LOOP
         DBMS_OUTPUT.put_line (l.files);
      END LOOP;
   END LOOP;
END;
/

9.13. A simple script dfdg

Used to check ASM diskgroup usage or list directories and files.
Put dfdg into the ORACLE_HOME/bin directory and make the script executable “chmod +x dfdg” .(replace all “^” to “$”)

#!/bin/bash

# ------------------------------------------------------------------------------
# FUNCTION
#   Displays ASM diskgroup information, space usage. Displays usage by DISKS.
#   Displays ongoing operations and list of files on diskgroup.
# NOTES
#   Developed for 11g Oracle Version. The entry must be in the /etc/oratab
#   for ASM instance
# CREATED
#   Aychin Gasimov 03/2011 aychin.gasimov@gmail.com
#
# MODIFIED
#   Xavier Picamal 08/2012
#       Added -r key
#   Xavier Picamal 09/2012 
#       NEW flag -p for Diskgroup Partners query.
#       NEW flag -fg for FailGroups, Diskgroups and Headers
#   Aychin Gasimov 08/2014
#       Removed reading ASM instance name and GI home info from oratab.
#       Now script automatically identifies all required variables.
#       Prints information about ASM and GI on execution
# ------------------------------------------------------------------------------

# set_crshome Author AG
#             Function for setting global variable CRS_HOME in the script, not in the environment.
#             It also set CRS_INSTALL_TYPE variable to RESTART or CLUSTER depending on installation type.
declare -r set_crshome_NO_OLRLOC=102
declare -r set_crshome_NO_HOMEINV=103
function set_crshome {
  local -i retCode=0
  # Get CRS_HOME from olr.loc
  local olrFile
  local PLATFORM=(/bin/uname)
  case ^PLATFORM in
      Linux) olrFile="/etc/oracle/olr.loc" ;;
      HP-UX) olrFile="/var/opt/oracle/olr.loc" ;;
      SunOS) olrFile="/var/opt/oracle/olr.loc" ;;
        AIX) olrFile="/etc/oracle/olr.loc" ;;
  esac
  if [[ -f ^olrFile ]]; then
      CRS_HOME="^(grep -i crs_home ^olrFile)" && CRS_HOME=^{CRS_HOME#*=}
      [[ -z ^CRS_HOME ]] && return ^set_crshome_NO_OLRLOC
  else
      return ^set_crshome_NO_OLRLOC
  fi
  # Now identify is it Cluster Installation or Oracle Restart
  local -i is_cluster
  if [[ -f ^CRS_HOME/inventory/ContentsXML/oraclehomeproperties.xml ]]; then
      is_cluster=^(grep -i "" ^CRS_HOME/inventory/ContentsXML/oraclehomeproperties.xml | wc -l)
      [[ ^is_cluster -eq 0 ]] && CRS_INSTALL_TYPE="RESTART" || CRS_INSTALL_TYPE="CLUSTER"
  else
      return ^set_crshome_NO_HOMEINV
  fi
  return 0 
}

# Setting environment for ASM instance
set_crshome
set_crshome_RES=^?

mess_no_olr="No olr.loc file on the system or corrupt entry! Grid Infrastructure not installed or have configuration problems!"
mess_no_homeinv="No oraclehomeproperties.xml in ^CRS_HOME/inventory/ContentsXML folder, can not identify Cluster software installation type!"
[[ ^set_crshome_RES -eq ^set_crshome_NO_OLRLOC ]] && echo -e ^mess_no_olr && exit ^set_crshome_NO_OLRLOC 
[[ ^set_crshome_RES -eq ^set_crshome_NO_HOMEINV ]] && echo -e ^mess_no_homeinv && exit ^set_crshome_NO_HOMEINV 

t_sid=( ps -eo args | grep -v grep | grep asm_pmon )
if [[ -z ^t_sid ]]; then
     echo "ASM instance is not running, can not get pmon process of ASM instance!"
     exit 1
fi
t_sid={t_sid##*_}

echo -e "\n   ASM Instance name: "t_sid
echo "             GI home: "^CRS_HOME
echo "GI installation type: "^CRS_INSTALL_TYPE

export ORACLE_HOME=^CRS_HOME
export ORACLE_BASE="^(^CRS_HOME/bin/orabase)"
export ORACLE_SID=t_sid

# End setting environment

SQLPLUS=^ORACLE_HOME/bin/sqlplus

dispinfo () {
 echo "Use -d key to display usage by disks"
 echo "Use -o key to display asm operations in progress (disk rebalancing)"
 echo "Use -r key to display min, max and avergage free megabytes by diskgroups"
 echo "Use -f  to list files and directories of the disk group"
 echo "Use -fg to list failgroups, diskgroups and headers"
 echo "Use -p to list partner disks"
 }

case "^1" in
 -d)
     ^SQLPLUS -S '/ as sysasm' << EOF
       set linesize 200
       set pagesize 50000
       col name format a10
       col path format a50
       col free_pct format a8
       select group_number,name,path,state,os_mb,total_mb,free_mb,round(free_mb*100/total_mb)||'%' free_pct from v\^asm_disk where header_status='MEMBER';
EOF
     dispinfo;
     ;;
 -o)
     ^SQLPLUS -S '/ as sysasm' << EOF
       set linesize 200
       select * from v\^asm_operation;
EOF
     dispinfo;
     ;;
 -f)
     if [ -e ^2 ]; then
      echo "Please specify diskgroup name after -f key"
     else
      ^SQLPLUS -S '/ as sysasm' << EOF
       alter session set nls_date_format='dd.mm.yyyy hh24:mi:ss';
       set linesize 200
       set pagesize 50000
       variable pindx number;
       exec select group_number into :pindx from v\^asm_diskgroup where upper(name)=upper('2');
       col reference_index noprint
       break on reference_index skip 1 on report
       compute sum label "Total size of all files in MBytes on diskgroup ^2" of mb on report
       col type format a15
       col files format a80
       select decode(aa.alias_directory,'Y',sys_connect_by_path(aa.name,'/'),'N',lpadaa.aa.name) files,  aa.REFERENCE_INDEX,
              b.type, b.blocks, round(b.bytes/1024/1024,0) mb, b.creation_date, b.modification_date
         from (select * from v\^asm_alias order by name) aa,
              (select parent_index from v\^asm_alias where group_number = :pindx and alias_index=0) a,
              (select * from v\^asm_file where group_number = :pindx) b
         where aa.file_number=b.file_number(+)
         start with aa.PARENT_INDEX=a.parent_index
         connect by prior aa.REFERENCE_INDEX=aa.PARENT_INDEX;
EOF
     dispinfo;
     fi;
     ;;
 -r)
     ^SQLPLUS -S '/ as sysasm' << EOF
     alter session set nls_date_format='dd.mm.yyyy hh24:mi:ss';
     set linesize 200
     set pagesize 5000
     col name format a10
     select dg.name,dg.allocation_unit_size/1024/1024 "AU(Mb)",min(d.free_mb) Min,
     max(d.free_mb) Max, round(avg(d.free_mb),2) as Avg
     from gv\^asm_disk d, gv\^asm_diskgroup dg
     where d.group_number = dg.group_number
     group by dg.name, dg.allocation_unit_size/1024/1024;
EOF
     dispinfo;
     ;;
 # XPA 2012-11-21 -fg flag BEGINS here
 -fg) 
     ^SQLPLUS -S '/ as sysasm' << EOF
     set linesize 200
     set pagesize 300
     col mount_status a15
     col header_status format a15
     col state format a15
     col redundancy format a15
     col failgroup format a15
     col path format a50
     select mount_status,header_status,state,redundancy,failgroup,path from v\^asm_disk order by failgroup;
EOF
     dispinfo;
     ;;
 # XPA 2012-11-21 -fg flag ENDS here
 # XPA 2012-09 -p flag begins here
 -p)
    ^SQLPLUS -S '/ as sysasm' << EOF     
    alter session set nls_date_format='dd.mm.yyyy hh24:mi:ss';     
    set linesize 200     
    set pagesize 50000     
    col "Partner Disks" format a80     
    select d||' => '||listagg(p, ',') within group (order by p) "Partner Disks"
      from (
       select ad1.failgroup||'('||to_char(ad1.disk_number, 'fm00')||')' d,
              ad2.failgroup||'('||listagg(to_char(p.number_kfdpartner, 'fm00'), ',') within group (order by ad1.disk_number)||')' p
       from gv\^asm_disk ad1, x\^kfdpartner p, v\^asm_disk ad2
       where ad1.disk_number = p.disk
         and p.number_kfdpartner=ad2.disk_number
         and ad1.group_number = p.grp
         and ad2.group_number = p.grp
       group by ad1.failgroup, ad1.disk_number, ad2.failgroup
           )
    group by d
    order by d;
EOF
     dispinfo;
     ;;
 -h)
     dispinfo;
     ;;
  *)
     ^SQLPLUS -S '/ as sysasm' << EOF
      set linesize 200
      set pagesize 50000
      col free_pct format a8
      col name format a10
      select group_number,name,sector_size,block_size,allocation_unit_size,state,total_mb,free_mb,round(free_mb*100/total_mb)||'%' free_pct from v\^asm_diskgroup;
EOF
     dispinfo;
esac

exit 0