7.Managing Database Storage Structures

逻辑结构

数据库的存储结构有物理结构和逻辑结构组成的

物理结构:物理上,oracle是由一些操作系统文件组成的

SQL> select name from v$datafile;

如何更好的访问和管理这些文件以及文件中的数据呢? 必须使用逻辑方法,比如表就是一种逻辑方式
逻辑结构:从逻辑上分,一个oracle数据库是由多个表空间组成的

表空间的作用:根据实际的需要,对物理文件进行分组,比如系统数据单独放到一个表空间中,用户数据可以放到单独的一个表空间中数据库中有哪些表空间?

SQL> col ts for a15
SQL> col file_name for a45
SQL> /

SQL> select tablespace_name ts,file_id,file_name from dba_data_files;

SYSTEM:系统表空间,存储系统数据,比如数据字典信息,oracle预定义的包
SYSAUX:系统辅助表空间,是oracle10g新增加的一个表空间,用来分担SYSTEM表空间的压力,主要存储自动性能诊断数据
UNDOTBS1:undo表空间,主要是存储undo数据(是数据被修改之前的原值)
USERS:用户表空间,主要是存储普通用户的数据
EXAMPLE:示例表空间,比如hr、oe等示例方案的数据

段:表空间从逻辑上是由段组成的,在创建对象的时候,如果这个对象需要空间,oracle都会为这个对象分配一个段

查看当前数据库中的段的类型:
SQL> select distinct segment_type from dba_segments;

从以上的输出可以看出:表、索引需要段

区:段是由区组成的,区是为段进行空间分配的单位,当段的空间不足的时候,oracle会以区为单位为段分配空间

oracle数据块:一个区是由连续的n个oracle数据块组成的

os块:一个oracle数据块是由n个连续的os块组成的

oracle最小的I/O单位是一个oracle数据块

实验:

在a会话:
SQL> create table t as select * from emp;
SQL> insert into t select * from t;
/
/
---不停的翻倍

在b会话:
查看区的分配以及区的大小:
SQL> col owner for a5
SQL> col segment_name for a14
SQL> set linesize 100
SQL> select owner,segment_name,segment_type,extent_id,file_id,blocks,block_id from dba_extents where owner='SCOTT' and segment_name='T';
SQL> /

手动为段分配区:

SQL> create table e as select * from emp;
SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name='E';

SQL> alter table e allocate extent;
SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name='E';

SQL> alter table e deallocate unused;
SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name='E';

SQL> conn /as sysdba
SQL> alter tablespace users add datafile '/u01/app/oracle/oradata/orcl/users02.dbf' size 100M;

SQL> conn scott/tiger
SQL> alter table e allocate extent(size 1M datafile '/u01/app/oracle/oradata/orcl/users02.dbf');
SQL> select segment_name,segment_type,extent_id,blocks from user_extents where segment_name='E';

SQL> conn /as sysdba
SQL> col owner for a5
SQL> col segment_name for a14
SQL> set linesize 100

SQL> select owner,segment_name,segment_type,extent_id,file_id,blocks,block_id
from dba_extents where owner='SCOTT' and segment_name='E';

SQL> alter table scott.e deallocate unused;

SQL> select owner,segment_name,segment_type,extent_id,file_id,blocks,block_id
from dba_extents where owner='SCOTT' and segment_name='E';

如何存储数据

desc v$tablespace;
dba_tablespaces;
select segment_type, segment_name, owner from dba_segments where tablespace_name='USERS' and segment_type='TABLE';

行链接:Insert操作:数据块剩余的空间不能保留整行,仅能保留一部分,则保存完一部分之后,保存一个指针指向另一个数据块。
行迁移:Update操作:更新的数据不能在当前数据块存下,则需要将整行迁移到另外的数据块,在当前位置保持指向新数据块的指针。

数据块:
数据从下往上增长,块头从上往下增长。
pctfree = 10.--便于减少行链接和行迁移,为事务槽服务
事务槽记录对数据块的哪些行进行更改,以及锁是否释放。

操作表空间

创建表空间:

CREATE SMALLFILE TABLESPACE "HNDX" DATAFILE '/u01/app/oracle/oradata/orcl/hndx01.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 300M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

SQL> select tablespace_name,file_id,file_name from dba_data_files where tablespace_name='HNDX';

SQL> drop tablespace hndx including contents and datafiles;

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 100M;

SQL> set long 1000
SQL> select dbms_metadata.get_ddl('TABLESPACE','HNDX') from dual;

删除表空间:

SQL> select name from v$tablespace;

SQL> drop tablespace hndx;
SQL> ! ls /u01/app/oracle/oradata/orcl/hndx01.dbf
SQL> select name from v$tablespace;

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 10M reuse;
SQL> select name from v$tablespace;
SQL> create table scott.t as select * from scott.emp;
SQL> select segment_name,segment_type from dba_segments where tablespace_name='HNDX';

SQL> drop table scott.t purge;
SQL> create table scott.t tablespace hndx as select * from scott.emp;
SQL> select segment_name,segment_type from dba_segments where tablespace_name='HNDX';

SQL> drop tablespace hndx;--有段,删除不了
SQL> drop tablespace hndx including contents;
SQL> !ls /u01/app/oracle/oradata/orcl/hndx01.dbf

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 10M reuse;
SQL> drop tablespace hndx including contents and datafiles;
SQL> !ls /u01/app/oracle/oradata/orcl/hndx01.dbf

扩大表空间:

1. 自动扩展:

SQL> create tablespace hndx datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' size 10M;

SQL> select AUTOEXTENSIBLE from dba_data_files where tablespace_name='HNDX';

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' autoextend on;

SQL> select AUTOEXTENSIBLE from dba_data_files where tablespace_name='HNDX';

SQL> select file_id from dba_data_files where tablespace_name='HNDX';

SQL> alter database datafile 7 autoextend off;

SQL> select AUTOEXTENSIBLE from dba_data_files where tablespace_name='HNDX';

2. 添加数据文件:

SQL> alter tablespace hndx add datafile '/u01/app/oracle/oradata/orcl/hndx02.dbf' size 10M;

SQL> select file_name from dba_data_files where tablespace_name='HNDX';

3. 加大数据文件的大小

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' resize 20M;

减小表空间:

1. 删除数据文件:

SQL> alter tablespace hndx drop datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf';--第一个数据文件不能删除,因为有整个表空间的控制信息

SQL> alter tablespace hndx drop datafile '/u01/app/oracle/oradata/orcl/hndx02.dbf';

SQL> select file_name from dba_data_files where tablespace_name='HNDX';

2. 减小数据文件的大小:

SQL> col file_name for a45
SQL> select file_name,bytes/1024/1024 from dba_data_files where file_id=7;

SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' resize 10M;

SQL> select file_name,bytes/1024/1024 from dba_data_files where file_id=7;

[oracle@hndx ~]$ sqlplus scott/tiger

SQL> create table t tablespace hndx as select * from emp;
SQL> insert into t select * from t;
SQL> /
SQL> /
insert into t select * from t
*
ERROR at line 1:
ORA-01653: unable to extend table SCOTT.T by 128 in tablespace HNDX

SQL> commit;

conn /as sysdba

SQL> select bytes/1024/1024 from dba_segments where tablespace_name='HNDX';
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/hndx01.dbf' resize 8M;--超出了数据的范围

表空间的状态:online, offline

online:read write、read only

read write:对表空间中的数据可以进行读和写
read only:只读,只能就行读操作(除了drop table以外)

SQL> alter tablespace hndx read only;

SQL> select segment_name,segment_type from dba_segments where tablespace_name='HNDX';

SQL> col segment_name for a20
SQL> /

SQL> select count(*) from scott.t;

COUNT(*)
----------
114688

SQL> update scott.t set sal=sal+100;
SQL> delete scott.t ;
SQL> insert into scott.t select * from scott.emp;
SQL> create table scott.e tablespace hndx as select * from scott.dept;

SQL> drop table scott.t purge;

Table dropped.

SQL> alter tablespace hndx read write;

压缩选项
不压缩
基本压缩--11G之前技术
OLTP压缩:空闲空间达到或小于pctfree时才进行压缩,并非一插入就压缩。
数据仓库压缩
在线归档压缩

alter tablespace test read write;
删除的时候只对数据字典进行更改,不对表空间进行更改,因此即使表空间为只读也可以进行操作。

重整表空间:释放不用的块,相当于碎片整理。
exec dbms_stats.gather_table_stats('scott','big_t');
select blocks, num_rows from user_tables where table_name='BIG_T';
delete big_t where rownum<=40000;
alter table big_t enable row movement;
alter table big_t shrink space;

SQL> select ts.name, df.name from v$tablespace ts, v$datafile df
2 where ts.ts#=df.ts#;

表空间信息
DBA_TABLESPACES
V$TABLESPACE

数据文件信息
DBA_DATA_FILES
V$DATAFILE

临时文件信息
DBA_TEMP_FILES
V$TEMPFILE

Oracle管理文件(OMF)
SQL> show parameter DB_CREATE_FILE_DEST
SQL> show parameter DB_CREATE_ONLINE_LOG_DEST_n
SQL> show parameter DB_RECOVERY_FILE_DEST

SQL> ALTER SYSTEM SET DB_CREATE_FILE_DEST = '+DATA';
SQL> CREATE TABLESPACE tbs_1;

数据库对象
Tablespaces
Redo log files
Control files
Archived logs
Block change tracking files
Flashback logs
RMAN backups

数据库扩容
1.创建新的表空间
2.给现存的小文件表空间增加数据文件
3.增加数据文件大小
4.提供数据文件的自动增长

备注:
数据库可以混合oracle管理的文件和非管理的文件
大文件表空间并不要求至少有一个文件大于100MB

查看表所在的数据文件
SQL> select segment_name,segment_type,tablespace_name from dba_segments where segment_name='EMP';

SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
-------------------- ------------------ ------------------------------
EMP TABLE USERS

SQL> select file_name from dba_data_files where tablespace_name='USERS';

emp表位于/u01/app/oracle/oradata/orcl/users01.dbf这个文件

查看区
select segment_name,EXTENT_ID,blocks from dba_extents where segment_name='EMP';
SQL> /

SEGMENT_NAME EXTENT_ID BLOCKS
-------------------- ---------- ----------
EMP 0 8

OCA读书笔记(7) - 管理数据库存储结构的更多相关文章

  1. OCA读书笔记(4) - 管理数据库实例

    Objectives: •Start and stop the Oracle database and components •Use Oracle Enterprise Manager •Acces ...

  2. OCA读书笔记(8) - 管理用户安全

    创建用户:create user +用户 default tablespace + 表空间名 identified + 验证方式 SQL> create user easthome profil ...

  3. OCA读书笔记(9) - 管理数据同步

    9.Managing Data Concurrency 描述锁机制以及oracle如何管理数据一致性监控和解决锁冲突 管理数据的并发--管理锁数据的不一致:脏读更改丢失幻影读 脏读:数据是指事务T2修 ...

  4. OCA读书笔记(16) - 执行数据库恢复

    16. Performing Database Recovery 确定执行恢复的必要性访问不同接口(EM以及命令行)描述和使用可用选项,如RMAN和Data Recovery Advisor执行恢复- ...

  5. OCA读书笔记(5) - 管理ASM实例

    Objectives:Describe the benefits of using ASMManage the ASM instanceCreate and drop ASM disk groupsE ...

  6. OCA读书笔记(10) - 管理UNDO数据

    Undo自动管理与手动管理 undo段自动管理SQL> show parameter undo_management 将undo段改为手工管理SQL> alter system set u ...

  7. OCP读书笔记(14) - 管理数据库性能

    搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...

  8. OCA读书笔记(15) - 执行数据库备份

    物理备份 -- 数据文件,控制文件,日志文件,参数文件 数据库备份 冷备 -- 归档和非归档均可以 什么时候必须用冷备?1. 数据库的模式为非归档的2. 用于现场保护 冷备的过程:1. 首先查看备份文 ...

  9. OCA读书笔记(1) - 浏览Oracle数据库架构

    Objectives: List the major architectural components of Oracle DatabaseExplain the memory structuresD ...

随机推荐

  1. File 操纵目录

    mkdir()   创建目录 不可及联创建    即父路径中一旦有不存在文件夹  即创建失败 mkdirs() 创建目录,及联创建 list() 列出目录内所包含的文件名(string) listFi ...

  2. NET Core 以及与 .NET Framework

    简析.NET Core 以及与 .NET Framework的关系 简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core ...

  3. Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  4. 基于visual Studio2013解决C语言竞赛题之0708字符串查找

       题目

  5. 解决linux下javac -version和java -version版本显示不一致

    解决linux下javac -version和java -version版本显示不一致 [javascript] view plaincopy [root@localhost usr]# $JAVA_ ...

  6. windows安装Apache,注册服务出现“(OS 5)拒绝访问。 : AH00369: Failed to open the WinNT service manager..."错误

    原文:http://blog.csdn.net/jaray/article/details/9950211 在安装Apache的时候,我下载的是zip格式,不是msi安装版,需要自己注册服务,才能在桌 ...

  7. Http报头Accept与Content-Type的差别

    1.Accept属于请求头. Content-Type属于实体头. Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报 ...

  8. C# - 委托_求定积分通用方法

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  9. VIM IDE

    打造VIM IDE(针对C语言开发者)   ================================使用vim打造IDE, 针对C语言开发者建议使用gvim================== ...

  10. Linux入门:文件权限、用户、用户组(比较清楚)

    单个文件名或目录名长度不超过255字符: 文件或目录的绝对路径长度不超过4096字符:   一.文件所有者与用户组     一个文件有很多属性,包括文件类型.文件权限.文件隐藏权限.文件所有者.用户组 ...