How to Identify If a Disk/Partition Is Still Used by ASM

How to Identify If a Disk/Partition Is Still Used by ASM

Introduction:

To find whether an ASM disk is still used by ASM, or has Been used by ASM or has not been used by ASM using below method.

The C program will help us to identify if a Disk/Partition is still used by ASM, has been used by ASM or has not been used by ASM on Unix or Linux platforms.

C Code:

#include <stdio.h>
#include <fcntl.h>
#define BLOCK_SIZE 4096
int main(int argc, char *argv[])
{
char buf[BLOCK_SIZE];
char *fname;
int  fd;
int  count;

if (argc != 2)
{
fprintf(stderr, “Exactly one argument required\n”);
return (-1);
}

fname = argv[1];
fd = open(fname, O_RDONLY);
if (fd < 0)
{
perror(fname);
return (-1);
}

count = read(fd, buf, sizeof(buf));
if (count < 0)
{
perror(fname);
return (-1);
}
if (count < sizeof(buf))
{
return (1);
}

if ( buf[32] == ‘O’ && buf[33] == ‘R’ && buf[34] == ‘C’ && buf[35] == ‘L’
&& buf[36] == ‘D’ && buf[37] == ‘I’ && buf[38] == ‘S’ && buf[39] == ‘K’)
{

if (buf[71] != 4) {
printf(“This disk %s still used by ASM\n”,argv[1]);
return (0);
}
else
printf(“This disk %s has been used by ASM\n”,argv[1]);

return (0);
}

printf(“This disk %s has not been used by ASM\n”,argv[1]);
return (1);
}

 

Save the above code in an ASCII file, then using a C Compiler compile it as follow:

$> -ls

-rw-r–r–  1 oracle oinstall 2014 Jun 16 15:57 checkasmdisk.c

$> cc checkasmdisk.c -o checkasmdisk

$> -ls

-rwxr-xr-x  1 oracle oinstall 5670 Jun 16 15:57 checkasmdisk
-rw-r–r–  1 oracle oinstall 2014 Jun 16 15:57 checkasmdisk.c

Check the desired disk(s), we can obtain 4 states:

  1. Disk has not been used by ASM:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> !dd if=/dev/zero of=/dev/sda14 bs=8192 count=12800
12800+0 records in
12800+0 records out

SQL> !checkasmdisk /dev/sda14

This disk /dev/sda14 has not been used by ASM

  1. Disk is still used by ASM :

SQL> create diskgroup DATADG external redundancy disk ‘/dev/sda14’;

Diskgroup created.

SQL> !checkasmdisk /dev/sda14

This disk /dev/sda14 still used by ASM

  1. Disk has been used by ASM:

SQL> drop diskgroup DATADG;

Diskgroup dropped.

SQL> !checkasmdisk /dev/sda14

This disk /dev/sda14 has been used by ASM

  1. Disk cannot be accessed:

# ls -l /dev/sda14

brw-rw—- 1 oracle dba 8, 14 Jun 11 19:12 /dev/sda14

# chown root:disk /dev/sda14

# ls -l /dev/sda14

brw-rw—- 1 root disk 8, 14 Jun 11 19:12 /dev/sda14

SQL> !checkasmdisk /dev/sda14

/dev/sda14: Permission denied

brw-rw—- 1 oracle dba 8, 14 Jun 11 19:12 /dev/sda14

 

Conclusion:

Using the above C program, we can identify different ASM disks/partitions having different disk states.

Recent Posts