必须先确保表空间处于ONLINE状态,否则ALTER TABLESPACE...READ ONLY会报ORA-01145;执行前须确认三条件:STATUS为ONLINE、无活动回退段、未处于联机备份中。

必须先确保表空间处于 ONLINE 状态,否则 ALTER TABLESPACE ... READ ONLY 会报错 ORA-01145:除非在归档模式下,否则不允许脱机立即检查点。
执行前必须确认的三个前提条件
Oracle 对只读切换有硬性约束,跳过任意一条都可能卡在 DML 阻塞、回滚段残留或备份状态冲突上:
-
STATUS必须是ONLINE(查DBA_TABLESPACES的STATUS列) - 不能包含活动的回退段(
SELECT segment_name FROM dba_rollback_segs WHERE tablespace_name = 'USERS'应返回空) - 不能正处于 RMAN 或用户管理的联机备份中(查
V$BACKUP中对应数据文件的STATUS是否为ACTIVE)
ALTER TABLESPACE ... READ ONLY 的实际行为与限制
执行后,该表空间内所有对象仅允许 SELECT,任何 INSERT/UPDATE/DELETE/CREATE 都会立刻报 ORA-01647:表空间为只读,无法在其中进行操作。
- 不会阻塞当前正在运行的事务,但新事务无法获取该表空间内的任何锁
- 数据文件头的只读标志位被置位,后续 checkpoint 不再更新其
CHECKPOINT_CHANGE#(可对比V$DATAFILE) - 即使表空间里有未提交事务,只要不是你正在执行的,Oracle 也不校验——它只检查回退段是否在该表空间内
ALTER TABLESPACE ... READ WRITE 不是简单逆向操作
切回读写前,Oracle 会校验数据文件头的只读位并重置内部状态,但更关键的是底层一致性验证:
- 建议在
OPEN状态下执行,而非MOUNT;否则即使语句成功,重启后可能因文件头不一致报ORA-01122 - 如果表空间曾被脱机再联机过,需确认所有数据文件
STATUS是ONLINE(查V$DATAFILE) - 若之前做过跨平台迁移或手动拷贝数据文件,
READ WRITE可能触发校验失败,错误信息通常是ORA-01219或ORA-01157
真正容易被忽略的点是:只读表空间的数据文件 SCN 在切换后就冻结了,而数据库全局 SCN 仍在推进。如果长期维持只读状态,恢复时需特别注意归档日志覆盖范围——它不参与实例恢复,但会影响整个数据库的介质恢复窗口。


















