alter tablespace ... read only 会阻塞未提交事务、dml、ddl及for update查询;read only表空间支持rman备份,推荐使用skip readonly;切回read write需确保数据文件online且归档完整;data pump导出只读表空间要求sysaux/system可写。
alter tablespace ... read only 会阻塞哪些操作
执行 alter tablespace users read only 时,oracle 并不会立刻完成切换——它必须等该表空间内所有未提交事务全部结束,且所有正在执行的 dml(如 insert、update、delete)和 ddl(如 create index)全部释放相关锁。常见卡住现象是:命令 hang 住,v$session 里看到状态为 active 或 inactive 但 sql_id 对应着未提交的更新。
- 必须提前 kill 掉长时间运行或遗忘的事务(查
v$transaction+v$session关联) -
SELECT不阻塞切换,但带FOR UPDATE的查询会阻塞(因为持有行级锁,影响一致性读快照生成) - 如果表空间含全局临时表(
GLOBAL TEMPORARY TABLE),其所在段不参与只读检查,但切换仍需等待临时段上活跃事务结束
READ ONLY 表空间能否做 RMAN 备份?怎么配才不报错
可以,而且是推荐做法:只读表空间在 RMAN 中支持增量备份跳过(BACKUP INCREMENTAL LEVEL 1 SKIP READONLY),大幅减少备份量。但默认全备(BACKUP DATABASE)会包含只读表空间,若对应数据文件被意外 offline 或路径不可读,RMAN 仍会报 RMAN-03009: failure of backup command on ORA_DISK_1 channel。
- 确认只读表空间物理文件在线:
SELECT file_name, status FROM dba_data_files WHERE tablespace_name = 'USERS',status 必须是AVAILABLE - 备份脚本中显式跳过只读表空间更稳妥:
BACKUP DATABASE SKIP READONLY - 若用恢复目录(recovery catalog),确保已执行
RESYNC CATALOG,否则 RMAN 可能缓存旧的只读状态导致误判
从 READ ONLY 切回 READ WRITE 的隐藏依赖
执行 ALTER TABLESPACE users READ WRITE 看似简单,但 Oracle 实际要校验:该表空间所有数据文件是否处于 ONLINE 状态、是否所有文件头 SCN 与控制文件一致、是否有未应用的介质恢复(media recovery)待完成。最常踩的坑是:切回前没检查归档日志是否完整,导致报错 ORA-01122: database file 5 failed verification check 或 ORA-01110: data file 5: '/u01/oradata/db/users01.dbf'。
- 先查文件状态:
SELECT file#, name, status, enabled FROM v$datafile WHERE ts# = (SELECT ts# FROM v$tablespace WHERE name = 'USERS') - 若任一文件
enabled为DISABLED,需先ALTER DATABASE DATAFILE '/path/to/file' ONLINE - 切回前务必确认数据库处于 OPEN 状态(非 MOUNT),且无活动的恢复进程(查
v$recover_file应为空)
只读表空间 + Data Pump 导出时的权限与对象可见性
用 expdp 导出只读表空间里的表,只要用户有 READ 权限就足够;但若导出参数含 CONTENT=METADATA_ONLY 或指定 INCLUDE=CONSTRAINT,Oracle 会尝试访问数据字典中的约束定义,此时若系统表空间(SYSTEM、SYSAUX)本身不是只读,就没问题;可一旦误把 SYSAUX 也设成只读,expdp 会直接失败并报 ORA-39126: Worker unexpected fatal error in KUPW$WORKER.CONFIGURE_METADATA_UNLOAD。
- 只读表空间不影响 Data Pump 的元数据导出,前提是
SYSAUX和SYSTEM始终可写 - 导出用户必须对目标表有
SELECT_CATALOG_ROLE或显式SELECT权限,仅EXP_FULL_DATABASE角色不够(该角色不自动授予跨表空间 SELECT) - 若导出时加
ESTIMATE=BLOCKS,Oracle 会扫描段头块估算大小——这在只读表空间中允许,但若段头损坏(罕见),仍可能触发ORA-00600内部错误
真正容易被忽略的是:表空间设为 READ ONLY 后,它的数据文件头里的“只读标志”会被置位,这个位在控制文件和数据文件物理头中同步;但如果你用 ASMCMD 手动拷贝了数据文件、或通过存储快照克隆了 LUN,新副本并不会自动继承只读状态——恢复时若没重新执行 ALTER TABLESPACE ... READ ONLY,Oracle 会按读写模式挂载,后续写入就会破坏只读语义。










