个人原创,转载请在文章头部明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10080102.html
在上一篇进阶中大概讲解了一些关于进阶方面的知识,今天就将进阶内容做个总结!
一、oracleserver实例db的概念:
1、oracle关系数据库管理系统(rdms)
- 集成了开放的、全面的、集成的信息管理方法.
- 一个实例对应一个oracleserver,要查询oracleserver,直接查询后台进程就可以了
- 查看实例个数:
ps -ef|grep ora_|cut -d ‘_’ -f3|uniq
ps -ef|grep ora_|cut -d ‘_’ -f3|sort|uniq(有几条就几个oracleserver)
- 后台进程是在实例启动的时启动的,时将文件写到磁盘上的
访问实例:v$instance,访问数据库: v$database
语句:select instance_name from v$instance_name;
select db_unique_name from v$database;
show parameter service_name (查看服务名)
一个实例返回一个数据库
注意:查看实例或数据库名时,保证数据库启动到mount(此阶段仅仅物理阶段可用)阶段或者open(此阶段打开物理机构和逻辑结构)阶段,在nomout阶段不可以查询
注意:所有的12c跑应用程序都在pdb里面跑,而不再cdb里面跑
- 实例名跟库名不一定相同,这是允许的
二、如何连接到数据库
1、连接到服务器:
所有连接数据库都需要有相应的翻译工具或者相应的客户端工具,eg:java访问工具:jdbc等。
- 10g里面连接工具:ojdbc14.jar classes12.jar ojdbc14.jar
- 11g 里面的连接工具:ojdbc6.jar ojdbc7.jar
所以要访问数据库,只需要安装以上任意连接工具的驱动包就可以
2、oracle中的客户端工具:
- sqlplus:
- sqldevelop:
- toad:
- pl/sql develop:
以上客户端实现的时候都是通过oracle net实现的
查看服务名:
也可以通过以下命令查看服务名
>show parameter dispathcer
3、windows上面访问数据库:
三、oracle db体系结构概览
1、用户进程
用户进程要连接数据库,有本地连接,有远程连接,但都会在服务器端产生用户进程
- 连接到数据库实例:
连接:用户进程和实例之间的通信
会话:用户通过用户进程与实例建立的特定连接
- 远程连接:tcp三次握手
- 本地连接:数据库和客户端在同一台电脑:通过套接字连接
本地远程连接数据库,然后进入服务端,desc v$session 就可以看到连接用户客户端信息
- 专有连接:一个用户进程对应一个服务进程,连接模式为none:共享连接
- 共享连接:一个服务进程对应多个用户进程, 连接模式dedicated:专有连接
2、服务器进程
1>访问服务器进程在v$process视图中查看,服务器进程是接收用户进程请求并做相应的处理的。
2>用户进程产生会话之后,该会话将保留在内存当中,每个用户进程都有自己的独立的pga区。
3>查看访问数据库的操作系统进程id语句:
select spid from v$process where addr in(select paddr from v$session where username=’scott’);
4>看操作系统进程:
- ho ps –ef|grep 2036
- ho ps –ef|grep 4407
5>查看该进程消耗资源情况:top –p 4407
每一个视图都可以进程跟踪,使用desc v$process可以看到tracefile(跟踪文件)文件。
6>只要dba的用户,在oracle里面都可以使用:show parameter pga_a查看pga的内存大小,pga的值本身是自动管理的,但在11g中,可以通过权值修改其大小。
7>修改pga的大小:
- alter system set pga_aggregate_target=5g;
- show parameter pga
8>对于耗资源的进程,可以杀掉(假如是4406进程):kill -9 4406
四、sga
在10g中可以用show parameter sga_target查看sga大小,在11g和12c中可能看到的大小
查看sga的信息:select * from v$sgainfo;
1、共享池
1>库高速缓存:用来接收pga传递过来的hashvalue,如果该值存在,做软分析,否则,做硬分析,定义语句是全标扫描还是索引扫描
2>数据字典高速缓存:提供访问的对象是表还是索引还是同义词,表空间、数据文件等,进行递归调用
3>服务器进程用来读取数据文件到数据高速缓存区中,然后进行的读取
2、数据库高速缓冲区
有两种block,读的block和写的block,与块的读取有关
3、重做日志缓冲区
与块的更改有关,其大小需要手工设置。
五、后台进程
1、ckpt
- 只要在用户进程里面执行除了查询之外的的任何操作,都会触发ckpt,触发后,ckpt除了通知控制文件和数据文件外,还会通知dbwn将在数据库缓冲区高速缓存区执行过的ddl或者dcl的操作写到数据文件中去(注意:通知dbwn去写,但是dbwn未必就立马去写)。
- 当ckpt触发了,lgwr也写完了,大师dbwn还没写完,在下次启动时候,会自动将lgwr记录在联机重做日志文件中保存的undo内容写到数据文件中。
- sga里面的操作由smon(系统监视进程)和pmon(进程监视进程)协调。
- oracle中最重要的5个进程:smon ,pmon,dbwn,ckpt,lgwr。
- 显示相应的视图:desc v$process,查看后台进程:desc v$bgprocess视图中:
- 查看当前正在使用的后台进程:select paddr,name from v$bgprocess where paddr<>’00’;
- 查看数据文件:select name from v$datafile;
- 查看日志文件位置:select member from v$logfile;
- 查看控制文件位置:select name from v$controlfile;
- 参数文件:show parameter spfile
1>数据文件:表空间、表、索引都在数据文件中
六、sga的其他组件
1、数据高速缓冲区
2、重做日志缓冲区
3、大型池
4、java池和流池
5、程序全局区(pga)
6、系统全局区(sga)
7、数据库写进程(dwrn)
将数据库缓冲区高速缓存区中经过修改的缓冲区写入磁盘:有两种写入方式:
1>在执行其它处理时异步执行
2>推进检查点
- 查看:show parameter db_wr;
- 数据库写进程是可以修改的:alter system set db_writer_processes=30; a scope=spfile; /(表示执行)
8、日志写进程(lgwr)
1>将重做日志缓冲区中的内容写入磁盘上的重做日志文件中
2>在以下情况下执行写操作:
- 用户进程提交事务处理时
- 重做日志缓冲区的三分之一已满时
- 在dbwn进程将经过修改的缓冲区写入磁盘之前
- 每隔3秒
9、检查点进程(ckpt)
1>将检查点信息记录在以下位置
- 控制文件
- 每隔数据文件头
10、系统件事进程(smon)
1>在实例启动时候执行恢复
2>清除不使用的临时段
11、进程监器视进程(pmon)
在用户进程失败时候执行进程恢复
1> 清楚数据库缓冲区高速缓存
2> 释放该用户进程使用的资源
3> 监视会话是否发生空闲会话超时
4> 将数据库服务动态注册到监听程序
12、恢复器进程:
1> 用于分布式数据库配置
2> 自动连接到其它那些与有问题的分布式处理有关的数据库
3> 自动解决所有有问题的事务处理
4> 删除对应于所有有问题的事务处理所有行
13、归档进程(arcn)
是一个可选进程。
1> 在发生日志切换之后,将重做日志文件复制到指定的存储设备
2> 可以手机事务处理重做数据,并将该数据传输到备用目标位置
14、告警日志
1>查看告警日志的路径:show parameter background_dump_dest;
3> 读该告警日志:ho ls /u01/oracle/admin/wyzc10g/bdump/alert_wyzc10g.log
在任何的版本都可以通过以上路径去访问,只是不同的版本可能路径不一样,如:在11g当中查看路径:show parameter backgr; 可以看到路径为:/u01/oracle/diag/rdbms/wyzc11g/wyzc11g/trace/alert_wyzc11g.log
同样可以读该日志:
ho ls / u01/oracle/diag/rdbms/wyzc11g/wyzc11g/trace/alert_wyzc11g.log
七、逻辑结构
1、逻辑和物理数据库结构:
- 方案:语句、表、索引、函数、过程、包等
- 数据库:一个数据库可以放32272个表空间
- 表空间:一个表空间可以放1023个数据文件
- 段;自动管理后,空间分配等都可自动管理,减少dba的工作量。一个表空间可以放多个段。
- 区:区里面存放的都是block,如果采用的是10g及其以后的版本,都采用的是本地管理,字典管理已经不使用了。
- oracle数据块:oracle最大的block只有32k
- 数据文件:
- 操作系统块:
2、物理结构:
3、system和sysaux表空间
1> system和sysaux表空间是在创建数据库时创建的必须存在的表空间,这些表空间必须联机。
2> system表空间用于核心功能(例如数据字典表)
3> 辅助的sysaux表空间用于附加的数据库组件(如oracle enterprise repository)
4> 数据块会映射到磁盘块,不建议使用system和sysaux表空间来存储应用程序的数据。
4、自动存储管理
1> 是可移植的高性能集群文件系统
2> 管理oracle db文件
3> 通过asm集群文件系统(acfs)管理应用程序文件
4> 将数据分配到各个次盘中以平衡负载
5> 建立数据镜像以防范故障
6> 解决存储管理挑战
5、asm存储组件
asm最终调的是硬盘
八、12c体系结构的不同之处
oracle中的三大容器:cdb$root容器、pdbseed容器和pdbcontainer容器
九、dml语句:
注意:在写sql语句时候如:selet * from aaa ;此时发现报错’selet’,返回重新纠正就都的重写,此时只需要替换一下就可以,’c/selet/select’然后回车,就会将错误字符改正并正常执行。
1.buffer cache –undo block
修改前的data block 数据进行镜像
2.undo 变化 所有redo记录undo变化的过程
3.buffer cache –data block 修改
4.data block 变化 redo记录变化过程
5.insert操作成功
insert执行时候1,2,3,4,5执行完成后,oracle数据要进行:提交 回退|不提交。
不提交>此时undo数据属于修改后的状态,未提交,undo数据只能被当前的事务所在的会话调用,其他会话不能看到dml修改后的结果,看到的是上次提交的状态
回退>此时使用修改前的undo镜像,覆盖修改的data block,这样就撤销了修改的信息,标记undo事务数据不需要
提交>标记itl信息为新的scn,undo数据为提交状态,变为历史undo数据,写到磁盘上,将块数据标记为脏数据,该脏数据需要下次dbwr写到磁盘上,该数据也将成为其他会话看到的提交的数据
长时间不提交,dml事务达,很长时间没有结束,可能影像其他的会话执行所在行的dml
dml在对一张表进行操作的时候,会将该表锁定,到commit或着collback后释放
十、ddl语句:
1、其中上面1、2看到ddl是否修改数据字典 ,若修改字典, 1,2执行,2、4都要执行
2、ddl操作成功
十一、执行计划
1、explain plan 命令模拟sql执行跟踪
2、查询v$sql_plan视图
3、查询awr
4、sql*plus autotrace:统计信息
取当前的执行计划:在内存中已经存在一个sql情况:
1> 找到对应sql语句的游标id:select sql_id from v$sql where sql_text like ‘select * from t1%’;
2> 使用嵌套表查询当前语句的执行计划:
select * from table(dbms_explan.display_cursor(‘alln3qb4qvzrt’)); 得到执行计划
常用查看执行计划语句:1>ls /u01/oracle/11g/sqlplus/admin/
5、执行计划的缩进执行顺序:
1、缩进不同,少的为父亲,多的为儿子。父子关系执行时候:先儿子后父亲
2、缩进相同,上面的为哥哥,下面的为弟弟,执行时候:先哥哥后弟弟
3、缩进是可以嵌套的:以父亲/祖父同级的为一个家族
6、sql跟踪工具:
1>通常在会话级启用
2>收集按照会话分组的sql语句的会话统计信息
3>产生可通过tkprof格式化输出
4>方法:对于当前会话:exec dbms_monitor(待完成)
7、sql 优化器:
rule:表示使用rule优化器,现已被淘汰,用与10g 使用rbo
choose:有统计信息的优化器,使用cbo不使用rbo
10gr2 :开始统计信息,可以动态采样,没有统计信息,也不使用rbo
all_rows first_rows first_rows_n
其中 rule基于规则,
如果没有统计信息,将采用rbo
8、生成优化程序跟踪
1>设置一个事件-10053优化程序跟踪
建索引:
create index emp_d_i on emp(deptno);
create index emp_s_d_i on emp();
create index emp_s_d_i on emp(sal,deptno);
2>执行相关语句
十二、oracle中的函数—单行函数之字符函数
单行函数:不管输入几行,返回的只有一行。
1、character:字符函数
大小写:
- lower(string):全部转换为小写
- upper(string):全部转换为大写
- initcap(string):将首字母转换为大写
字符处理函数:
- concat(string,string):字符串连接函数,要连接三个字符串,需用嵌套,其嵌套为:concat(concat(stringvalue,stringvalue),stringvalue)
- substr(expr,m,n):截取字符串expr,其中m表示从哪里开始,m可为负数,表示反向截取,n表示取多少个,省略n表示从第m个字符把后面所有的字符都截取出来。应用场景:如找到第二个字符是a的员工:select ename from emp where substr(ename,2,1)=’a’;
- length():该函数有四种形式,lengthc、lengthb、length2、length4
- instr(stringvalue,’a’):返回字符在第一个字符串中的位置,若找到,返回位置,没找到,返回0,应用场景:找到第一个字符是a开头的员工,select ename from emp where instr(ename,’a’)=1。
2、gerneral:通用函数
3、numbers:数字函数
4、conversion:转化函数
5、datevalue日期函数
以上空着的部分将在后续总结中进行填补!