[ORACLE] oracle 存储结构

  1. 表空间和数据文件
  2. 管理表空间

表空间和数据文件

1.ORACLE的存储模型

  1.1  存储模型

   1.2 段

    一个表空间可以包括多个段,而且也可以由多个数据文件组成。也就是说,一个段可以分布在多个数据文件中,而任一数据文件可以包含多个段的全部或一部分。任何一个段可以仅存在于一个表空间中,但表空间可以将其均匀分布于构成表空间的所有文件中。段由多个区组成,这些区可以是连续的,也可以是不连续的。当用户在数据库中创建各种具有实际存储结构的对象时(保存有数据的对象),比如表、索引等,Oracle将为这些对象创建“段”。 一般一个对象只拥有一个段。在创建段时,可以为它指定PCTFREE、PCTUSED等参数来控制其中的块的存储空间管理方式,也可以为它指定INITIAL、NEXT、PCTINCREASE等存储参数,以指定其中区的分配方式。如果没有为段指定这些参数,段将自动继承表空间的相应参数。

    smallfile 表空间可以有多个数据文件,但bigfile表空间只能又一个数据文件

    段管理的类型:手动和自动(位图管理),无法将首款段空间管理转换为自动段空间管理,查看段空间管理类型:

select tablespace_name,segment_space_management from dba_tablespaces;

  1.3块

    1.3.1 块的介绍:

    DB_BLOCK_SIZE,OS块小于ORACLE块,数据块容量应该设为操作系统块容量的整数倍(同时小于数据块容量的最大限制),以便减少不必要的I/O操作。Oracle数据块是Oracle可以使用和分配的最小存储单位。需要注意的是,块大小的设置是在数据库创建时候设置的,一旦设置好是不可更改的。类似于我们磁盘的存储格式,FAT16FAT32NTFS.... ,要想改变存储格式只能数数据全部格式化掉。

    1.3.2 块的组成

          块的头部信息区:块头:包含块的一般属性信息 如块的物理地址、块所属的段的类型

                  表目录:如果块中存储的数据是表数据, 则在表目录中保存块中所包含的表的相关信息

                  行目录:行记录的相关信息 如ROWID

          块的存储区:主要包含空闲空间和已经使用的空间。Oracle主要是通过下面的两个参数对这部分空间进行管理的

          PCTFREE参数:指定块中必须保留的最小空闲空间比例。当块中的空闲存储空间减少到PCTFREE所设置的比例后,Oracle将块标记为不可用状态,新的数据行将不能被加入到这个块。

          PCTUSED参数:制定一个百分比,当块中已经使用的存储空间降低到这个百分比只下时,这个块才被重新标记为可用状态。
               请注意:以上两个参数既可以在表空间级别进行设置,也可以在段级别进行设置。段级别的设置优先级更高。

    1.3.3  High-Water Mark

    对一一个新建立的表,表中包含很多数据块,water mark 原始指向表中的第一个数据块。water mark随着插入的数据“向前”移动。当把插入的数据删除掉一些,water mark 并不会“向后”移动。也就是water mark 的位置表示历史的最高水位。那么我们要想插入一些数据时,oralce是按什么样的规则输选择插入位置呢?首先会先查找灰色的,灰色部分表示就已经插入数据的块,但这些块并不是已经被完全占满了,有些或多或少的都会留下一些空间,关于留空间的规则,后面细说。如果插入一个很小的数据,灰色被占的数据块中可以完全插入的,就会被插在这一部分。 如果数据比较大,查找了所有被占用块都无法插入,那么将会选择“曾经”插入过数据的空白块进行插入,也就是上图浅灰色部分。如果数据非常大,曾经插入数据的空白块都无法插入,那么只好动用从未被插入过数据的空白块进行插入。当然water mark 也就会“向前”移动。

    但是如果我们在表上使用了 truncate命令,则该表的 HWM 会被重新置为0.

    全表扫描通常要读出直到 HWM 标记的所有的属于该表数据库块,即使该表中没有任何数据。即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大

ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;
SELECT blocks, empty_blocks, num_rows FROM user_tables WHERE table_name = <tablename>; ---说明:BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据

     每个数据块,是否允许插入数据的规则:块头(数据块的头)不在百分比的范围内,当剩余空间大于20%的时候,那这个块就是纳入freelist中,当我要插入一条数据时,freelist是会扫描这个块的,检查其它是否可以存放要插入的数据。当小于20%的这间时,说明这个块已经满了,会从freelist中去掉,插入数据时不作为扫描的对象。一个小于20%空闲的块会从freelist上摘除,那么一个块在什么情况下会被重新挂到freelist上呢?对于一个已经从freelist上摘除的块,可以能由于删除更新操作,其空间会得到释放,当占用空间小于40%时,也就是空闲空间大于60%时,这个块被有认为是空间的块又会被重现挂到freelist上。

   1.4 区间:

是一个数据文件中一组连续编号的ORACLE块。这些区间可能位于构成表空间的任何或所有数据文件中。可以根据段的维度(区间根据每个段连续编号,从零开始)或数据文件的维度(每个区间在一个文件中,从某个ORACLE块编号开头)确定。是Oracle在进行存储空间的分配和回收的最小单位。

  本地区间管理的重要选项 uniform size,如果知道段大小使用uniform size; ORACLE 建议autoallocate

  字典管理转换为本地管理 

execute dbms_space_admin.tablespace_migration_to_local('tablesapcename')

   1.5 段,区间,块和行

    DBA_SEGMENTS

    段的类型:TABLE/INDEX/TYPE2 UNDO/ROLLBACK/TABLE PARTITION/INDEX PARTITION/LOBSEGMENT/LOBINDEX/LOB PARTITION/CLUSTER/NESTED TABLE

        CLUSTER:将多个表反规范化为一个段

        TABLE PARTITION:将表分为多个分区,分区将成为一个个的段,而表本身完全不是段:仅以分区的总和的形式存在。堆表的每个表分区在本身的表段中,成为堆表结构。这些段可能使用不同的表空间,这意味着可以将一个表分布到多个表空间中。

select tablespace_name,file_id,extent_id,block_id,blocks,bytes from dba_extents where owner='SAPR3' and segment_name="T"

alter table TT allocate extent;
alter table TT allocate extent storage (datafile 'filenmae';

select tablespace_name,file_name from dba_data_files where file_id=4;

#DBA_TABLES 也可以查表空间,但只适用于非分区的表,不适用于每个分区都有自己的段而且可能位于不同表空间的分区表。分区允许将一个表分布到多个表空间中。

  1.6 文件存储技术

    本地文件系统

    群集文件系统 OCFS (Oracle cluster file system)

    原始设备

    ASM: 只存储数据库文件,不能存储二进制文件。始终将ORACLE主目录保存在常规文件系统中。

select name,block_size*file_size_blks bytes from v$controlfile;
select member,bytes from v$log join v$logfile using (group#);

select name,bytes from v$datafile
union all 
select name,bytes from v$tempfile;

2.管理表空间

  2.1 创建表空间

    Allocated Size / Space Used / Allocated space used / Allocated free space / status / datafiles / type / extend management / segment management

    Status:Read and Write / Read only / offline

    type : 永久表空间/临时表空间/UNDO

    extent management :LOCAL

    segment management : AUTO 

    Compression: Disabled  / enabled on direct-path INSERT operation only / Enable on all operations

    logging:YEs/ NO

SQL> col name for A10
SQL> set linesize 500
SQL> select t.tablespace_name name,d.allocated,u.used,f.free, t.status,d.cnt, contents,t.extent_management extan,t.SEGMENT_SPACE_MANAGEMENT segman
from dba_tablespaces t,
(select sum(bytes) allocated,count(file_id) cnt from dba_data_files where tablespace_name='TEST') d,
(select sum (bytes) free from dba_free_space where tablespace_name='TEST') f,
(select sum(bytes) used from dba_segments where tablespace_name='TEST') u
where t.tablespace_name='TEST';  

NAME        ALLOCATED        USED       FREE STATUS         CNT CONTENTS           EXTAN      SEGMAN
---------- ---------- ---------- ---------- --------- ---------- --------------------- ---------- ------
TEST        104857600    97058816    6750208 ONLINE           1 PERMANENT           LOCAL      AUTO
create smallfile tablespace "test"
datafile '/opt/oracle/oradata/test91.dbf'
size 100M autoextend on next 10M maxsize 200M
logging
extent management LOCAL autoallocate 
segment SPACE management AUTO
DEFAULT NOCOMPRESS;

    数据文件 v$datafile and dba_data_files

    临时文件v$tempfile and dba_temp_files

    v$tablespace 了解是否为bigfile ,v$temfile and v$datafile 查看文件大小;dba_data_files and dba_temp_files 查看区间管理和段空间管理

  2.2 更改表空间

alter tablespace tablespacename rename to tablespacenewname;

alter tablespace tablespacename offline|online|read only|read write  #只读表空间可以删除

alter database datafile 'filename' resize n[M|GT];
alter tablespace tablespacename add datafile 'filename' autoextend on next 50M maxsize 2G 
ALTER TABLESPACE TEST ADD DATAFILE '/oracle/D4C/oradata/D4CDB/test02.dbf' SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE 2000M;

drop tablespace tablespacename [including content【and datafiles】]

  2.3 OMF Oracle-managed Files

DB_CREATE_FILE_DEST         #指定所有数据文件默认位置 
DB_CREATE_ONLINE_LOG_DEST_1   #指定联机重做日志文件的默认位置
DB_CREATE_ONLINE_LOG_DEST_2
DB_CREATE_ONLINE_LOG_DEST_3
DB_CREATE_ONLINE_LOG_DEST_4
DB_CREATE_ONLINE_LOG_DEST_5
DB_RECOVERY_FILE_DEST    

  2.4警报阈值

      应用于所有表空间的数据库范围的默认设置:

      >85% 警告警报

      >97% 严重警报

  2.5 相关视图

    databse mount 时,可以查看 ‘v$datafile’ & ‘v$tablespace‘ 此时dba_data_files and dba_tabspaces 还没有加载

    

每天进步一点点,多思考,多总结 版权声明:本文为CNblog博主「zaituzhong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文地址:https://www.cnblogs.com/tingxin/p/12541190.html