前一段时间,某个项目做rman全备,在自动备份控制文件时会hang住,我发现异常。查了下mos,rman可以做debug,也可以做10046,这里记录一下:
rman target / log=rman.log trace=trace.trc debug
run{
debug on
backup database format '/u01/rman/fuulldb.bak';
debug off
}
rman target / log rman.log trace rman.trc debug
run {
sql "alter session set events ''10046 trace name context forever, level 12''";
set command id to 'rman';
backup database format '/u01/rman/fuulldb.bak';
}
另外发现生成的debug文件可以追踪完整的rman备份,实际上rman备份利用的如下dbms包
sys.dbms_backup_restore.backupDataFile
PRMVAL = memnum := 6;
DBGPLSQL: 477 TEXTNOD =
DBGPLSQL: 478 PRMVAL = dfnumber := 100; tsname := 'QCZJ'; fname := '+DATA/ORACLE/738D3B5541630D6FE05395FA87177B80/DATAFILE/qczj.377.985713711'; blocks := 262144; blksize := 8192;
DBGPLSQL: 479 TEXTNOD = if (first_time) then
DBGPLSQL: 480 TEXTNOD = if validatecmd then
DBGPLSQL: 481 TEXTNOD = krmicd.writeMsg(8141, krmicd.getChid);
DBGPLSQL: 482 TEXTNOD = elsif not docopies then
DBGPLSQL: 483 TEXTNOD = krmicd.writeMsg(8010, krmicd.getChid);
DBGPLSQL: 484 TEXTNOD = end if;
DBGPLSQL: 485 TEXTNOD = first_time := FALSE;
DBGPLSQL: 486 TEXTNOD = end if;
DBGPLSQL: 487 TEXTNOD = if files < memnum then
DBGPLSQL: 488 TEXTNOD = begin
DBGPLSQL: 489 TEXTNOD = sys.dbms_backup_restore.backupDataFile(dfnumber => dfnumber,
DBGPLSQL: 490 PRMVAL = max_corrupt=>0,since_change=>0
DBGPLSQL: 491 TEXTNOD = );
DBGPLSQL: 492 TEXTNOD = if convertdb then
DBGPLSQL: 493 TEXTNOD = if transonlyundo then
DBGPLSQL: 494 TEXTNOD = processfile := krmicd.isFileUndo(dfnumber);
DBGPLSQL: 495 TEXTNOD = end if;
DBGPLSQL: 496 TEXTNOD =
DBGPLSQL: 497 TEXTNOD = if processfile then
DBGPLSQL: 498 TEXTNOD = if transontarget then
DBGPLSQL: 499 TEXTNOD = krmicd.writeMsg(8305, krmicd.getChid);
DBGPLSQL: 500 TEXTNOD = else
DBGPLSQL: 501 TEXTNOD = krmicd.writeMsg(8589, krmicd.getChid);
DBGPLSQL: 502 TEXTNOD = end if;
DBGPLSQL: 503 TEXTNOD = end if;
DBGPLSQL: 504 TEXTNOD =
DBGPLSQL: 505 TEXTNOD = end if;
DBGPLSQL: 506 TEXTNOD =
DBGPLSQL: 507 TEXTNOD = if processfile then
DBGPLSQL: 508 TEXTNOD = krmicd.writeMsg(8522, to_char(dfnumber, 'FM09999'), fname);
DBGPLSQL: 509 TEXTNOD =
DBGPLSQL: 510 TEXTNOD = deb('budf_name', 'blocks=' || blocks || ' block_size=' || blksize,
DBGPLSQL: 511 TEXTNOD = rman_constant.DEBUG_IO, rman_constant.LEVEL_MIN);
DBGPLSQL: 512 TEXTNOD = end if;
DBGPLSQL: 513 TEXTNOD = exception
DBGPLSQL: 514 TEXTNOD = when sys.dbms_backup_restore.inc_scn_matches_df_scn then
DBGPLSQL: 515 TEXTNOD = krmicd.writeMsg(8522, to_char(dfnumber, 'FM09999'), fname);
DBGPLSQL: 516 TEXTNOD = krmicd.writeMsg(8056, to_char(dfnumber, 'FM09999'));
DBGPLSQL: 517 TEXTNOD = krmicd.clearErrors;
DBGPLSQL: 518 TEXTNOD = end;
DBGPLSQL: 519 TEXTNOD = files := files + 1;
DBGPLSQL: 520 TEXTNOD = end if;
DBGPLSQL: 521 TEXTNOD = --
MOS ID 412950.1
ORA-19511: How to determine if an RMAN FAILURE is caused by MML - Media Manager Layer (文档 ID 412950.1)
另外这里记下:
如果数据库日志切换太频繁,会导致rman全备备份控制文件时被hang住。