How To Remove An Empty ASM System Directory

解决ASM空系统目录删除问题

 

       Sometimes it can happen that the ASM contains empty system directories which cannot be removed. According to Note 3751057.8(ALTER DISKGROUP DROP DIRECTORY FORCE removes system aliases) the system generated directories should be removed automatically as soon as all it's files are removed. However this does not happen sometimes and a manual directory removal will fail :  

 

SQL> set pages 2000
SQL> SELECT level, dir, sys, substr(lpad(' ',2*level,' ')||CONCAT('+'||gname,
     SYS_CONNECT_BY_PATH(aname,'/')),1,60) full_path
     FROM ( SELECT g.name gname, a.parent_index pindex, a.name aname,
     a.reference_index rindex, a.ALIAS_DIRECTORY dir, a.SYSTEM_CREATED sys
                      FROM v$asm_alias a, v$asm_diskgroup g
                    WHERE a.group_number = g.group_number)
     START WITH (MOD(pindex, POWER(2, 24))) = 0
     CONNECT BY PRIOR rindex = pindex
     ORDER BY rtrim(ltrim(full_path))desc, level asc;

          3 N Y       +DATA/UDWH/DATAFILE/ADASTRA.376.624105133             
          2 Y Y     +DATA/UDWH/DATAFILE                                     
          3 N Y       +DATA/UDWH/CONTROLFILE/Current.486.624103637          
          3 N Y       +DATA/UDWH/CONTROLFILE/Current.479.624103637          
          3 N Y       +DATA/UDWH/CONTROLFILE/Current.434.624103637          
          2 Y Y     +DATA/UDWH/CONTROLFILE                                  
          1 Y Y   +DATA/UDWH                                               
          1 Y Y   +DATA/TDWH                                                
          2 N N     +DATA/IDWH/spfileIDWH.ora                               
          2 N N     +DATA/IDWH/control03.ctl                                
          2 N N     +DATA/IDWH/control02.ctl                                
          2 N N     +DATA/IDWH/control01.ctl  

 

The TDWH directory from the above list is empty but cannot be removed :

 

ASMCMD> cd tdwh
ASMCMD> ls
ASMCMD> cd ..
ASMCMD> rm -rf tdwh
ORA-15032: not all alterations performed
ORA-15177: cannot operate on system aliases (DBD ERROR: OCIStmtExecute)

 

alter diskgroup DATA drop directory  '+DATA/TDWH' FORCE; 
ORA-15032: not all alterations performed 
ORA-15177: cannot operate on system aliases (DBD ERROR: OCIStmtExecute)

  

A solution to remove these directories is to recreate the ASM diskgroups but this is not something one would do very often especially when the ASM is used by production databases.

 

Solution

Either:
       Create a new database with the DBCA having the same name as the old directory and subsequently drop the database with the DBCA.

Or:
       Create a dummy tablespace having a datafile within the directory to be dropped, drop the tablespace and then remove the datafile using the ASMCMD tool. The old directory will be removed automatically.

 

       There is a scenario when there are left behind directories after the database is dropped using RMAN's command "drop database including backups [noprompt];". When one falls into this there is no way out but to recreate the diskgroups. This problem is being investigated in Bug 6606689. To avoid this issue one should run the following two commands instead of  "DROP DATABASE INCLUDING BACKUPS;":

RMAN> delete backupset;

RMAN> drop database;

 

 

 

 

From Oracle

-------------------------------------------------------------------------------------------------------

QQ: 492913789
Email: ahdba@qq.com
Blog: http://www.cndba.cn/dave

DBA1 群:62697716();   DBA2 群:62697977()   DBA3 群:62697850()  

DBA 超级群:63306533();  DBA4 群: 83829929  DBA5群: 142216823   

聊天 群:40132017   聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

<think>好的,我现在需要帮助用户解决删除非空目录时出现的“目录非空”错误。首先,我得回忆一下常见的删除目录的方法,比如在命令行中使用rm或者rmdir,或者在编程中使用相关的库。用户可能在不同的环境下遇到这个问题,比如Linux系统、Windows系统,或者使用编程语言如Python、Java等。 用户提到的是“directory is not empty”错误,这通常发生在尝试删除一个仍然包含文件或子目录的目录时。在Linux中,使用rmdir只能删除空目录,如果目录非空,需要用rm -r。而Windows的rd命令也需要添加参数,比如/S来删除目录树。此外,权限问题也可能导致删除失败,比如文件被其他进程占用或者用户没有足够的权限。 接下来,我需要考虑用户可能的操作环境。根据用户提供的引用内容,之前的问题涉及Git仓库中的空文件、MogileFS删除文件以及ASM系统目录的问题。这可能意味着用户在使用版本控制系统、分布式文件系统或数据库存储管理时遇到了问题。例如,在Git中,如果存在损坏的对象或空文件,可能需要手动删除这些文件,或者运行git gc来清理。 用户的具体错误信息可能与文件系统或权限有关。例如,如果目录中有隐藏文件(如.git目录中的内容),或者文件被锁定,普通删除命令可能无效。此外,某些系统生成的目录可能需要特定的命令或权限才能删除,比如ASM目录需要使用SQL命令或特定的管理工具。 另外,用户可能是在编程中尝试删除目录,比如使用Python的os.rmdir,但该函数只能删除空目录。正确的做法是使用shutil.rmtree,但需要注意异常处理,避免权限问题或文件占用导致的错误。用户可能需要检查是否有程序正在使用目录中的文件,或者是否以管理员权限运行命令。 还需要考虑跨平台的情况,比如在Windows中,路径名过长或保留名称(如CON、AUX)可能导致无法删除,这时可能需要使用特定的工具或命令。此外,防病毒软件或资源管理器进程可能锁定了目录,导致删除失败,可以尝试在安全模式下操作。 最后,用户可能需要分步指导,比如先列出目录内容确认是否真的非空,处理隐藏文件,强制删除命令的使用,以及处理特殊情况的工具如chmod修改权限,lsof检查文件占用等。同时,提醒用户谨慎使用强制删除,避免数据丢失。</think>### 如何解决“目录非空”错误? 删除非空目录时出现`directory is not empty`错误,通常是因为目录中仍存在文件、子目录或隐藏文件。以下是分步解决方案: --- #### **1. 命令行删除(Linux/macOS)** - **使用`rm -rf`强制递归删除** ```bash rm -rf /path/to/directory ``` - `-r`:递归删除子目录和文件 - `-f`:强制删除,忽略不存在的文件或权限问题 - 注意:此命令不可逆,需谨慎使用[^1]。 - **检查隐藏文件** 若目录中存在隐藏文件(如`.git`、`.DS_Store`),需确保所有文件已被清除。 使用`ls -a`查看隐藏文件: ```bash ls -a /path/to/directory ``` --- #### **2. 命令行删除(Windows)** - **使用`rd /s /q`命令** ```cmd rd /s /q C:\path\to\directory ``` - `/s`:删除目录及其子目录 - `/q`:静默模式,无需确认[^2]。 - **处理文件锁定问题** 若文件被其他进程占用(如资源管理器、编辑器),需关闭相关程序或使用工具解除锁定(如`Process Explorer`)。 --- #### **3. 编程语言实现** - **Python示例** 使用`shutil.rmtree`删除非空目录: ```python import shutil try: shutil.rmtree("/path/to/directory") except PermissionError: print("权限不足,请以管理员身份运行") ``` - **Java示例** 使用`FileUtils.deleteDirectory`(需Apache Commons IO库): ```java import org.apache.commons.io.FileUtils; FileUtils.deleteDirectory(new File("/path/to/directory")); ``` --- #### **4. 特殊场景处理** - **Git仓库中的目录** 若目录关联Git且存在损坏对象(如空文件),需手动清理`.git/objects`并修复仓库: ```bash cd .git/objects find . -type f -empty -delete git fsck --full # 检查仓库完整性[^2] ``` - **ASM系统目录(Oracle数据库)** 使用SQL命令强制删除系统生成的残留目录: ```sql ALTER DISKGROUP disk_group_name DROP DIRECTORY '+path/to/directory' FORCE; ``` 需结合`v$asm_alias`视图查询目录状态[^3]。 --- #### **5. 检查文件系统权限** - **Linux/macOS** 使用`chmod`修改目录权限: ```bash chmod -R 777 /path/to/directory # 开放所有权限(仅临时使用) ``` - **Windows** 右键目录 → 属性 → 安全 → 编辑权限 → 添加当前用户为完全控制。 --- #### **常见错误原因** 1. 目录中存在未删除的隐藏文件或子目录 2. 文件被其他进程占用(如编辑器、服务) 3. 权限不足(如非管理员用户) 4. 文件系统损坏(需运行`fsck`或`chkdsk`修复)[^2][^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值