Oracle 存储管理

简介

Oracle数据库对数据的管理可以分为两个方面来管理,从逻辑上来说Oracle是将数据存储在表空间中的表里面,从物理上来说,是将数据存储在存储在数据文件中。

物理概念管理数据

数据文件、控制文件、联机重做日志文件

逻辑概念管理数据

数据库-表空间-段(segment)-区间(extent)-数据块(block)
1.一个表空间只属于一个数据块,一个表空间有很多数据文件,一个数据文件只属于一个表空间
2.一个段可以跨越多个数据文件,一个表就是一个segment、索引也是一个segment
3.segment分配空间的最小单位就是extent,每个segment由一个或者多个extent组成
4.一个extent不能跨越多个数据文件因为一个extent是物理上连续的存储空间
5.一个extent由多个连续的block组成
6.block是oracle最小的单位

表空间

系统表空间

系统表空间里面存储的是数据字典信息

非系统表空间

包含用户自己的数据、也包含临时和undo数据

表空间的空间管理

在表空间中,段会进行收缩和扩展,分配的单元是extent
表空间的管理就是如何对extent的分配和释放
表空间管理主要是,数据字典管理(DMT),本地管理(LMT)

数据字典管理(基本不用)
有两个数据字典表(FET 和 U E T 和UET UET
FET $(free extent)记录表空间中的可用空间
UET $(used extent)记录表空间中的已经分配的空间

SQL> desc fet$
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TS#                                       NOT NULL NUMBER
 FILE#                                     NOT NULL NUMBER
 BLOCK#                                    NOT NULL NUMBER
 LENGTH                                    NOT NULL NUMBER
 
SQL> desc UET$
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SEGFILE#                                  NOT NULL NUMBER
 SEGBLOCK#                                 NOT NULL NUMBER
 EXT#                                      NOT NULL NUMBER
 TS#                                       NOT NULL NUMBER
 FILE#                                     NOT NULL NUMBER
 BLOCK#                                    NOT NULL NUMBER
 LENGTH                                    NOT NULL NUMBER

分配空间后,就相当于从FET$中挖数据、释放空间以后,就相当于从UET $中挖数据
在extent不断的分配和释放中,FET $和UET $不断的变化
我们来看看能够产生的一些问题
注意:因为字典管理表空间几乎已经被淘汰,因此我们没有必要研究的很细。

1、使用SQL语句对两个表进行操作,本身是一种相对低效的方式
2、两个表之间的插入、删除,产生事务,伴随着锁的产生,有了锁以后,必然会产生锁的争用,引起锁等待,影响extent的分配和释放
3、事务会产生redo和undo,这也是使用SQL的缺点之一
4、SMON进程定期扫描FET $表,对其中相邻的可用空间进行合并,这会消耗一定的资源,FET $中记录很多的时候,资源消耗尤其严重
随着数据库的增长、事务量的增加,字典管理表空间已经不能满足需求,于是就是产生了本地管理表空间

本地管理表空间
1.利用bitmap来管理extent的分配和释放
2.每个bit对于一个extent,0表示未分配,1表示已经分配。
我们来分析一些位图
111100001100100011000
前四个extent已经分配,5678还没有分配,等等
如果需要分配extent,只要扫描文件的头部,找到那些值为0的bit位,分配该extent所对应的空间,然后将相应的bit为置为1即可
当需要释放extent的时候,只需要将对应的bit位设置为0即可
解决了字典管理表空间的问题
1、没有涉及到SQL语句
2、没有事务、没有锁、没有回滚和redo
3、空间的合并也非常的方便,因为连续为0就是可以合并的空间

因为每次涉及的只是一些位,操作起来非常的方便。
从Oracle9i开始,就支持本地管理表空间,我们不要再使用字典管理表空间。

默认表空间

如果创建用户的时候,没有指定默认表空间。
那么就使用这个表空间作为默认表空间。使用新建用户登录,创建对象的时候,如果没有指定明确的表空间,那么就使用这个默认的表空间。
使用DBCA创建数据库的时候,默认创建了USERS表空间,并且将这个表空间作为数据库默认表空间。
没有数据库默认表空间、创建用户的时候也没有指定默认的表空间,那么该用户就使用system作为默认表空间,这显然不是我们希望的。

查询默认表空间

select property_value from database_properties where property_name ='DEFAULT_PERMANENT_TABLESPACE';
SQL> select property_value from database_properties where property_name ='DEFAULT_PERMANENT_TABLESPACE';

PROPERTY_VALUE
--------------------------------------------------------------------------------
USERS

临时表空间

1.存放临时数据,需要时被覆盖,关闭时被删除。
2.可以被所有的用户使用

例如排序
首先在PGA中进行、如果数据量太大,不能在内存中完成,那么Oracle如下处理
1、将数据分割成多份,只取出一份放在PGA中进行排序
2、其余的放在临时表空间中
3、部分数据在PGA中排序完成以后,交换到临时表空间中,然后再从临时表空间中取出一份,放在PGA中继续排序,以此类推,直到将所有的数据排序完毕为止

设置默认临时表空间
如果设置了这个选项,创建用户没有指定默认表空间,那么用户就使用这个临时表空间作为自己的默认临时表空间,用户所有的排序都在这个临时表空间中进行

查看默认的临时表空间

select property_value from database_properties where property_name ='DEFAULT_TEMP_TABLESPACE';

指定数据库的默认临时表空间还是很有必要的。
注意:一定不要出现一种情况
使用我们不希望使用的表空间,例如将system表空间作为默认永久和默认临时表空间。最好的用法就是
指定明确的数据库默认表空间和用户默认表空间,用户创建对象的时候,尽量指定表空间。

表空间状态

读写
只读
脱机

只读:
1、表空间只读,不能写入
2、系统表空间、临时表空间和undo表空间都不能设置为只读
3、只读表空间里面的数据不能被修改,但是表可以被删除,因为删除表只是在数据字典里面将对应的信息删除而已

离线
1、系统表空间、默认临时表空间、undo表空间,都不能设置为离线
2、表空间不能被读和写

添加数据文件

指定数据文件的名字和目录、数据文件的初始大小,是否重用等。

如果没有选择"数据文件满后自动扩展",那么数据满后会报错。
对于DBA来说,不应该出现数据文件已经分配满,但是DBA不知晓的情况,应该例行性的查看空间使用情况。
为了方便,可以选择自动扩展,而且指定每次扩展的大小

例子:创建表空间
段空间的管理(为段分配空间的时候,如何分配具体的数据块,段空间管理就是数据块的具体管理)

create tablespace DEMOSPACE  datafile '/oracle_tablespaces/DEMOSPACE_TBSPACE.dbf' size 1500M  autoextend on next 5M maxsize 3000M;

manual
Oracle9i以前,只能使用手工设定参数
每一个segment的第一个数据块中,都有一个seg header,这个seg header指向一个可用链表的起点,freelist链表上挂的都是可以用来进行插入操作的数据块
当服务器进程进行插入操作而需要可用数据块时,锁定seg header,遍历freelist,搜索具有足够空间进行插入的可用数据块,找到该数据块,将数据插入,然后释放对seg header的锁定

对于段空间的手动管理,我们有两个参数
pctfree、pctused
在创建表或者索引的时候,可以指定这两个参数
1、pctfree:表示数据块里剩余的可用空间占数据块总空间的百分比,该参数默认是10
2、pctused:表示已经使用的空间占数据块总空间的百分比,该参数默认是40
当可用链表上的某个数据块不断被插入数据,从而导致该数据块里的剩余可用空间与数据块大小的百分比小于pctfree的值的时候,该数据块从可用链表上删除,不再用于insert操作,剩余空间被用于update操作
当删除某个数据块上的数据,导致该数据块已经使用的空间与数据块大小的百分比小于pctused的值的时候,说明这个数据块的可用空间已经足够多了,于是再次被挂到可用链表上
问题
当对某一个段的数据并行插入很多的时候,每一个插入都需要锁定seg header,然后遍历freelist,因为同一时间只能有一个插入锁定seg header,因此容易产生seg header锁等待
注意:锁等待是数据库里面的一个很严重的性能问题

标准的建立表空间的语句

CREATE SMALLFILE TABLESPACE "TBS" DATAFILE '/u01/app/oracle/oradata/ORACLR10G/datafile/tbs01.dbf' SIZE 100M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED LOGGING EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M SEGMENT SPACE MANAGEMENT AUTO

表空间分类

表空间分类
1、SYSTEM是数据字典存放的表空间
2、SYSAUX从Oracle10g引入,作为辅助的系统表空间,创建数据库的时候创建,不能重命名、不能删除,存放了很多数据库的辅助功能,比如AWR等
3、temp是数据库的默认临时表空间
4、undotbs1为数据库的undo表空间
5、users是数据库的默认永久表空间
6、example为数据库的测试案例涉及的表所在的表空间

四种脱机模式
1、正常:离线前,Oracle会发出文件级别的CKPT,将离线的表空间所对应的位于buffer cache里的脏数据块全部写入到对应的数据文件里面,然后将表空间离线。通过这种方式,表空间数据没有损坏,下次ONLINE的时候,不需要恢复
2、立即:通常在表空间所对应的所有的数据文件损坏或者丢失的情况下采用这种模式
Oracle不会发出文件级别的CKPT,所有脏数据都不写入,表空间数据会被损坏,下次online需要恢复
3、临时
通常在表空间所对应的数据文件没有完全丢失或损坏的情况下会采用这种模式
Oracle发出CKPT,能写入的脏数据就写入,不能写入的就不写入
数据会被损坏,下次online时需要恢复
4、用于恢复
不再使用

转移表空间的方法
1、只能使用命令行,不能使用dbcontrol
2、分为两种
转移非system表空间
转移system表空间

非系统表空间
1.将表空间设置为离线状态
alter database example offline;
2.拷贝数据文件
!cp /tmp/example.dbf /tmp/oracle/example.dbf
3.更改表空间的数据文件
alter tablespace example rename datafile ‘/tmp/example.dbf’ to ‘/tmp/oracle/example.dbf’ ;
4.将表空间状态改为在线online
alter database example online

系统表空间
1.关闭数据块
shutdown imediate;
2.启动数据库到mount状态
startup mount
3.拷贝表空间的数据文件
!cp /tmp/example.dbf /tmp/oracle/example.dbf
4.更改表空间的数据文件
alter tablespace example rename datafile ‘/tmp/example.dbf’ to ‘/tmp/oracle/example.dbf’ ;
5.打开数据库
alter database open;

临时表空间和临时表空间组

1.临时表空间主要是用来存放用户的临时数据,例如排序数据
2.Oracle10G引入了临时表空间的概念
(1)临时表空间组是一组临时表空间
(2)临时表空间组和临时表空间的名字不能相同
(3)不能显式的创建和删除临时表空间组,因为临时表空间组中必须要有成员,当第一个临时表空间被分配给临时表空间组的时候,临 时表空间组自动的创建,当最后一个临时表空间从临时表空间组退出的时候,临时表空间组自动删除,这样保证了临时表空间组总是有成员。

创建临时表空间组
1.可以在创建临时表空间是指定表空间组,即隐式创建。

`create temporary tablespace temp1 tempfile '+AAPOCARCH/AACDB/DATAFILE/temp01.dbf' size 10m tablespace group` grp_temp;
create temporary tablespace temp2 tempfile '+AAPOCARCH/AACDB/DATAFILE/temp02.dbf' size 10m tablespace group grp_temp;

2.查询表空间组

select * from dba_tablespace_groups;
SQL> select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
GRP_TEMP                       TEMP1
GRP_TEMP                       TEMP2

3.将默认表空间设置为GRP_TEMP
alter database default temporary tablespace GRP_TEMP;

4.查询当前的默认临时表空间

select property_value
  from database_properties
 where property_name = 'DEFAULT_TEMP_TABLESPACE';

扩展知识

1.临时表空间表空间数据文件查看

SELECT file_name,
       bytes / 1024 / 1024 / 1024,
       status,
       tablespace_name
  FROM dba_temp_files;

如何查看临时表空间都是被什么SQL占用?

SELECT vt.inst_id,
         vs.sid,
         vs.serial#,
         vs.machine,
         vs.saddr,
         vs.program,
         vs.module,
         vs.logon_time,
         vt.tempseg_usage,
         vt.segtype
    FROM gv$session vs,
         (  SELECT inst_id,
                   username,
                   session_addr,
                   segtype,
                   ROUND (SUM (blocks) * 8192 / 1024 / 1024 / 1024, 2)
                      tempseg_usage
              FROM gv$tempseg_usage
          GROUP BY inst_id,
                   username,
                   session_addr,
                   segtype
          ORDER BY 4 DESC) vt
   WHERE vs.inst_id = vt.inst_id AND vs.saddr = vt.session_addr
ORDER BY tempseg_usage DESC;

3.查询会话使用临时表空间,
SELECT SE.USERNAME,
SE.SID,
SE.SERIAL#,
SE.SQL_ADDRESS,
SE.MACHINE,
SE.PROGRAM,
SU.TABLESPACE,
SU.SEGTYPE,
SU.CONTENTS
FROM V S E S S I O N S E , V SESSION SE, V SESSIONSE,VSORT_USAGE SU
WHERE SE.SADDR = SU.SESSION_ADDR;

4.数据库中消耗资源比较大的SQL,

SELECT se.username,
       se.sid,
       su.extents,
       su.blocks * TO_NUMBER (RTRIM (p.VALUE)) AS Space,
       tablespace,
       segtype,
       sql_text
  FROM v$sort_usage su,
       v$parameter p,
       v$session se,
       v$sql s
 WHERE p.name = 'db_block_size'
   and su.session_addr = se.saddr
   and s.hash_value = su.sqlhash
   and s.address = su.sqladdr
 order by se.username, se.sid;

联机重做日志文件

1、联机重做日志文件记录的都是数据块的变化,例如数据块头部的变化也会产生重做记录
2、commit的时候会触发LGWR,因为LGWR是顺序写入的,这相对DBWR来说,速度就快得多,因此提交的时候,只要保证LGWR写完即可,这样提高了提交的速度
3、联机重做日志文件最主要的功能是为了进行恢复

日志切换
联机重做日志文件采用的是循环写的方式,一个日志写满以后,切换到下一个日志继续写
日志切换的步骤
1、从控制文件中得到下一个可用的联机重做日志文件
2、记录写入当前联机重做日志文件的最后一个日志块的SCN(high SCN),关闭当前联机重做日志文件
3、增加SCN,再次修改控制文件,将下一个联机重做日志文件标记为CURRENT,判断前一个联机重做日志文件里包含的重做记录所对应的脏数据块是否都已经写入到了数据文件中,如果没有,则标记为active,如果是,标 记为inactive,如果数据库是归档模式,那么LGWR将前一个联机重做日志文件加入到归档列表中,并唤醒ARCn进程进行归档
4、打开新的联机重做日志文件组中的所有的成员,记录当前日志序列号和第一个日志块的SCN,新一轮的重做记录开始

查看当前的日志状态

select group#,status from v $log;
SQL> select group#,status from v$log;

    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE
         4 CURRENT

手工的启动一个完全检查点

alter sysytem checkpoint;

管理日志文件

创建文件组

alter database add logfile group 4('/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log') size 50M blocksize 512;
添加成员
alter database add logfile member '/u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log' to ('/u01/app/oracle/oradata/CDB1/onlinelog/logfile004.log');
移动日志文件
mv /u01/app/oracle/oradata/CDB1/onlinelog/logfile004a.log  /home/oracle/logtest/logfile004a_new.log

删除日志文件
删除日志文件前提:
1 一个实例至少需要两组重做日志文件,而不考虑组中的成员数。

2 只有当重做日志组处于非活动状态时,才能删除它。如果必须删除当前组,则首先强制进行日志切换。

3 在删除重做日志组之前,请确保该组已存档(如果已启用存档)。
查看日志文件状态:

 alter system switch logfile;

 select * from v$log;

删除成员

 alter database drop logfile member '/home/oracle/logtest/logfile004a_new.log';
 select group#,member from v$logfile;

删除组

alter database drop logfile group 4;

 select * from v$log;

Oracle的OMF
从Oracle9i开始,引入了所谓的OMF概念(Oracle管理文件)
OMF包含的文件包括控制文件、联机重做日志文件、数据文件、备份文件
我们不需要为这些文件指定文件名字、路径以及大小
只有设置了下面的参数以后,才能够启用OMF

SQL> show parameter db_create_online_log_dest;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_online_log_dest_1          string
db_create_online_log_dest_2          string
db_create_online_log_dest_3          string
db_create_online_log_dest_4          string
db_create_online_log_dest_5          string

一共设置了5个

show parameter db_recovery_file_dest;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      +HCUATARCH
db_recovery_file_dest_size           big integer 200G

create tablespace omf_test;
SQL> `show parameter db_recovery_file_dest;`

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      +JTPOCDATA
db_recovery_file_dest_size           big integer 100G
SQL> create tablespace omf_test;

Tablespace created.

对于OMF来说,删除表空间的时候,自动删除数据文件。
表空间默认大小是100M。

 ~~show parameter db_create;~~ 

```markup
SQL>  show parameter db_create;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      +JTPOCARCH
db_create_online_log_dest_1          string
db_create_online_log_dest_2          string
db_create_online_log_dest_3          string
db_create_online_log_dest_4          string
db_create_online_log_dest_5          string

 如果我们设置了上面的三个参数,那么在创建表空间、创建联机重做日志文件、使用恢复区的时候,Oracle自动的管理这些文件的路径、大小、名称。
我们在管理Oracle的时候,有的时候使用到了Oracle的OMF,有的时候没有使用到Oracle的OMF。上面的实验中,我们在建立表空间的时候,就使用到了OMF。
 如果我们手工的指定路径、名称,那么就没有使用OMF。

注意:OMF涉及的概念
1、三个参数
2、什么时候OMF起作用(没有指定文件的路径和名称的时候)
3、OMF管理路径、文件名称、文件大小

数据块的结构
数据块分为三个部分
1、数据块的头部
2、数据
3、可用空间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值