Mais conteúdo relacionado
Semelhante a 5, OCP - oracle storage (20)
5, OCP - oracle storage
- 2. Overview
• 本章讨论与oracle存储相关的主题, 包含以
下方面:
– 使用表空间与数据文件
– 创建与管理表空间
– 表空间的空间管理
数据库存储空间的管理占用了DBA大量的工作, 幸
运的是oracle近期的版本(10g & 11g)在一定程度上
提供了对空间自动管理的支持, 大大地降低了DBA
的工作负担.
另外在章节《Architecture Intro》中讲到了oracle
存储的相关基础概念, 在这里将不会再重复.
- 3. Logical Storage
- Segment
• oracle将数据保存在数据段(segment)中, 可以通过dba_segments视图查看数据库的
段信息, 使用下面的sql:
select segment_type, count(1) from dba_segments
group by segment_type order by segment_type
下面是段类型的介绍:
– TABLE 存储关系型数据(row)
– INDEX 索引段, 用于加快查询速度
– TYPE2 UNDO回滚段
– ROLLBACK 在9i版本之后不应该再使用ROLLBACK段, 使用UNDO段; 但字典中始终会显示
一个ROLLBACK段, 它用于创建数据库, 在该时间点undo端没有被加载.
– TABLE PARTITION
oracle支持数据库表的分区, 每个分区会使用一个表分区段.
– INDEX PARTITION
对分区表建立分区索引时, 每个分区索引会使用一个索引分区段.
– LOBSEGMENT, LOBINDEX, LOB PARTITION
这些是大字段类型列使用到的段.
– CLUSTER
与分区正好相反, CLUSTER段包含了多个表的数据.
– NESTED TABLE
如果表的列使用用户自定义类型, 并且类型包含了自己的列定义, 那么该列的数据存储在
嵌套表段中.
- 4. Logical Storage
- Extent
• 每个段由一个或者多个扩展(extent)组成, 当段被初始化时一个
初始的extent会被分配(以创建表为例, 在10g中段和初始扩展在
创建时被分配; 在11g中, 则通过参数deferred_segment_creation
进行控制, 如果为true则在实际向表中插入数据时分配). 当该
extent被填满时, 第二个extent被分配. 也可以通过手动的方法
分配extent. 下面演示如何查看extent的相关信息:
create table demo.newtab(c1 date);
insert into demo.newtab values(sysdate);
commit;
select tablespace_name, file_id, extent_id, block_id, blocks, bytes from
dba_extents where owner = 'DEMO' and segment_name = 'NEWTAB‘;
alter table demo.newtab allocate extent; -- 手动分配一个扩展
Tip: 对扩展进行手动分配虽然可以带来一定的性能提升, 但是
需要大量的工作. 通常而言很少使用.
- 5. Logical Storage
- Data Block
• extent由数据块组成(data block), 每个数据块
分为头部区域(header area)和数据区域(data
area). 头部区域包含了行目录(指的是每一行
从哪个位置开始)及行锁信息; 数据区包含了
具体的数据.
• 数据块内容的填充按照如下方式: 头部区域
从上往下填充, 数据区从下往上填充.
- 6. File Storage Technologies
• 数据文件可以存储在以下四种设备类型上:
– 本地文件系统(local file system)
这是最简单的物理存储情况, 数据文件存放在
IDE/SATA磁盘或者SCSI硬盘上.
– 集群文件系统(clustered file system)
集群文件系统通常在外部的磁盘上创建, 并挂载
到一台或者多态服务器. 典型的集群文件系统有NFS, 甲骨文公司也
提供了自己的实现OCFS. 集群文件系统通常使用在数据库集群
(RAC)的情况.
– 裸设备(raw device)
裸设备指的是没有创建文件系统的存储设备, 这种存储方式虽然仍
被支持但是不推荐使用.
– ASM 设备
ASM是在10g版本中引入的一种存储技术, 将会在以后的章节中详
细介绍.
TIP: ASM是甲骨文提供的一种逻辑卷(logical volume)技术, 专用于
数据库文件的存储, 比如数据文件/重做日志/控制文件等.
ORACLE_HOME目录不能在ASM设备上.
- 7. Manage Tablespaces
- Query
• 表空间用于存储用户数据, 以及数据库字典数据. 在11g版本中, 所有的
数据库都必须创建以下四个表空间: SYSTEM/SYSAUX/临时表空间/回滚
表空间, 通常而言它们会随着数据库的创建而被创建. 之后更多的表空
间被创建以用于存储用户业务数据.
• Query
可以通过OEM查看表空间的信息, 打开之后点击链接Server
Tablespaces, 页面显示如下:
- 8. Manage Tablespaces
- Query
• Query
这些信息同样可以通过执行如下SQL语句得到:
select t.tablespace_name name, d.allocated, u.used, f.free,
t.status, d.cnt, contents, t.extent_management extman,
t.segment_space_management segman
from dba_tablespaces t,
(select sum(bytes) allocated, count(file_id) cnt from dba_data_files
where tablespace_name='DEMO') d,
(select sum(bytes) free from dba_free_space
where tablespace_name='DEMO') f,
(select sum(bytes) used from dba_segments
where tablespace_name='DEMO') u
where t.tablespace_name='DEMO';
这里查询了DEMO表空间的相关信息.
- 9. Manage Tablespaces
- Creation
• 下面演示使用Database Control图形化的方式创建一个表空间, 首先指定表空间名称,
其他选项均使用默认值:
点击Add按钮添加数据文件, 这里在Storage选项卡下面指定文件为自动扩展(默认不
自动扩展):
- 10. Manage Tablespaces
- Creation
• 点击Continue按钮之后会到表空间创建的主页面点击Storage页, 查看表
空间的存储设置如下:
此时点击Show SQL按钮会显示创建表空间的SQL语句, 如下:
CREATE SMALLFILE TABLESPACE "TESTXX"
DATAFILE '/opt/oracle/oradata/ocpdemo/testxx.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 200M
LOGGING
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO
- 11. Manage Tablespaces
- Creation
这里对该语句逐行进行分析:
– CREATE SMALLFILE TABLESPACE "TESTXX"
这里创建的是一个小文件表空间, 该类型的表空
间允许有多个数据文件; 与之相应的是大文件表
空间仅允许一个数据文件.
– DATAFILE '/opt/oracle/oradata/ocpdemo/testxx.dbf' SIZE 100M
指定数据文件的位置以及初始大小.
– AUTOEXTEND ON NEXT 10M MAXSIZE 200M
设置数据文件自动扩展, 每次扩展增加10M, 最大值200M.
– LOGGING
默认情况下所有对段(表或者索引)的操作都会生成redo, 如果指定NOLOGGING
极少数的某些操作不会生成redo(比如创建索引).
– EXTENT MANAGEMENT LOCAL
使用本地扩展管理, 另一种方式是字典管理用于向后兼容. 在本地扩展管理情
况下, 可以为扩展指定统一的大小或者自动分配.
– SEGMENT SPACE MANAGEMENT AUTO
使用自动段空间管理, 另一种方式是手动管理, 仅用于向后兼容.
- 12. Manage Tablespaces
- Temporary Tablespace
• 在创建一个表空间时, 可以选择类型为: 永久
(permanent), 临时(temporary), 回滚(UNDO). 临
时表空间用于存放一些临时的数据, 比如SQL语
句排序/分组操作的数据. 临时表空间使用的文
件被称为临时文件(tempfiles), 通过v$tempfile
或者dba_temp_files进行查询(数据文件使用
v$datafile和dba_data_files), 如下:
select t.name TABLESPACE_NAME, d.name FILENAME,
d.bytes/1024/1024 SIZE_MB,
d.create_bytes/1024/1024 CREATE_SIZE_MB
from v$tablespace t join v$tempfile d using (TS#)
where t.name = 'TEMP'
- 13. Manage Tablespaces
- Alter
• 支持对表空间作如下修改操作:
– 重命名
– 设置在线(online)或者离线(offline)
– 设置可读写或者只读
– 改变大小
– 修改告警阀值
• Rename
使用如下语法修改表空间的名称:
ALTER TABLESPACE tsoldname RENAME TO tsnewname;
• Take Online or Offline
只有当表空间处于在线状态时才可以被正常使用, 如果表空间离线, 表空间则无
法被使用. 使用如下语法设置表空间的状态:
ALTER TABLESPACE tablespacename OFFLINE [NORMAL | IMMEDIATE | TEMPORARY];
选项说明:
NORMAL 对所有的表空间文件执行CHECKPOINT操作
IMMEDIATE 表空间立即离线, 不执行CHECKPOINT; 下一次将表空间设置为在
线时, 需要使用重做日志进行恢复操作.
TEMPORARY 前两者的这种, 仅对能够执行CHECKPOINT的数据文件执行该操
作.
- 14. Manage Tablespaces
- Alter
• READONLY
将表空间设置为可读写或者只读, 使用如下语法:
ALTER TABLESPACE tablespacename [READ ONLY | READ WRITE];
• Resizing
使用下面的语法分别修改数据文件的大小和添加数据文件:
ALTER DATABASE DATAFILE filename RESIZE n[M|G|T];
ALTER TABLESPACE tsname ADD DATAFILE '/path/to/file' SIZE n[M|G|T];
ALTER DATABASE DATAFILE filename AUTOEXTEND [ON|OFF] NEXT n[M|G|T] MAXSIZE
n[M|G|T];
• Change Alert Threshold
告警阀值通常用于设置表空间使用情况的告警, 比如使用超过90%的空间则发送告
警信息. 可以通过Database Control设置告警.
• DROP
使用如下语法删除一个表空间:
DROP TABLESPACE tablespacename
[INCLUDING CONTENTS [AND DATAFILES] ] ;
– INCLUDING CONTENTS
如果表空间包含了相关的对象(表/索引 etc), 那么必须指定该选项, 否则失败;
– AND DATAFILES
如果指定此选项, 则删除文件系统上的表空间数据文件, 否则不删除.
- 15. OMF
• OMF, 是Oracle-Managed Files的简称, OMF提供了一
种自动创建相关数据库文件的方法, 给DBA提供了一
定的方便. 使用OMF需要指定如下初始化参数:
– 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
存储归档日志文件的目录
在使用OMF的情况下, 文件的名称会自动生成.
- 16. Space Management in Tablespace
- Extent Management
• 扩展管理的设置是针对表空间并应用于表空间内所有的段, 11g中的扩
展管理分为两种类型: 字典管理和本地管理, 应该始终使用本地管理方
式, 字典管理仅用于向后兼容.
– 字典管理
基于字典的扩展管理使用SYS.UET$和SYS.FET$表分别记录扩展的使用情况, 前者记录已
经使用的扩展后者记录空闲的扩展. 每次分配一个新的扩展时, 需要查找FET$表并对
FET$/UET$表进行更新. 这样带来了一定的性能问题.
– 本地管理
扩展的本地管理在8i中引入, 在9i中成为默认设置. 本地管理使用存储在数据文件中的位图
(bitmap)对扩展进行管理, 位图中的一个bit对应一个扩展, 初始为0, 如果扩展被分配, 则更新
为1. 这样不仅降低了性能消耗, 而且很大程度上提高了并发性. 示例:
create tablespace large_tabs datafile 'large_tabs_01.dbf' size 10g
extent management local uniform size 160m;
create tablespace any_tabs datafile 'any_tabs_01.dbf' size 10g
extent management local autoallocate;
创建一个本地管理表空间时, 有一个十分重要的选项: 是否设置统一的扩展大
小(uniform size 160m), 还是自动分配(autoallocate). Oracle推荐使用自动分配方
式, 但是如果能够确定段的大小及空间分配的情况使用统一设置更有有效.
- 17. Space Management in Tablespace
- Extent Management
• Query & Migration
使用下面的sql查询表空间扩展的管理方式:
select tablespace_name, extent_management from
dba_tablespaces;
oracle支持将字段管理表空间转换为本地管理
方式, 执行以下PLSQL:
execute
dbms_space_admin.tablespace_migrate_to_local('tab
lespacename');
Tip: 通过上面的调用可以快捷而方便地将表空
间的管理转换为本地方式, 一个例外是SYSTEM
表空间, 需要一些额外的步骤.
- 18. Space Management in Tablespace
- Segment Space Management
• 段空间管理的设置是针对表空间并应用于表空间内所有的段, 有
两种方式: 自动管理和手动管理, 应当始终使用自动管理, 手动管
理仅用于向后兼容.
• 自动管理
自动段空间管理在9i版本引入, 在11g中默认采用该方式. 在该管
理方式下, 每个段使用5个位图来记录数据块的使用情况, 每个数
据块会出现在其中的一个位图上. 这些位图根据数据块的空间使
用情况分为:
–full blocks bitmap
–75%-100% full blocks bitmap
–50%-75% full blocks bitmap
–25%-50% full blocks bitmap
–0%-25% full blocks bitmap
示例: 数据块大小为4k, 插入数据1500B, 那么该数据块将出现在
第四个位图上面. 使用下面SQL查看表空间段管理方式:
select tablespace_name, segment_space_management from dba_tablespaces
Tip: oracle不支持将段空间管理方式从手动管理转换为自动管理.