zoukankan      html  css  js  c++  java
  • [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 版权协议,转载请附上原文出处链接及本声明。
  • 相关阅读:
    使用 Dockerfile 定制镜像
    UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)
    UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)
    LeetCode Best Time to Buy and Sell Stock 买卖股票的最佳时机 (DP)
    LeetCode Number of Islands 岛的数量(DFS,BFS)
    LeetCode Triangle 三角形(最短路)
    LeetCode Swap Nodes in Pairs 交换结点对(单链表)
    LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)
    HDU 5312 Sequence (规律题)
    LeetCode Letter Combinations of a Phone Number 电话号码组合
  • 原文地址:https://www.cnblogs.com/tingxin/p/12541190.html
Copyright © 2011-2022 走看看