存储结构

一、文件

1.1、控制文件

范例:查看控制文件的目录

SQL>select name,value from v$parameter where name like '%control%';

 

NAME                                   VALUE                                                                                                                                                                                                                                                                                                                                                                                                                                            

--------------------------------------------------------     --------------------------------------------------------

control_files                                                    /u01/app/oracle/oradata/wolex/control01.ctl,                                                                     /u01/app/oracle/oradata/wolex/control02.ctl,                                                                     /u01/app/oracle/oradata/wolex/control03.ctl  

                                                                                                                                                                                                                                                                                                                                                                                   

control_file_record_keep_time                7  

control_file的值表示的就是控制文件所在的路径,我们可以根据其路径查看一下其大小。

范例:查看控制文件大小

[oracle@redhat4wolex]$ pwd

/u01/app/oracle/oradata/wolex

[oracle@redhat4wolex]$ ll

总用量 1118772

-rw-r-----  1 oracle oinstall   7061504  7月 11 18:27 control01.ctl

-rw-r-----  1 oracle oinstall   7061504 7月 11 18:27control02.ctl

-rw-r-----  1 oracle oinstall   7061504 7月 11 18:27control03.ctl

-rw-r-----  1 oracle oinstall 104865792  7月 10 16:06 example01.dbf

-rw-r-----  1 oracle oinstall  52429312 7月 10 16:00redo01.log

-rw-r-----  1 oracle oinstall  52429312 7月 11 18:27redo02.log

-rw-r-----  1 oracle oinstall  52429312 7月  9 19:51 redo03.log

-rw-r-----  1 oracle oinstall 304095232  7月 11 18:26 sysaux01.dbf

-rw-r-----  1 oracle oinstall 513810432  7月 11 18:27 system01.dbf

-rw-r-----  1 oracle oinstall  20979712 7月 10 22:41temp01.dbf

-rw-r-----  1 oracle oinstall  36708352 7月 11 18:27undotbs01.dbf

-rw-r-----  1 oracle oinstall   5251072 7月 10 16:06users01.dbf

可以发现,3个控制文件的大小都是一样的,这样是为了互用。但建议最后把各个控制文件存放到不同的目录甚至不同的磁盘上。由于控制文件存储的是系统的一些信息(如,SCN号,DB的名字,DB的物理结构信息,checkpoint等等),因为这些信息占用空间并不大,所以可以看到控制文件大约就7M。

1.2、数据文件

范例:查看数据文件

SQL>select file_id,file_name,bytes/1024/1024 MB from dba_data_files;

 

   FILE_ID FILE_NAME                                             MB

------------------------------------------------------- ----------

         4/u01/app/oracle/oradata/wolex/users01.dbf              5

         3/u01/app/oracle/oradata/wolex/sysaux01.dbf           290

         2/u01/app/oracle/oradata/wolex/undotbs01.dbf           35

         1/u01/app/oracle/oradata/wolex/system01.dbf           490

         5/u01/app/oracle/oradata/wolex/example01.dbf          100

 

范例:查看临时文件

SQL>select file_id,file_name,bytes/1024/1024 MB from dba_temp_files;

 

   FILE_ID FILE_NAME                                             MB

------------------------------------------------------- ----------

         1/u01/app/oracle/oradata/wolex/temp01.dbf              20

 

??日志文件比数据文件小吗?归档日志是否记录着DB建立以来所有的操作?如果不是这样,那么如果数据文件损坏了,怎么办

1.3、联机重做日志文件

范例:查看日志文件

SQL>select * from v$logfile;

 

GROUP#STATUS  TYPE    MEMBER                                       IS_RECOVERY_DEST_FILE

------ -------------- --------------------------------------------- ---------------------

     3        ONLINE /u01/app/oracle/oradata/wolex/redo03.log      NO                   

     2        ONLINE /u01/app/oracle/oradata/wolex/redo02.log      NO                   

     1        ONLINE /u01/app/oracle/oradata/wolex/redo01.log      NO   

1.4、参数文件

范例:查看参数文件

SQL>select name,description,value from v$parameter where name='spfile';

 

NAME    DESCRIPTION                   VALUE

----------  --------------------------------- --------------------------------------------------------------------

spfile      server parameter file             /u01/app/oracle/product/10.2.0/db_1/dbs/spfilewolex.ora

1.5、归档日志文件

查看归档日志文件:

SQL> select * from v$archived_log;

注意:归档日志文件备份文件一定不能放在存储上,因为数据文件也是放在存储上的,而存储出现问题的情况不为少数,所以如果归档日志文件和数据文件都放在存储上,如果存储出现问题,则必定会丢失数据。

1.6、预警和跟踪日志文件

预警日志文件路径

[oracle@redhat4 bdump]$ pwd

/u01/app/oracle/admin/wolex/bdump

[oracle@redhat4 bdump]$ ls

alert_wolex.log       wolex_lgwr_16805.trc  wolex_lgwr_29832.trc

wolex_cjq0_16284.trc wolex_lgwr_17006.trc wolex_lgwr_29849.trc

wolex_cjq0_18229.trc wolex_lgwr_17076.trc wolex_lgwr_30083.trc

wolex_cjq0_29690.trc wolex_lgwr_17144.trc  wolex_mmon_17200.trc

wolex_cjq0_29840.trc wolex_lgwr_17190.trc wolex_mmon_17360.trc

wolex_j000_27272.trc wolex_lgwr_17350.trc wolex_mmon_18231.trc

wolex_j004_25943.trc wolex_lgwr_18221.trc wolex_pmon_12361.trc

wolex_lgwr_12226.trc wolex_lgwr_20095.trc  wolex_pmon_29674.trc

wolex_lgwr_12309.trc wolex_lgwr_24596.trc wolex_pmon_29824.trc

wolex_lgwr_12369.trc wolex_lgwr_29682.trc wolex_pmon_30075.trc

wolex_lgwr_16276.trc wolex_lgwr_29774.trc

二、表空间

范例:查看DB所有表空间

SQL>select tablespace_name,contentsfrom dba_tablespaces;

 

TABLESPACE_NAME                CONTENTS

-------------------------       ---------

SYSTEM                         PERMANENT

UNDOTBS1                       UNDO

SYSAUX                         PERMANENT

TEMP                           TEMPORARY

USERS                          PERMANENT

EXAMPLE                        PERMANENT

 

6 rowsselected.

 

一个表空间可以有多个数据文件,下面查看一下每个表空间包含的数据文件:

SQL>select ts.tablespace_name,file_name,file_id from dba_tablespacests,dba_data_files df where ts.tablespace_name=df.tablespace_name;

 

TABLESPACE_NAME                FILE_NAME                                        FILE_ID

--------------------------------------------------------------------------- ----------

USERS                         /u01/app/oracle/oradata/wolex/users01.dbf              4

SYSAUX                        /u01/app/oracle/oradata/wolex/sysaux01.dbf             3

UNDOTBS1                      /u01/app/oracle/oradata/wolex/undotbs01.dbf            2

SYSTEM                        /u01/app/oracle/oradata/wolex/system01.dbf             1

EXAMPLE                       /u01/app/oracle/oradata/wolex/example01.dbf            5

 

范例:创建表空间(重点

CREATE SMALLFILE TABLESPACE "DATA1"  -- 此处创建的是非大文件表空间

DATAFILE -- 添加数据文件,如果上面为bigfile,则只能添加一个

'/u01/app/oracle/oradata/wolex/data_01' SIZE 100M  -- 初始大小为100M

REUSE -- 重用现有文件,即如果此目录已经存在此文件,则覆盖

AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED ,

       -- 数据文件满后自动扩展100M,并且最大文件大小无限制

'/u01/app/oracle/oradata/wolex/data_02' SIZE 100M

LOGGING     -- 启用时间日志记录

EXTENT MANAGEMENT LOCAL  -- 区分配为自动

SEGMENT SPACE MANAGEMENT AUTO  -- 段空间管理为自动

注意:也可以通过EM简单设置完成

执行以上语句后查看:

SQL>select ts.tablespace_name,file_name,file_id from dba_tablespacests,dba_data_files df where ts.tablespace_name=df.tablespace_name;

 

TABLESPACE_NAME                FILE_NAME                                     FILE_ID

--------------------------------------------------------------------------- -------

USERS                         /u01/app/oracle/oradata/wolex/users01.dbf           4

SYSAUX                         /u01/app/oracle/oradata/wolex/sysaux01.dbf          3

UNDOTBS1                      /u01/app/oracle/oradata/wolex/undotbs01.dbf         2

SYSTEM                        /u01/app/oracle/oradata/wolex/system01.dbf          1

EXAMPLE                        /u01/app/oracle/oradata/wolex/example01.dbf         5

DATA1                          /u01/app/oracle/oradata/wolex/data_01               6

DATA1                          /u01/app/oracle/oradata/wolex/data_02               7

●     添加一个数据文件到表空间中:

SQL> alter tablespace data1 add datafile'/u01/app/oracle/oradata/wolex/data_03' size 100M;

 

Tablespace altered.

●     查看当前的默认表空间

SQL>select * from props$ where name like '%DEFAULT%';

 

NAME                           VALUE$          COMMENT$                              

--------------------------------------------- ----------------------------------------

DEFAULT_TEMP_TABLESPACE        TEMP            Name of default temporarytablespace    

DEFAULT_PERMANENT_TABLESPACE   SYSTEM          Name of default permanenttablespace    

DEFAULT_TBS_TYPE               SMALLFILE       Default tablespace type                 

 

●     设置默认表空间:

SQL>alter database default tablespace system;

 

Databasealtered.

●     设置表空间为脱机状态:

SQL>alter tablespace data1 offline;

 

Tablespacealtered.

●     设置表空间为联机状态:

SQL>alter tablespace data1 online;

 

Tablespacealtered.

●     设置表空间为只读模式:

SQL>alter tablespace data1 read only;

 

Tablespacealtered.

●     设置表空间为读写模式:

SQL>alter tablespace data1 read write;

 

Tablespacealtered.

●     删除表空间:

SQL>drop tablespace data1

includingcontents     -- 可选,删除表空间中可能包含的所有对象

anddatafiles -- 可选,删除该表空间相关的数据文件

cascadeconstraints;  -- 可选,确保将表空间内外对象之间的所有约束关系删除

 

Tablespacedropped.

三、段区块

范例:查看段中的块数目,区数目等信息

步一,先分析统计表T1。

SQL>analyze table t1 compute statistics;

 

Tableanalyzed.

(或:使用如下包对T1表进行统计分析。此法更为推荐)

SQL>exec dbms_stats.gather_table_stats('SYS','T1');

 

PL/SQLprocedure successfully completed.

步二,查看信息,注意这里统计的信息不一定准确

SQL>select segment_name,segment_type,tablespace_name,bytes,blocks, extents from dba_segments where segment_name='T1';

 

SEGMENT_NAME    SEGMENT_TYPE       TABLESPACE_NAME      BYTES   BLOCKS   EXTENTS

--------------------------------- -------------------  -------- -------- -------

T1              TABLE              SYSTEM                6291456  768      21

范例:USER_TABLES表中查看相关信息

SQL> select table_name,num_rows,--表中的记录数

blocks,--表中数据所占的数据块数

empty_blocks,--表中的空块数

avg_space,--数据块中平均的使用空间

chain_cnt,--表中行连接和行迁移的数量

avg_row_len--每条记录的平均长度

FROMUSER_TABLES where table_name='T1';

 

TABLE_NAME  NUM_ROWS        BLOCKS EMPTY_BLOCKS AVG_SPACE   CHAIN_CNT   AVG_ROW_LEN

-----------------------    ------ ------------ ----------- ----------- -----------

T1           50430       693    74            870         0            97

范例:通过视图dba_extents查看T1表的段和区的使用情况:

SQL> select* from dba_extents wheresegment_name='T1';

 

SEGMENT_NAME    EXTENT_ID    FILE_ID   BLOCK_ID     BYTES     BLOCKS

--------------- ---------- ---------- -------------------- ----------

T1                      0          1      61073     65536          8

T1                      1          1      61369     65536          8

T1                       2          1     61377      65536          8

T1                      3          1      61385     65536          8

T1                      4          1      61393     65536          8

T1                      5          1      61401      65536          8

T1                      6          1      61409     65536          8

T1                      7          1      61417     65536          8

T1                      8          1      61425     65536          8

T1                      9          1     61433      65536          8

T1                     10          1      61441     65536          8

T1                     11          1      62089     65536          8

T1                     12          1      62097     65536          8

T1                     13          1      62105     65536          8

T1                     14          1      62113     65536          8

T1                     15          1      62121     65536          8

T1                     16          1      62217   1048576        128

T1                     17          1      62345   1048576        128

T1                     18          1      62473   1048576        128

T1                     19          1      62601   1048576        128

T1                      20          1     62729    1048576        128

 

21 rows selected.

 

观察可以发现,段T1,即表T1共占了21个区,因为表空间SYSTEM的区管理属于自动管理,所以当一个表使用第16个区后,下一个区将分配更多的块(由8个增加到128个),因为ORACLE认为这个段很大,所以将分配更多的空间给它,但如果在建表空间时,设置其区管理属于统一管理,则不会随着区的增长而分配更多的块,而是根据你预先设置的值为每个区都分配这个预设值。

● 高水位线(重点

高水位线用于全表扫描时的标志位,如果一个表没有没有数据,但它的高水位线没有降下来,则全表扫描的时候还是会扫描到高水位线那个位置。

范例:证明高水位线的作用

步一,用delete删除一个表,观察其还占的块数目,以及全表扫描时一致读次数:

SQL>select table_name,num_rows,

blocks,

empty_blocks,

avg_space,

chain_cnt,

avg_row_len

fromUSER_TABLES where table_name='T1';

 

TABLE_NAME  NUM_ROWS        BLOCKS EMPTY_BLOCKS AVG_SPACE   CHAIN_CNT   AVG_ROW_LEN

-----------------------    ------ ------------ ----------- ----------- -----------

T1           50430       693    74            870         0            97

 

SQL>delete t1;

 

50430 rowsdeleted.

 

SQL>commit;

 

Commitcomplete.

 

SQL>exec dbms_stats.gather_table_stats('SYS','T1');

 

PL/SQLprocedure successfully completed.

 

SQL>select table_name,num_rows,

blocks,

empty_blocks,

avg_space,

chain_cnt,

avg_row_len

fromUSER_TABLES where table_name='T1';

 

TABLE_NAME  NUM_ROWS        BLOCKS EMPTY_BLOCKS AVG_SPACE   CHAIN_CNT   AVG_ROW_LEN

-----------------------    ------ ------------ ----------- ----------- -----------

T1           0            693    74            870         0            0

 

SQL> setautotrace on

SQL>select count(*) from t1;

 

  COUNT(*)

----------

         0

 

 

ExecutionPlan

----------------------------------------------------------

Planhash value: 3724264953

 

-------------------------------------------------------------------

|Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

-------------------------------------------------------------------

|   0 | SELECT STATEMENT   |     |     1 |   154  (1)| 00:00:02 |

|   1 | SORT AGGREGATE    |      |    1 |            |          |

|   2 |  TABLE ACCESS FULL| T1   |     1 |  154   (1)| 00:00:02 |

-------------------------------------------------------------------

 

 

Statistics

----------------------------------------------------------

        124 recursive calls

          0 db block gets

        708  consistentgets

          0 physical reads

          0 redo size

        514 bytes sent via SQL*Net to client

        469 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          2 sorts (memory)

          0 sorts (disk)

          1 rows processed

 

可以发现,如果是通过delete删除一个表,即使commit和统计分析后,此表还是占用了和原来一样的块数目,全表扫描时把占有的块也都要进行一致读,但是表T1里面现在并没有行。

步二,用truncate可以把一个表的高水位线压下来:

SQL>truncate table t1;

 

Tabletruncated.

 

SQL>exec dbms_stats.gather_table_stats('SYS','T1');

 

PL/SQLprocedure successfully completed.

 

SQL>select table_name,num_rows,

blocks,

empty_blocks,

avg_space,

chain_cnt,

avg_row_len

fromUSER_TABLES where table_name='T1';

 

TABLE_NAME  NUM_ROWS        BLOCKS EMPTY_BLOCKS AVG_SPACE   CHAIN_CNT   AVG_ROW_LEN

-----------------------    ------ ------------ ----------- ----------- -----------

T1           0            0       74           870         0            0

 

SQL>select count(*) from t1;

 

  COUNT(*)

----------

         0

 

 

ExecutionPlan

----------------------------------------------------------

Planhash value: 3724264953

 

-------------------------------------------------------------------

|Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |

-------------------------------------------------------------------

|   0 | SELECT STATEMENT   |     |     1 |     2  (0)| 00:00:01 |

|   1 | SORT AGGREGATE    |      |    1 |            |          |

|   2 |  TABLE ACCESS FULL| T1   |     1 |    2   (0)| 00:00:01 |

-------------------------------------------------------------------

 

 

Statistics

----------------------------------------------------------

        124 recursive calls

          0 db block gets

         13 consistent gets

          0 physical reads

          0 redo size

        514 bytes sent via SQL*Net to client

        469 bytes received via SQL*Net from client

          2 SQL*Net roundtrips to/from client

          2 sorts (memory)

          0 sorts (disk)

          1 rows processed

可以发现,truncate表T1后,T1所占用的块释放了,进行全表扫描的时候一致读次数也将下来了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值