一、文件
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所占用的块释放了,进行全表扫描的时候一致读次数也将下来了。