模拟ORA-26040: Data block was loaded using the NOLOGGING option

我们知道通过设置nologging选项,可以加快oracle的某些操作的执行速度,这在执行某些维护任务时是非常有用的,但是该选项也很危险,如果使用不当,就可能导致数据库发生ORA-26040错误。

首先,构造使用环境,

SQL> select tablespace_name,logging,force_logging from dba_tablespaces;

TABLESPACE_NAME 	       LOGGING	 FOR
------------------------------ --------- ---
SYSTEM			       LOGGING	 NO
UNDOTBS1		       LOGGING	 NO
SYSAUX			       LOGGING	 NO
TEMP			       NOLOGGING NO
USERS			       LOGGING	 NO
LOGGING 		       LOGGING	 NO

6 rows selected.
SQL> show user
USER is "LOGGING"
SQL> select table_name,logging from user_tables;

TABLE_NAME		       LOG
------------------------------ ---
SOURCE			       YES
NOLOG			       NO
NOLOG1			       NO

我们使用create table table_name nologging as select * from user_tables创建了表nolog和nolog1。在创建表之前,先使用rman进行全库的备份,表创建完成后,关闭数据库,并使用备份来恢复,结果如下:

[oraten@yue bdump]$ rman target /

Recovery Manager: Release 10.2.0.5.0 - Production on 星期四 11月 13 17:21:02 2014

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

connected to target database: ORATEN (DBID=3658365464, not open)

RMAN> list backup;

using target database control file instead of recovery catalog

List of Backup Sets
===================

BS Key  Type LV Size       Device Type Elapsed Time Completion Time    
------- ---- -- ---------- ----------- ------------ -------------------
97      Full    565.31M    DISK        00:00:41     2014-11-12 09:34:45
        BP Key: 65   Status: AVAILABLE  Compressed: NO  Tag: TAG20141112T093404
        Piece Name: /home/app/oraten/flash_recovery_area/ORATEN/backupset/2014_11_12/o1_mf_nnndf_TAG20141112T093404_b65g8fc3_.bkp
  List of Datafiles in backup set 97
  File LV Type Ckp SCN    Ckp Time            Name
  ---- -- ---- ---------- ------------------- ----
  1       Full 1276159    2014-11-12 09:34:04 /home/app/oraten/oradata/oraten/system01.dbf
  2       Full 1276159    2014-11-12 09:34:04 /home/app/oraten/oradata/oraten/undotbs01.dbf
  3       Full 1276159    2014-11-12 09:34:04 /home/app/oraten/oradata/oraten/sysaux01.dbf
  4       Full 1276159    2014-11-12 09:34:04 /home/app/oraten/oradata/oraten/users01.dbf
  5       Full 1276159    2014-11-12 09:34:04 /home/app/oraten/oradata/oraten/logging01.dbf

BS Key  Type LV Size       Device Type Elapsed Time Completion Time    
------- ---- -- ---------- ----------- ------------ -------------------
98      Full    6.86M      DISK        00:00:02     2014-11-12 09:34:52
        BP Key: 66   Status: AVAILABLE  Compressed: NO  Tag: TAG20141112T093404
        Piece Name: /home/app/oraten/flash_recovery_area/ORATEN/backupset/2014_11_12/o1_mf_ncsnf_TAG20141112T093404_b65g9vx2_.bkp
  Control File Included: Ckp SCN: 1276545      Ckp time: 2014-11-12 09:34:50
  SPFILE Included: Modification time: 2014-11-12 09:14:00

RMAN> restore database;

Starting restore at 2014-11-13 17:21:19
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK

channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /home/app/oraten/oradata/oraten/system01.dbf
restoring datafile 00002 to /home/app/oraten/oradata/oraten/undotbs01.dbf
restoring datafile 00003 to /home/app/oraten/oradata/oraten/sysaux01.dbf
restoring datafile 00004 to /home/app/oraten/oradata/oraten/users01.dbf
restoring datafile 00005 to /home/app/oraten/oradata/oraten/logging01.dbf
channel ORA_DISK_1: reading from backup piece /home/app/oraten/flash_recovery_area/ORATEN/backupset/2014_11_12/o1_mf_nnndf_TAG20141112T093404_b65g8fc3_.bkp
channel ORA_DISK_1: restored backup piece 1
piece handle=/home/app/oraten/flash_recovery_area/ORATEN/backupset/2014_11_12/o1_mf_nnndf_TAG20141112T093404_b65g8fc3_.bkp tag=TAG20141112T093404
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 2014-11-13 17:21:45

RMAN> recover database;

Starting recover at 2014-11-13 17:21:50
using channel ORA_DISK_1

starting media recovery

archive log thread 1 sequence 53 is already on disk as file /home/app/oraten/flash_recovery_area/ORATEN/archivelog/2014_11_12/o1_mf_1_53_b65gj7m2_.arc
archive log thread 1 sequence 54 is already on disk as file /home/app/oraten/flash_recovery_area/ORATEN/archivelog/2014_11_12/o1_mf_1_54_b65kj77p_.arc
archive log thread 1 sequence 55 is already on disk as file /home/app/oraten/flash_recovery_area/ORATEN/archivelog/2014_11_13/o1_mf_1_55_b68w6tft_.arc
archive log filename=/home/app/oraten/flash_recovery_area/ORATEN/archivelog/2014_11_12/o1_mf_1_53_b65gj7m2_.arc thread=1 sequence=53
media recovery complete, elapsed time: 00:00:14
Finished recover at 2014-11-13 17:22:05

RMAN> alter database open;

database opened

RMAN> 

alert 文件中的内容如下:

Thu Nov 13 17:21:20 CST 2014
Full restore complete of datafile 5 /home/app/oraten/oradata/oraten/logging01.dbf.  Elapsed time: 0:00:00 
  checkpoint is 1276159
Full restore complete of datafile 4 /home/app/oraten/oradata/oraten/users01.dbf.  Elapsed time: 0:00:00 
  checkpoint is 1276159
  last deallocation scn is 672889
Full restore complete of datafile 2 /home/app/oraten/oradata/oraten/undotbs01.dbf.  Elapsed time: 0:00:01 
  checkpoint is 1276159
  last deallocation scn is 1252646
Full restore complete of datafile 3 /home/app/oraten/oradata/oraten/sysaux01.dbf.  Elapsed time: 0:00:03 
  checkpoint is 1276159
  last deallocation scn is 842824
Thu Nov 13 17:21:41 CST 2014
Full restore complete of datafile 1 /home/app/oraten/oradata/oraten/system01.dbf.  Elapsed time: 0:00:10 
  checkpoint is 1276159
  last deallocation scn is 399219
Thu Nov 13 17:21:51 CST 2014
alter database recover datafile list clear
Thu Nov 13 17:21:51 CST 2014
Completed: alter database recover datafile list clear
Thu Nov 13 17:21:51 CST 2014
alter database recover datafile list
 1 , 2 , 3 , 4 , 5
Completed: alter database recover datafile list
 1 , 2 , 3 , 4 , 5
Thu Nov 13 17:21:51 CST 2014
alter database recover if needed
 start
Media Recovery Start
 parallel recovery started with 2 processes
ORA-279 signalled during: alter database recover if needed
 start
...
Thu Nov 13 17:21:51 CST 2014
alter database recover logfile '/home/app/oraten/flash_recovery_area/ORATEN/archivelog/2014_11_12/o1_mf_1_53_b65gj7m2_.arc'
Thu Nov 13 17:21:51 CST 2014
Media Recovery Log /home/app/oraten/flash_recovery_area/ORATEN/archivelog/2014_11_12/o1_mf_1_53_b65gj7m2_.arc
Thu Nov 13 17:21:52 CST 2014
Recovery of Online Redo Log: Thread 1 Group 3 Seq 54 Reading mem 0
  Mem# 0: /home/app/oraten/oradata/oraten/redo03.log
Thu Nov 13 17:21:54 CST 2014
Recovery of Online Redo Log: Thread 1 Group 1 Seq 55 Reading mem 0
  Mem# 0: /home/app/oraten/oradata/oraten/redo01.log
Thu Nov 13 17:21:59 CST 2014
Recovery of Online Redo Log: Thread 1 Group 2 Seq 56 Reading mem 0
  Mem# 0: /home/app/oraten/oradata/oraten/redo02.log
Thu Nov 13 17:22:02 CST 2014
Media Recovery Complete (oraten)
Completed: alter database recover logfile '/home/app/oraten/flash_recovery_area/ORATEN/archivelog/2014_11_12/o1_mf_1_53_b65gj7m2_.arc'
Thu Nov 13 17:22:11 CST 2014
alter database open
Thu Nov 13 17:22:11 CST 2014
LGWR: STARTING ARCH PROCESSES
ARC0 started with pid=21, OS id=6628
Thu Nov 13 17:22:11 CST 2014
ARC0: Archival started
ARC1: Archival started
LGWR: STARTING ARCH PROCESSES COMPLETE
ARC1 started with pid=22, OS id=6630
Thu Nov 13 17:22:12 CST 2014
Thread 1 opened at log sequence 56
  Current log# 2 seq# 56 mem# 0: /home/app/oraten/oradata/oraten/redo02.log
Successful open of redo thread 1
Thu Nov 13 17:22:12 CST 2014
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Thu Nov 13 17:22:12 CST 2014
ARC0: Becoming the 'no FAL' ARCH
ARC0: Becoming the 'no SRL' ARCH
Thu Nov 13 17:22:12 CST 2014
ARC1: Becoming the heartbeat ARCH
Thu Nov 13 17:22:12 CST 2014
SMON: enabling cache recovery
Thu Nov 13 17:22:12 CST 2014
Successfully onlined Undo Tablespace 1.
Thu Nov 13 17:22:12 CST 2014
SMON: enabling tx recovery
Thu Nov 13 17:22:12 CST 2014
Database Characterset is AL32UTF8
Opening with internal Resource Manager plan 
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
QMNC started with pid=23, OS id=6632
Thu Nov 13 17:22:12 CST 2014
db_recovery_file_dest_size of 2048 MB is 28.34% used. This is a
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
Thu Nov 13 17:22:13 CST 2014
Completed: alter database open
从上面我们看出,一切正常,数据库成功恢复了,但是:

SQL> conn logging/logging
Connected.
SQL> select * from nolog;
select * from nolog
              *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 44)
ORA-01110: data file 5: '/home/app/oraten/oradata/oraten/logging01.dbf'
ORA-26040: Data block was loaded using the NOLOGGING option

数据库报错,看来恢复成功并不一定数据库就是正常的。
再看一下,日志的的dump内容,

[oraten@yue udump]$ strings oraten_ora_10509.trc | grep oad
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
Direct Loader invalidate block range redo entry
看来日志中对nologging是有记录的,在rman恢复时,会根据记录将某些块设置为逻辑损坏。




<think>我们正在解决Oracle数据泵导出时出现的UDE-31623和ORA-31623错误。根据用户提供的引用(特别是文档ID1907256.1),这个错误的具体描述是:“a jobis notattached tothis sessionvia thespecified handle”(作业没有通过指定的句柄附加到当前会话)。这通常发生在尝试控制(如停止、重启或监控)一个数据泵作业时,但当前会话并没有附加到这个作业。错误原因分析:1.会话未附加作业:可能因为之前的会话已经断开,而作业在后台继续运行,此时在新的会话中尝试重新附加该作业就会失败。2.作业句柄无效:在数据泵操作中,作业句柄(handle)是唯一标识作业的。如果句柄不正确或已失效,就会导致此错误。3.作业已完成或失败:如果作业已经完成(成功或失败)而用户仍尝试附加,也会出现此错误。 解决方案: 根据Oracle官方文档(文档ID1907256.1)[^1][^2],我们可以采取以下步骤:步骤1:检查数据泵作业的状态使用以下SQL查询当前数据库中的数据泵作业状态:```sqlSELECTowner_name, job_name,operation,job_mode, stateFROM dba_datapump_jobs; ```或者(如果没有DBA权限): ```sqlSELECT *FROM user_datapump_jobs; ```步骤2:根据作业状态采取相应措施-如果作业状态(STATE)为`NOTRUNNING`、`FAILED`或`COMPLETED`,则说明作业已经结束,无法重新附加。此时,如果需要重新运行,应该使用新的作业名重新启动导出。-如果作业状态为`EXECUTING`,说明作业正在运行,但当前会话无法附加。这时,我们可以尝试重新附加到作业(见步骤3)。 步骤3:重新附加到运行中的作业(如果作业仍在运行) 在数据泵导出命令中,使用`attach`参数附加到现有作业:```bashexpdp username/passwordATTACH=<job_name> ```其中`<job_name>`是步骤1中查询到的作业名。 步骤4:如果附加成功,则可以在交互模式下控制作业(如停止、重启等)。如果附加失败(例如作业名错误或作业已不存在),则考虑终止该作业并重新启动。 步骤5:终止无法附加的作业(如果作业已挂起且无法附加) 如果作业确实存在但无法附加,且需要停止它,可以使用以下PL/SQL命令(以SYS或拥有权限的用户执行):```sqlDECLAREhdlNUMBER;BEGINhdl :=DBMS_DATAPUMP.ATTACH('<job_name>', '<owner_name>'); --作业名和所有者(从步骤1中获取)DBMS_DATAPUMP.STOP_JOB(hdl,1,0); --立即停止作业END; /``` 注意:如果作业所有者不是当前用户,需要指定所有者。步骤6:重新启动导出作业在清理了无效作业后,使用新的作业名重新启动导出: ```bashexpdpusername/password DIRECTORY=dpump_dirDUMPFILE=export.dmp LOGFILE=export.logJOB_NAME=new_job_name ...``` 预防措施:1.在脚本中使用数据泵时,确保作业名唯一(例如包含时间戳)。 2.在会话中断(如网络断开)后,先检查作业状态再尝试重新附加。3.定期清理已完成的数据泵作业。注意事项: -如果作业已经完成(成功或失败),则不需要终止,直接重新运行即可。-如果作业状态为`DEFINING`,表示作业正在创建,可以稍等片刻再尝试附加。如果上述步骤无法解决问题,可能需要检查数据泵的日志文件(通常位于DIRECTORY参数指定的目录中)以获取更多信息。 相关问题: 1.如何查看Oracle数据泵作业的详细日志?2.如何永久删除Oracle数据泵作业? 3.Oracle数据泵中,如何从网络故障中恢复导出作业?</think>### 解决 Oracle 数据泵导出错误 UDE-31623 ORA-31623 "job not attached to session handle" 根据您提供的引用文档 ID 1907256.1[^1][^2],这个错误的核心是数据泵作业未能正确附加到当前会话句柄。以下是针对此错误的完整解决方案: #### 错误原因分析 ```mermaid graph TD A[UDE-31623/ORA-31623] --> B[会话句柄丢失] B --> C1[网络中断] B --> C2[会话超时] B --> C3[客户端异常退出] B --> C4[并行操作冲突] B --> C5[作业名重复] A --> D[作业状态不一致] D --> E1[作业仍在运行] D --> E2[作业已停止但未清除] ``` 主要触发场景: 1. **会话中断**:导出过程中网络断开或客户端异常关闭 2. **作业状态残留**:作业仍在数据库后台运行,但会话句柄丢失[^1] 3. **句柄冲突**:多个会话尝试附加同名作业(常见于脚本重复执行) 4. **权限问题**:用户权限变更导致会话无法重新附加作业 #### 解决方案步骤 ##### 1. 检查作业状态(关键步骤) ```sql -- 查询所有数据泵作业状态 SELECT owner_name, job_name, operation, job_mode, state, attached_sessions FROM dba_datapump_jobs WHERE job_name = '<your_job_name>'; -- 替换为实际作业名 -- 若无作业名,查询所有运行中作业 SELECT * FROM dba_datapump_jobs WHERE state = 'EXECUTING'; ``` - ✅ **正常状态**:`STATE = 'EXECUTING'` 且 `ATTACHED_SESSIONS > 0` - ❌ **错误状态**:`STATE = 'NOT RUNNING'` 但作业实际在运行(需强制清理) ##### 2. 重新附加作业(首选方案) ```bash expdp username/password@db \ ATTACH=<job_name> # 从步骤1获取的作业名 ``` - 成功附加后进入交互模式,可选择: - `CONTINUE_CLIENT` 恢复作业 - `STOP_JOB` 安全停止 - 若附加失败,继续下一步 ##### 3. 强制清理残留作业 ```sql DECLARE hdl NUMBER; BEGIN -- 尝试附加作业 hdl := DBMS_DATAPUMP.ATTACH('<job_name>', '<owner_name>'); -- 立即停止并删除作业 DBMS_DATAPUMP.STOP_JOB(hdl, 1, 0); EXCEPTION WHEN OTHERS THEN -- 当附加失败时直接删除作业 DBMS_DATAPUMP.DETACH('<job_name>'); END; / ``` ##### 4. 重启导出作业(预防措施) ```bash expdp username/password@db \ DIRECTORY=dpump_dir \ DUMPFILE=export_%U.dmp \ LOGFILE=export.log \ JOB_NAME=exp_$(date +%s) \ # 使用时间戳确保唯一性 PARALLEL=4 \ CLUSTER=N # 禁用集群选项(规避常见Bug) ``` 关键参数优化: - `JOB_NAME`:添加时间戳保证唯一性(避免 ORA-31623) - `CLUSTER=N`:禁用集群模式(解决引用[2]提到的并发Bug) - `PARALLEL`:根据 CPU 核心数设置(公式:$ \text{parallel} \leq \text{CPU\_cores}/2 $) ##### 5. 网络中断处理 若错误由网络中断引起: ```bash # 使用mosh替代ssh(防止会话超时) mosh user@dbserver # 在tmux/screen中启动导出 tmux new-session -s expdp expdp ... # 按Ctrl+B D脱离会话 ``` #### 预防措施 1. **会话管理**: - 使用 `nohup expdp ... &` 或 `tmux` 启动作业 - 设置 SQLNET.EXPIRE_TIME=10(分钟级心跳检测) 2. **作业监控脚本**: ```bash #!/bin/bash # 自动检测并重新附加作业 if ! expdp attach=<job_name>; then echo "Reattaching failed, restarting job..." expdp ... JOB_NAME=exp_$(date +%s) fi ``` 3. **参数优化**(`expdp` 命令行): ```bash COMPRESSION=ALL # 减少网络传输量 NETWORK_LINK=db_link # 远程导出避免客户端中断 ENCRYPTION_PASSWORD=pass # 防止凭据失效 ``` > **重要提示**:如果问题反复出现,请检查 Oracle 集群配置。引用[2]指出该错误常与 Bug 5663241/4173696 相关(集群环境下的句柄同步问题),需应用补丁或设置 `CLUSTER=N`[^2]。 #### 故障排除流程图 ```mermaid graph LR A[出现 ORA-31623] --> B{作业是否存在?} B -->|Yes| C[尝试ATTACH] B -->|No| D[重启新作业] C -->|成功| E[交互控制] C -->|失败| F[强制清理] F --> G[重启新作业] G --> H[添加唯一JOB_NAME] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值