oracle concept——data block,extent,segment-01
现在开始再次下定决定好好看看oracle concept,几个月前看了一两天太抽象了后面就慢慢没怎么看了,要坚持啊!里面对oracle数据库体系结构和原理的讲解很全面,而且文档中有些细节后面需要再查看别的资料结合实际来验证,精度细读之.当创建一个对象表,索引或者分区表等,将会创建一个这个对象的段,如果段内空间不足将分配新的extent,但是段内的数据是通过block来管理也是最小的I/O单位。Block是数据库中的最小单位,Block中主要分为:块头:主要记录的是块的类型 块的地址表目录区:此数据块的对应的表的信息行目录区:此数据块的对应的
几个scn和恢复的细节
前些天在看电视剧《无懈可击之高手如林》,终于速度看完了,该静下心来看看oracle了,不然年底估计完成不了俺的4本book的阅读了,这些天陆陆续续接触了rman备份的原理,其中肯定不免得接触了oracle中的scn,查阅资料当然主要是eygle的两本书的说法和itpub上网友整理的一些scn的资料。当一个checkpoint发生时有哪些scn了1 发生检查点,记录系统的检查点scn。Select name,checkpoint_change# from v$datafile2 发生检查点对数据文件的checkpoint scn更新,也就是数据文件checkpoint scn,存储在控制文件中Select name,checkpoint_change#
手工创建数据库
Oracle数据库的启动分为三个状态nomount,mount,open,三个状态需要的文件了spfile,controlfile,datafile,log file。第一次看eygle的《循序渐进》的第一章就是手工创建数据库解析。当时由于是5个月前刚接触oracle,很多东西都不会很理解,现在这几天又好好看了下,期间我也手工创建数据库一两次,晒下其中的有些注意的地方。1 首先我们先做点准备工作吧,oracle软件肯定需要安装的吧,然后数据库文件的储存目录Mkdir oracle_baseadminsfadump Mkdir oracle_baseadminsfbdump 准备用于存储警告日志文件和后台跟踪日志Mkdir oracle_base
sga的自动管理
sga自动共享内存管理sga以一定大小为单位来为各个部分分配内存空间,这个单位被称为细粒,如果sga不大于1G,那么细粒的单位就是4MB,如果大于1G,数值就可能变化了。相应的可以在v$sga_dynamic_components中的granule_size中查到具体的数值,也可以尝试手动修改一下sga_max_size的数值,再次查看v$sga_dynamic_componentsselect granule_size from v$sga_dynamic_components实际试验sga中内存的分配是否以granule细粒为单位的手动修改下shared_pool_size的大小alter system set shared_pool_size=30M;此时shared_pool_size是30M,并不是4M
oracle nomount小议
关于数据库的nomount状态的一点信息。数据库的启动nomount mount open三个状态,其中nomount中今天查看eygle的博客发现后台altersid.log中存在输出了pid和os id两个信息。pid代表该进程在数据库内部的进程标识符,而os id则代表该进程在操作系统上的进程标识符。SQL> startup nomount;ORACLE instance started.Total System Global Area 1073741824 bytesFixed Size 1223488 bytesVariable Size 264242368 bytesDatabase Buffers 801112064 bytesRedo Buffers 7163904 bytes此时先是oracle的sga的分配然后读取spfile中的参数System par
oracle中update的细节
今天一天比较忙,不过好歹完成了一个知识点的整理oracle的更新数据的原理和其中的latch锁。 前段时间提到oracle的关于update原理,个人查阅资料,oracle中关于update 数据块时的具体步骤大家可以参考下,如果觉得有问题可以自己尝试dump下数据块来看看。 1 首先查看buffer cache中是否存在数据块,如果存在则取出不存在oracle则要数据文件中读取数据块信息 2 查看该数据块的latch锁,如果没有则oracle选择等待。 3 oracle更新该数据块,并把相应的原数据块镜像写入undo。 4 commit时oracle释放该table的lock锁资源,并释放回滚段信息,更新
imp到不同的tablespace中
关于把dmp导入到不同的表空间中conn ashuang/ashuangselect * from user_tables where table_name='DAVE'此时ashuang.dave的tablespace是ycupexp shuang/ashuang tables=dave file=d:test.dmp 创建user abc用来测试create user abc identified by ashuangdefault tablespace userstemporary tablespace tempgrant dba to abc --注意dba的role中包含了unlimited tablespace的权限imp ashuang/ashuang fromuser=ashuang touser=abc file=d:test.dmpselect * from dba_tables where table_name='DAVE' and owner='ABC'此时的abc.dave的tables
lead和lag函数
lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合select id,name from daveid name4 SF3 oracle4 eygle5 rman4 exportdave表中有id和name的数据。lag函数是取出数据的前n行的数据,lead函数是取出数据的后n行的数据,直接在例子吧,简单明了select id,name,lag(id,4) over (order by id) as v_ab from daveid name v_ab3 oracle 4 export 4 SF 4 eygle5 rman 3lag(id,n,values)才是整个lag的完整形式,其中的id是column_name,n就是前n行的,values就是缺省的值,如果省略n和values,默认n是1,va
数据磊原理和工具
今天个人使用expdp和impdp弄了几个小时,终于整理出大概,对于数据磊工具的原理整理出下面的心得。expdp/impdp是通过API调用,把传统的exp和imp交互模式的操作转化为oracle内部的job来完成,所以可以实现任务的中止和重启动.oracle10g中出现了数据磊,数据磊的所有工作都由数据库实例来完成,数据库可以并行来处理这些工作。可以建立多个数据磊进程来读写正在导入的数据,也可以建立并行I/O服务器进程来读取数据,从而exp和imp的单进程瓶颈得到解决expdp impdp和exp imp的不同点除了可控制job还有局限于数据磊工具必须在服务器端运行。因为
绑定变量在静态sql和动态sql中
关于oracle的中绑定变量oracle中的sql分为静态和动态sql,静态sql是已经编译成功直接执行的sql,动态sql在程序执行时才进行编译。ITPUB一个版主提到oracle的所有静态sql都是软解析,动态sql可以由程序设计者来掌握是否是软解析和硬解析。依个人来看前半句可能需要实践后半句确实是存在的,下面的代码中我就利用动态sql来让sql使用绑定变量来进行软解析。动态sql比静态sql灵活可以解决静态sql无法解决的问题,比如对数据字典的读取。oracle中的sql的执行计划:在shared pool中查找是否有sql的缓存明确的应该是在库缓存中查找,库缓存中保留
logminer工具对redo log或archive log的挖掘
oracle中可能需要对数据库中产生的redo log和archive log进行日志挖掘,来更好查看数据库的内部信息,此时oracle提供了logminer来对日志文件进行挖掘。挖掘的具体步骤:oracle10g中的logminer工具安装的脚本是:l $ORACLE_HOME/rdbms/admin/dbmslm.sql 2 $ORACLE_HOME/rdbms/admin/dbmslmd.sql. logminer需要oracle的dbms_logmnr的package,如果系统包没有装好后面的步骤都处理不了,运行上述脚本,可以查询desc dbms_logmnrdesc dbms_logmnr_d查看具体的package的下面的procedure。1 设置utl_file_dir目录,主要用于服务器放置数据字典文
文本文件的数据装载工具sqlldr
--sqlldr使用简单说明 oracle中要把txt文件或者csv文件的数据导入到数据库表中,此时需要使用oracle一个自带的sqlldr工具。此时有test.txt文件1,2,32,3,53,5,6需要把txt的文件装载到oracle中的test_sqlldr表中此时我们优先创建一个测试用表test_sqlldrcreate table test_sqlldr(id_1 number,id_2 number,id_3 number);然后需要填写控制文件test.ctl,这个也是sqlldr工具使用最重要的部门load data infile "d:test.txt"append into table test_sqlldrfields terminated by ','trailing nullcols --txt(id_1,id_2 ,id_3)ctl文件填
imp中的indexfile参数解决imp指定表空间问题
exp和imp工具中可能存在把table从一个库exp然后imp到另一个数据库出现没有指定tablespace而无法imp,imp的indexfile参数中可以解决的imp userid/userid@service_name file=d:test.dmp tables=tablename indexfile=d:test.idx rows=n首先把dmp文件中的信息导入到d:test.idx中去,查看d:test.idx如下REM CREATE TABLE "ABC"."INDEXFILE_TEST" ("USER_ID" NUMBER(16, 0) NOT NULL REM ENABLE, "DEPT_ID" CHAR(32), "STAFF_CODE" VARCHAR2(200) NOT NULL REM ENABLE, "USER_NAME"
公有私有synonym中的权限实际指向和dblink中global_names和权限封装
公有和私有同义词和数据库链路访问同义词主要是用于访问用户的对象的一种方式,特别是公有同义词可以省去别的user例如select * from user.tablename,dba最常用的做法就是先grant select username.tablename,然后建public synonym赋予相应的select synonym或者本表,其实就是授予select synonym也实际上授予的是本表如果同义词和本表的name相同,默认的是优先访问本表,然后私有同义词,最后公有同义词下面涉及到同义词的一些细节的地方都是本人测试的结果 oracle 10G 10.2.0drop public synonym r$user 删除public synonymdrop synonym r
remote_login_passwordfile和口令文件 远程管理员登录的关系
REMOTE_LOGIN_PASSWORDFILE参数增强系统的安全性,在此总结一下在REMOTE_LOGIN_PASSWORDFILE参数取不同值时的行为特性。REMOTE_LOGIN_PASSWORDFILE参数可以有三种取值:EXCLUSIVE(默认)、NONE和SHARED。1)当取值为EXCLUSIVE时,tom在9I和10I编程中exclusive提到是只有一个数据库使用一给定的密码文件sql>show parameter remote_login_passwordfile;默认的是exclusivealter system set remote_login_passwordfile=exclusive scope=spfilesql>conn sys/oracle@test as sysdbasql>grant sysdba to ashuangsql>revoke sysdba f
字典管理表空间DMT和本地管理表空间LMT
字典管理表空间是通过两个数据字典uet$和fet$管理,uet$数据字典中存储的是tablespace中已经使用extent,fet$中存储的是tablespace中空闲的extent,当segment中需要分配新的extent时,也就是需要建的segment或者一个segment需要分配新的extent时,oracle就会从fet$查找extent列表,找到的extent编号A吧用于新extent需求,马上这个编号A的extent中会写入uet$这个数据字典中;同样当删除一个segment或者从segment中移除一个extent时,先从uet$中删除extent记录然后插入到fet$中去。此种方式的发生过程是连续的,串行的,非常容易造成竞争和等