oracle存储架构

database数据库--tablespaces表空间--segments段--exents区--blocks块

本节非常重要!!!!

一、表空间

permanent 永久表空间 system表空间

undo 撤销表空间

temporary 临时表空间

1.1表空间管理方式

段的管理方式和区的管理方式是建立在表空间时确定的,后续不可更改

段管理方式有auto、manual两种,区管理方式有本地管理字典管理(已淘汰)两种

查询当前表空间段区及其管理方式

SQL> select tablespace_name,contents,extent_management,segment_space_management from dba_tablespaces;

TABLESPACE_NAME                CONTENTS              EXTENT_MAN SEGMEN
------------------------------ --------------------- ---------- ------
SYSTEM                         PERMANENT             LOCAL      MANUAL
SYSAUX                         PERMANENT             LOCAL      AUTO
UNDOTBS1                       UNDO                  LOCAL      MANUAL
TEMP                           TEMPORARY             LOCAL      MANUAL
USERS                          PERMANENT             LOCAL      AUTO
A                              PERMANENT             LOCAL      AUTO
B                              PERMANENT             LOCAL      MANUAL
BIG_TBS                        PERMANENT             LOCAL      AUTO

8 rows selected.

注:

如果system表空间时数据字典管理,其他表空间可以是数据字典管理也可以是本地管理(默认)

(只有system表空间为字典方式管理,其他表空间才有机会被设置为字典管理;若system表空间是本地管理,其他表空间一定是本地管理)

字典管理可以转换成本地管理,但是对于系统表空间,要执行一些附加步骤(步骤如下)

execute dbms_space_admin.tablespace_migragte_to_local('tablespace');

1.2表和表空间的关系

以默认方式创建表空间

SQL> create tablespace a datafile '/u01/app/oracle/oradata/SINGLE04/a01.dbf' size 10m;

Tablespace created.

调oracle提供的dbms_metadata.get_ddl包查看具体的缺省值

SQL> set serverout on;

SQL> declare
  2  aa varchar2(2000);
  3  begin
  4  select dbms_metadata.get_ddl('TABLESPACE','A') into aa from dual;
  5  dbms_output.put_line(aa);
  6  end;
  7  /

  CREATE TABLESPACE "A" DATAFILE
  '/u01/app/oracle/oradata/SINGLE04/a01.dbf' SIZE 10485760
  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
 NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO

PL/SQL procedure successfully completed.

解释:本地方式管理区,默认自动分配;自动方式管理段。

上面的表空间一经确认,就会固定,不可以后期更改

当我不按默认方式创建时

SQL> create tablespace b datafile '/u01/app/oracle/oradata/SINGLE04/b01.dbf' size 10m extent management local uniform size 128k segment space management manual;

Tablespace created.

128k是个区,

auto模式下,一开始一个区的大小是64k,8个块8个块的一次分配,越往后可能越大。

uniform模式下,指定好就按128k给一个区 

注:建表时可以指定区段管理方式,若使用缺省值则该表将服从其所属表空间的区段管理方式

创建表时指定表空间

SQL> create table test0809(id int) tablespace a;

Table created.

给用户授权操作表空间的权限

SQL> grant unlimited tablespace to tim;

Grant succeeded.

1.3删除表空间

下面四种表空间open下不能删

  • system表空间
  • active undo表空间
  • 默认临时表空间(可以有好几个,但是只有一个是激活状态的)
  • 默认表空间

下面3中表空间open下不能offline

  • system
  • active undo表空间
  • 默认临时表空间

查看表空间空闲大小

SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;

TABLESPACE_NAME                SUM(BYTES)/1024/1024
------------------------------ --------------------
SYSTEM                                       7.3125
SYSAUX                                      32.5625
UNDOTBS1                                     281.75
B                                                 9
A                                                 9
USERS                                        2.3125

注:sysaux就是sys

1.4 大文件与小文件

小文件:一个表空间里面可以有多个数据文件,便于扩充

大文件:只能建立一个数据文件,需要使用标准快(8k的block,datafile maxsize可以是32T)

rman备份放在不同的通道。

简化管理:一个表空间对应一个数据文件

SQL> create bigfile tablespace big_tbs datafile '/u01/app/oracle/oradata/SINGLE04/bigtbs01.dbf' size 100m;

Tablespace created.

检查是否创建成功

SQL> select name,bigfile from v$tablespace;

NAME                           BIG
------------------------------ ---
SYSAUX                         NO
SYSTEM                         NO
UNDOTBS1                       NO
USERS                          NO
TEMP                           NO
A                              NO
B                              NO
BIG_TBS                        YES

向大文件表空间增加一个数据文件

SQL> alter tablespace big_tbs add datafile '/u01/app/oracle/oradata/SINGLE04/bigtbs02.dbf' size 100m;
alter tablespace big_tbs add datafile '/u01/app/oracle/oradata/SINGLE04/bigtbs02.dbf' size 100m
*
ERROR at line 1:
ORA-32771: cannot add file to bigfile tablespace

二、段segment

2.1特点:

  • 表空间可以对应多个段,物理上对应多个数据文件,当一个段比较大的时候可以对应多个数据文件
  • 创建一个模式对象(一个用户下面创建了一个表)时,oracle为这个对象创建一个(或多个)段,在这个段中保存该对象的所有数据(对象不可以跨段),段表一一对应
  • 段中至少有一个初始区。当段数据增加使区不够用时,将为这个段配新的区

解释:段可以简单理解成表,当一个段足够大时,该数据文件剩余空间不够,可以写完后在新的数据文件去书写,于是这个表就在两个数据文件上。一个段里面有多个区,一个区里面有多个块

段管理方式

1)自动管理方式(asm)。auto

每个段的段头都有一组位图(5个位图),位图描述每个块的满度,根据满度的不同将每个块对应到相应的位图上,位图自动跟踪每个块的使用空间,这5个位图的满度如下定义:一个位图位于满块,其余4个位图分别用于75%-100%,50%-75%,25%-50%,0-25%。比如块大小为8k,若要插入一行是3k的表行,那么oracle就给对应到满度为25%-50%的位图指定的块上去

2)手动管理方式MSSM Manual Segment Space Management  manual

采用空闲列表(freelist)管理段的存储空间

传统方法,仍在使用,未被淘汰,保留pctfree和pctused属性。pctfree中数据可以被插入。

段管理方式只在创建表空间时设置,一经确定不能改变。

缺省状态为自动管理方式,

assm的前提是extent management local

2.2表和段的关系

一般而言,一个单纯的表,分配一个段。但是表上经常会有主键约束,那么就会有索引,索引有索引段,还有分区表,每个分区会有独立的段,再有就是oracle的大对象,若是表里面引用blob,clob,那这个表就又被分区多个段来。

创建新用户,并赋予权限

SQL> conn / as sysdba
Connected.

SQL> create user tim identified by tim;

User created.

SQL> grant connect,resource to tim;

Grant succeeded.

查看参数deferred_segment_creation

SQL> show parameter DEFERRED_SEGMENT_CREATION;

NAME                                 TYPE       VALUE
------------------------------------ -----------------------------------------
deferred_segment_creation            boolean    TRUE

注:该参数值为true时,create table并不会马上分配segment,当第一个insert语句才开始分配segment。

赋予用户tim插入表数据的权限,并连接tim用户

SQL> grant unlimited tablespace to tim;

Grant succeeded.

SQL> conn tim/tim;
Connected.

创建简单表,插入数据,并查看所创建段

SQL> create table test080902 (x int);

Table created.

SQL> insert into test080902 values (1);

1 row created.

SQL> select segment_name from user_segments;

SEGMENT_NAME
----------------------------------------------------------------------
TEST080902

创建复杂表,插入数据,并查看生成段

SQL> create table test080903 (x int primary key,b blob,c clob);

Table created.

SQL> insert into test080903 values(1,'2','3');

1 row created.

SQL> select segment_name from user_segments;

SEGMENT_NAME
----------------------------------------------------------------------
SYS_C007542 #创建主键约束产生的段
SYS_IL0000073272C00002$$
SYS_IL0000073272C00003$$
SYS_LOB0000073272C00002$$
SYS_LOB0000073272C00003$$
TEST080902
TEST080903

每创建索引时,会增加一个段,每创建一个clob对象或blob时,会增加两个段。

注:

也可以使用局部设置改变插入数据才创建段的功能,在create table时指定segment creation子句指定。如:

create table tim.t1(x int,name char(10) segment creation immediate tablespace a)

create table tim.t2(x int) segment creation deffered;

三、区

3.1特点

区是oracle进行存储空间分配的最小单位。是由一系列逻辑上连续的oracle数据块组成的逻辑存储结构。段中第一个区叫初始区,随后分配的区叫后续区。当段中所有的区空间使用完后,oracle自动为该段分配新的区。

3.2区管理方式

1)字典管理:在数据字典中管理表空间的区空间分配。

缺点:某些在字典管理方式下的存储分配有时会产生递归操作,并且容易产生碎片,从而影响系统性能。已经淘汰

2)本地管理:

在每个数据文件中使用位图管理空间的分配。表空间中所有区(extent)的分配信息都保存在该表空间对应的数据文件的头部。

优点:速度快,存储空间的分配和回收只简单改变数据文件中的位图,而不像字典管理需要修改数据库。无碎片,易于维护。

3.3 表和区的关系

当建立表的时候建立段,然后自动分配相应的extent(1个或者多个),或者手工提前分配extent(当需要大量插入数据的表)

3.4查看段的初始区分配情况

1)创建表空间和表

SQL> create tablespace c datafile '/u01/app/oracle/oradata/SINGLE04/c01.dbf' size 10m;

Tablespace created.

SQL> create table tim.test080904 tablespace c as select * from v$session;

Table created.

2)查看区的分配情况

SQL> select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='TEST080904';

SEGMENT_NAME            FILE_ID  EXTENT_ID      BYTES
-------------------- ---------- ---------- ----------
TEST080904                    9          0      65536

可以看到初始区id为0,所属数据文件号为9,大小65536bytes

3)向表中插入更多的数据并查看分区情况

SQL> INSERT into tim.test080904 select * from tim.test080904;

57 rows created.

SQL> select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='TEST080904';

SEGMENT_NAME            FILE_ID  EXTENT_ID      BYTES
-------------------- ---------- ---------- ----------
TEST080904                    9          0      65536
TEST080904                    9          1      65536

可以发现该插入操作产生了一个新的区,区id为1

4)删除表空间并查看分区情况

SQL> delete tim.test080904;

114 rows deleted.

SQL>  select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='TEST080904';

SEGMENT_NAME            FILE_ID  EXTENT_ID      BYTES
-------------------- ---------- ---------- ----------
TEST080904                    9          0      65536
TEST080904                    9          1      65536

可知表删除操作不能删除表空间中的分区情况

5)可以预分配表空间中的区,但是size不超过表空间的剩余可用空间

SQL> alter table tim.test080904 allocate extent (datafile '/u01/app/oracle/oradata/SINGLE04/c01.dbf' size 5m);

Table altered.

SQL>  select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='TEST080904';

SEGMENT_NAME            FILE_ID  EXTENT_ID      BYTES
-------------------- ---------- ---------- ----------
TEST080904                    9          0      65536
TEST080904                    9          1      65536
TEST080904                    9          2    1048576
TEST080904                    9          3    1048576
TEST080904                    9          4    1048576
TEST080904                    9          5    1048576
TEST080904                    9          6    1048576

可以发现区自动分配,每个区size = 1m

6)回收未使用的extent

SQL> alter table tim.test080904 deallocate unused;

Table altered.

SQL>  select segment_name,file_id,extent_id,bytes from dba_extents where segment_name='TEST080904';

SEGMENT_NAME            FILE_ID  EXTENT_ID      BYTES
-------------------- ---------- ---------- ----------
TEST080904                    9          0      65536
TEST080904                    9          1      65536

检查发现刚刚分配的,未使用过的区已经被回收

7)查看该表对应的数据文件和表空间

SQL> select file_id,file_name,tablespace_name from dba_data_files;

   FILE_ID FILE_NAME                                          TABLESPACE_NAME
---------- -------------------------------------------------- --------------------
         1 /u01/app/oracle/oradata/SINGLE04/system01.dbf      SYSTEM
         3 /u01/app/oracle/oradata/SINGLE04/sysaux01.dbf      SYSAUX
         2 /u01/app/oracle/oradata/SINGLE04/undotbs01.dbf     UNDOTBS1
         7 /u01/app/oracle/oradata/SINGLE04/users01.dbf       USERS
         5 /u01/app/oracle/oradata/SINGLE04/a01.dbf           A
         4 /u01/app/oracle/oradata/SINGLE04/b01.dbf           B
         8 /u01/app/oracle/oradata/SINGLE04/bigtbs01.dbf      BIG_TBS
         9 /u01/app/oracle/oradata/SINGLE04/c01.dbf           C

dab_data_files中的file_id和dba_extents中的file_id保持一致,是物理上的数据文件的编号

四、数据块block

4.1特点

块是oracle进行存储空间IO操作最小的单位,block的管理方法是区的管理和段管理的具体体现

  • 自动管理方式  若区为本地管理,段为auto增加(ASSM),该表空间的所有快均是位图自动管理方式。系统默认
  • 空闲列表方式(MSSM)  引入freelist,用pctfree,pctused两个参数控制可用存储区的大小,避免行迁移发生。这两个参数可在创建表空间时指定,也可以在建立数据库模式对象(表,索引)时设置。模式对象设置的优先级高于表空间设置。即:若表和索引中没有设置,则按表空间的设置,否则按系统默认的自动管理方式管理块

data block:block header+free space+data,标准8k,支持2-32k

block header

ITL:事务槽,可以有多个ITL以支持并发事务,每当一个事务需要修改数据块里面的数据时,必须先得到一个ITL,一遍存储当前事务的id,事务所用的undo数据块地址,scn,当前事务是否提交等信息。

initrans:初始化事务槽个数,表默认1,index默认2

maxtrans:最大的事物槽个数(默认255)

row dir:行目录,指向空闲起始和结束的偏移量

注:使块头增加的可能情况是,row enries增加,并发率变高增加更多的ITL空间

空闲表方式的数据块管理

freelist:空闲列表中登记了可以插入数据的可用块,记录于段头,插入表行数据时首先查找该列表

pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从freelist清除该块信息。

pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息加入freelist。这个参数在assm下不使用

行链接:指一行存储在多块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。

行迁移:指一个数据行由于update语句导致当前块被重新定位到另外一个块(那里有充足空间),但在原始块中保留一个指针的情形。原始块中的指针是必须的,因为索引的row id指向原位置。行迁移是update语句引起,与insert和delete无关。

 如何知道发生了行迁移或行链接?

查看dba_tables的AVG_ROW_LEN列和CHAIN_CNT列,当CHAIN_CNT有值时,说明发生了行迁移或行链接,看AVG_ROW_LEN,他表示行的平均长度,单位bytes,如果AVG_ROW_LEN《块,则行迁移,若》块大小,则行链接。

SQL> create table test0810(c1 varchar2(20));

Table created.

SQL> begin
  2  for i in 1..1000 loop
  3  insert into test0810 values(i);
  4  end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL> analyze table test0810 compute statistics;

Table analyzed.

SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='TEST0810';

  PCT_FREE   PCT_USED AVG_ROW_LEN  CHAIN_CNT
---------- ---------- ----------- ----------
        10         40           7          0

SQL> update test0810 set c1='timran is my name';

1000 rows updated.

SQL> analyze table  test0810 compute statistics;

Table analyzed.

SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='TEST0810';

  PCT_FREE   PCT_USED AVG_ROW_LEN  CHAIN_CNT
---------- ---------- ----------- ----------
        10         40          26        863

SQL> alter table test0810 move;

Table altered.

SQL> analyze table test0810 compute statistics;

Table analyzed.

SQL> select pct_free,pct_used,avg_row_len,chain_cnt from user_tables where table_name='TEST0810';

  PCT_FREE   PCT_USED AVG_ROW_LEN  CHAIN_CNT
---------- ---------- ----------- ----------
        10         40          21          0

对于大部分目的而言,应该用dbms_stats包中的过程分析表,但是若要查看行链接或者行迁移信息,只能通过analyze命令检测

4.2 表和块的关系

1)什么是高水位线?

高水位线:high water mark HWM

在数据库中,高水位线是曾经包含了最新数据的块。原则上HWM只会增大,及时将表中的数据全部删除,HWM也不会降低。(若数据块是以堆的方式插入数据,那么最新的数据将在堆的最高点,HWM是堆曾经的最高点)

使用全表扫描时需要读出HWM以下的所有数据块,即使表中仅有少量的数据块,这将占用大量IO资源。

2)解决方法如下:

2.1)异动表,move法,将表从一个表空间移动到另一个表空间(也可以在本表空间内move),可以清楚表里面的碎片。

alter table test0810 move [tablespace users];

优点:可以清除表中的碎片,降低高水位线。

缺点:move需要额外一倍的空间

           move过程会锁表,其他用户不可以在该表上做ddl和dml操作。

           move之后,索引不可用,需要重新创建索引

2.2)收缩表 shrink ,也叫段重组。底层实现是通过insert和delete操作。

两个阶段:压缩阶段+ddl阶段

alter table test0810 shrink space [cascade][compact]

前提

  • 段管理方式采用assm,因为只有assm使用位图管理才会记录快满度信息
  • 表启用了row movement

步骤

执行下面语句,只完成了第一阶段-----收缩阶段,可以在业务高峰时完成这个任务

alter table test0810 shrink space compact

高峰期后,执行下面语句;因压缩阶段大部分工作已经完成,很快进入第二阶段,dml操作会有短暂的锁等待时间。

alter table test0810 shrink space

实践

sys创建表空间和创建表

SQL> create tablespace e datafile '/u01/app/oracle/oradata/SINGLE04/e01.dbf' size 100m;

Tablespace created.

SQL> create table tim.test081002 tablespace e as select * from dba_objects;

Table created.

连接tim用户,查询blocks

SQL> conn tim/tim;
Connected.
SQL> select max(rownum) from test081002;

MAX(ROWNUM)
-----------
      72441

SQL> select table_name,blocks,empty_blocks,num_rows from user_tables where table_name='TEST081002';

TABLE_NAME   BLOCKS EMPTY_BLOCKS   NUM_ROWS
------------------- -------------- ----------
TEST081002   1439   0              72441

SQL> analyze table test081002 compute statistics;

Table analyzed.

删除40000行数据并查询块大小,发现数据块并没有变化

SQL> delete test081002 where rownum<40000;

39999 rows deleted.

SQL> commit;

Commit complete.

SQL> select table_name,blocks,num_rows from user_tables where table_name='TEST081002';

TABLE_NAME     BLOCKS      NUM_ROWS
------------   ---------- ----------
TEST081002     1439        32442

做shrink。第一阶段,使行能移动,并压缩数据,检查发现此时数据块大小依旧不会变化

SQL> alter table test081002 enable row movement;

Table altered.

SQL> alter table test081002 shrink space compact;

Table altered.

SQL> analyze table test081002 compute statistics for table;

Table analyzed.

SQL> select table_name,blocks,num_rows from user_tables where table_name='TEST081002';

TABLE_NAME        BLOCKS   NUM_ROWS
------------      ---------- ----------
TEST081002        1439      32442

第二阶段:DDL命令阶段

SQL> alter table test081002 shrink space;

Table altered.

SQL> analyze table test081002 compute statistics for table;

Table analyzed.

SQL> select table_name,blocks,num_rows from user_tables where table_name='TEST081002';

TABLE_NAME             BLOCKS   NUM_ROWS
---------------------- -------- ----------
TEST081002             642      32442

此时检查发现数据块大小已经从1439变成642。至此,成功shrink表

考点

  • 表收缩生成undo和redo,索引可以得到维护
  • 收缩分为压缩阶段和降低HWM阶段。shrink操作不占用额外的空间。
  • 可以单独完成第一阶段,此阶段只压缩,不降低HWM,故此时DML操作几乎不受影响
  • 可以级联相关的段一起压缩,即shrink space cascade
  • 段必须assm管理,必须使行能移动。若不满足这两个条件,只能使用move重组表。
  • mssm管理或有long列表或是有refresh_on_commit物化视图的表

重要表总结:dba_tablespaces\dba_segments\dba_tables\dba_extents\dba_data_files(表和数据文件怎么结合的)

五、临时表空间

5.1 用途

用于排序,temp和undo类似,有多个,但是只有一个是激活状态的,default temporary tablespace不能offline和drop。如果未指定默认的临时表空间,oracle将会使用system作为临时表空间,只有temp表空间时nologin。

注意:

  • 不要用system表空间作为临时表空间
  • 实体都是datafile,在磁盘上,为了排序而存在,若是pga排不下,此时需要用temp表空间来排序

查询表空间

SQL> select tablespace_name,status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
SYSAUX                         ONLINE
UNDOTBS1                       ONLINE
TEMP                           ONLINE
USERS                          ONLINE
A                              ONLINE
B                              ONLINE
BIG_TBS                        ONLINE
C                              ONLINE
E                              ONLINE

当添加临时表空间,若是在dba_temp_files中没出现,则需要reuse temp文件,具体语句如下。

alter tablespace temp add tempfile '/u01/app/oracle/oradata/SINGLE04/temp01.dbf' size 100m reuse;

此时再次查询dba_temp_files,就会发现东西已经存在了

SQL> select file_id,file_name,tablespace_name from dba_temp_files;

   FILE_ID FILE_NAME                                TABLESPACE_NAME
---------- ---------------------------------------- -------------------------
         1 /u01/app/oracle/oradata/SINGLE04/temp01. TEMP
           dbf

在v$tempfile中查看tempfile详细信息

SQL> select file#,name,bytes/1024/1024 from v$tempfile;

     FILE# NAME                                               BYTES/1024/1024
---------- -------------------------------------------------- ---------------
         1 /u01/app/oracle/oradata/SINGLE04/temp01.dbf                     32

5.2 建立临时表空间

创建临时表空间,删除临时表空间

SQL> create temporary tablespace temp2 tempfile '/u01/app/oracle/oradata/SINGLE04/temp02.dbf' size 10m;

Tablespace created.

SQL> alter tablespace temp2 add tempfile '/u01/app/oracle/oradata/SINGLE04/temp03.dbf' size 5m;

Tablespace altered.

SQL> select file_id,file_name,tablespace_name from dba_temp_files;

   FILE_ID FILE_NAME                                TABLESPACE_NAME
---------- ---------------------------------------- -------------------------
         1 /u01/app/oracle/oradata/SINGLE04/temp01. TEMP
           dbf

         2 /u01/app/oracle/oradata/SINGLE04/temp02. TEMP2
           dbf

         3 /u01/app/oracle/oradata/SINGLE04/temp03. TEMP2
           dbf

SQL> alter tablespace temp2 drop tempfile '/u01/app/oracle/oradata/SINGLE04/temp03.dbf';                 

Tablespace altered.

SQL> select file_id,file_name,tablespace_name from dba_temp_files;

   FILE_ID FILE_NAME                                TABLESPACE_NAME
---------- ---------------------------------------- -------------------------
         1 /u01/app/oracle/oradata/SINGLE04/temp01. TEMP
           dbf

         2 /u01/app/oracle/oradata/SINGLE04/temp02. TEMP2
           dbf

临时表空间若删除了,下次起机时oracle会重新创建temp表空间。

5.3 查看默认临时表空间

SQL> select * from database_properties where property_name like '%TABLESPACE';

PROPERTY_NAME                 PROPERTY_VALUE  DESCRIPTION
--------------------          --------------- ----------------------------------------
DEFAULT_PERMANENT_TABLESPACE  USERS           Name of default permanent tablespace


DEFAULT_TEMP_TABLESPACE       TEMP            Name of default temporary tablespace

此视图规定了缺省临时表空间和缺省永久表空间,缺省undo看参数确定缺省值

5.4指定用户使用临时表空间

SQL> alter user tim temporary tablespace TEMP2;

User altered.

指定用户的临时表空间组
SQL> alter user tim temporary tablespace tmpgrp;

User altered.

检查是否指定成功
SQL> select username,default_tablespace,temporary_tablespace from dba_users where username='TIM';

USERNAME   DEFAULT_TABLESPACE   TEMPORARY_TABLESPACE
---------- -------------------- --------------------
TIM        USERS                TMPGRP

可以创建用户的时候指定

create user hr identified hr default tablespace c profile [] temporary []

公共临时表,私有临时表,缺省使用公共的,也可以让某个用户单独使用某个私有的临时表空间

查询临时表空间。

5.5切换默认的临时表空间

SQL> alter database default temporary tablespace temp2;

Database altered.

SQL> select * from database_properties where property_name like '%TABLESPACE';

PROPERTY_NAME                  PROPERTY_VALUE       DESCRIPTION
------------------------------ -------------------- ----------------------------------------
DEFAULT_PERMANENT_TABLESPACE   USERS                Name of default permanent tablespace
DEFAULT_TEMP_TABLESPACE        TEMP2                Name of default temporary tablespace

5.6建立临时表空间

多个session使用同一个用户名去访问oracle,而临时表空间是基于用户的,那么可以建立一个临时表空间组,组中由若干临时表空间构成,从而提高单个用户多个会话使用表空间的效率

1)临时表空间无法显式创建,组是通过第一个临时表空间分配时自动创建

SQL> alter tablespace temp tablespace group tmpgrp;

Tablespace altered.

SQL> alter tablespace temp2 tablespace group tmpgrp;

Tablespace altered.

SQL> select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TMPGRP                         TEMP
TMPGRP                         TEMP2

2)将临时表空间组设成默认临时表空间,实现负载均衡

SQL> alter database default temporary tablespace tmpgrp;

Database altered.

SQL> select * from database_properties where property_name like '%TABLESPACE';

PROPERTY_NAME                  PROPERTY_VALUE       DESCRIPTION
------------------------------ -------------------- ----------------------------------------
DEFAULT_PERMANENT_TABLESPACE   USERS                Name of default permanent tablespace
DEFAULT_TEMP_TABLESPACE        TMPGRP               Name of default temporary tablespace

3)要移除表空间组时,该组不能是缺省的临时表空间

SQL> alter database default temporary tablespace temp;

Database altered.

SQL> alter tablespace temp tablespace group '';

Tablespace altered.

SQL> alter tablespace temp2 tablespace group '';

Tablespace altered.

4)当组内所有临时表空间被移除时,组也自动删除。

SQL> select * from dba_tablespace_groups;

no rows selected

SQL> drop tablespace temp2 including contents and datafiles;

Tablespace dropped.

default temporary tablespace不可以offline然后drop,当某个tempfile坏了,而不能正常工作时,add新的tempfile,再drop坏掉的tempfile

六、如何调整表空间的尺寸(表空间大小等于所属表空间的数据文件大小之和)

当表空间不足时:

  • 增加数据文件大小(resize)
  • 增加数据文件(add datafile)
  • 设置表空间自动增长(auto extend)
SQL> alter database datafile '/u01/app/oracle/oradata/SINGLE04/b01.dbf' resize 20m;

Database altered.

此时b01.dbf数据文件大小从10m增大为20m,表空间的大小为20m

SQL> alter tablespace b add datafile '/u01/app/oracle/oradata/SINGLE04/b02.dbf' size 10m;

Tablespace altered.

此时新添了大小为10m的属于b表空间的datafile b02.dbf,表空间b的大小为20m

实验详情如下

SQL> create table tim.test0811(id int) tablespace B;

Table created.

SQL> insert into tim.test0811 values(2);

1 row created.

SQL> insert into tim.test0811 select * from tim.test0811;

1 row created.

SQL> /

。。。多次/,指数级增长



当报错时,扩大表空间容量

SQL> alter database datafile '/u01/app/oracle/oradata/SINGLE04/b02.dbf' resize 40m;

Database altered.

SQL> insert into tim.test0811 select * from tim.test0811;

2097152 rows created.

SQL> /
insert into tim.test0811 select * from tim.test0811
*
ERROR at line 1:
ORA-01653: unable to extend table TIM.TEST0811 by 16 in tablespace B


当报错时,新增数据文件

SQL> alter tablespace b add datafile '/u01/app/oracle/oradata/SINGLE04/b03.dbf' size 80m;

Tablespace altered.

SQL> insert into tim.test0811 select * from tim.test0811;

4194304 rows created.

SQL> /
insert into tim.test0811 select * from tim.test0811
*
ERROR at line 1:
ORA-01653: unable to extend table TIM.TEST0811 by 16 in tablespace B


当报错时,使表空间自动增长

SQL> alter database datafile '/u01/app/oracle/oradata/SINGLE04/b02.dbf' autoextend on next 20m maxsize 200m;

Database altered.

SQL> insert into tim.test0811 select * from tim.test0811;                       
8388608 rows created.

SQL> /
insert into tim.test0811 select * from tim.test0811
*
ERROR at line 1:
ORA-01653: unable to extend table TIM.TEST0811 by 16 in tablespace B


七、可恢复空间分配 oracle的resumable(可恢复)功能

当一条insert语句插入大量数据时,由于表空间不足且没有开启自动扩展,该sql语句会中断,且报ora-01653的错误。导致数据库资源浪费的情况。为应对这种问题,oracle设计了resumable功能。在resumable开启时,若某条sql执行申请不到空间(包括数据表空间、undo表空间、temporary空间等)时,该事务的语句挂起(suspended),等空间扩展后,oracle会继续运行该条sql语句。

resumable有2个级别

  • system级别:初始化参数resumable_timeout !=0, 这将使数据库中所有session使用可恢复空间分配
  • session级别:alter session enable|disable resumable [timeout];这将为当前session设置可恢复的空间分配。

因为resumable有资源消耗代价,所以session级别的resumable比较实际。

timeout单位为s,涉及到参数resumable_timeout.

  • resumable_timeout=0,enable session时需要指定timeout。否则使用缺省值7200s。
  • resumable_timeout<>0,enable session时可以省略timeout,此时若是指定timeout会覆盖掉参数resumable_timeout值

实验

begin
for i in 1..2000 loop
insert into tim.test0811 values('this is test');
end loop;
commit;
end;
/

SQL> create tablespace small datafile '/u01/app/oracle/oradata/SINGLE04/small01.dbf' size 2m;

Tablespace created.

SQL> create table tim.test0811(x char(1000)) tablespace small;

Table created.

SQL> begin
for i in 1..2000 loop
insert into tim.test0811 values('this is test');
end loop;
commit;
end;
/  2    3    4    5    6    7
begin
*
ERROR at line 1:
ORA-01653: unable to extend table TIM.TEST0811 by 128 in tablespace SMALL
ORA-06512: at line 3

查询tim.test0811,可以发现数据根本没有插入表中。

SQL> select count(*) from tim.test0811;

  COUNT(*)
----------
         0

此时,启动resumable功能,并重新插入,会发现程序挂起

SQL> alter session enable resumable;

Session altered.

SQL> begin
for i in 1..2000 loop
insert into tim.test0811 values('this is test');
end loop;
commit;
end;
/  2    3    4    5    6    7
/

另开一个session查询是否是因为空间不够而导致挂起

SQL> select session_id,sql_text,error_number from dba_resumable;

SESSION_ID SQL_TEXT                                           ERROR_NUMBER
---------- -------------------------------------------------- ------------
       253 INSERT INTO TIM.TEST0811 VALUES('this is test')            1653

查询等待时间

SQL> select sid,event,seconds_in_wait from v$session_wait where sid=253;

       SID EVENT                                         SECONDS_IN_WAIT
---------- --------------------------------------------- ---------------
       253 statement suspended, wait error to be cleared               1

对small表空间添加数据文件

SQL> alter tablespace small add datafile '/u01/app/oracle/oradata/SINGLE04/small02.dbf' size 40m;

Tablespace altered.

再回到第一个session,会发现程序已经完成,数据已经插入。

disable resumable并删除small测试表空间

SQL> alter session disable resumable ;

Session altered.

SQL> drop tablespace small including contents and datafiles;

Tablespace dropped.

总结

当处于生产环境中时,有时候我们需要插入大量数据,若是插入一半因为空间不够的原因而导致所有的数据都没有插入,是非常浪费时间和资源的,于是resumable功能还是非常重要的,可用性也比较高

考点

  • 下面三种情况引起resumable:表空间超出上限,extents达最大值,quota超出
  • enable resumable可以再一个session中多次挂起执行的语句,直到disable resumable
  • dbms_resumable.set_session_timeout可以延长当前session的timeout,且立即生效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值