DBA学习

实例:
实例是后台进程(Background)和内存结构(SGA)的统称
 
主要后台进程有
    PMON: Process Monitor进程监视器,执行某些更新语句未提交时进程崩溃,PMON自动ROLLBACK操作,无须人工ROLLBACK;RECO失败,PMON重启RECO进程,更严重的LGWR进程崩溃,PMON中止实例,防止数据错乱。
    SMON:System Monitor系统监视器,SMON关注整个系统级操作而非单个进程,重点工作在于instance,除此之外清理临时表空间:SMON在库重启时会完成临时段释放,TEMP表清理的操作[通过查询DB中的Temporary Extent,在一定时间内比较总数,有减少的话说明正在清理]
 
    清理回滚段表空间:11g中SMON会基于过去7天的V$UNDOSTAT动
态视图信息或者AWR自动负载仓库的UNDO历史快照适用信息来决定offline undo segment的数量
 
    合并空闲空间:通过语句查询空闲extent,如果一定时间总数在减少,
说明正在合并空间空间
 
LCKn:仅用于RAC中实现实例间的封锁,最多可有n个进程(lcn1,lck2,lck3...lckn)
 
RECO:用于分布式数据库的恢复,适用于两阶段提交的应用场景,面临多个数据库A,B,C,某应用跨越三个数据库,再发起的过程中需要A,B,C三个数据库都提交成功,事务才会成功,只要有一个失败,就全部回滚
 
CKPT:设置参数调整DBWR落盘的量,存够多少量的动作写入到磁盘中,由CKPT的参数决定,CKPT触发DBWR写入到磁盘。
 
DBWR:在数据缓冲区修改完数据后,启动DBWR,将更新的数据从内存中刷入到磁盘。commit后不一定直接将缓冲区的数据写入到磁盘,等CKPT参数设置的量够了再一起写入磁盘,由CKPT触发,CKPT相应DBWR的动作
 
LGWR:将数据库相关操作的动作日志从日志缓冲区写进磁盘的日志文件。Commit时将操作写入到磁盘中的redolog文件,完成数据库对象创建,更新等过程的记录
 
11g及之前中只能采用单进程,12c中可以采用多进程:同时为了效率和安全制定了5条规则:
  1. 每隔3s,LGWR运行一次
  2. 每一次commit都触发LGWR一次
  3. DBWR要将数据从缓存写到磁盘中时,触发LGWR
  4. 日志缓冲区满三分之一或记录满1MB时,触发LGWR
  5. 发生日志切换时也触发LGWR
 
内存结构:
    内存结构由PGA(程序全局区)和SGA(系统全局区)组成,SGA用来存放操作的数据,库缓存,数据字典等控制信息的内存区域,PGA为服务进程专用的内存区域,大多数内容为私有。
   
SGA的组成及其作用:
    SGA是用来缓存数据库数据及控制信息的内存结构,其中大部分共享,存在于SGA中不同的池。
SGA由以下池构成:
    共享池:shared pool,控制参数shared_pool_size;
        缓存最近被执行的SQL语句和最近被使用的数据定义
    Java池:java pool,控制参数java_pool_size;
        在数据中运行java代码时用到这些内存
    大池:large pool,控制参数large_pool_size;
        用于大块内存的分配,
    流池:streams pool,控制参数streams_pool_size;
        共享复制数据时用到这些内存
    数据缓冲区:database buffer cache,控制参数db_cache_size
        存放Oracle最近使用过的数据块
    重做日志缓冲区:redolog buffer cache,控制参数log_buffer
        缓存对于数据块的修改
 
SGA相关参数:
shared_pool_size,控制共享池的大小,可以动态调整
java_pool_size,控制JAVA池的大小,可以动态调整
large_pool_size,控制大池的大小,可以动态调整
streams_pool_size,控制流池的大小,可以动态调整
db_cache_size,控制数据缓冲区的大小,可以动态调整
log_buffer,控制日志缓冲区的大小,不能动态调整
sga_target,如果值为0,需要DBA手动管理SGA
sga_max_size,SGA可以使用的最大内存,sga的总内存不能超过sga_max_size的值,否则报错。sga_max_size的值不能动态调整,必须先修改初始化参数文件,然后重启实例。如果实例启动时发现sga各部分组成的参数值大于sga_max_size,实例会忽视当前设置的sga_max_size,并修改sga_max_size值为当前最大值
 
PGA的组成及其作用:
    PGA是一块包含服务进程数据以及控制信息的内存区域,PGA由固定(fixed)PGA和可变(variable)PGA(也称为PGA Heap或PGA堆)构成。
 
    1.PGA是Oracle在一个服务进程启动时创建的,是独有的非共享的
    2.一个Oracle进程拥有一个PGA,一个PGA只能被拥有它的那个服务进程访问,只有这个进程中的Oracle代码才能读写它
    3.PGA中包含了关于进程使用到的操作系统资源的信息,以及一些关于进程状态的信息。PGA的作用:
            1)保存用户的连接信息,如会话属性,绑定变量等
            2)保存用户权限等重要信息,当用户进程与数据库建立对话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内
            3)当发起的指令需要排序时,PGA正是这个排序区,如果内存中可以放下排序的尺寸,就在内存PGA区完成,如果完不成,就在临时表空间中完成排序,也就是在磁盘中进行排序
 
 
 
PGA的相关参数:
    pga_aggregate_target:设定所有进程总的work area区大小,主要影响下面几个相关参数的设定,增大此参数,可以提高每个work area大小,对于hash,join,排序等操作有利
smm_max_size:串行进程的work area上限值,默认单位KB
pga_max_size:每个进程work area上限值,默认单位byte
smm_px_max_size:并行模式下,所有并行进程共享的work area上限值,默认单位kb
注意事项:PGA达到10G,单个进程的work area已经达到极限
CPU足够的情况下,设置并行度超过6,可以获得更大的work area,比如创建索引就会更快
如果大量启用高并行度,操作系统内存很容易消耗光,因为PGA只是限定了work area空间,而其他的组件可以越界
 
实例启停
    启动:
    mount阶段:在这个阶段,Oracle从启动参数文件里找到控制文件的路径参数值,找到所有的控制文件,然后打开控制文件的信息,控制文件里记录了各种表空间文件,日志文件的信息,以及数据库的字符集,这时,数据库已经读取了相关系统文件的信息,也读取了字符集信息,但是仅仅是读取,这些系统文件,并没有真正加载到数据库里
在此阶段,可以执行数据库日志归档,数据库介质恢复,使数据文件联机或脱机,重定位数据文件和联机日志文件
 
open阶段:mount阶段结束后,数据库体系的所有信息已经读取全,知道了redo文件,数据文件的信息,但是还没有加载到open状态,数据库读取所有文件打开数据库。
此时数据库可用,可以建立会话。
 
启动到start nomount阶段:Oracle读取初始化参数文件并在/dbs中依次找
spfile<sid>.ora    ->    spfile.ora    ->    init<sid>.ora     ->    init.ora
 
启动到mount状态:定位控制文件路径,读取所有的系统文件
 
open阶段:读取所有文件打开数据库
 
    关闭:
数据库关闭的三个阶段:从CLOSE->DISMOUNT->SHUTDOWN
CLOSE阶段:数据库关闭,关闭SMON,kill掉所有会话连接,关闭PMON,ARCH,redo等
DISMOUNT阶段:数据库卸载,断开数据库和实例的之间的连接
SHUTDOWN阶段:关闭实例,开辟的内存区域消失,后台进程全部消失
 
用户与对象管理:
    创建用户:
create user user_name
            identified by password
            default tablespace tbs_name
            quota 10M on tbs_name
            temporary tablespace temp_name
            profile profile_name
 
    删除用户:
如果不包含任何对象:
drop user user_name;
如果其中有包含某些对象:
drop user user_name cascade;
 
    权限授予与回收:
授权:
grant connect,resource to user_name;
 
回收:
revoke connect,resource from user_name;
 
对象相关:
    表相关:
    表的类型,创建方式:
表有普通堆表,全局临时表,分区表,索引组织表,簇表
①普通堆表的创建:
create table t (
classid number(2) primary key,
classname varchar(10) not null
);
②全局临时表的类型:分为基于会话的全局临时表(on commit preserve rows),一种是基于事务的全局临时表(on commit delete rows),不同之处在于基于会话的断开会话后临时表数据被清除,基于事务的提交完后临时表数据就被清除。
基于会话的临时表创建:
create global temporary table T_TMP_session on commit preserve rows as select * from dba_objects where 1=2;
基于事务的全局临时表创建
:create global temporary table T_TMP_transaction on commit delete rows as select * from dba_objects where 1=2;
使用场景:
        1.当处理某一批临时数据,需要多次DML操作时(插入,更新等),建议使用临时表
        2.当某些表在查询里面,需要多次用来做连接时(为了获取目标数据需要关联A,B,C,同时为了获取另一个目标数据时,需要关联D,B,C)
细化分类:如果全局临时表在程序的一次调用执行过程中需要多次清空记录再插入记录,就要考虑用基于事务的,这时commit可以快速清理结果。
    一般情况使用基于会话的临时表
 
③分区表的类型:有范围分区,列表分区,HASH分区及组合分区。
范围分区的创建:
create table range_part_tab(id number,deal_date date,area_code number,contents varchar2(4000))
partition by range(deal_date)
(
partition p1 values less than(TO_DATE(‘2012-02-01’,’YYYY-MM-DD’)),
partition p2 values less than(TO_DATE(‘2012-03-01’,’YYYY-MM-DD’)),
partition p3 values less than(TO_DATE(‘2012-04-01’,’YYYY-MM-DD’)),
partition p4 values less than(TO_DATE(‘2012-05-01’,’YYYY-MM-DD’)),
partition p5 values less than(TO_DATE(‘2012-06-01’,’YYYY-MM-DD’)),
partition p_max values less than (maxvalue)
);
范围分区的关键词为partition by range。values less than是范围分区特有的语法,用于指明具体的范围。最后需要划分出超出以上范围的区域,落在单独的分区,防止数据出错
 
列表分区的创建:比如
create table list_part_tab(id number,deal_date date,area_code number,contents varchar2(40000))
partition by list(area_code)
(
partition p_591 values (591),
partition p_592 values (592),
partition p_593 values (593),
partition p_594 values (594),
partition p_595 values (595),
partition p_596 values (596),
partition p_597 values (597),
partition o_other values (DEFAULT)
);
列表分区的关键词为partition by list。不同于范围分区values less than,列表分区仅需values即可确定范围,但并不是取值只能写一个,而是可以写多个partition p_union values(592,593,594),同样还是要划分不在刚刚范围的记录全部落在单独的分区,避免数据出错
 
散列(HASH)分区的创建:比如
create table hash_part_tab (id number,deal_date date,area_code number,contents varchar2(4000))
partition by hash(deal_date)
partition 12
;
散列分区的关键词为partition by hash。散列分区不用指定分区名,仅仅指定分区个数即可。散列分区的分区个数尽量设置为偶数个,如果不是2的幂数会导致数据量分布不均匀。
④索引组织表的创建:
create table heap_address
(empno    number(10),
addr_type varchar2(10),
street varchar2(10),
city varchar2(10),
state varchar2(10),
zip number,
primary key (empno)
)
organization index
/
索引组织表最大的特点就是表就是索引,索引就是表,获取数据时无须访问表
 
⑤簇表的创建:
create cluster shc
(
cust_id    NUMBER,
order_dt timestamp SORT
)
HASHKEYS 10000
HASH IS cust_id
SIZE 8192
/
簇已创建
 
CREATE TABLE cust_orders
(    cust_id    number,
order_dt timestamp SORT,
order_number number,
username varchar2(30),
ship_addr number,
bill_addr number,
invoice_num number
)
CLUSTER shc (cust_id,order_dt)
/
 
延迟段创建:
    11g新特性,创建数据库段时,创建一张表将不再预先分配初始化区,不对新创建的段分配空间,这个特性一方面提高了性能,降低了数据库的开销
     初始化参数deferred_segment_creation用于控制该特性,设置为False可以关闭这个功能;
 
高水位问题:
     High Water Mark是Oracle Segment级的概念,在仅有DML(delete,insert)操作时,高水位线只会增长,不会降低。因为程序使用的delete语句不回收使用过的空间,数据虽然删除了,但是高水位线却没有降低,仍然处于之前的水位。
    一个表在初次插入记录时,Oracle会为其分配segment和block,插入大量数据后,高水位线随之增长,当数据被删除时,高水位线未下降
    在Oracle中执行select扫描的是高水位以下的所有数据块,而不是说数据库有多少使用的数据块,就扫描多少数据块,如果是一个新建的表,执行select就会很快,如果插入1000W条记录再delete掉,执行select就会很慢
    如何降低高水位:
    1.能使用truncate操作尽量不使用delete操作
    2.新建一个临时表,把数据复制到临时表中,drop掉源表,再把临时表重新命名成源表的名字
    3.执行表重建命令(alter table table_name move;)(在线转移表空间aler table table_name move tablespace tablespace_namemove后面也可不跟参数,如果不跟就在原来的表空间,move到其他表空间需要重建索引。如果以后需要向原表增加数据,没必要move,不过释放出来的空间只能本表使用,其他表或者segment无法使用)
    4.执行10g新增的收缩表alter table_name shrink space;执行该命令前需要允许行迁移alter table table_name enable row movement;
 
    索引相关:
 
逻辑上
物理上
Single column 单行索引
Partitioned分区索引
Concatenated 多行索引
NonPartitioned非分区索引
Unique 唯一索引
Normal正常B树索引
NonUnique 非唯一索引
Rever Key 反转型B树
Function-based 函数索引
Bitmap位图索引
Domain 域索引
 
 
常用6种索引结构:
 
    1.b-tree索引:按平衡树结构组织的索引,最常见的索引结构,一般默认创建的索引b-trees索引占用空间多,适合索引值取值范围大(基数大),重复率低的情况
    2.bitmap索引:按位图结构组织的索引,适合索引值取值范围小(基数小),重复率高的情况
    3.函数索引:基于包含索引列的函数或表达式创建的索引(索引值为计算后的值)
    4.唯一索引与非唯一索引:唯一索引是索引值不重复的索引,非唯一索引是索引值可以重复的索引。默认情况下,Oracle创建的是非唯一索引。当在表中定义主键约束或唯一性约束时,Oracle会自动在相应列上创建唯一性索引。
    5.单列索引与复合索引:索引创建在一个列上的称为单列索引,创建在多个列上,称为复合索引。
 
索引块分裂9-1.5-5等待事件:                                                                                                                              
 oracle:增加表空间的三种方式:         
当一个事务对一个索引块做DML时,因为该索引块没有空闲空间导致                                                                        1.增加数据文件再自动扩展
索引块分裂,这时其他事务正在向这个索引块做DML操作时就会产生等待                                                                   add datafile /// autoextend on
直到索引块分裂完成                                                                                                                                                2.直接自动扩展
                                                                                                                                                                                autoextend on
引起索引失效的原因:                                                                                                                                            3.仅增加数据文件:
1.索引列上使用函数,建立索引函数即可解决                                                                                                             add datafile /// size 50M
2.新表还未生成统计信息,分析一下表                                                                                                                      4.手工改变已存在数据文件的大小
3.基于cost的成本分析访问的表国小,使用全表扫描的消耗小于使用索引的                                                                  resize 100M;
4.使用<>,not in,not exist,大多数情况认为结果集很大,一般大于5%
到15%就不走索引而是走FTS(快速全表)
5.单独的<,>
6.like “%_百分号在前”
7.字符型字段为数字时再where条件里不添加引号(会隐式转换为number)
8.当变量采用times变量,表字段采用date变量,或者相反
 
索引的作用:
    1.帮助用户提高查询速度
    2.利用索引的唯一性来控制记录的唯一性
    3.加速表与表之间的连接
    4.降低查询中分组和排序的时间
 
索引的创建:
自动创建:在定义primary_key或unique约束后系统自动在相应的列上创建唯一性索引
手动创建:用户可以在其他列上创建非唯一的索引,以加速查询
在一个或多个列上创建索引:
create index index_name on table(column[column]) online;
最后加online,等待业务完成后再添加索引
 
 
表空间:
表空间类型分别有永久表空间,撤销表空间和临时表空间。
永久表空间:包含一些段,这些段在超出会话或事务的持续时间后持续存在
撤销表空间:可能有一些段在超出会话或事务末尾后仍然保留,但它为访问被修改表的select提供一致读性,同时为数据库的大量闪回特性提供撤销数据。然而,撤销段主要用来存储一些列在更新或删除的值,或者用于提供指示,表明不存在用于插入的行
临时表空间:包含暂时的数据,这些数据只存在于会话的持续时间,例如完成分类操作的空间不适合来自于内存。
 
UNDO表空间:
undo表空间用于存放undo数据,当执行DML操作,Oracle会将这些操作的旧数据写入到undo段
undo表空间的状态一共三种:
EXPIRED:表示该回退信息对应的事务已经提交,保存时间超过保留区
UNEXPIRED:表示该回退信息对应的事务已经提交,保存时间没超过保留区
ACTIVE:表示回退信息对应的事务还没有提交,该区还在使用
 
UNDO表空间的作用:
--事务回滚:当事务执行失败或用户执行回滚操作(rollback)时,Oracle会利用保存在回退段中的信息将数据恢复到原来的值
--数据库恢复:当数据库实例运行失败,在数据库重启恢复时,Oracle先利用重做日志文件的信息对数据库进行恢复(包括已提交和未提交的事务),再利用回滚段中的信息回滚未提交的事务
--读一致性:当一个用户对数据进行修改时,会预先将其原始值保存到回退段中,这时,如果有其他用户访问该数据,则访问回退段中的信息,使当前用户未提交的修改其他用户无法看到,保证了数据的一致性
--闪回查询:通过保留在回退段中的信息,用户可以查询某个数据在过去某个时刻的状态
 
UNDO表空间的参数:
①UNDO_MANAGEMENT:该初始化参数用于指定UNDO数据的管理方式。如果要使用自动管理模式,必须设置该参数为AUTO,如果使用手工管理,需设置参数为MANUAL,使用自动管理模式时,Oracle使用undo表空间管理,使用手动管理时,Oracle使用回滚段管理undo数据,如果使用自动管理模式,如果没有配置初始化参数UNDO_TABLESPACE,Oracle会自动选择第一个可用的UNDO表空间存放UNDO数据。如果没有可用的UNDO表空间,oracle会使用SYSTEM回滚段存放UNDO记录,并在alert文件中记载警告
 
②UNDO_TABLESAPCE:该初始化参数指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定实例所要使用的UNDO表空间
 
③UNDO_RETENTION:在Oracle10g中引入undo_retention参数,该参数是一个时间值,说明当还原段中的事务在提交后继续保留的时间,为flashback等工具进行闪回数据等操作,该参数默认值为900s,可以动态修改。当保留时间超过undo_retention所指定的时间以后,该undo块才能被其他事务覆盖,当使用AUM(自动管理时),并且设置了undo_retention后,undo块???????????????4?????????
  1. active,活跃的,表示使用该数据块的事务还没有提交或者回滚
  2. inactive,不活跃的,表示该数据块上没有活动的事务,可以被覆盖
  3. expire,超时的,达到时间上限的,表示该数据库持续inactive的时间已经超过undo_retention所指定的空间,如果没有freed,将会被其他事务覆盖
  4. freed,释放的,表示该数据块是空的,从来没有被使用过

猜你喜欢

转载自www.cnblogs.com/bctingisland/p/12156595.html
DBA