This is a very annoying task when you have to purge old and unused files from ASM. Of course you can try to run the script provided by Oracle support in the Doc.Id 552082.1 , but the query is deprecated for post 12c grid infra. There is another note for post 12c ( 2228573.1 ) but here we will try another method.
In our databases we could have some files with OMF and some files with classical naming convention. So the first step is to list all files in disk groups, but when an asm alias ( due to the classical naming convention ) is present, display only this alias, not the target file.
Some tips used in this script :
- file_number 4294967295 is a special number that we have to exclude
- alias_index < 50 are useds for DB root asm directories
Reduce the list with all files used by the database ( from v$datafile, v$tempfile, v$controlfile, …) and the result is a file list that you potentially could purge.
Of course this doesn’t cover all file type (spfiles, password files, broker files, …) but this is a good starting point and could help you to free some space on your ASM disk groups.
Disclamer : Before apply the result of the script, double check if all files that you will delete are not used by any databases.
The entire risk arising out of the use of the script remains with you.
Use at your own risk . You are warned !
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; /
This script is design to be run from the client database (not from the asm instance). Here is a result :
SQL*Plus: Release 12.1.0.2.0 Production on Fri May 31 15:44:41 2019 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SYS@SETRADEV # @asm_orphaned_files.sql rm +DATAC02/SETRADEV/DATAFILE/SETRA.317.966277287 rm +DATAC02/SETRADEV/DATAFILE/SETRA.409.966954235 rm +DATAC02/SETRADEV/DATAFILE/SETRA.422.968237887 rm +DATAC02/SETRADEV/DATAFILE/SETRA.436.981892603 rm +DATAC02/SETRADEV/DATAFILE/SETRA.442.981907497 rm +DATAC02/SETRADEV/DATAFILE/SYSAUX.389.966247761 rm +DATAC02/SETRADEV/DATAFILE/SYSAUX.399.966952889 rm +DATAC02/SETRADEV/DATAFILE/SYSAUX.420.968237827 rm +DATAC02/SETRADEV/DATAFILE/SYSAUX.434.981892565 rm +DATAC02/SETRADEV/DATAFILE/SYSAUX.440.981907449 rm +DATAC02/SETRADEV/DATAFILE/SYSTEM.386.966247749 rm +DATAC02/SETRADEV/DATAFILE/SYSTEM.408.966953793 rm +DATAC02/SETRADEV/DATAFILE/SYSTEM.421.968237871 rm +DATAC02/SETRADEV/DATAFILE/SYSTEM.435.981892587 rm +DATAC02/SETRADEV/DATAFILE/SYSTEM.441.981907489 rm +DATAC02/SETRADEV/DATAFILE/UNDOTBS1.387.966247751 rm +DATAC02/SETRADEV/DATAFILE/UNDOTBS1.404.966963411 rm +DATAC02/SETRADEV/DATAFILE/UNDOTBS1.410.968237591 rm +DATAC02/SETRADEV/DATAFILE/UNDOTBS1.430.981907283 rm +DATAC02/SETRADEV/DATAFILE/UNDOTBS1.433.981892369 rm +DATAC02/SETRADEV/DATAFILE/USERS.390.966247767 rm +DATAC02/SETRADEV/DATAFILE/USERS.411.966963413 rm +DATAC02/SETRADEV/DATAFILE/USERS.423.968237891 rm +DATAC02/SETRADEV/DATAFILE/USERS.437.981892603 rm +DATAC02/SETRADEV/DATAFILE/USERS.443.981907499 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_1.297.966977863 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_1.391.966247949 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_2.392.966247951 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_2.413.966977867 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_3.393.966247953 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_3.414.966977869 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_4.394.966247957 rm +DATAC02/SETRADEV/ONLINELOG/GROUP_4.415.966977873 rm +DATAC02/SETRADEV/SETRAREF01.DBF rm +DATAC02/SETRADEV/SETRAREF02.DBF rm +DATAC02/SETRADEV/SETRAREF03.DBF rm +DATAC02/SETRADEV/TEMPFILE/TEMP.395.966247963 rm +DATAC02/SETRADEV/TEMPFILE/TEMP.416.966977879 rm +DATAC02/SETRADEV/TEMPFILE/TEMP.428.968238205 rm +DATAC02/SETRADEV/TEMPFILE/TEMP.438.981892677 rm +DATAC02/SETRADEV/TEMPFILE/TEMP.444.981907569 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_1.395.966247949 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_1.675.966977865 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_2.396.966247953 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_2.676.966977867 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_3.397.966247955 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_3.677.966977871 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_4.398.966247959 rm +RECOC02/SETRADEV/ONLINELOG/GROUP_4.678.966977875 PL/SQL procedure successfully completed. SYS@SETRADEV # exit