精华内容
下载资源
问答
  • 显示当前数据库的表空间名称及数据文件 sql> select file_name,...表空间名称、路径、类型、管理方式、区管理方式段管理方式和是否自动增长。 select t1.tablespace_name as "表空间名称"...

    显示当前数据库的表空间名称及数据文件

    sql> select file_name,tablespace_name,bytes/(1024*1024) from dba_data_files;

    显示当前数据库的表空间管理方式

    表空间名称、路径、类型、管理方式、区管理方式、段管理方式和是否自动增长。

    select t1.tablespace_name       as "表空间名称",

           t2.file_name                as "数据文件名",

           t1.contents                 as "类型",

           t1.extent_management      as "管理方式",

           t1.allocation_type          as "区管理方式",

           t1.segment_space_management as "段管理方式",

           t2.autoextensible           as "是否自动扩展",

           t1.status                   as "是否联机"

    from dba_tablespaces t1, dba_data_files t2

    where t1.tablespace_name = t2.tablespace_name

    展开全文
  • 字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT)。DMT是指oracle的空间分配或回收是通过数据库中的数据字典表来记录和管理的。用于管理的两个数据字典表分别是:UET$(used ...

    字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT)。DMT是指oracle的空间分配或回收是通过数据库中的数据字典表来记录和管理的。用于管理的两个数据字典表分别是:UET$(used extents)和FET$(freeextents)。DMT的工作方式是:当建立一个新的段或者段在表空间时,oracle通过一系列的SQL语句来完成这个工作且和前面的两个字典表有关,在繁忙的系统中会造成竞争和等待(另一个DMT会带来的问题是空间碎片)。

    本地管理(Locally Managed Tablespace,LMT):在创建表空间时,在9i的R2版本后成了默认的选项。LMT在表空间的数据文件头部加入了一个位图区域,在其中记录每个extent的使用状况。当extent被使用或者被释放,oracle会更新头部的记录来反映这个变化,不产生回滚信息。因为仅仅操作数据文件头部的几个数据块,不用操作数据字典,LMT比DMT要快,尤其是在繁忙的时候更明显。

    需要注意的是,如果使用“CREATE DATABASE”命令创建数据库,且不显式的加“EXTENT MANAGEMENT LOCAL”子句时,那么在创建完数据库后,其SYSTEM表空间默认为字典管理的表空间。只有SYSTEM表空间为字典管理的表空间时,才可以创建基于字典管理的其它表空间。如果SYSTEM表空间是基于本地管理的,那么无法创建基于字典管理的表空间。

    --查看表空间使用的管理方式:

    SQL> select TABLESPACE_NAME,EXTENT_MANAGEMENT,BLOCK_SIZE,STATUS,CONTENTS,FORCE_LOGGING,BIGFILE from dba_tablespaces;

    TABLESPACE_NAME                EXTENT_MAN BLOCK_SIZE STATUS    CONTENTS  FOR BIG

    ------------------------------ ---------- ---------- --------- --------- --- ---

    SYSTEM                         LOCAL            8192 ONLINE    PERMANENT NO  NO

    UNDOTBS1                       LOCAL            8192 ONLINE    UNDO      NO  NO

    SYSAUX                         LOCAL            8192 ONLINE    PERMANENT NO  NO

    TEMP                           LOCAL            8192 ONLINE    TEMPORARY NO  NO

    USERS                          LOCAL            8192 ONLINE    PERMANENT NO  NO

    EXAMPLE                        LOCAL            8192 ONLINE    PERMANENT NO  NO

    TBS1                           LOCAL            8192 ONLINE    PERMANENT NO  NO

    --DMT 和LMT 的相互转换

    --将字典管理的表空间转换为本地管理

    exec dbms_space_admin.tablespace_migrate_to_local('表空间名')--表空间名用大写

    --将本地管理的表空间转换为字典管理

    exec dbms_space_admin.tablespace_migrate_from_local('表空间名')

    【OCP真题1】 which two statements are true about tablespaces?

    A. A database can contain multiple undo tablespaces.

    B. A database instance stores undo data in the SYSTEM tablespace if no undo tablespace exists.

    C. A database instance hangs if the SYSAUX tablespace becomes unavailable.

    D. A database can contain only a single temporary tablespace.

    E. A database with a locally managed SYSTEM tablespace can have dictionary-managed user tablespaces.

    Answer:AB

    对于C选项,不会hang住。

    对于D选项,一个数据库可以包含多个临时表空间。

    对于E选项,如果系统表空间是基于本地管理的,那么无法创建基于数据字典管理的表空间。

    SYS@ora11g >  create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management directory;

    create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management directory

    *

    ERROR at line 1:

    ORA-25141: invalid EXTENT MANAGEMENT clause

    SYS@ora11g >  create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary;

    create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary

    *

    ERROR at line 1:

    ORA-12913: Cannot create dictionary managed tablespace

    SYS@ora11g >  select extent_management from dba_tablespaces where tablespace_name='SYSTEM';

    EXTENT_MAN

    ----------

    LOCAL

    SYS@ora11g > ! oerr ora 12913

    12913, 00000, "Cannot create dictionary managed tablespace"

    // *Cause: Attemp to create dictionary managed tablespace in database

    //         which has system tablespace as locally managed

    // *Action: Create a locally managed tablespace.

    SYS@ora11g >

    只有SYSTEM为字典管理的表空间时才能创建字典管理的普通表空间:

    [oracle@rhel6lhr ~]$ cat a.txt

    db_name=PROD3

    db_block_size=8192

    db_create_file_dest='/u01/app/oracle/oradata'

    control_files='/u01/app/oracle/oradata/PROD3/control01.ctl'

    sga_target=300m

    [oracle@rhel6lhr ~]$

    [oracle@rhel6lhr ~]$

    [oracle@rhel6lhr ~]$ mkdir /u01/app/oracle/oradata/PROD3

    [oracle@rhel6lhr ~]$

    [oracle@rhel6lhr ~]$ sas

    SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 24 22:41:03 2018

    Copyright (c) 1982, 2011, Oracle.  All rights reserved.

    Connected to an idle instance.

    SYS@orclasm > exit

    Disconnected

    [oracle@rhel6lhr ~]$ ORACLE_SID=PROD3

    [oracle@rhel6lhr ~]$ sas

    SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 24 22:41:17 2018

    Copyright (c) 1982, 2011, Oracle.  All rights reserved.

    Connected to an idle instance.

    SYS@PROD3 > startup nomount pfile='/home/oracle/a.txt';

    ORACLE instance started.

    Total System Global Area  313159680 bytes

    Fixed Size                  2227944 bytes

    Variable Size             113246488 bytes

    Database Buffers          192937984 bytes

    Redo Buffers                4747264 bytes

    SYS@PROD3 >create database PROD3 character set al32utf8;

    Database created.

    /*

    Specify the EXTENT MANAGEMENT LOCAL clause in the CREATE DATABASE statement to create a locally managed SYSTEM tablespace. The COMPATIBLE initialization parameter must be set to 10.0.0 or higher for this statement to be successful.If you do not specify the EXTENT MANAGEMENT LOCAL clause, then by default the database creates a dictionary-managed SYSTEM tablespace.Dictionary-managed tablespaces are deprecated.*/

    SYS@PROD3 > select open_mode from v$database;

    OPEN_MODE

    ----------------------------------------

    READ WRITE

    SYS@PROD3 > create tablespace test_dic datafile '/u01/app/oracle/oradata/ora11g/test_dic01.dbf' size 10m extent management dictionary;

    Tablespace created.

    SYS@PROD3 >

    SYS@PROD3 > SET LINE 120

    SYS@PROD3 >  SELECT  TS.NAME,decode(ts.bitmapped, 0, 'DICTIONARY', 'LOCAL') extent_management FROM SYS.TS$ TS;

    NAME                                                         EXTENT_MANAGEMENT

    ------------------------------------------------------------ --------------------

    SYSTEM                                                       DICTIONARY

    SYSAUX                                                       LOCAL

    SYS_UNDOTS                                                   LOCAL

    TEST_DIC                                                     DICTIONARY

    SYS@PROD3 >

    【OCP真题1】An online tablespace, TEST_TBS, is full and you realize that no server-managed tablespace threshold alerts were generated for the TEST_TBS tablespace. What could be the reason, if the TEST_TBS tablespace does not include autoextensible data files?一个名为测试表空间的联机表空间是满的,你意识到测试表空间表没有生成服务器管理的表空间阈值警报。如果测试表空间不包括自动扩展数据文件,可能是什么原因?

    A. TEST_TBS is a small file tablespace.

    B. TEST_TBS is a bigfile tablespace (BFT).

    C. TEST_TBS is the default temporary tablespace.

    D. TEST_TBS is a dictionary-managed tablespace. TEST_TBS是一个字典管理的表空间。(基于位图的会告警)

    Answer: D

    解释说明:表空间是一个逻辑概念:=> oracle 逻辑概念段区块管理方式:

    number one =》 tablespace

    number two=> segments

    Oracle新建一个对象,产生一个对象,这有啥需要管理的吗? 使用了一个延时段管理;

    所以一般没人会回答表空间的管理是延迟段管理还是非延迟段管理,而是说区的管理方式,就是分配区的方式;

    number three A:如何寻找空闲的区域,给新分配的区,安家落户。

    Oracle区的分配的方式分两种: directory, local 字典、本地管理,字典管理基本被弃用; 那么Oracle分配区的方式有没有更细节的呢? 例如分配一个区,区分给他多大?

    number three B:衍生出,如何对新生成的区,给它分配多大空间,第一种:默认,auto allocative,系统默认分配;第二种uniform size;

    首先解释说明,区的空间大小如何衡量? 区是由连续的块组成,最初是8个块*8192Bytes=64kb ytes/

    *** 相当于看人口,举例,家族迁移;发生战乱,从北方逃难,来到美丽的江西九江,九江的官员毕竟负责,来住可以,先统计人口,判断出,有500多号人,按照8个房间,一个房间住2个人的美好场景=32间房间左右,按照16个房间好管理的方式,分配了两个街道(区),每个街道16个房间(块);

    如果是自动的呢? 官员不负责任,来了500个人,按照每个街道,分配8个房间;需要62个街道分配,分配12次;

    但是官府有一套机制,分配到16个街道之后,官府自动增加分配区的大小,分配第16以后,官府决定大方一点,每个街道(区)分配128间房间,(麻烦,减少工作量)这样最少,也需要分配16个街道*8+ 2-3*128个块的方式分配===》也就是说,最少需要分配18次;

    以上说明:仅限于理解,手动统一分配与自动的区别,实际还存在大量误差,概念可以先理解;

    number four;以上分配空间都说了空间不够,分区;

    如果是已经分配了区,但是Insert 一条数据,它去哪里存储呢?,块在哪里找呢? 段空闲管理方式;

    number four A: manual手工,特征,并不是手动,而是相比较B,显得笨拙;

    特点: 手工段空闲管理,在段的头部,段是逻辑概念,如何真时记录数据,归属于段的一堆块中,前三个块默认,就是管理单位,建立记录了一个free list的列表,存储什么样的数据? 存储记录空闲空间的块的信息;需要使用块时,去空闲列表,读取空闲块;并发访问会导致添加锁,其它事物等待,这种热快容易产生,buffer busy waits热快现象;访问时串行方式

    number four B: auto:默认,我们存储数据,一般是无序的,哪个块有空闲,就往哪个块里面存储数据,正是因为没有顺序,所以访问表的数据,需要全表扫描;

    自动段空闲块管理,采用的方式是在段的头部建立bitmap位图的方式记录块是否空闲,支持并发访问;

    ——————————————————————以上是原理,以下通过视图验证查询---

    number one;

    Aoracle database 11g 默认采用段延迟管理;

    SQL> show parameter seg

    NAME                                 TYPE        VALUE

    ------------------------------------ ----------- ------------------------------

    deferred_segment_creation            boolean     TRUE

    --延迟  段  创建=> ture  false;

    什么是延迟管理,如果你创建的对象没有具体的数据存储,Oracle将不会给你分配存储区域,存储区域的管理是段,不会分配段给你;

    ---创建测试表,只创建表结构,没有数据

    SQL> create table emp1 as select * from emp where 1=2;

    ---查询表的存储,段、区、块、大小

    SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';

    no rows selected

    --插入数据测试

    SQL> insert into emp1 select * from emp where rownum<2;

    --再次查询

    SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';

    SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENT

    EMP1          TABLE              USERS                               .0625        8         1

    ---修改参数,取消延迟段分配管理,创建测试表,查询结果如下;

    ---alter system set deferred_segment_creation=false;

    EMP2     TABLE              USERS                               .0625        8        1

    -------------------------------------------------------------------------------------------------------

    number two

    空闲区的管理方式:数据字典管理与本地管理

    数据字典管理:1.采取两个基表进行管理,free extent记录在数据字典表中的fet$、已经使用的记录在uet$;

    2.当表插入数据,需要存储扩大空间存放数据,都需要访问fet$表,获取信息后;

    3.需要对fet$、以及uet$两张表进行dml更改操作;

    ===》这就造成了,如果数据库中,大量的区扩张时,并发去访问修改以上两张表,消耗资源,等待分配;

    本地管理:位图管理:权利下放,从两张表的权限放到每一个数据文件的手上;

    1.每个表空间对每个数据文件的头部加入一个位图区,记录每个区的使用情况,当存储区发生改变使用或者删除,会对数据文件头部的位图进行修改;

    2.因为如上的方式,回收或者分配,只需要在每个表空间的每个数据文件的数据文件头部进行修改,而且还是修改位图,效率高,并且减少了并发

    --如何查询是表空间是位图管理:本地还是数据字典管理呢?

    SQL> select TABLESPACE_NAME,CONTENTS,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;

    TABLESPA CONTENTS  EXTENT_MAN ALLOCATIO SEGMEN

    -------- --------- ---------- --------- ------

    SYSTEM   PERMANENT DICTIONARY USER      MANUAL

    SYSAUX   PERMANENT LOCAL      SYSTEM    AUTO

    UNDOTBS1 UNDO      LOCAL      SYSTEM    MANUAL

    TEMPTS1  TEMPORARY LOCAL      UNIFORM   MANUAL

    USERS    PERMANENT LOCAL      SYSTEM    MANUAL

    TBS_DICT PERMANENT DICTIONARY USER      MANUAL

    extent_management列:directory代表数据字典,local代表本地位图管理;

    directory已经被放弃选择了,此查询是因为手工艰苦,控制文件脚本修改了:删除了.EXTENT MANAGEMENT LOCAL  表空间本地管理,造成的效果类似,extent management directory;

    .SQL> create tablespace abc datafile '/picclife/app/oracle/abc.dbf' size 10m extent management local/ directory;

    -------------------------------------------------------------

    number three:

    表空间的管理,区分配多大空间:

    首先提取测试环境:scott用户,默认是users表空间,对应的区管理分配的大小:

    ALLOCATION_TYPE=》system 方式,代表系统自动管理,next_extent空值,最小64K/8K=8个块;

    create table t1 as select * from emp;

    select segment_name,extent_id,file_id,block_id,blocks from dba_extents where owner='SCOTT'

    and segment_name='T1';

    SEGMENT_NAME     EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS

    --------------- ---------- ---------- ---------- ----------

    T1                                          0          6       1648          8  ---虽然表中的数据存储,没有占满8个块的区域,但是Oracle最少还是一起分配了一个区8个块;

    insert into t1 select * from t1; --增加数据

    //

    480 rows created.测试

    从第 十七个块,开始,每次分配128个数据块;

    --测试环境查询了一个1G左右的表,是导入进去的,一个区存在;   blocks 8192个数据块;

    成倍增加;

    ALLOCATION_TYPE=》uniform  代表extent的分配方式一致:

    SQL> select tablespace_name,initial_extent,next_extent,min_extents ,max_extents from dba_tablespaces;

    TABLESPA INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS

    -------- -------------- ----------- ----------- -----------

    SYSTEM            16384       16384            1         505

    SYSAUX            65536                             1  2147483645

    TBS_DICT          40960       40960           1         505

    ABC                    65536                            1  2147483645

    YA                       65536                           1  2147483645

    TBSA               1048576     1048576       1  2147483645

    TEMPTS1         1048576     1048576           1

    SQL> select 1048576/1024/1024 from dual;

    1048576/1024/1024 -----------------                 1M

    SQL> select 1048576/8192 from dual;  128个块---

    1048576/8192 ------------          128

    ------------如上查询,tempts1是创建数据库默认选项next_extent对应的是1M大小,128个数据块,Oracle为每个一个区分配一个固定的128个块为单位的一个区;

    SYSTEM=>USER: 代表可以控制next_extent的值:

    SYSTEM   PERMANENT DICTIONARY USER      MANUAL

    TBS_DICT PERMANENT DICTIONARY USER      MANUAL

    --只要区的分配方式是数据字典管理,则区大小的分配就是user模式,代表可以自主分配;

    数据字典,区大小分配方式;

    SQL>  select 40960/8192 from dual;

    40960/8192 ----------                   5           五个块

    SQL> select 40960/1024/1024 from dual;

    40960/1024/1024 ---------------        .0390625      ---实际多大,给多大,是否

    -----------------------------------------------------------------------------------------------------------

    number four :

    以上说的都是如何寻找空闲的区,用来分配,给一个区分配多大空间;

    如今一个现实的问题摆在你面前,直接问你,我爱你你嫁不嫁我,咋整,直接;

    我有一条数据,需要存储,存在哪里?如何寻找:

    来走进块的空闲区域管理:

    段的空闲块管理:segment free block management;

    1.manual

    2.auto

    块什么是空闲? 块分几部分: 块头,存储区域,空闲区域:一般空闲区域预留10%的区域;

    1.manual=> segment header 段的前三个块默认块头部,建立一个free list列表记录空闲的块;

    使用空闲列表,获取空闲块,并发访问free list ,其它insert事物处于等待状态,在segment header block会经常出现buffer busy waits热快事件,访问串行,存储满了之后,移除列表;

    2.auto  =》在segment bitmap标识上可用的空闲块,0空闲1非空闲,支持并发访问;

    SQL> select TABLESPACE_NAME,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;

    TABLESPA SEGMEN -------- ------

    SYSTEM   MANUAL

    SYSAUX   AUTO

    SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSTEM'

    SYSTEM SYS_LOB0000000474C00021$$ LOBSEGMENT                  1               1

    SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSAUX'

    SYSAUX           BSLN_TIMEGROUPS_PK             INDEX

    ------以上为查询:

    语言描述:当数据对象插入数据,假设为manual管理方式,pctfree=20,代表,数据块空间存储达到80%,数据块将被移除空闲列表,随着数据的删除,当数据块的使用百分比低于参数:pctused参数的设置时,加入空闲列表;空闲链表中,竞争压力强大;ASSM管理

    Auto Segment Space Management:

    为了解决上述的问题,通过位图有效快速解决存储扩张和剩余区块free block:改善段的存储管理;

    ASSM管理模式下,insert 通过扫描位图查找可用的Block:

    参数:pctfree还需要,但是低于此数值,也不会从位图删除,而是记录状态,可用为后续的update更改操作保留行数据增长预留使用;

    PCTUSED参数,将被废弃,不需要记录使用百分比;

    FREELIST  FREELIST GROUPS将无效;

    新的管理方式使用位图的机制对块进行追踪,没个块的大小,状态使用了:>75%,50%-75%,25%-50%,<25%,四个状态代替以前的pctused;

    ASSM管理最大优势,位图减轻缓冲区等待,Buffer busy wait热快的产生;

    ORA-12913: 无法创建字典管理的表空间

    jcq0>show user

    USER 为"SYS"

    jcq0>create tablespace dictionary_t

    2  datafile 'D:\Oracle\ORADATA\DB_NAMEX\dict.dbf' size 50M

    3  extent management dictionary

    4  default storage(initial 100k next 100k);

    create tablespace dictionary_t

    *

    ERROR 位于第 1 行:

    ORA-12913: 无法创建字典管理的表空间

    查看错误解释

    ORA-12913 Cannot create dictionary managed tablespace

    Cause: An attempt was made to create a dictionary managed tablespace in a database whose SYSTEM tablespace is locally managed.

    Action: Create a locally managed tablespace.

    该信息告诉我们只能在SYSTEM表空间为字典管理时才能用以上语句创建字典管理的表空间

    3.峰回路转

    突然想到不是有个包可以在本地管理的表空间和字典管理的表空间之间迁移么,之后找到该包

    DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL

    DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL

    看来果然可以,于是马上动手

    jcq0>execute DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('TEST10');

    BEGIN DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('TEST10'); END;

    *

    ERROR 位于第 1 行:

    ORA-12914: 无法将表空间移植到字典管理的类型中

    ORA-06512: 在"SYS.DBMS_SPACE_ADMIN", line 0

    ORA-06512: 在line 1

    ORA-12914 Cannot migrate tablespace to dictionary managed type

    Cause: An attempt was made to migrate a locally managed tablespace to dictionary managed type when the database has a locally managed SYSTEM tablespace.

    Action: Such an operation cannot be issued.

    同样的提示,所以先迁移SYSTEM表空间

    jcq0>execute DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('SYSTEM');

    BEGIN DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('SYSTEM'); END;

    *

    ERROR 位于第 1 行:

    ORA-03251: 无法在 SYSTEM 表空间上提交此命令

    ORA-06512: 在"SYS.DBMS_SPACE_ADMIN", line 0

    ORA-06512: 在line 1

    ORA-03251 Cannot issue this command on SYSTEM tablespace

    Cause: It is not permitted to migrate SYSTEM tablespace from locally managed format to dictionarymanaged format or relocate bitmaps.

    Action: Check the tablespace name and procedure name.

    4.回到原点

    翻到doc对该过程的说明可以得到同样的解释

    The tablespace must be kept online and read/write during migration. Migration of temporarytablespaces and migration of SYSTEM tablespaces are not supported.

    5.结论

    如果你想在SYSTEM为本地管理表空间的数据库上建立字典管理的表空间,那么答案是 no way!!!

    Oracle的物理结构和逻辑结构的关系

    Oracle不会直接操作底层操作系统的数据文件,而是提供了一个中间层,这个中间层就是Oracle的逻辑结构,它与操作系统的平台无关,中间层(逻辑结构)到数据文件(物理结构)的映射通过DBMS来完成。一个数据库有一个或多个表空间,一个表空间有一个或多个段,一个段有一个或多个区间组成、一个区间由一个或多个数据库块组成、一个数据库块由一个或多个操作系统块组成;一个表空间物理上由一个或多个数据文件组成,一个数据文件物理上由一个或多个操作系统块组成。

    表空间的分类

    在一个数据库中表空间的数量没有严格的限制。有几个表空间是Oracle数据库必备的,它们是system,temporary,undo,user,oracle 10g以后还有sysaux表空间。

    Oracle数据库的表空间分为两类:系统表空间和非系统表空间。

    表空间的区间管理

    表空间的管理其实就是分配可用区间和回收空闲区间的过程,Oracle提供了两种表空间区间管理的方法,一种是数据字典管理、一种是本地管理。

    数据字典管理方式是将每个表空间的使用情况记录在数据字典表中,当分配或撤销表空间区段的时,隐含使用SQL语句记录当前表空间的使用情况,并在撤销段中记录以前区段的使用情况,这种操作方式增加了数据字典的频繁操作,对于一个大型的数据库系统,这样的系统效率会非常的低下。

    为了解决数据字典管理表空间效率不高的问题,Oracle设计让每一个表空间自己管理表空间区段的分配,记录区段的使用情况。在数据文件头中有一个区域用于存储本地管理的表空间的数据文件的空间信息,将表空间中数据文件的可用和已用空间信息记录下来。本地管理的方式使用位图在数据文件头中记录数据文件的已用和可用信息,位图使用一个数据位表示一个数据块或者一组数据库块的使用情况,而表空间的最小分配单位就是区段extent,一个区段由多个数据库块组成,所以当需要在表空间中增加新的对象时,就需要查找位图,看是否有一段连续的Oracle数据库空闲。

    表空间的创建

    表空间的创建语法为:

    CREATE [ BIGFILE | SMALLFILE ] [ TEMPORARY ] [ UNDO ] TABLESPACE tablespace name  //

    DATAFILE datafile spec | TEMPORARY tempfile spec

    [ MINIMUM EXTENT minimum extend size ]//定义该表空间中最小中最小区段大小,这样该表空间中的区段大小为最小值的整数倍

    [ BLOCKSIZE blockszie ]

    [ [ COMPRESS | NOCOMPRESS ] DEFAULT STORAGE (default storage clause) ]

    [ LOGGING | NOLOGGING ]//是否把该表空间中数据的变化记录在重做日志文件中

    [ FORCE LOGGING ]

    [ ONLINE | OFFLINE ]//表空间创建后是否联机

    [ EXTENT MANAGEMENT DICTIONARY | LOCAL [ AUTOALLOCATE | UNIFORM SIZE size ] ]//表空间的管理方式:数据字典管理或本地管理

    [ SEGMENT SPACE MANAGEMENT MANUAL | AUTO ]

    [ FLASHBACK ON | OFF ]

    示例一:

    SQL> create tablespace demotbs

    2  datafile '/u01/app/oracle/oradata/testdb/test01.dbf' size 10m;

    Tablespace created.

    示例二:

    无法创建基于数据字典管理的表空间问题

    SQL> create tablespace dic_management_tbs

    2  datafile '/u01/app/oracle/oradata/testdb/test02.dbf' size 10m

    3  extent management dictionary;

    create tablespace dic_management_tbs

    *

    ERROR at line 1:

    ORA-12913: Cannot create dictionary managed tablespace

    原因是因为:如果系统表空间是基于本地管理的,则无法创建基于数据字典管理的表空间,看见基于数据字典管理表空间的方式已经成为历史了。

    SQL> select extent_management from dba_tablespaces where tablespace_name='SYSTEM';

    EXTENT_MAN

    ----------

    LOCAL

    展开全文
  • 本地管理师表空间的默认空间管理方法。当使用本地管理方式时,oracle使用位图维护空闲的信息。本地管理表空间有以下优点: ...因为本地管理表空间的空闲空间被记录在数据文件位图上,所以分配释放...

     

    本地管理师表空间的默认空间管理方法。当使用本地管理方式时,oracle使用位图维护空闲区的信息。本地管理表空间有以下优点:

    • 避免了递归的空间管理操作。在数据字典管理表空间上分配和释放区会导致访问undo段和数据字典基表,而在本地管理表空间上分配和释放区只需要修改其数据文件上的相应位图值。
    • 降低了数据字典基表冲突。因为本地管理表空间的空闲空间被记录在数据文件位图上,所以分配和释放区不需要访问数据字典基表。
    • 不需要合并空间碎片。本地管理表空间会自动跟踪合并相邻空闲空间,而字典管理表空间则需要定期合并空间碎片。

    1.使用uniform选项指定区尺寸

    uniform选项用于指定使用相同区尺寸建立表空间,默认尺寸是1m。如果设置其他尺寸,那么需要指定size选项。

    例子:建立表空间data01和data02:

    sqlplus sys/sys as sysdba;
    host mkdir d:\orcl
    create tablespace data01
    datafile 'd:\orcl\data01.bdf' size 10m uniform;
    create tablespace data02
    datafile 'd:\orcl\data02.bdf' size 10m uniform  size 256k ;

    2.使用autoallocate

    autoallocate选项用于指定尺寸由系统自动分配,如果在建立表空间时不指定autoallocate或者unifom,那么默认分配为autoallocate。

    例子:

    create tablespace data03
    datafile 'd:\orcl\data03.dbf' size 10m;
    create tablespace data04 
    datafile 'd:\orcl\data04.dbf' size 10m autoallocate;

     

     

     

    转载于:https://www.cnblogs.com/zhaojiedi1992/archive/2013/05/21/oracle11g_sql_0042.html

    展开全文
  • 详细描述全扫描是如何完成(只描述I/O相关) I. 头:在头读取两样信息:高高水点、Extent Map(地图)(Auxillary Map) II. 根据头中Auxillary Map,依次读每个区的数据。 23、描述索引Index ...

    1.补充--关于dba_objects中的 DATA_OBJECT_ID 和OBJECT_ID字段:

    truncate table test1;

    alter table test1 move tablespace tp2;

    select object_id,data_object_id from dba_objects where object_name='TEST1';

    OBJECT_ID DATA_OBJECT_ID

    ---------- --------------

         22959          23144

    truncate和移动到不同表空间时DATA_OBJECT_ID会变化。

    但是当表内无数据时,truncate不会导致DATA_OBJECT_ID会加一。


     2.各种数据读取方式涉及的I/O

    详细描述全表扫描是如何完成的(只描述I/O相关)

    I. 从数据字典dba_segments找到 段头,

    段头:在段头读取两样信息:高高水点、Extent Map(区地图)(Auxillary Map)

    II. 根据段头中的Auxillary Map,依次读每个区的数据。


    描述索引Index RANGE SCAN的流程
    Root块的块号=索引段段头块号+1
    I. 查找seg$等数据字典,确定索引段段头位置
    II. 段头块号加1,得到Root块

    描述索引Index Full SCAN的流程
    等于索引范围扫描
    有序,为了“顺序”,不能多块读

    索引Index Fast Full SCAN的流程
    等同于表的全扫描
    I. 段头:在段头读取两样信息:高高水点、Extent Map(区地图)(Auxillary Map)
    II. 根据段头中的Auxillary Map,依次读每个区的数据。

    无序,可以多块读

    3.打开闪回时DROP和TRUNCATE的不同块管理

    未打开闪回时没有不同。
    TRUNCATE和DROP-打开闪回时,具体做了哪些操作???
    DROP-打开闪回时:改数据字典表中相应字段tab$,seg$,ext$,col$,将表系统命名bin$开头的,空间并未释放。打开闪回时此时查询可用区的方法是全部扫描位图区。附带会有删除索引约束触发器等,也可能会慢。
    此时,可以查询到闪回DROP之前的数据。
    TRUNCATE :修改表所有区对应的二进制位--位图区变为1变为0

    实验一:

    使用游标,exec open :x时先进行解析,print :x时提取数据
    BYS@ bys3>var x refcursor
    BYS@ bys3>exec open :x for select count(*) from test6;
    PL/SQL procedure successfully completed.
    BYS@ bys3>print :x
      COUNT(*)
    ----------
             2
    BYS@ bys3>exec open :x for select count(*) from test6;
    PL/SQL procedure successfully completed.

    此时在会话2执行BYS@ bys3>drop table test6;
    在会话1查看游标
    BYS@ bys3>print :x
      COUNT(*)
    ----------
             2
    因为开启回收站时,DROP 表只是将表改名-修改数据字典表tab$,seg$,ext$,在数据文件中并未改变数据块头OBJ的、标记,所以可以查到
    #######

    实验二:

    会话2把表闪回DROP
    BYS@ bys3>flashback table test6 to before drop;
    Flashback complete.

    会话一:执行游标:
    BYS@ bys3>exec open :x for select count(*) from test6;
    PL/SQL procedure successfully completed.

    会话二:
    BYS@ bys3>truncate table test6;
    Table truncated.
    会话一:查询游标
    BYS@ bys3>print :x
    ERROR:
    ORA-08103: object no longer exists
    no rows selected
    报错是因为:TRUNCATE删除数据,修改数据字典表,同时将数据块头的OBJ清除,所以查询时报对象不存在。



    展开全文
  • 对于oracle数据库最小i/0单位是数据块,最想分配空间单位是,对于表空间的管理其实是对管理,在8i之前采用数据字典管理表空间 ,通过uet$fet$进行管理。可是从8i开始引入了本地管理表空间方式(LMT),以此...
  • ORACLE表空间是一个逻辑容器,包含一个或多个数据文件。表空间包含(segment)、又包含(extent)...获取已有表空间的DDL查看表空间管理方式,可以用下面的语句获得建立表空间的DDL,也可以用数据泵工具导出sys@A
  • 17->管理表空间

    2017-04-13 17:16:00
    一表空间概念 表空间可以指定多个数据文件(datafile) 数据文件中可以存储...二 表空间的管理方式 由于发出sql语句对数据的修改 都会涉及到表空间中空间的分配释放 数据库需要动态的知道某个时间某个...
  • oracle 表空间管理

    2010-12-03 14:01:00
    表空间是ORACLE数据库最高层次逻辑存储结构,保存、块,由一个或多个数据文件组成。 块存储管理 块是ORACLE存储结构最小单位。块大小分为标准数据块非标准数据块 标准数据块由DB...
  • **实验目的:**理解Oracle表空间的作用,掌握Oracle数据库永久、临时和...查看数据库内各个表空间及其类型,以及它们管理方式、分配类型和段空间管理方法: select tablespace_name,contents,extent_management,all
  • 今天是2013-12-16,今天我收到一个消息,在大约5月7号左右接到了杨廷琨... 今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记。  对于oracle数据库最小i/0单位是数据块,最想分配空间单位是,对于表空间
  • 表空间2.1 表空间类型2.2 管理方式3. 、块关系3.1 segment3.2 extent 1. 数据库存储结构 逻辑结构—————物理结构 物理结构 不同类型数据文件,数据文件是真实存在 逻辑结构 数据库为数据库...
  • 本文内容 创建永久表空间 查看表空间 扩展表空间 参考资料 创建永久表空间 Oracle 按照区和段空间进行管理表空间区管理方式 - 针对区分配方式不同,有两种方式:字典管理方式(dictionary-managed tablespace...
  • 分段存储管理方式的引入 ■为满足用户程序员下述需要: ●方便编程 ●信息共享 ●信息保护 ●动态增长 ●动态链接 分段系统基本原理 1.分段: ●逻辑地址空间分段,各长度不等。 ●每个均有名或段号,且从...
  • Oracle体系结构逻辑存储结构(扩展)数据块数据区段数据索引回滚临时段表空间集中默认创建的表空间SYSTEM表空间SYSAUX表空间UNDO表空间USERS表空间TEMP表空间注意物理存储结构(扩展)主要文件数据文件表空间...
  • o 理解数据库逻辑存储结构o 管理表空间和数据文件o 管理控制文件o 管理重做日志文件o Block(块...永久性表空间,临时表空间,撤销表空间表空间管理方式:字典管理方式和本地管理方式(默认)区分配方式:自动分配(默...
  • oracle数据库存储管理

    2015-05-10 23:14:23
    o 理解数据库逻辑存储结构 o 管理表空间和数据文件 o 管理控制文件 o 管理重做日志文件 o Block(块)最基本存储单元 o Extent()一次分配连续块 ...表空间管理方式:字
  • Oracle-Oracle数据库逻辑存储结构管理

    千次阅读 2019-06-21 21:34:54
    下面通过一些简单的例子来熟悉一下Oracle数据库表空间的管理数据库表空间不同状态时对数据操作的影响。 (1)为BOOKSALES数据库创建一个名为BOOKTBS1的永久性表空间,采用自动扩展方式,采用自动管理方式。 ...
  • 6.2.9 主动的表空间的空间预警 178 6.2.10 管理重做数据的生成 180 6.2.11 重新命名表空间 180 6.2.12 只读表空间 181 6.2.13 使表空间脱机 181 6.3 临时表空间 181 6.3.1 创建临时表空间 182 6.3.2...
  • 4.9 保护 SYSTEM 表空间的三种简单 方法 4.10 为什么必须保护 ORACLE_HOME 4.11 保护操作系统 4.12 如何保护回退 4.13 分类划分数据 4.14 划分表空间的优先次序 4.15 如何配置高可用性的 TEMP 表空间 ...
  • 7.6 Oracle 10gR2使用RMAN恢复临时表空间的增强 360 7.7 临时表空间过度扩展的问题解决 361 7.8 从V$SORT_USAGE到V$TEMPSEG_USAGE 363 7.9 临时文件file#db_files的关系 364 7.10 LOB对象与临时 365 ...
  • c语言中内存管理,函数在内存中堆申请一些内存空间去(程序运行过程动态分配,链表的方式由程序员自己去管理)。 内存五大区域:1栈 2堆(程序运行) 3bss (没有初始化全局变量局部变
  • 如果一张表放在一个单独表空间,则放数据、索引插入缓冲页)2、(数据为叶子节点,索引为非叶子节点)3、(由连续页组成,1个1MB)4、页(InnoDB磁盘管理的最小单位)三、InnoDB行记录格式 表 一、索引组织表 ...
  • 目录 推荐序 前言 第1章 认识Oracle RAC ...15.3.6 UNDO表空间的调整 15.4应用系统 15.4.1应用拆分 15.4.2 SQL执行过程 15.4.3 SQL解析 15.4.4 SQL优化 15.4.5 SQL行源生成 15.4.6 SQL执行 15.5本章小结
  • 网钛文章管理系统

    2012-12-22 10:02:44
    1、支持自定义文章路径,使其他系统数据转移到网钛文章管理系统中,文章路径可保持不变,不影响网站已被搜索引擎收录数量排名; 2、支持仿OK3W文章系统路径 3、支持仿老Y文章系统路径 4、支持其他大...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 274
精华内容 109
关键字:

表空间的区管理方式和段管理方式