欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle区管理和段空间管理详细介绍

程序员文章站 2023-11-12 19:54:28
作为一名dba,常见的一个场景之一: 创建表空间: 复制代码 代码如下: createtablespacethink datafile'/u01/app/oracle/or...

作为一名dba,常见的一个场景之一:

创建表空间:

复制代码 代码如下:

createtablespacethink
datafile'/u01/app/oracle/oradata/orcl/think.dbf'size100m
autoextendonnext10mmaxsize4096m
extentmanagementlocaluniformsize256k
segmentspacemanagementauto;

创建用户:
复制代码 代码如下:

createuserbin
defaulttablespacethink
temporarytablespacetemp;

授予权限:
复制代码 代码如下:

grantconnect,resourcetobin;
revokeunlimitedtablespacefrombin;
alteruserbinquotaunlimitedonthink;

在这个场景中,有两条语句:
①extentmanagementlocaluniformsize256k
②segmentspacemanagementauto
其中,前者是区管理;后者则是段空间管理

㈠区管理
区管理实际上就是表空间的管理
8i以前,是字典管理表空间,当创建或删除对象时,oracle的空间分配或回收是通过数据字典来记录和管理
在高并发系统中,这会导致性能衰减、空间碎片等难题
这已经是门过去的技术,这里就不赘述了。
8i开始,oracle引入本地表空间管理
在每个表空间的数据文件的头部加入了一个位图区域
一个段的第一个区的第一个块是firstlevelbitmapblock
第二个块是secondlevelbitmapblock
第三个块才是段头块
这两个块是用来管理freeblock

语法:
复制代码 代码如下:

extentmanagementlocal{autoallocate|uniformsizenk/m}

是自动分配还是统一尺寸
若为自动分配,则oracle会按照递增算法来分配空间
如果选择统一尺寸,还可以详细指定每个区间的大小
dba_extents这个视图可以看到哪些对象分配了多少区间

㈡段空间管理
oracle以区间为单位将空间分配给对象段,而段内则是以block为单位进行空间使用和管理
我们以几个参数来理解段空间管理
复制代码 代码如下:

[sql]
<spanstyle="font-size:18px;">sys@orcl>selectextent_management,segment_space_managementfromdba_tablespaces;
extent_mansegmen
----------------
localmanual
localmanual
localauto
localmanual
localmanual

从9i开始,段空间管理有两种:
①mssm:由你设置freelists、freelistgroups、pctused、pctfree、initrans等参数来控制如何分配、使用段中的空间
②assm:你只需控制一个参数pctfree,其他参数即使建了也将被忽略
⑴freelist
使用mssm表空间管理时,oracle会在freelist中为有*空间的对象维护hwm以下的块
freelist和freelistgroup在assm表空间中根本不存在,仅在mssm表空间使用这个技术
⑵pctfree和pctused
pctfree告诉oracle:块上应该保留多大的空间来完成将来的更新
对于mssm,她控制着块何时放入freelist中,以及何时从freelist中取出。
如果大于pctfree,则这个块会一直在freelist上
对于assm,因为assm根本不使用freelist。在assm中,pctused也将被忽略。
但她仍然会限制能否将一个新行插入到一个块中
适当的设置pctfree有助于减小行迁移
⑶initrans
无论是assmormssm这个参数仍然有效
块头的事务槽的初始化大小有对象的initrans指定