标签云
asm恢复 bbed bootstrap$ dul kcbzib_kcrsds_1 kccpb_sanity_check_2 kcratr_nab_less_than_odr MySQL恢复 obet ORA-00312 ORA-00704 ORA-00742 ORA-01110 ORA-01200 ORA-01555 ORA-01578 ORA-01595 ORA-600 2662 ORA-600 2663 ORA-600 3020 ORA-600 4000 ORA-600 4137 ORA-600 4193 ORA-600 4194 ORA-600 16703 ORA-600 kcbzib_kcrsds_1 ORA-600 KCLCHKBLK_4 ORA-600 kcratr_nab_less_than_odr ORA-15042 ORA-15196 ORACLE 12C oracle dul ORACLE PATCH Oracle Recovery Tools oracle加密恢复 oracle勒索 oracle勒索恢复 oracle异常恢复 ORACLE恢复 Oracle 恢复 ORACLE数据库恢复 oracle碎片 OSD-04016 YOUR FILES ARE ENCRYPTED 比特币加密文章分类
- MongoDB (1)
- MongoDB恢复 (1)
- Others (2)
- 中间件 (2)
- WebLogic (2)
- 操作系统 (112)
- 数据库 (1,884)
- DB2 (22)
- MySQL (82)
- Oracle (1,709)
- Data Guard (53)
- EXADATA (8)
- GoldenGate (24)
- ORA-xxxxx (168)
- ORACLE 12C (72)
- ORACLE 18C (6)
- ORACLE 19C (15)
- ORACLE 21C (3)
- Oracle 23ai (8)
- Oracle ASM (73)
- Oracle Bug (8)
- Oracle RAC (56)
- Oracle 安全 (6)
- Oracle 开发 (28)
- Oracle 监听 (29)
- Oracle备份恢复 (662)
- Oracle安装升级 (108)
- Oracle性能优化 (62)
- 专题索引 (5)
- 勒索恢复 (91)
- PostgreSQL (37)
- pdu工具 (7)
- PostgreSQL恢复 (13)
- SQL Server (34)
- SQL Server恢复 (14)
- TimesTen (7)
- 达梦数据库 (5)
- 达梦恢复 (3)
- 生活娱乐 (2)
- 至理名言 (11)
- 虚拟化 (2)
- VMware (2)
- 软件开发 (51)
- Asp.Net (9)
- JavaScript (12)
- PHP (2)
- 小工具 (34)
- MongoDB (1)
-
最近发表
- 记录19c ASM磁盘掉线触发ORA-59048故障处理
- aix平台Oracle数据库由于断电无法启动故障处理
- 断电引起ORA-600 3005故障处理
- 记录一次云存储资源到期之后引起的数据库恢复
- Firebird 损坏数据库数据抢救工具—firebirdext
- Oracle 19c 202610补丁(RUs+OJVM)-19.33
- 由于con$.con#值达到极限,触发数据库增加约束报ORA-600 12807错误
- MongoDB 离线提取工具—mongoext
- .bres勒索病毒加密数据库dmp文件可恢复
- ORA-600 krsm_mrp_rebuild_lf_list.lno_mismatch
- 记录一次0丢失的ORA-00354: 损坏重做日志块标头故障恢复
- 不当数据库恢复操作导致一个月数据丢失
- obet快速修复oracle 位图损坏块
- 不太常见的10.2.0.1的oracle redo损坏恢复
- obet forcecopy功能抢救硬件故障中的数据文件
- kcratr_nab_less_than_odr和system坏块故障处理
- 通过obet 恢复system坏块,打开数据库
- obet dbv功能完整说明
- 分享一例运行在aix上的sap系统数据库恢复过程
- OBET-Oracle Block Editor Tool使用说明
分类目录归档:数据库
证明递归session存在并解释为什么不在v$session中显示
我们在数据库的使用过程中,有时候会遇到类似情况,我会话是登录的,但是我进行某种操作,缺报session不足.这种情况证明该sql后台还产生了其他会话,这里通过试验分析证明了递归session的存在
会话创建表报session超
CDB_PDB@CHF> create table t_xifenfei(id number) ;
create table t_xifenfei(id number)
ERROR at line 1:
ORA-00018: maximum number of sessions exceeded
这里有个问题:当前会话已经登录成功了,证明当前session是足够的,但是为什么在执行创建表操作之时依然会报ORA-00018呢?通过10046继续分析
CDB_PDB@CHF> alter session set events '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12'; 会话已更改。 CDB_PDB@CHF> create table t_xifenfei as select * from dual; 表已创建。 CDB_PDB@CHF> select value from v$diag_info where name='Default Trace File'; VALUE -------------------------------------------------------------------------------- E:\APP\XIFENFEI\diag\rdbms\cdb\cdb\trace\cdb_ora_6596.trc
分析trace文件
CDB_PDB@CHF> host tkprof E:\APP\XIFENFEI\diag\rdbms\cdb\cdb\trace\cdb_ora_6596.trc d:/1.txt --查看trace文件,发现里面有很多基表操作,拿其中的一个tab$表分析,创建表过程有如下insert操作 insert into tab$(obj#,ts#,file#,block#,bobj#,tab#,intcols,kernelcols,clucols, audit$,flags,pctfree$,pctused$,initrans,maxtrans,rowcnt,blkcnt,empcnt, avgspc,chncnt,avgrln,analyzetime,samplesize,cols,property,degree,instances, dataobj#,avgspc_flb,flbcnt,trigflag,spare1,spare6) values (:1,:2,:3,:4,decode(:5,0,null,:5),decode(:6,0,null,:6),:7,:8,decode(:9,0,null, :9),:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25, decode(:26,1,null,:26),decode(:27,1,null,:27),:28,:29,:30,:31,:32,:33)
尝试人工插入
CDB_PDB@CHF> insert into sys.tab$ select * from sys.tab$ where rownum=1;
insert into sys.tab$ select * from sys.tab$ where rownum=1
*
第 1 行出现错误:
ORA-01031: 权限不足
证明当前执行创建表的session无权限直接操作tab$表,证明应该有其他表操作它
v$session视图基表
通过查询V$FIXED_VIEW_DEFINITION视图获得相关sql语句,不同版本可能有出入,但是大体一致
/* Formatted on 2013/11/8 23:09:30 (QP5 v5.227.12220.39754) */
SELECT inst_id,
addr,
indx,
ksuseser,
ksuudses,
ksusepro,
ksuudlui,
ksuudlna,
ksuudoct,
ksusesow,
DECODE (ksusetrn, HEXTORAW ('00'), NULL, ksusetrn),
DECODE (ksqpswat, HEXTORAW ('00'), NULL, ksqpswat),
DECODE (BITAND (ksuseidl, 11),
1, 'ACTIVE',
0, DECODE (BITAND (ksuseflg, 4096), 0, 'INACTIVE', 'CACHED'),
2, 'SNIPED',
3, 'SNIPED',
'KILLED'),
DECODE (ksspatyp,
1, 'DEDICATED',
2, 'SHARED',
3, 'PSEUDO',
'NONE'),
ksuudsid,
ksuudsna,
ksuseunm,
ksusepid,
ksusemnm,
ksusetid,
ksusepnm,
DECODE (BITAND (ksuseflg, 19),
17, 'BACKGROUND',
1, 'USER',
2, 'RECURSIVE',
'?'),
ksusesql,
ksusesqh,
ksusepsq,
ksusepha,
ksuseapp,
ksuseaph,
ksuseact,
ksuseach,
ksusecli,
ksusefix,
ksuseobj,
ksusefil,
ksuseblk,
ksuseslt,
ksuseltm,
ksusectm,
DECODE (BITAND (ksusepfl, 16), 0, 'NO', 'YES'),
DECODE (ksuseft,
2, 'SESSION',
4, 'SELECT',
8, 'TRANSACTIONAL',
'NONE'),
DECODE (ksusefm,
1, 'BASIC',
2, 'PRECONNECT',
4, 'PREPARSE',
'NONE'),
DECODE (ksusefs, 1, 'YES', 'NO'),
ksusegrp,
DECODE (BITAND (ksusepfl, 16),
16, 'ENABLED',
DECODE (BITAND (ksusepfl, 32), 32, 'FORCED', 'DISABLED')),
DECODE (BITAND (ksusepfl, 64),
64, 'FORCED',
DECODE (BITAND (ksusepfl, 128), 128, 'DISABLED', 'ENABLED')),
DECODE (BITAND (ksusepfl, 512),
512, 'FORCED',
DECODE (BITAND (ksusepfl, 256), 256, 'DISABLED', 'ENABLED')),
ksusecqd,
ksuseclid
FROM x$ksuse
WHERE BITAND (ksspaflg, 1) != 0 AND BITAND (ksuseflg, 1) != 0
注意:v$session查询的肯定是BITAND (ksuseflg, 1)!=0的记录
通过锁住表测试
CDB_PDB@SYS表示sys用户,CDB_PDB@CHF表示chf用户,使用两个session,不同用户测试
CDB_PDB@SYS> show user;
USER 为 "SYS"
--SYS用户锁住表
CDB_PDB@SYS> lock table tab$ IN exclusive MODE;
表已锁定。
CDB_PDB@CHF> show user;
USER 为 "CHF"
CDB_PDB@CHF> select sid from v$mystat where rownum=1;
SID
----------
57
CDB_PDB@CHF> select paddr from v$session where sid=57;
PADDR
----------------
000007FF1E10F228
--CHF用户创建表
CDB_PDB@CHF> create table t_xifenfei_new as select * from dual;
--SYS用户查询
CDB_PDB@SYS> SELECT s.addr,
2 s.indx sid,
3 s.ksuseser SERIAL#,
4 ksuudsna username,
5 DECODE (BITAND (ksuseflg, 19),
6 17, 'BACKGROUND',
7 1, 'USER',
8 2, 'RECURSIVE',
9 '?')
10 TYPE
11 FROM x$ksuse s
12 WHERE ksusepro = '000007FF1E10F228';
ADDR SID SERIAL# USERNAME TYPE
---------------- ---------- ---------- ------------------------------ ----------
000007FF1E1EBEA0 57 23 CHF USER
000007FF1E1D7F90 67 183 SYS RECURSIVE
CDB_PDB@SYS> SELECT ksuudsna username,
2 ksuseflg
3 FROM x$ksuse s
4 WHERE ksusepro = '000007FF1E10F228';
USERNAME KSUSEFLG
------------------------------ ----------
CHF 135266369
SYS 2
--这里我们发现递归sys调用的sql,在v$session视图中被排除了,因此递归sql的session不能在v$session显示
CDB_PDB@SYS> select bitand(2,1) from dual;
BITAND(2,1)
-----------
0
至此,我们可以验证,我们当前的会话,在创建表的过程中有一个sys的递归session执行了关于基表的操作,但是由于v$session视图对于x$ksuse表中的部分记录进行了过滤因此我们不能在v$session查看到这些递归session
继续分析bitand函数
通过观察v$session的创建语句,我们可以发现如下规律,如果某个session是递归session,那么BITAND (ksuseflg, 19)=2,那当这个值为2的时候,是不是BITAND (ksuseflg, 1)一定为0呢?bitand函数实际上就是把里面的两个参数转换为二进制然后进行and运算,也就是两个对应位都为1的情况才会结果得带1(bitand(3,1)=1,bitand(2,1)=0),这里可以发现19转换为二进制为10011,要使得BITAND (ksuseflg, 19)=2成立,那就是说ksuseflg转换为二进制后,最后一位必须是0;而BITAND (ksuseflg, 1)在这样的情况下,一定为0,因此递归session的一定不会在v$session视图显示.
发表在 Oracle
评论关闭
因RAC的undo_management参数不一致导致数据库mount报ORA-01105 ORA-01606
环境Linux 5.8 10.2.0.5 RAC,两个节点只能一个节点mount,如果尝试mount另外节点就报ORA-01105和ORA-01606错误
数据库版本
SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi PL/SQL Release 10.2.0.5.0 - Production CORE 10.2.0.5.0 Production TNS for Linux: Version 10.2.0.5.0 - Production NLSRTL Version 10.2.0.5.0 - Production
crs资源情况
[oracle@node1 dbs]$ $ORA_CRS_HOME/bin/crs_stat -t Name Type Target State Host ------------------------------------------------------------ ora....D1.inst application OFFLINE OFFLINE ora....D2.inst application ONLINE ONLINE node2 ora.PROD.db application ONLINE ONLINE node2 ora....SM1.asm application ONLINE ONLINE node1 ora....E1.lsnr application ONLINE ONLINE node1 ora.node1.gsd application ONLINE ONLINE node1 ora.node1.ons application ONLINE ONLINE node1 ora.node1.vip application ONLINE ONLINE node1 ora....SM2.asm application ONLINE ONLINE node2 ora....E2.lsnr application ONLINE ONLINE node2 ora.node2.gsd application ONLINE ONLINE node2 ora.node2.ons application ONLINE ONLINE node2 ora.node2.vip application ONLINE ONLINE node2
节点1 mount报错
SQL> startup ORACLE instance started. Total System Global Area 171966464 bytes Fixed Size 2094832 bytes Variable Size 113248528 bytes Database Buffers 50331648 bytes Redo Buffers 6291456 bytes ORA-01105: mount is incompatible with mounts by other instances ORA-01606: gc_files_to_locks not identical to that of another mounted instance
Error: ORA 1105
Text: mount is incompatible with mounts by other instances
-------------------------------------------------------------------------------
Cause: An attempt was made to mount the database, but another instance has already mounted
a database by the same name, and the mounts are not compatible.
dditional messages will accompany this message to report why the mounts are incompatible.
Action: See the accompanying messages for the appropriate action to take.
Error: ORA 1606
Text: GC_FILES_TO_LOCKS not identical to that of another mounted instance
-------------------------------------------------------------------------------
Cause: The initialization parameter GC_FILES_TO_LOCKS is not the same as
another instance mounted in parallel mode.
This parameter must be the same as that for all shared instances.
Action: Modify the parameter to be compatible with the other instances, then
shut down and restart the instance.
根据这个错误提示,查询两个节点的gc_files_to_locks参数,均为空值(默认值),也就是值相同
SQL> show parameter gc_files_to_locks; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ gc_files_to_locks string
检查两个节点的gc相关隐含参数,发现所有值也均一致
NAME DESCRIPTION VALUE ------------------------------ --------------------------------------------------------------------- ------- _gc_affinity_limit dynamic affinity limit 50 _gc_affinity_minimum dynamic affinity minimum activity per minute 6000 _gc_affinity_time if non zero, enable dynamic object affinity 10 _gc_async_memcpy if TRUE, use async memcpy FALSE _gc_check_bscn if TRUE, check for stale blocks TRUE _gc_coalesce_recovery_reads if TRUE, coalesce recovery reads TRUE _gc_defer_time how long to defer down converts for hot buffers 3 _gc_dissolve_undo_affinity if TRUE, dissolve undo affinity after an offline FALSE _gc_dynamic_affinity_locks if TRUE, get dynamic affinity locks TRUE _gc_element_percent global cache element percent 103 _gc_global_lru turn global lru off, make it automatic, or turn it on AUTO _gc_initiate_undo_affinity if TRUE, initiate undo affinity after an online TRUE _gc_integrity_checks set the integrity check level 1 _gc_keep_recovery_buffers if TRUE, make recovery buffers current TRUE _gc_latches number of latches per LMS process 8 _gc_maximum_bids maximum number of bids which can be prepared 0 _gcs_fast_reconfig if TRUE, enable fast reconfiguration for gcs locks TRUE _gcs_latches number of gcs resource hash latches to be allocated per LMS process 64 _gcs_pkey_history number of pkey remastering history 4000 _gcs_process_in_recovery if TRUE, process gcs requests during instance recovery TRUE _gcs_resources number of gcs resources to be allocated _gcs_shadow_locks number of pcm shadow locks to be allocated _gc_statistics if TRUE, kcl statistics are maintained TRUE _gcs_testing GCS testing parameter 0 _gc_tsn_undo_affinity if TRUE, use TSN undo affinity TRUE _gc_undo_affinity if TRUE, enable dynamic undo affinity TRUE _gc_undo_affinity_locks if TRUE, get affinity locks for undo TRUE _gc_use_cr if TRUE, allow CR pins on PI and WRITING buffers TRUE _gc_vector_read if TRUE, vector read current buffers TRUE
仔细对比数据库参数,发现undo异常
--节点1 SQL> show parameter undo NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string MANUAL undo_retention integer 900 undo_tablespace string SYSTEM --节点2 SQL> show parameter undo NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1
这里已经明确,因为两个节点的undo_*相关参数配置不正确,导致数据库只能一个节点mount。进一步定位问题发现,原来是因为dba粗心在编辑节点1的参数文件的时候把undo_*相关的参数给弄丢了,从而数据库使用了默认值undo_management=manual,undo_tablespace=system
win平台rman备份和删除dg备库归档日志脚本
总觉得使用windows跑oracle是不靠谱的事情,可以这个世界上总有很多人喜欢做类似这样的事情,对于数据库比较常见的两件事情:rman和删除dg备库归档日志,在linux/unix平台上使用shell实现很简单,可是跑到win里面,就变的烦了,不是因为其麻烦,而是因为用的人少,不知道怎么下手处理该事情,我编写了简单的实现初级功能的win下面rman备份和删除备库归档日志脚本,供大家参考,也更加欢迎朋友提出来更加好的处理方法(win是真心的不懂)
rman备份脚本
--backup_oracle.bat文件 rman target / cmdfile=D:\backup\rman\backup_db.rman log=d:/backup/rman/logfile/rmanlog%date:~0,4%%date:~5,2%%date:~8,2%.log --backup_db.rman文件 CONFIGURE RETENTION POLICY TO REDUNDANCY = 2; CONFIGURE DEVICE TYPE DISK PARALLELISM 2; CONFIGURE DEFAULT DEVICE TYPE TO DISK; backup filesperset = 5 as compressed backupset database format 'd:/backup/rman/full_%U.rman'; sql 'alter system archive log current'; backup filesperset = 50 as compressed backupset archivelog all format 'd:/backup/rman/arch_%U.rman' delete input; DELETE noprompt OBSOLETE; crosscheck backup; delete noprompt expired backup; backup format 'd:/backup/rman/ctl_%U.rman' current controlfile; backup spfile format 'd:/backup/rman/spfile_%U.rman' ; exit;
backup_oracle.bat文件加入到计划任务即可
删除dg备库归档日志(已经应用)
--delete_dg_archivelog.bat rem 注意修改 部署目录 cd D:\win_xifenfei d: rem 注意delete_archive.sql 查询是否有记录 echo delete archivelog staring > delete_archivelog.bak sqlplus / as sysdba @delete_archive.sql echo rman target / cmdfile=rman_checkcross.rman>>delete_archivelog.bat delete_archivelog.bat >>delete_dg_archivelog_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%".log exit --delete_archive.sql set lines 150 col name for a150 set pagesize 0 feedback off verify off heading off echo off spool delete_archivelog.bat select 'del '||name from v$archived_log where APPLIED='YES' AND NAME IS NOT NULL and DEST_ID=1; spool off exit; --rman_checkcross.rman crosscheck archivelog all; delete noprompt expired archivelog all; exit
delete_dg_archivelog.bat加入到计划任务即可
发表在 Data Guard
评论关闭

加我微信(17813235971)
加我QQ(107644445)

