ORA-39181: Only partial table data may be exported due to fine grain access control on

文章描述了一次expdp全量备份过程中遇到的告警,原因是由于对ZF_MDS对象的细粒度访问控制导致部分数据无法导出。提供了两种解决方案:为备份用户授权或禁用VPD策略。

检查某个环境时发现expdp完全备份成功但有告警

 Master table "USR_EXPDP"."SYS_EXPORT_FULL_01" successfully loaded/unloaded
******************************************************************************
Dump file set for USR_EXPDP.SYS_EXPORT_FULL_01 is:
  /backup/expdp/orcl_20231129_1629.dmp
Job "USR_EXPDP"."SYS_EXPORT_FULL_01" completed with 20 error(s) at Wed Nov 28 23:49:49 2023 elapsed 0 00:19:56

搜索ORA-关键字,发现是ORA-39181报错

ORA-39181: Only partial table data may be exported due to fine grain access control on "ZF_MDS"."ZF_ATTRIBUTES"
ORA-39181: Only partial table data may be exported due to fine grain access control on "ZF_MDS"."ZF_COMPONENTS"
ORA-39181: Only partial table data may be exported due to fine grain access control on "ZF_MDS"."ZF_DEPENDENCIES"
ORA-39181: Only partial table data may be exported due to fine g

这个错误信息是 Oracle 数据库在启动(`startup`)时出现的典型问题,主要涉及 **初始化参数文件(spfile)无法找到或访问**,尤其是当数据库使用的是 **ASM(Automatic Storage Management)磁盘组** 存储时。 --- ### ❌ 错误分析 ```bash ORA-01078: failure in processing system parameters ORA-01565: error in identifying file '+DATA/orcl/spfileorcl.ora' ORA-17503: ksfdopn:2 Failed to open file +DATA/orcl/spfileorcl.ora ORA-15056: additional error message ORA-17503: ksfdopn:2 Failed to open file +DATA/orcl/spfileorcl.ora ORA-15001: diskgroup "DATA" does not exist or is not mounted ``` #### 逐条解释: - `ORA-01078`: 启动数据库时无法处理系统参数 —— 通常是找不到或读取不了 spfile/pfile。 - `ORA-01565`: 识别指定的参数文件失败。 - `ORA-17503`: 低层 I/O 操作失败,无法打开文件。 - `ORA-15001`: 表示 ASM 磁盘组 `"DATA"` 不存在或者没有被挂载。 👉 核心问题是:**ASM 实例未运行,或者磁盘组 `DATA` 没有被挂载,导致 Oracle 实例无法读取存放在 `+DATA` 中的 spfile。** --- ## ✅ 解决方案 ### 步骤 1:确认当前环境变量和实例状态 确保你连接到了正确的 Oracle 环境。 ```bash export ORACLE_SID=+ASM # 如果使用 ASM,默认 SID 是 +ASM 或 +ASM1(RAC) sqlplus / as sysdba ``` ### 步骤 2:检查 ASM 实例是否启动 ```sql SQL> SELECT instance_name, status FROM v$instance; -- 应该输出类似: -- INSTANCE_NAME STATUS -- ---------------- ------------ -- +ASM STARTED ``` 如果没有启动,请先启动 ASM 实例: ```sql SQL> startup; ``` > ⚠️ 注意:如果 ASM 也无法启动,可能是磁盘权限、udev 规则、asmlib 配置或磁盘路径问题。 --- ### 步骤 3:查看磁盘组状态 ```sql SQL> SELECT name, state, total_mb, free_mb FROM v$asm_diskgroup; -- 输出示例: -- NAME STATE TOTAL_MB FREE_MB -- ------ --------- -------- ------- -- DATA MOUNTED 10240 3000 ``` 如果你看到 `DATA` 的状态不是 `MOUNTED`,说明它没挂载。 --- ### 步骤 4:尝试手动挂载磁盘组 ```sql ALTER DISKGROUP DATA MOUNT; ``` 如果报错,比如: - `ORA-15032: not all alterations performed` - `ORA-15063: ASM discovered an insufficient number of disks` → 表明 ASM 无法识别构成 `DATA` 磁盘组的物理磁盘。 --- ### 🔍 排查磁盘问题 #### 查看 ASM 发现的磁盘: ```sql SELECT path, header_status, mode_status FROM v$asm_disk; ``` 期望结果:`DATA` 对应的磁盘 `HEADER_STATUS = MEMBER`, `MODE_STATUS = ONLINE` 如果 `header_status` 是 `CANDIDATE` 或 `UNKNOWN`,说明这些磁盘未被正确识别。 --- ### 可能原因及修复方法 | 原因 | 解决方式 | |------|---------| | ASM 实例未启动 | 执行 `sqlplus / as sysdba` → `startup` | | 磁盘权限问题(Linux) | 检查 `/dev/sdX` 权限是否属于 `grid:asmadmin` | | udev 规则未设置 | 配置持久化设备名规则(如 `/etc/udev/rules.d/99-oracle-asmdevices.rules`) | | ASMLib 配置丢失(若使用) | 使用 `oracleasm scandisks` 和 `oracleasm listdisks` | | 磁盘路径变更(如 VM 迁移后) | 重新绑定设备或修改 udev 规则 | --- ### ✅ 成功挂载后启动数据库实例 一旦 `DATA` 磁盘组成功挂载,切换回数据库实例: ```bash export ORACLE_SID=orcl sqlplus / as sysdba ``` 然后启动数据库: ```sql SQL> startup; ``` 此时应该可以正常读取 `+DATA/orcl/spfileorcl.ora` 并启动。 --- ### 💡 替代方案:使用 PFILE 启动(临时) 如果暂时无法恢复 SPFILE,可以从 ASM 中创建一个文本型 PFILE: ```sql -- 在 ASM 实例中导出参数 CREATE PFILE='/tmp/initorcl.ora' FROM SPFILE='+DATA/orcl/spfileorcl.ora'; ``` 然后用该 PFILE 启动数据库: ```sql SQL> CREATE SPFILE FROM PFILE='/tmp/initorcl.ora'; SQL> startup; -- 自动使用 SPFILE ``` > 注意:前提是 ASM 能读到原始 spfile。否则只能手动写一个最小 pfile。 --- ### 🛠 示例:最小 PFILE 启动(应急) ```text # /tmp/initorcl.ora orcl.__db_cache_size=100M orcl.__shared_pool_size=80M *.db_name='orcl' *.control_files='+DATA/orcl/controlfile/current.256.123456789' *.instance_type='RDBMS' *.job_queue_processes=10 *.open_cursors=300 *.pga_aggregate_target=100M *.sga_target=300M *.undo_management='AUTO' *.undo_tablespace='UNDOTBS1' ``` 然后: ```sql SQL> create spfile from pfile='/tmp/initorcl.ora'; SQL> startup; ``` --- ## ✅ 总结流程图 ```text 启动数据库失败 ↓ 检查是否能访问 +DATA/orcl/spfileorcl.ora ↓ 否 → 检查 ASM 实例是否运行? ↓ 否 → 启动 ASM 实例 ↓ 是 → 检查磁盘组 DATA 是否存在并已挂载? ↓ 否 → 挂载磁盘组(需解决磁盘识别问题) ↓ 是 → 尝试重新启动 DB 实例 ↓ 成功 or 失败 → 查看 alert.log 进一步诊断 ``` --- ### ✅ 关键命令汇总 ```bash # 设置环境 export ORACLE_SID=+ASM sqlplus / as sysdba # 检查 ASM 实例 SELECT instance_name, status FROM v$instance; # 启动 ASM startup; # 查看磁盘组 SELECT name, state FROM v$asm_diskgroup; # 挂载磁盘组 ALTER DISKGROUP DATA MOUNT; # 查看磁盘状态 SELECT path, header_status, mode_status FROM v$asm_disk; # 切换到数据库实例 export ORACLE_SID=orcl sqlplus / as sysdba startup; ``` --- ### ✅ 查看告警日志定位细节 ```bash cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/ tail -f alert_orcl.log ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值