• OCA读书笔记(7)


    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

  • 相关阅读:
    WTL自绘表指针
    QQ日志搬家工具 1.0
    一个消失很久的首页
    共享.net PE文件结构浏览器+名称混淆 + 16进制结构图 (源码)
    JavaScript中Array 对象相关的几个方法
    ASP.NET底层架构
    ASP.NET 2.0 正式版中无刷新页面的开发
    ASP.NET组件设计Step by Step(9)
    ASP.NET组件设计Step by Step(8)
    ajax上传(xmlhttp上传文件突破大小限制)
  • 原文地址:https://www.cnblogs.com/thlzhf/p/3357846.html
Copyright © 2020-2023  润新知