Pythian Blog: Technical Track

Oracle ASM 11g: Does the ASMCMD cp Command Really Work?

Update 21-Sep-2011: It’s definitely was a bug in an early 11g release. As cp command does work in the latest release. Nevertheless, triple check the results if you are using it as part of your backup strategy. Don’t forget to test regularly!

Since the introduction of ASM in Oracle 10g Release 1, every ASM administrator has been dreaming of a simple command line tool to copy files between ASM diskgroups and other filesystems. Oracle ASM 10g Release 2 added the handy asmcmd utility, but even though everyone expected a copy command there, it had not been implemented.

The only way to copy files to or from an ASM diskgroup was either to use RMAN, to configure XDB for FTP access, or use the DBMS_FILE_TRANSFER package. No wonder that the cp command is the most popular addition to asmcmd tool in Oracle ASM 11g: the hardest barrier to convincing my customers to use ASM has been the inability to access the files and copy them to the OS filesystem using the command-line copy command. Customers wanted to “feel” the files and be able to easily manipulate them.

While working on a Collaborate 08 presentation on Oracle 11g new features out-of-the-box, I was verifying new commands in Oracle ASM 11g’s asmcmd utility. It turned our that copying files from or to ASM is still a problem.

First, I tried to copy a single text file to an ASM diskgroup:

ASMCMD> cp /home/oracle/.bash_profile +dg2/test.file
source /home/oracle/.bash_profile
target +dg2/test.file
ASMCMD-08012: can not determine file type for file->'/home/oracle/.bash_profile'
ORA-15056: additional error message
ORA-17503: ksfdopn:DGGetFileAttr15 Failed to open file /home/oracle/.bash_profile
ORA-27046: file size is not a multiple of logical block size
Additional information: 1
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 207
ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)

Hmm . . . Okay. Let’s try to do it in multiples of diskgroup blocks:

ASMCMD> lsdg
State    Type    Rebal  Sector

Block

       AU  Total_MB...
MOUNTED  EXTERN  N         512

4096

  1048576      2048...
MOUNTED  NORMAL  N         512

4096

  2097152       200...
ASMCMD> exit
[oracle@lh8 ~]$ dd if=/dev/zero of=/home/oracle/test2.file bs=4k count=10
10+0 records in
10+0 records out
[oracle@lh8 ~]$ asmcmd
ASMCMD> cp /home/oracle/test2.file +DG2
source /home/oracle/test2.file
target +DG2/test2.file
ASMCMD-08012: can not determine file type for file->'/home/oracle/test2.file'
ORA-15056: additional error message
ORA-19762: invalid file type DGGetFileAttr20
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 207
ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)

Oops. It seems I can’t put any file to ASM. Not that I’m very surprised — I expected that ASM would “automagically” try to place all files based on OMF standards and templates. There are, however, only templates and rules for database files in 11g.

Right, let me try to backup a controlfile to a filesystem and copy it to ASM:

RMAN> backup format '/tmp/backup.ctl' current controlfile;
...
channel ORA_DISK_1: finished piece 1 at 06-APR-08
piece handle=/tmp/backup.ctl tag=TAG20080406T202034 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
...
ASMCMD> cp /tmp/backup.ctl +dg2/backup.ctl
source /tmp/backup.ctl
target +dg2/backup.ctl
copying file(s)...
file, +DG2/backup.ctl, copy committed.
ASMCMD> ls -l +dg2/backup.ctl
Type       Redund  Striped  Time             Sys  Name
                                             N    backup.ctl => +DG2/ASMTESTING/BACKUPSET/TESTING.256.651356493

Alright. That seems to work, except that ASM chose a bizarre location. For some reason, I’m not surprised again — I kind of expected it to place it somewhere into DB_UNKNOWN like RMAN does when recovering SPFILE from autobackup. In the best Oracle traditions of keeping things consistent, ASMTESTING seems to be reasonable. Was it a hard-coded leftover from the test implementation of the cp command? I wouldn’t be surprised, it’s deja-vu.

We can be patient and forgive this for the first release. Let’s try to copy it to a filesystem and back:

ASMCMD> cp +dg2/backup.ctl /tmp/backup.ctl2
source +dg2/backup.ctl
target /tmp/backup.ctl2
copying file(s)...
file, /tmp/backup.ctl2, copy committed.
ASMCMD> cp /tmp/backup.ctl2 +dg2/backup.ctl2
source /tmp/backup.ctl2
target +dg2/backup.ctl2
ASMCMD-08012: can not determine file type for file->'/tmp/backup.ctl2'
ORA-15056: additional error message
ORA-19762: invalid file type DGGetFileAttr20
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 207
ORA-06512: at line 3 (DBD ERROR: OCIStmtExecute)

Now, that is odd. Perhaps I need to register this file with the database (i.e. in the controlfile)? Let’s ask RMAN to catalog this file:

[oracle@lh8 ~]$ ls -l /tmp/backup.ctl*
-rw-r-----  1 oracle dba 9797632 Apr  6 20:20 /tmp/backup.ctl
-rw-r-----  1 oracle dba 9797632 Apr  6 20:22 /tmp/backup.ctl2
...
RMAN> catalog start with '/tmp/backup.ctl2';
...
List of Files Which Where Not Cataloged
=======================================
File Name: /tmp/backup.ctl2
  RMAN-07517: Reason: The file header is corrupted

So the file got corrupted while copying from ASM to a filesystem? Okay. Let’s try an ASM -> ASM copy:

ASMCMD> cp +dg2/backup.ctl +dg2/backup.ctl3
source +dg2/backup.ctl
target +dg2/backup.ctl3
copying file(s)...
file, +DG2/backup.ctl3, copy committed.
...
RMAN> catalog start with '+dg2';
...
List of Files Which Where Not Cataloged
=======================================
File Name: +dg2/backup.ctl
  RMAN-07517: Reason: The file header is corrupted
File Name: +dg2/backup.ctl3
  RMAN-07517: Reason: The file header is corrupted

Hey, both files are actually corrupted, so the corruption occurred in the first copy, from the filesystem to ASM. Alright. Let’s try to simply copy a current controlfile within ASM:

ASMCMD> cp +dg1/db11g/controlfile/Current.256.651275203 +dg2/asm_copy
source +dg1/db11g/controlfile/Current.256.651275203
target +dg2/asm_copy
copying file(s)...
file, +DG2/asm_copy, copy committed.

ASMCMD> ls -l +dg2/asm_copy
Type         Redund  Striped  Time             Sys  Name
                                               N    asm_copy => +DG2/ASMTESTING/CONTROLFILE/TESTING.258.651358725
...
RMAN> catalog start with '+dg2';
...
List of Files Which Where Not Cataloged
=======================================
File Name: +dg2/asm_copy
  RMAN-07517: Reason: The file header is corrupted

These results are disappointing — I couldn’t make the cp command work even a single time.

I should note that I did ask my old good friends, Metalink and Google, about ASMCMD-08012 and the like, but they came back empty.

If anyone has been able to test the ASMCMD cp command in 11g, please share your experience.

No Comments Yet

Let us know what you think

Subscribe by email