oracle ORA-30012: undo tablespace 'UNDOTBS1' does not exist or of wrong type

本文记录了在手工创建ORACLE数据库过程中遇到的错误及解决方法。主要问题为ORA-01519和ORA-30012等错误,涉及未定义的UNDOTBS1表空间。通过检查pfile设置发现并修正了问题。

在手工创建数据库的过程中遇到如下错误:


SQL>  @/home/oracle/scripts/create.sql
CREATE DATABASE PROD
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-01501: CREATE DATABASE failed
ORA-01519: error while processing file '?/rdbms/admin/dtxnspc.bsq' near line 5
ORA-00604: error occurred at recursive SQL level 1
ORA-30012: undo tablespace 'UNDOTBS1' does not exist or of wrong type
Process ID: 6250
Session ID: 1 Serial number: 3


奇怪了,这UNDOTBS1是哪里来的,我的建库脚本里也没有这个呀。

[oracle@localhost scripts]$ cat create.sql
CREATE DATABASE PROD
   USER SYS IDENTIFIED BY oracle1
   USER SYSTEM IDENTIFIED BY oracle1
   LOGFILE GROUP 1 ('/u01/app/oracle/oradata/PROD/Disk1/redo01a.log','/u01/app/oracle/oradata/PROD/Disk2/redo01b.log') SIZE 100M BLOCKSIZE 512,
           GROUP 2 ('/u01/app/oracle/oradata/PROD/Disk1/redo02a.log','/u01/app/oracle/oradata/PROD/Disk2/redo02b.log') SIZE 100M BLOCKSIZE 512,
           GROUP 3 ('/u01/app/oracle/oradata/PROD/Disk1/redo03a.log','/u01/app/oracle/oradata/PROD/Disk2/redo03b.log') SIZE 100M BLOCKSIZE 512
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   CHARACTER SET AL32UTF8
   NATIONAL CHARACTER SET AL16UTF16
   EXTENT MANAGEMENT LOCAL
   DATAFILE '/u01/app/oracle/oradata/PROD/Disk1/system01.dbf' SIZE 325M REUSE
   SYSAUX DATAFILE '/u01/app/oracle/oradata/PROD/Disk1/sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TABLESPACE users
      DATAFILE '/u01/app/oracle/oradata/PROD/Disk1/users01.dbf'
      SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
   DEFAULT TEMPORARY TABLESPACE tempts1
      TEMPFILE '/u01/app/oracle/oradata/PROD/Disk1/temp01.dbf'
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs
      DATAFILE '/u01/app/oracle/oradata/PROD/Disk1/undotbs01.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

只有undotbs这个tablespace呀!看看错误信息:ORA-01519: error while processing file '?/rdbms/admin/dtxnspc.bsq' near line 5,把它打开看看第五行写的啥。

[oracle@localhost PROD]$ cat $ORACLE_HOME/rdbms/admin/dtxnspc.bsq|more
REM   jklein    08/01/05 - creation
REM
rem Create default undo tablespace
"D_DUTSCR"
/
REM


说实话我看不懂这啥意思,最后经调查得知,原来是是在pfile中设置了undo表空间,且表空间名与所创建的不一致,导致了以上错误。

*.undo_tablespace='UNDOTBS1'
删掉或修改即可。




<think>我们面临两个问题: 1. ORA-65048: 在可插拔数据库ORCLPDB中处理当前DDL语句时出错 2. ORA-00959: 表空间'ECOLOGY'不存在 根据错误信息,我们需要在可插拔数据库(PDB)中操作,而不是在CDB$ROOT中。因此,我们需要确保在正确的容器(即PDB)中执行操作。 步骤概述: 1. 确认当前容器并切换到目标PDB(ORCLPDB)。 2. 检查表空间'ECOLOGY'是否存在,如果不存在则创建。 3. 在目标PDB中重新执行之前出错的DDL语句(可能是创建用户或表等操作,因为表空间通常与用户和表相关)。 详细步骤: ### 步骤1: 以sysdba身份登录CDB ```sql sqlplus / as sysdba ``` ### 步骤2: 查看当前容器 ```sql SHOW CON_NAME; ``` 如果当前容器是CDB$ROOT,我们需要切换到目标PDB(ORCLPDB)。 ### 步骤3: 切换到目标PDB ```sql ALTER SESSION SET CONTAINER = ORCLPDB; ``` ### 步骤4: 检查表空间'ECOLOGY'是否存在 在PDB中查询表空间: ```sql SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name = 'ECOLOGY'; ``` 如果查询结果为空,说明表空间不存在,需要创建。 ### 步骤5: 创建表空间'ECOLOGY'(如果不存在) 假设我们要在'/u01/app/oracle/oradata'目录下创建数据文件(根据实际情况调整路径和大小): ```sql CREATE TABLESPACE ECOLOGY DATAFILE '/u01/app/oracle/oradata/ORCLCDB/ORCLPDB/ecology01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED; ``` 注意:确保目录存在,或者使用Oracle管理的目录(如使用OMF特性可以省略文件名,但这里显式指定)。 ### 步骤6: 重新执行之前失败的DDL语句 例如,如果之前是在创建用户并指定默认表空间为'ECOLOGY',那么现在可以执行: ```sql CREATE USER ecology_user IDENTIFIED BY password DEFAULT TABLESPACE ECOLOGY; ``` ### 步骤7: 授权(如果需要) ```sql GRANT CONNECT, RESOURCE TO ecology_user; ``` ### 解决ORA-65048错误的关键点 ORA-65048错误通常是因为在CDB$ROOT容器中执行了应该在PDB中执行的DDL语句。因此,确保在正确的容器中操作是解决此问题的关键。 ### 验证 1. 确认表空间已创建: ```sql SELECT file_name, tablespace_name FROM dba_data_files WHERE tablespace_name = 'ECOLOGY'; ``` 2. 确认用户已创建(如果需要): ```sql SELECT username, default_tablespace FROM dba_users WHERE username = 'ECOLOGY_USER'; ``` ### 注意事项 - 创建表空间时,数据文件的路径必须存在,否则会报错。如果使用OMF(Oracle Managed Files),可以省略文件名,由Oracle自动生成。 - 在PDB中创建的表空间仅在该PDB中可见,不会影响其他PDB。 ### 完整示例流程 ```sql -- 步骤1: 登录 sqlplus / as sysdba -- 步骤2: 查看当前容器 SHOW CON_NAME; -- 步骤3: 切换到目标PDB ALTER SESSION SET CONTAINER = ORCLPDB; -- 步骤4: 检查表空间 SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name = 'ECOLOGY'; -- 如果不存在,则创建 CREATE TABLESPACE ECOLOGY DATAFILE '/u01/app/oracle/oradata/ORCLCDB/ORCLPDB/ecology01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED; -- 步骤5: 创建用户(示例) CREATE USER ecology_user IDENTIFIED BY ecology_pass DEFAULT TABLESPACE ECOLOGY; -- 步骤6: 授权 GRANT CONNECT, RESOURCE TO ecology_user; ``` 通过以上步骤,应该可以解决ORA-65048(操作在错误的容器)和ORA-00959(表空间不存在)的问题。 §§相关问题§§ 1. 如何查看Oracle CDB中的PDB列表? 2. 如何在Oracle中创建可插拔数据库(PDB)? 3. 如何删除Oracle中的表空间及其数据文件?</think>### 解决可插拔数据库ORCLPDB中的ORA-65048错误及ORA-00959表空间不存在问题 #### 问题分析 1. **ORA-65048错误**:发生在CDB/PDB架构中,表示在错误的容器(如CDB$ROOT)中执行了PDB级别的操作[^1]。 2. **ORA-00959错误**:表空间'ECOLOGY'在目标PDB中不存在,通常因跨容器操作或路径错误导致[^2]。 #### 完整解决方案(需SYSDBA权限) ##### 步骤1: 连接到CDB并切换至目标PDB ```sql -- 以sysdba身份登录CDB sqlplus / as sysdba -- 切换到目标PDB容器 ALTER SESSION SET CONTAINER = ORCLPDB; ``` ##### 步骤2: 处理表空间'ECOLOGY'不存在问题 ```sql -- 检查表空间是否存在(在PDB中执行) SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name = 'ECOLOGY'; -- 若不存在则创建(注意PDB数据文件路径) CREATE TABLESPACE ECOLOGY DATAFILE '/u01/app/oracle/oradata/ORCLCDB/ORCLPDB/ecology01.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; ``` ##### 步骤3: 解决ORA-65048错误的核心操作 ```sql -- 关键:确保所有DDL在PDB容器内执行 ALTER SESSION SET CONTAINER = ORCLPDB; -- 再次确认容器切换 -- 示例:创建使用该表空间的用户 CREATE USER ecology_user IDENTIFIED BY your_password DEFAULT TABLESPACE ECOLOGY QUOTA UNLIMITED ON ECOLOGY; ``` ##### 步骤4: 验证修复结果 ```sql -- 确认表空间状态 SELECT file_name, bytes/1048576 AS size_mb FROM dba_data_files WHERE tablespace_name = 'ECOLOGY'; -- 验证PDB内对象操作 CREATE TABLE test_ecology (id NUMBER) TABLESPACE ECOLOGY; -- 应成功执行 ``` #### 关键注意事项 1. **路径规范**: - PDB数据文件必须放在PDB专属目录(如`.../ORCLCDB/ORCLPDB/`) - 错误路径示例:`/u01/app/oracle/oradata/ORCLCDB/ecology.dbf`(缺少PDB目录层) 2. **容器隔离**: - CDB$ROOT中的表空间对PDB不可见 - 每个PDB需要独立创建所需表空间[^1] 3. **权限要求**: ```sql -- 确保用户有PDB管理权限 GRANT CREATE TABLESPACE, CREATE USER TO sysadmin CONTAINER=ORCLPDB; ``` #### 完整操作流程示例 ```sql -- 步骤1: 登录并切换容器 sqlplus / as sysdba ALTER SESSION SET CONTAINER = ORCLPDB; -- 步骤2: 创建表空间 CREATE TABLESPACE ECOLOGY DATAFILE '/u01/app/oracle/oradata/ORCLCDB/ORCLPDB/ecology01.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED; -- 步骤3: 创建业务用户 CREATE USER app_user IDENTIFIED BY SecurePass123 DEFAULT TABLESPACE ECOLOGY QUOTA UNLIMITED ON ECOLOGY; -- 步骤4: 授权 GRANT CONNECT, RESOURCE, CREATE TABLE TO app_user; -- 步骤5: 验证 CONNECT app_user/SecurePass123@ORCLPDB CREATE TABLE test_tab (id NUMBER) TABLESPACE ECOLOGY; -- 应成功 ``` #### 预防措施 1. **容器检查脚本**: ```sql -- 在关键操作前添加容器验证 DECLARE v_con_name VARCHAR2(30); BEGIN SELECT SYS_CONTEXT('USERENV', 'CON_NAME') INTO v_con_name FROM dual; IF v_con_name != 'ORCLPDB' THEN RAISE_APPLICATION_ERROR(-20001, '错误容器! 当前容器: '||v_con_name); END IF; END; / ``` 2. **表空间监控**: ```sql -- 定期检查表空间使用率 SELECT tablespace_name, ROUND(used_percent, 2) AS used_pct FROM dba_tablespace_usage_metrics WHERE tablespace_name = 'ECOLOGY'; ``` > **重要提示**:所有涉及PDB对象的DDL语句(CREATE/ALTER/DROP)必须在目标PDB容器内执行。在CDB$ROOT中操作PDB对象必然引发ORA-65048错误[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值