2011年初识oracle
2011年初识oracle关于这篇blog构思了很久,但是都未曾动笔,不和往常的技术blog文档和不似之前的心情随笔,其实关于2011这一年自身有了太多变化,要说这一年最值的就是初识甲骨文,也让自己对以后的路子有了一个想法。 回想一年半前毕业自己虽然一心想如何证明自己,但是其实心里很没底,真正能拿出台面的东西真没有,自己是个傲气但是又不付出实际行动的人,说实话这真是一个很能荒废人的性格特征,要想取得自己所需要的东西是沉下去很长一段时间的。 在2011年初过完春节回到工作岗位,当时自己对于oracle真没多
闪回和drop原 undo tbs的一点分析
Flashback闪回,表级闪回是由undo回滚段作支撑的(表的结构不能改变,不能alter,truncate等ddl操作),而10g的闪回drop的表是由于表空间的虚拟回收站来闪回的,被删除的表只是被重命名而已,在空间足够情况下并没有彻底清除。而10g的数据库级的闪回则是又闪回日志来支撑的!表级闪回跟undo表空间SQL> select * from xiaoyu.test03; ID---------- 44 11 22 33 44 11 22 33 8 rows selectedSQL> select dbms_flashback.get_system_change_number from dual; GET_SY
深入浅出undo记载03
这里自己无意中做了个测试:之前修改undo表空间为手工管理Sql>alter system set undo_management=manual scope=spfileSql>startup force。。。。。SQL> insert into xiaoyu.test03 select * from xiaoyu.test03; insert into xiaoyu.test03 select * from xiaoyu.test03 ORA-01552: 非系统表空间 'USERS' 不能使用系统回退段SQL> select * from v$rollname; USN NAME---------- ------------------------------ 0 SYSTEM……SQL> show parameter undo; NAME TYPE V
深入浅出undo记载02
继续理解eygle深入浅出的undo回滚于撤销的重要细节知识点,先说一下以前blog中就提到的关于块清除的知识点。(块清除是个及其复杂的过程,这里因为个人理解只能整理出如下要点) Ora-01555快照过久,oracle经典错误,主要由以下三种情况构成1 查询scn小于block的scn需要undo构造cr块实现一致性读,回滚段被覆盖 2 延迟块清除,查询触发延迟块清除需要从回滚段获得事务提交的scn,如果事务前镜像已经被覆盖,并且查询scn小于回滚段中最小提交的scn,那么oracle将无法判断查询scn和事务提交scn大小,出现ora-01555(这里还说一下极端的情况,
oracle 10g跨越resetlogs恢复-incarnation
Oracle 10g后可以跨越resetlogs恢复数据库,incarnation是跨越resetlogs恢复数据库的重要特性。下面用下列测试来说明下:SQL> create table incarnation_tab01(id number); Table createdSQL> declare 2 begin 3 for i in 1..10 loop 4 insert into incarnation_tab01 select dbms_flashback.get_system_change_number from dual; 5 commit; 6 end loop; 7 end; 8 /PL/SQL procedure successfully completed SQL> select * from incarnation_tab01; ID---------- 1881030 1881031 1881032 1881033
深入浅出undo记载01
初看eygle的深入浅出的关于回滚段undo,其实刚开始自认为对undo的理解还算清晰,undo的记录的信息,dml时undo如何和buffer cache联系(回滚段也是属于buffer cache),从AUM的管理,flashback利用undo来闪回,undo表空间的回滚段的自动扩展于回收,切换undo表空间,快速块清除,延迟块清除,回滚段过旧等,看了回滚这一章发现自己还是有颇多的理解误区和盲区。回滚段具体记录的是什么:在看冯春培的回滚段探究中提到了回滚段具体记载的是什么,同样eygle深入浅出中再次提到了回滚段的具体记录的是什么,自己也有误区认为回滚段会记录整个数
总是归档错误-重置归档目录
这段时间测试redo的产生和热备期间,居然出现了一系列的重做日志块头错误导致无法归档。Sql>alter database clear unarchived logfile group 1;先后执行了清空日志组status为inactive的日志,但是再次查看v$archive_dest的归档目的都出现error,还是现实重做日志块头错误,然后又再次强制清空了几次日志还是出现了所谓的无法归档,重做日志块头错误。实在想不通为什么会出现这种情况,按理说日志组清空不会还报日志块头错误啊。SQL> select dest_id,dest_name,status,error from v$archive_dest where status<>'INACTIVE';
oracle 9.2.0.8.0的drop user而引起的ora-0060[qmxiUnpPacked2], [121], [], [], [], [], [], []
今天和同事在生产库中需要删除一个测试用户,居然碰见一个bug。Sql>drop user test cascadeOra-01001 无效游标Ora-0060内部错误代码,参数: [qmxiUnpPacked2], [121], [], [], [], [], [], [].SQL> select * from v$version; BANNER----------------------------------------------------------------Oracle9i Enterprise Edition Release 9.2.0.8.0 - ProductionPL/SQL Release 9.2.0.8.0 - ProductionCORE9.2.0.8.0 ProductionTNS for 32-bit Windows: Version 9.2.0.8.0 - ProductionNLSRTL Version 9.2.0.8.0 - Production推
深入浅出redo和undo记载03
如何高效快速插入数据,nologging+append+parallel 停掉索引和约束!下面来看看nologging和append模式下产生的redo测试!SQL> archive log list数据库日志模式 非存档模式自动存档 禁用存档终点 USE_DB_RECOVERY_FILE_DEST最早的联机日志序列 1当前日志序列 3SQL> create or replace view redo_size as select name,value from v$mystat a,v$statname b where 2 a.STATISTIC#=b.STATISTIC# and b.NAME='redo size';SQL> create public synonym redo_size for redo_size; Syno
深入浅出-redo和undo记载02
Log_buffer中的redo entries的大小是以bytes为单位,LGWR还是以redo block size为单位把redo写入磁盘,redo block size是oracle源代码固定的,跟操作系统有关,通常的操作系统都是以512bytes为单位。例如Solaris,AIX,Windows,Linux等可以从v$sysstat视图得到redo bloc sizeSQL> select value,name from v$sysstat where name in ('redo size','redo wastage','redo blocks written'); 2 / VALUE NAME---------- ---------------------------------------------------------------- 5065308 redo size 294736 redo wasta
丢失redo的solution
今早打开自己的测试库发现alter system switch logfile无法日志交换,具体问题及解决步骤如下:C:Documents and Settings0990753>sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12月 20 10:19:34 2011Copyright (c) 1982, 2005, Oracle. All rights reserved.连接到:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith the Partitioning, OLAP and Data Mining optionsSQL> alter system switch logfile;总是等待,看来日志交换出了问题,查看v$session_wait有event switch
深入浅出-redo和undo记载01
Redo和undo可以说是oracle实例回滚和事务一致性的重要依据,好在自己对于oracle的这两个理解比shared pool理解透彻,结合eygle的深入浅出这两章再次回味一下redo和undo的特性!Redo用于记录数据库的改变,redo特性有三个组件:redo log buffer重做日志缓存 lgwr后台进程用于把redo log buffer写入disk,redo log file(归档模式下arcn用于把写满的redo log file归档到归档日志下),redo中记录数据库的改变的信息以重做条目redo entries形式存储(又称redo records),redo entrie包含数据库改变的信息,其中有insert update的dml和alter
深入浅出buffer cache和shared pool记载03
还是继续整理eygle深入浅出中关于shared pool部分。Shared pool共享池,初步仅仅只是理解为sql和pl/sql 数据字典的共享区,提供代码共享,当然这也是shared pool最重要的地方。在oracle 10G后的自动sga管理,shared pool回由oracle自动管理,并不需要dba过多的设置,因为系统的业务情况也是不稳定的,buffer cache和shared pool的需求程度也不同,自动sga的管理可以按系统负载情况均衡sga的各个组件。Alter system set events ‘immediate trace name heapdump leval 2’EXTENT 8 addr=28000000 Chunk 28000038 sz= 24 R-freeabl
动态sql无法recover
早上看pub的一个帖子说到动态sql执行恢复的一个错误,SQL> alter database datafile 4 offline; Database altered SQL> declare 2 v_ab number; 3 v_sql varchar2(100); 4 begin 5 select file# into v_ab from v$recover_file; 6 v_sql:='recover datafile'||v_ab; 7 execute immediate v_sql; 8 end; 9 /declare*第 1 行出现错误:ORA-00900: 无效 SQL 语句ORA-06512: 在 line 7SQL> recover datafile 4;完成介质恢复。SQL> alter database datafile 4 online;数据库已更改。Oracle的动态sql可以执行ddl等操
in,exists和not exists ,not in与null的一些关系记载
In和exist,not in和not exists,其中可能还有null,一直是个很纠结的问题,直到现在自己也不能完全说出两种语句的优劣,使用情况等。 先从查询结果上来讲,上个星期五pub的一篇帖子说到了not in和not exists查询结果不同,记得曾经碰到过这种问题,null的影响,因为not in和not exists两种从根本上”算法”是不同的。下面自己做个了测试的例子可以很清晰的看到结果不同SQL> select * from jj_one;ID NAME------ ----------------------------------------1 as2 adkj1 asSQL> select * from jj_two;COL1 COL2---------- ----------1
深入浅出cache buffer和shared pool记载02
当进程需要读取数据到buffer cache或cache buffer根据LRU算法进行管理,就会扫描LRU list获取可用buffer或更改buffer状态,此时在搜索过程中必须获取latch,锁定内存结构(latch是oracle的一种串行锁机制,保护共享内存结构),防止并发访问顺坏内存中的数据。SQL> col name for a25SQL> select addr,latch#,name,hash,gets,misses,immediate_gets,immediate_misses from v$latch where name='cache buffers lru chain'; ADDR LATCH# NAME HASH GETS MISSES IMMEDIATE_GETS IMMEDIATE
深入浅出buffer cache和shared pool记载01
开始静下心来好好看书了,再次翻看egyle的深入浅出的buffer cache于shared pool原理,看得够呛,eygle剖析得很有点深,记载以下书中的有些要点和个人理解! Sga的buffer cache对oracle体系有些了解的都了解一些,用户进程递交请求给服务器进程,服务器进程不会在disk磁盘上直接获取数据都会构造一个buffer cache的内存机构来缓存数据,数据的修改 读取都是在buffer cache获取然后写给磁盘,同样在大多数os上也是采取的缓存机制,自己最近也在看鸟哥的linux私房菜,文件系统的e2和e3正是采用的缓存机制交换数据,而且e3中还采用了oracle中的
10g windows安装db出现ora-24324
今早在windows下10G重新安装oracle数据库,往常安装数据库一般很顺利,因为是windows上不需要设置环境变量,内核参数,还有文件夹权限设置等相比linux上简单太多,不过这次貌似出现了一点小插曲,安装时候出现下列几个错误!oracle_home/cfgtoollogs/dbca有相应的dbca创建创建db的logORA-24324: 未初始化服务句柄ORA-24323: 不允许此值ORA-03113: 通信通道的文件结束这个错误自己在尝试在测试库用隐含参数_allow_resetlogs_corruption=true略去一致性然后alter database open resetlogs无法打开数据库时报错上述错误,第一次发现首次安装数
空表bytes依然很大的一些想法
最近对于学习有个新的领悟,并不是所谓的技术上面的,更多知识习惯上和心路上的体会,以前每天看完oracle都腾不出时间来看看关于linux的东西,现在自己在工作中要每天抽出点时间学习linux,然后个人发觉学习要一直进行下去,如果你中途有一段时间脱离了这个状态,你再想进入就会很花时间而且很需要毅力,自己也一直再改进自己的学习方法和习惯,也希望大家能找到适合自己的高效方法!还是说一下技术的话题吧! 还是一篇pub的帖子http://www.itpub.net/thread-1519595-1-1.html 说到了一个没有数据的表却占有40G的空间,当时由于以前对于hw
%rowtype和数组的基本记载
这里提一点关于oracle开发上面的一点小知识细节,由于自己对于oracle开发上面相对于管理来说比较弱!不管是开发还是管理在日常管理中都是非常重要的!SQL> desc jj_one;Name Type Nullable Default Comments ---- --------- -------- ------- -------- ID NUMBER(5) Y NAME CHAR(40) Y SQL> declare 2 v_ab jj_one%rowtype; 3 begin 4 select * into v_ab from jj_one where rownum=1; 5 insert into jj_one values v_ab; 6 end;7 /定义定量的方式A%rowtype,这