当前用户下没有主键也没有唯一性索引的表

本文分享了如何使用Oracle SQL查询特定条件下的表信息,包括没有主键的表、含有唯一性索引的表以及既无主键也无唯一索引的表,提供了实用的SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、查询当前用户下没有主键的表

select 
  from user_tables a
 where exists (select table_name
          from user_constraints b
         where b.constraint_type = 'P'
           and a.table_name = b.table_name);

2、查询当前用户下含有唯一性索引的表

select distinct cu.table_name
  from user_cons_columns cu, user_constraints au
 where cu.constraint_name = au.constraint_name
   and au.constraint_type = 'U') T
 where u.table_name = T.table_name;

3、当前用户下,既没有主键也没有唯一性索引的表

select table_name
  from user_tables u
 where not exists
 (select table_name
          from (select table_name
                  from user_tables a
                 where exists (select *
                          from user_constraints b
                         where b.constraint_type = 'P'
                           and a.table_name = b.table_name)
                union
                select distinct cu.table_name
                  from user_cons_columns cu, user_constraints au
                 where cu.constraint_name = au.constraint_name
                   and au.constraint_type = 'U') T
         where u.table_name = T.table_name)
   and u.table_name not like '%$%';

 

转载于:https://www.cnblogs.com/connected/p/10298470.html

<think>好的,我现在需要处理用户关于Oracle GoldenGate(OGG)在Schema级别附加日志的问题,特别是当没有主键唯一索引时的影响和解决方案。首先,我需要回顾之前的对话和用户提供的引用,确保回答准确。 用户的问题集中在创建没有主键唯一索引对OGG的Schema级别附加日志的影响及解决方法。根据之前的回答和用户提供的引用,我需要整合这些信息。 首先,用户提到的引用[1]解释了为什么需要附加日志:OGG需要主键唯一索引或所有列来唯一标识行,因为目标端的rowid不同。如果没有主键唯一索引,OGG会默认记录所有列,但这可能带来性能问题,如引用[2]和[3]所述。引用[3]和[4]提到解决方案是添加带有SYS_GUID的列,并分步骤执行以避免锁。 接下来,我需要考虑用户之前的问题中关于Schema级别附加日志的配置步骤,特别是ADD SCHEMATRANDATA命令如何自动处理这些情况。根据之前的回答,ADD SCHEMATRANDATA会为schema下的所有添加主键唯一键的补充日志。但如果没有这些,OGG会记录所有列,这可能影响性能和日志量。 现在,用户的问题是关于这种情况下Schema级别附加日志的具体影响和解决方案。需要明确以下几点: 1. **影响**:当没有主键唯一索引时,OGG在Schema级别附加日志会自动记录所有列,导致日志量增加、同步延迟和资源消耗,如引用[2]所述。还可能存在数据冲突风险,因为依赖所有列可能不够稳定。 2. **解决方案**: - 最佳实践是为添加主键唯一索引,如引用[3]建议。 - 如果无法修改结构,使用SYS_GUID生成唯一标识符,并分步骤添加以避免锁问题,如引用[4]所述。 - 配置全字段补充日志作为临时措施,但需注意性能影响。 此外,需要提到在Schema级别附加日志下,新增会自动处理,但如果没有主键,同样会记录所有列。同时,在双向复制中需注意两端配置,如之前的回答中提到的。 还要考虑用户的潜在需求,比如如何优化性能、处理现有数据等。可能需要分步骤指导解决方案,并强调最佳实践和替代方案的优缺点。 最后,确保回答结构清晰,分点说明影响和解决方法,并引用相关引用支持。同时,生成的相关问题要贴近用户可能的后续疑问,如具体操作步骤、性能优化或RAC环境注意事项。</think>### **Schema级别附加日志对无主键的影响及解决方案** 在Oracle GoldenGate中,当缺乏主键唯一索引时,**Schema级别附加日志(`ADD SCHEMATRANDATA`)** 会触发OGG的默认处理机制,但可能带来潜在风险。以下是具体影响及应对方案: --- ### **一、无主键/唯一索引的影响** 1. **日志量与性能问题** - OGG默认会记录所有列值作为行标识(`ALLCOLS`模式),导致重做日志量显著增加,可能引发同步延迟和存储压力[^2]。 - 例如:对包含20列的执行更新操作,日志中会记录全部20列的旧值和新值,而非仅主键。 2. **数据冲突风险** - 若目标存在重复数据(如所有列值相同但实际为不同业务记录),OGG可能无法准确定位目标行,导致同步错误或数据覆盖[^3]。 3. **Schema级自动补充日志的局限性** - `ADD SCHEMATRANDATA`仅自动启用主键/唯一键的补充日志。若无主键,OGG会强制启用全字段日志,但缺少显式控制手段[^1]。 --- ### **二、解决方案** #### **方案1:优化结构(推荐)** 1. **添加主键唯一索引** ```sql -- 示例:为添加主键 ALTER TABLE IT_MES.orders ADD CONSTRAINT pk_orders PRIMARY KEY (order_id); ``` - **优势**:直接解决标识问题,减少日志量,提升同步性能[^2]。 - **注意**:需评估业务逻辑,避免与现有数据冲突。 2. **使用SYS_GUID生成唯一标识** ```sql -- 步骤1:添加默认值为SYS_GUID的列(避免锁) ALTER TABLE IT_MES.orders ADD (ogg_key_id RAW(16) DEFAULT SYS_GUID() NOT NULL); -- 步骤2:创建唯一索引(单独执行,避免锁风险[^4]) CREATE UNIQUE INDEX idx_orders_ogg_key ON IT_MES.orders (ogg_key_id); ``` - **适用场景**:无法修改现有主键时,作为替代方案[^3]。 --- #### **方案2:显式配置全字段补充日志** 1. **级覆盖配置** 通过`ADD TRANDATA`强制记录全字段(即使已启用Schema级日志): ```bash GGSCI> ADD TRANDATA IT_MES.orders ALLCOLS ``` - **影响**:日志量最大,仅建议作为临时措施[^2]。 2. **验证配置状态** ```bash GGSCI> INFO TRANDATA IT_MES.orders ``` 输出中需包含`ALLCOLS`标识。 --- #### **方案3:参数调整与监控** 1. **启用`USEDEFAULTS`参数** 在抽取进程参数文件中添加: ```properties TABLE IT_MES.*; USEDEFAULTS ALLCOLS ``` - **作用**:强制所有使用全字段补充日志[^1]。 2. **监控日志增长** 定期检查重做日志切换频率和空间使用情况: ```sql SELECT * FROM V$LOG_HISTORY WHERE FIRST_TIME > SYSDATE-1; ``` --- ### **三、特殊场景处理** 1. **新增的自动处理** - 启用`ADD SCHEMATRANDATA`后,新创建的会自动继承补充日志配置,但若无主键,仍会触发全字段日志[^1]。 2. **双向复制环境** - 需在源端和目标端同时启用补充日志,避免因标识不一致导致循环复制[^4]。 --- ### **四、操作验证示例** 1. **模拟无主键同步** ```sql -- 创建测试 CREATE TABLE IT_MES.test_nopk (col1 NUMBER, col2 VARCHAR2(50)); -- 启用Schema级补充日志 GGSCI> ADD SCHEMATRANDATA IT_MES ``` 2. **检查日志记录方式** ```bash GGSCI> INFO TRANDATA IT_MES.test_nopk ``` 输出应显示`ALLCOLS`生效。 --- ### **引用总结** | 问题点 | 引用依据 | 解决方案 | |----------------------|--------------------------|-----------------------------| | 无主键导致全字段日志 | [^1][^2] | 添加主键/SYS_GUID列 | | 全字段日志性能影响 | [^2] | 优先优化结构 | | 新增自动处理 | [^1] | 确保SCHEMATRANDATA已启用 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值