备库不能复用主库TEMP表空间,因其TEMPFILE不参与Redo传输与应用,需在MOUNT状态下手动创建临时表空间并设为默认,多租户下PDB还需单独配置。

Oracle 12c 物理备库中临时表空间不能直接用主库同步过来的 TEMP 表空间文件,必须手动创建并指定为默认临时表空间,否则用户登录或执行排序操作会报 ORA-01950 或 ORA-16000(只读数据库)错误。
为什么备库上不能复用主库的临时表空间
物理备库是通过 Redo Apply 实现数据同步的,而 TEMPFILE 不参与 Redo 传输和应用——它不记录在归档日志里,也不会被恢复进程重建。即使你在主库上创建了临时表空间,备库启动后 dba_temp_files 视图为空,v$tempfile 中也看不到任何条目。此时若用户连接并触发排序(如 ORDER BY、HASH JOIN),Oracle 会尝试分配临时段,但找不到可用的临时文件,直接报错。
- 常见错误现象:
ORA-01119: error in creating database file(建临时文件时路径不可写)、ORA-01950: no privileges on tablespace 'TEMP'(实际是 TEMP 表空间不存在或未激活) - 根本原因:备库默认不自动创建临时文件;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE过程不处理 TEMPFILE - 注意:
TEMP_UNDO_ENABLED在备库上默认为TRUE且不可修改,但这只影响临时表的 undo 存储位置,和临时表空间本身无关
在备库上创建本地临时表空间的正确步骤
必须在备库以 MOUNT 状态(非 OPEN READ ONLY)下执行创建,否则会报 ORA-16000: database open for read-only access。创建完成后,再 ALTER DATABASE OPEN READ ONLY。
- 确认当前状态:
SELECT open_mode, database_role FROM v$database;—— 应为MOUNTED和PHYSICAL STANDBY - 创建临时表空间(路径需真实存在、Oracle 用户有写权限):
CREATE TEMPORARY TABLESPACE temp_stby TEMPFILE '/u01/app/oracle/oradata/ORCLPDB1/temp_stby01.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2G EXTENT MANAGEMENT LOCAL;
- 设为数据库默认临时表空间:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_stby;
(注意:不是ALTER SYSTEM,也不是在 PDB 内执行) - 切回只读模式:
ALTER DATABASE OPEN READ ONLY;
多租户环境(CDB/PDB)下的特殊处理
如果备库是 CDB 架构,且业务运行在 PDB 中,仅在 CDB ROOT 创建临时表空间还不够——PDB 必须有自己的临时表空间,且不能继承 CDB 的。否则 PDB 用户仍会因无临时空间而失败。
- 先切换到目标 PDB:
ALTER SESSION SET CONTAINER = pdb1; - 检查当前 PDB 是否已有临时表空间:
SELECT property_name, property_value FROM database_properties WHERE property_name = 'DEFAULT_TEMP_TABLESPACE'; - 若为空或指向不存在的表空间,需在该 PDB 内创建:
CREATE TEMPORARY TABLESPACE temp_pdb1 TEMPFILE '/u01/app/oracle/oradata/ORCL/ORCLPDB1/temp_pdb1.dbf' SIZE 50M AUTOEXTEND ON NEXT 20M MAXSIZE 1G;
- 再设置 PDB 默认临时表空间:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_pdb1;
(注意:此命令在 PDB 内执行有效,不同于 CDB 级命令)
验证与后续维护要点
配置完别急着交付,几个关键点必须验证,否则上线后第一个大查询就可能卡住:
- 登录测试用户,执行简单排序:
SELECT * FROM all_objects ORDER BY object_name;—— 看是否成功,同时查v$sort_usage是否有记录 - 检查视图一致性:
SELECT tablespace_name, file_name FROM dba_temp_files;和SELECT * FROM v$tempseg_usage;(后者需有活跃会话) - 路径权限容易被忽略:Windows 下注意目录继承权限,Linux 下确保
oracle用户对temp_xxx.dbf所在目录有rwx权限,否则备库重启后TEMPFILE自动 offline - 不要依赖主库的
TEMP表空间名:即使主库叫TEMP,备库也建议起独立名(如TEMP_STBY),避免误操作或脚本冲突


















