在12c的$ORACLE_HOME/rdbms/admin下找到 INT$DBA_CONSTRAINTS 的定义

本文深入探讨了Oracle数据库管理系统中的INT$DBA_CONSTRAINTS与DBA_CONSTRAINTS视图的区别与联系,包括它们的数据结构、存储方式以及如何通过视图获取约束信息。
[oracle@rhel59 admin]$ pwd
/u01/app/oracle/product/12.1.0/dbhome_1/rdbms/admin
[oracle@rhel59 admin]$ grep -rn 'INT$DBA_CONSTRAINTS' ./
./e1201000.sql:138:Rem    thbaby      09/17/13 - lrg 9710290: reload INT$DBA_CONSTRAINTS
./e1201000.sql:150:Rem    thbaby      08/13/13 - 16956123: drop view INT$INT$DBA_CONSTRAINTS
./e1201000.sql:881:drop view INT$INT$DBA_CONSTRAINTS;
./e1201000.sql:883:-- lrg 9710290: 12.1.0.2->12.1.0.1 downgrade drops INT$INT$DBA_CONSTRAINTS, 
./e1201000.sql:884:-- which causes INT$DBA_CONSTRAINTS to be marked invalid. This, in turn, 
./e1201000.sql:887:-- definition of INT$DBA_CONSTRAINTS right after INT$INT$DBA_CONSTRAINTS 
./e1201000.sql:889:create or replace view INT$DBA_CONSTRAINTS COMMON_DATA 
./cdcore.sql:37:Rem                           querying INT$DBA_CONSTRAINTS
./cdcore.sql:76:Rem    thbaby      05/31/13 - 16813682: INT$DBA_CONSTRAINTS is not common data 
./cdcore.sql:14122:create or replace view INT$INT$DBA_CONSTRAINTS COMMON_DATA 
./cdcore.sql:14181:-- INT$DBA_CONSTRAINTS has two object types - a view and a table.
./cdcore.sql:14191:create or replace view INT$DBA_CONSTRAINTS
./cdcore.sql:14205:from   INT$INT$DBA_CONSTRAINTS INT$INT$DBA_CONSTRAINTS
./cdcore.sql:14206:where  INT$INT$DBA_CONSTRAINTS.OBJECT_TYPE# = 4
./cdcore.sql:14207:       OR (INT$INT$DBA_CONSTRAINTS.OBJECT_TYPE# = 2
./cdcore.sql:14208:           AND (INT$INT$DBA_CONSTRAINTS.ORIGIN_CON_ID IN (0,1)
./cdcore.sql:14209:                OR INT$INT$DBA_CONSTRAINTS.SHARING = 0))
./cdcore.sql:14211:-- Even though DBA_CONSTRAINTS and INT$DBA_CONSTRAINTS look very similar 
./cdcore.sql:14213:-- selects fewer columns than INT$DBA_CONSTRAINTS.
./cdcore.sql:14228:from   INT$DBA_CONSTRAINTS 
./cdcore.sql:14320:from   NO_ROOT_SW_FOR_LOCAL(INT$INT$DBA_CONSTRAINTS) INT$INT$DBA_CONSTRAINTS
./cdcore.sql:14321:where  INT$INT$DBA_CONSTRAINTS.OBJECT_TYPE# = 4   /* views */
./cdcore.sql:14322:  and  INT$INT$DBA_CONSTRAINTS.OWNER=SYS_CONTEXT('USERENV', 'CURRENT_USER')
./cdcore.sql:14330:from   NO_COMMON_DATA(INT$INT$DBA_CONSTRAINTS) INT$INT$DBA_CONSTRAINTS
./cdcore.sql:14331:where  INT$INT$DBA_CONSTRAINTS.OBJECT_TYPE# = 2 /* tables */
./cdcore.sql:14332:  and  INT$INT$DBA_CONSTRAINTS.OWNER=SYS_CONTEXT('USERENV', 'CURRENT_USER')
./cdcore.sql:14416:from INT$DBA_CONSTRAINTS 
./upobjxt.lst:60914:SYS,INT$DBA_CONSTRAINTS,,4,                                                     
./upobjxt.lst:61068:SYS,INT$INT$DBA_CONSTRAINTS,,4,                                                 
./e1102000.sql:9039:drop view INT$DBA_CONSTRAINTS;

 


于是定位到下面的一行:

./cdcore.sql:14191:create or replace view INT$DBA_CONSTRAINTS

 

然后vi cdcore.sql ,找到如下的信息:

-- INT$DBA_CONSTRAINTS has two object types - a view and a table.
-- The dictionary information about linked views is stored only in ROOT,
-- with a dummy obj$ row in PDB to indicate this. Hence we can use common
-- data view mechanism to fetch view constraints.
-- The dictionary information about linked tables however is stored in
-- all the containers. Hence using common data view mechanism would fetch
-- duplicate constraints. So we added a condition that if the object is
-- a not a linked table then fetch the constraint and if it is a linked
-- table then fetch the constraint only if the origin con id is root or
-- non-cdb.
create or replace view INT$DBA_CONSTRAINTS
    (OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE,
     TABLE_NAME, OBJECT_ID, OBJECT_TYPE#, SEARCH_CONDITION,
     SEARCH_CONDITION_VC, R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS,
     DEFERRABLE, DEFERRED, VALIDATED, GENERATED,
     BAD, RELY, LAST_CHANGE, INDEX_OWNER, INDEX_NAME,
     INVALID, VIEW_RELATED, SHARING, ORIGIN_CON_ID)
as
select OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE,
       TABLE_NAME, OBJECT_ID, OBJECT_TYPE#, SEARCH_CONDITION,
       SEARCH_CONDITION_VC, R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS,
       DEFERRABLE, DEFERRED, VALIDATED, GENERATED,
       BAD, RELY, LAST_CHANGE, INDEX_OWNER, INDEX_NAME,
       INVALID, VIEW_RELATED, SHARING, ORIGIN_CON_ID
from   INT$INT$DBA_CONSTRAINTS INT$INT$DBA_CONSTRAINTS
where  INT$INT$DBA_CONSTRAINTS.OBJECT_TYPE# = 4
       OR (INT$INT$DBA_CONSTRAINTS.OBJECT_TYPE# = 2
           AND (INT$INT$DBA_CONSTRAINTS.ORIGIN_CON_ID IN (0,1)
                OR INT$INT$DBA_CONSTRAINTS.SHARING = 0))
/
-- Even though DBA_CONSTRAINTS and INT$DBA_CONSTRAINTS look very similar
-- in their definitions, we need both these views because DBA_CONSTRAINTS
-- selects fewer columns than INT$DBA_CONSTRAINTS.
create or replace view DBA_CONSTRAINTS
    (OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE,
     TABLE_NAME, SEARCH_CONDITION, SEARCH_CONDITION_VC,
     R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS,
     DEFERRABLE, DEFERRED, VALIDATED, GENERATED,
     BAD, RELY, LAST_CHANGE, INDEX_OWNER, INDEX_NAME,
     INVALID, VIEW_RELATED, ORIGIN_CON_ID)
as
select OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE,
       TABLE_NAME, SEARCH_CONDITION, SEARCH_CONDITION_VC,
       R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS,
       DEFERRABLE, DEFERRED, VALIDATED, GENERATED,
       BAD, RELY, LAST_CHANGE, INDEX_OWNER, INDEX_NAME,
       INVALID, VIEW_RELATED, ORIGIN_CON_ID
from   INT$DBA_CONSTRAINTS
/


 

你遇到的错误信息: ``` ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 6144M ORA-01078: failure in processing system parameters ``` 表示你在启动 Oracle 实例时(`STARTUP NOMOUNT`),Oracle 读取了指定的 PFILE(初始化参数文件),但其中设置的 `MEMORY_TARGET` 参数值小于 Oracle 所需的最小值(至少 6144 MB,即 6 GB)。 --- ### 🔍 错误原因分析 - `MEMORY_TARGET` 是 Oracle 的自动内存管理参数(AMM,Automatic Memory Management),它统一管理 SGA 和 PGA。 - 当前你在 `initdup.ora` 文件中设置的 `memory_target` 小于 6144M。 - Oracle 在启动实例时进行参数校验,发现该值过小,无法满足最低运行需求,于是报错并拒绝启动。 > ⚠️ 注意:这个最小值(6144M)通常出现在较大配置数据库或特定版本(如 11g、12c)中,尤其是在服务器物理内存较大的情况下,Oracle 内部会强制要求一个最小值。 --- ### ✅ 解决方案 你需要修改你的 PFILE 文件 `$ORACLE_HOME/initdup.ora`,将 `memory_target` 设置为 **至少 6144M**(推荐略大一点,比如 7G 或 8G,视系统可用内存而定)。 #### 步骤如下: 1. 打开你的 PFILE 文件: ```bash $ vi $ORACLE_HOME/initdup.ora ``` 2. 找到以下参数并修改: ```ini memory_target = 7516192832 # 推荐值:7G,单位是字节 ``` 或者使用更易读的方式(如果你用的是文本格式): ```ini memory_target = 7G ``` > ✅ 最小必须设置为 `6144M`,建议设为 `7G` 避免未来扩展问题。 3. 如果你还设置了 `sga_target` 或 `pga_aggregate_target`,确保它们之和不超过 `memory_target`。 示例合理配置: ```ini memory_target = 7G sga_target = 4G pga_aggregate_target = 2G ``` 4. 保存文件后,重新尝试启动: ```sql SQL> STARTUP NOMOUNT PFILE='$ORACLE_HOME/initdup.ora'; ``` --- ### 🛠 补充说明:如何查看当前参数值? 你可以临时检查当前 PFILE 中的内容是否生效: ```sql -- 查看某个参数(仅当实例能启动时) SHOW PARAMETER memory_target; ``` 但在 `NOMOUNT` 前无法执行此命令。所以建议直接编辑文件。 --- ### ❗ 其他可能的问题排查 | 检查项 | 说明 | |------|------| | 物理内存是否足够? | 确保服务器有至少 8GB 可用内存,否则不要设太高 | | 使用 SPFILE? | 如果后续转为 SPFILE,记得更新:`CREATE SPFILE FROM PFILE;` | | 参数拼写错误 | 检查是否有 `memroy_target` 这类拼写错误 | | 单位格式支持 | Oracle 支持 `K/M/G`,但如果写成小写 `g` 可能在某些版本不识别,建议大写 | --- ### 💡 示例修正后的 initdup.ora 片段 ```ini db_name='DUP' instance_name='dup' memory_target=7G sga_target=4G pga_aggregate_target=2G processes=300 background_dump_dest='/u01/app/oracle/admin/dup/bdump' user_dump_dest='/u01/app/oracle/admin/dup/udump' compatible='11.2.0.0.0' ``` --- ### ✅ 成功启动示例 ```sql SQL> STARTUP NOMOUNT PFILE='$ORACLE_HOME/initdup.ora'; ORACLE instance started. Total System Global Area 7516192768 bytes Fixed Size 2267872 bytes Variable Size 5033164800 bytes Database Buffers 2466250752 bytes Redo Buffers 14499840 bytes ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值