Oracle笔记(六)

[第一章] Oracle 数据库体系结构
物理结构
逻辑结构
内存结构
进程结构

[数据库管理员DBA(Database Administrator)]
DBA职责:
。Oracle核心软件安装与产品升级
。为数据库系统分配存储空间及规划未来存储需求
。创建数据库存储结构
。用户权限与角色管理
。监视与控制用户对数据库的存储
。维护数据库安全
。完成数据库备份与恢复
。监视与优化数据库性能

一、物理结构:数据库是由构成数据库的操作系统文件所组成。
UNIX:/u01/app/oracle/oradata/db_name/ *.*
Windows NT/2000: D:/Oracle/oradata/db_name/*.*

//为保证数据安全,只要将此目录中的所有文件备份即可。 Control0X.CTL文件(X为1,2,3)是一样的,只要有一个完好就可以。

包含三类物理文件:
1、数据文件(DataFiles):存储数据库数据的文件,表、索引、存储过程等都存储在数据文件中。

[*]查询数据文件信息:
SQL> select * from dba_data_files;

/* 数据文件的大小只是表示有多少存储数据的空间,并不表示数据量的大小。*/

[*]查询表空间空闲空间:
SQL> select * from dba_free_space;  // 显示结果中包括碎片
SQL>select tablespace_name, sum(bytes) from dba_free_space
 group by tablespace_name;
 
[*] 表空间碎片合并命令:
SQL> alter tablespace 表空间名 coalesce;

SQL> alter tablespace temp coalesce;

[*]数据块大小控制参数:db_block_size = 2K - 32K
在数据库安装后,数据块大小不得修改。

系统缺省值如下:
Oracle7, Oracle8, Oracle8i 8.1.5: 2048(2K)

Oracle8i 8.1.6: 8192(8K)

Oracle8i 8.1.7: 8192(8K)

这个参数存储在d:/oracel/admin/db_name/pfile/init.ora文件中。

SQL> select bytes, blocks, blocks*8192, file_name from dba_data_files;

数据文件的大小都是数据块的整数倍。数据块的大小在数据库安装之前确实,数据库安装之后就不能再修改。

[*] 显示数据块大小:
(1) d:/svrmgrl
SVRMGR> connect internal/oracle

SVRMGR> show parameter db_black_size

SQL> select value form v$parameter where name='db_block_size'; (小写)

[1.1] 在Oracle数据库中,数据文件大小可以修改,命令如下:
SQL> Alter database datafile '数据文件名及路径' resize xxM;

SQL> alter database datafile 'd:/oracle/oradata/ora8i/system01.dbf' resize 100m;
// 上一行中ora8i在具体系统中应该是相应的数据库名

更改之前,查询相应磁盘是否有空闲空间。
用相同的方法可以压缩数据文件的大小,但不能小于已经存储的数据的大小。

[1.2] 在Oracle8i数据库中,数据文件的大小可以自动扩展,命令如下:
SQL> Alter database datafile '数据文件名及路径' autoextend on;  --//该数据文件允许自动扩展(缺省)

SQL> Alter database datafile '数据文件名及路径' autoextend off; --//该数据文件不允许自动扩展

[*] 查询数据文件自动扩展属性:
SQL> select bytes, autoextensible, maxbytes, file_name from dba_data_files;

SQL> Alter database datafile '数据文件名及路径' autoextend on
 next 50m  -- // 每次扩展50M
 maxsize 1000m ; --// 最大扩展到1000M,如果unlimited,则受磁盘大小的限制
 
[*] 查询每次扩展量:
SQL> select bytes, increment_by, file_name from dba_data_files;

[安全起见,建议把自动扩展关闭]


[C.1] Sun Enterprise 6500: 8 * 34G
system01.dbf ==> 33G

SQL> Alter table emp deallocate unused;  --// 压缩表未用空间

2、日志文件(Redo log files):记录数据库修改前后的信息,用于数据库恢复。

每一个数据库至少有两个日志文件组,每组有一个或多个日志成员文件。每个组的成员文件的缺省大小是1M。

[*]假设有三个组,每个组有三个成员文件,Oracle的日志工作流程(概括起来为循环覆盖):

(1) 每个组中的日志成员文件之间的关系是镜像关系,每个成员分别存储到不同的物理磁盘上,只有全部损坏,这个组才算损坏。如果只有一个成员,则这个数据库是不安全的。

(2) 在同一个时刻,只有一个组在工作。当第一组不能全部存放要记录的数据时,则转换到第二组,如果第二组仍然写不下,则转到第三组,第三组仍然存不下,则再转回到第一组。如果第一组日志的归档模式为归档日志,则第一组日志中存储的数据归档到磁盘或者磁带上,然后数据被覆盖,如果是非归档日志(默认模式,建议改变为归档模式),则新的数据直接覆盖第一组的数据,这种情况就会造成数据丢失。

[*] 确认数据库(日志)归档方式:
SQL> select log_mode from v$database;

SVRMGR> archive log list

[C*] Oracle的数据库恢复
不完全数据库恢复:通过备份来回退,会造成部分数据的丢失
完全数据库恢复:数据不会丢失。
两种情况下都需要用到日志,日志对于数据库的恢复至关重要。

[*]
(1) 在线日志:v$log  // 当前使用的日志,current
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
        
[如果当前日志文件损坏,则数据库无法恢复。(打死也恢复不了)。]
[C*]日志文件组的名称是:REDO0X.LOG(X=1,2,3)。
[对于Oracle数据库来说,还有一个关键文件是SYSTEM01.DBF,如果这个文件坏了,整个数据库系统无法启动,数据也会全部丢失。]

[!!! 一定要做好数据库及日志的备份!!!]

日志文件:v$logfile  // 日志文件
归档日志:v$archived_log  // 日志组切换时归档到磁盘或者磁带上的日志

(4) 历史日志:v$log_history  // 日志的历史记录
SQL> select * from v$log_history;

[*] Redo Log 文件镜像
(1) 一组中Redo Log文件具有相同的信息。
(2) 选择合适的日志文件大小(不能太小,太小容易导致频繁的切换,从而导致过多的磁盘I/O,降低系统的性能)。
[C*] 内存的多少对数据库系统性能的影响是最重要的,日志虽然对系统性能有影响,但没有内存关键,内存一定要大。

[C*] Oracle数据库最大化参数:
maxlogmembers: 最大值是5,缺省值是2。
maxlogfiles:最大254,缺省32个。 // 最大的日志文件个数
maxdatafiles:最大65534, 缺省254。
maxloghistory:最大65534,缺省65534
maxinstances: 最大63,缺省1。

[组不需要太多,至少三个,四个一般就可以了]

[C* 不同日志文件组的文件大小可以不同,两个组中文件的个数也可以不同]
(3) 组中的成员同时被更新。
... [请参考PowerPoint教程]

[*] 日志切换:
DBA强制日志切换命令:SQL> alter system switch logfile;


[*] 在Oracle中,文件的扩展名没有任何意义,从以下数据字典中查询相应的文件的文件名
(1) 表空间文件*.dbf: dba_data_file, v$datafile
(2) 日志文件*.log: v$logfile
(3) 控制文件*.ctl: v$controlfile

SQL> select * from v$log;

查询数据文件同步号:SQL> seelct file#, checkpoint_change#, from v$datafile;

控制文件同步号:SQL> select checkpoint_change# from v$database;

/* 随着日志的切换或者时间的推移,文件的同步号不断改变,如果上述同步号不一致,表明数据库出现问题;由此,不能将不同机器上的单个数据库文件互相拷贝,因为同步号不一致,只能把一台机器上的所有数据文件同时拷贝到另一台机器上才可以使用。Oracle的同步号以控制文件(*.ctl)中的为准。 */

Oracle不提供修改同步号的命令。如果在一个数据库中出现同步号不一致的情况,说明这个数据库的数据已经有不一致的部分,原因可能是进行了不完全恢复,只有当数据完全恢复后,同步号才能重新变得一致。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
上述显示结果中的SEQUENCE#的最大值是65534,如果达到最大值,会自动清零,从头开始。


[*]日志管理与配置命令
A. 增加日志文件组:
SQL> Alter database ADD
 logfile group n('第一个日志成员文件','第二个日志成员文件') size xxM;
// n为组号。第二个日志成员文件为可选的,两个成员文件最好放到不同的物理磁盘上。

SQL>Alter database ADD
 logfile group 4('d:/oracle/oradata/ora8i/log41.log', 'd:/oracle/oradata/ora8i/log42.log')
 size 5m;

SQL>Alter database ADD
 logfile group 4('d:/oracle/oradata/ora8i/log41.log', 'd:/oracle/oradata/ora8i/log42.log')
 REUSE; // 如果在相应的路径下存在同名文件,请加Reuse直接覆盖原来的文件。
 

[C*]: Oracle不提供修改原来的日志组的属性(文件大小)的命令,解决办法是先创建新的,然后删除旧的

// ************************************* 实际操作内容 ************************************************
SQL> Alter database ADD
  2   logfile group 4('d:/oracle/oradata/ora54/ReDo41.log', 'd:/oracle/oradata/ora54/ReDo42.log')
  3   size 5m;


数据库已更改。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
         4          1          0    5242880          2 YES UNUSED                       0

SQL> alter system switch logfile;

系统已更改。

SQL> /

系统已更改。

SQL> /

系统已更改。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  INACTIVE                153302 2002年04月
         2          1        201    1048576          1 NO  INACTIVE                153435 2002年04月
         3          1        202    1048576          1 NO  CURRENT                 153436 2002年04月
         4          1        200    5242880          2 NO  INACTIVE                153434 2002年04月
/*****************************************************************************************************/

B. 删除日志文件组:
SQL> Alter database DROP logfile group n;

说明:(1)Current, Active组不得删除,如果是归档日志组,要求先归档,否则,该组状态为ACTIVE,不能删除。
(2) 数据库只有两个日志组时,不得删除。
(3) 逻辑删除后,再删除物理文件。切记:不要删除错了文件,尤其是在UNIX下,最好在删除之间检查正在使用的物理文件,(当然,如果删除之前先备份文件更好)如下命令:
SQL> select * from v$logfile;

C. 增加日志成员文件:
SQL> Alter database ADD logfile member '成员文件名及路径' to group n;

D. 删除日志成员文件:
SQL> Alter database DROP logfile member '成员文件名及路径';

说明:(1) Current, Active组的成员不得删除;
(2) 日志组只有一个成员时,不得删除成员,可以删除组。

3、控制文件(Control Files):是描述数据库结构的二进制文件。包括:
 。数据库名db_name
 。数据库创建的时间
 。全部数据文件名及路径
 。全部日志文件名及路径
 。数据库恢复时所需的同步信息
// 控制文件只需要一个,但在oradata目录下有三个,另两个是镜像,三个文件内容相同。

(1) 查询数据库跟踪文件信息(跟踪文件记录所有影响控制文件修改的命令):
D:/oracle/admin/db_name/bdump/SIDalrt.log // SID视具体情况而定
/u01/app/oracle/admin/db_name/bdump/alert_sid.log

// 这个文件时间长了之后会变得很大,因此需要定期删除。

(2) 建议设置:
 。至少设置两个控制文件并保存于不同的磁盘。
 。在数据库参数文件中的Control_files指明控制文件。
  . 控制文件可以镜像,可以在安装或者安装完成后进行配置
  .
 
[(2).C] 数据库参数文件名称及路径:
Unix:
/u01/app/oracle/admin/db_name/pfile/initSID.ora

Windows NT/2000:
D:/oracle/admin/db_name/pfile/init.ora

指明控制文件的参数:
control_files = ('file1', 'file2', 'file3')
例:
control_files = ( "D:/Oracle/oradata/ora54/control01.ctl",
    "D:/Oracle/oradata/ora54/control02.ctl",
    "D:/Oracle/oradata/ora54/control03.ctl")
   
(3) 查询控制文件名及路径:
SQL> select * from v$controlfile;

(4) 控制文控镜像方法:
A. 关闭数据库
B. 复制控制文件到目标路径
C. 修改参数文件control_files,包含新的控制文件
D. 重启数据库

[DBA的图形界面管理工具:DBA Studio]
启动DBA Studio, 选择“登录到Management Server”:
登录用户:sysman, 密码:oem_temp(默认,登录成功后要求修改)

在登录之前,要求Management Server服务已经启动,同时已经在系统控制台Console中搜索并增加(配置)了Management Server要管理的数据库。

二、逻辑结构:
数据库的逻辑结构包括:
。表空间(Tablespaces)
。段(Segments)
。区(Extents)
。数据块(Data Blocks)

数据块->区->段->表空间->(逻辑)数据库
(1) 表空间://对应四种不同的段类型,Oracle有四种对应的表空间
 。数据表空间
 。索引表空间: INDX
 。临时表空间: TEMP
 。回退表空间: RBS

(2) 段(Segments)的四种类型:
 。数据段:用来存储基表数据
 。索引段:存储索引数据
 。临时段:用于排序(Order by)、汇总等
 。回退段:用于事务回退,rollback语句使用

// 临时段和回退段占的空间固定,不能增大。
// Oracle中最复杂的就是回退段管理。
// 每个段的结构都大致相同,即包含若干个区,每个区的大小又是数据块的整数倍。
// 表空间是Oracle中最大的逻辑结构

1、表空间(Tablespaces):
(1)表空间的特点与作用:
。控制数据库数据磁盘分配

。跨越磁盘存储数据

。表空间通过离线(Offline)、在线(online)控制数据可用性。

[A]设置表空间offline、online、read only、read write属性:
SQL> Alter tablespace 表空间名 offline;
SQL> Alter tablespace 表空间名 online;  // 正常状态
SQL> Alter tablespace 表空间名 read only;
SQL> Alter tablespace 表空间名 read write; // 正常状态

[system表空间不得offline]

[B]查询表空间信息:
SQL> select * from dba_tablespaces;
SQL> select tablespace_name, status from dba_tablespaces;

。完成部分数据库的备份与恢复

。表空间通过数据文件来扩大,表空间大小等于构成该表空间的所有数据文件大小之和。

[A] 查询表空间与数据文件之间的关系:
SQL> select tablespace_name, file_name from dba_data_files;

2、段(Segments):
(1) 数据段:存储基表数据的段,由Create table命令产生。用户在创建基表时,则自动在用户缺省表空间中创建一个数据段。
[A]查询用户与用户缺省表空间对应关系:
SQL>select username, default_tablespace from dba_users;
[B] 查询表与所在表空间的对应关系:
SQL> select table_name, tablespace_name from user_tables;

如果一个表有分区,则用上面这个命令无法查询表所使用的表空间,因为表使用了多个表空间。查询方法如下:
SQL> select partition_name, segment_type, tablespace_naem from user_extents
 where segment_name = 'EMPLOYEE';

(2)、索引段:存储索引数据的段,由Create index命令产生。用户在创建索引时,则自动在用户缺省表空间中创建一个索引段。
[A] 索引与所在表空间的对应关系:
SQL> select index_name, tablespace_name from user_indexes;

[B] 使用索引表空间创建索引:
SQL> create index emp_job on emp(job) tablespace indx;
// 如果不加tablespace indx,则索引默认创建在用户缺省表空间中。

(3)临时段:用户排序、汇总时临时工作空间。临时段表空间在DBA创建用户时确定。创建用户时未指定临时表空间,则系统自动使用system表空间作为临时表空间使用。临时表空间公用(temp)。
[A] 查询用户及所使用的临时表空间:
SQL> select username, temporary_tablespace from dba_users;

// 建议不要使用system作为用户的临时表空间,因为容易导致碎片。

[B]DBA可以修改用户的临时表空间
SQL> Alter user 用户名 temporary tablespace temp;

(4) 回退段:用于用户在回退事务时使用。回退段由DBA创建,全体用户公用。
[A] 查询回退段及所对应的表空间:
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;

[B]为什么要设回退段?
回退段是数据库的一部分,是Oracle 数据库的一个重要参数,其设计是否正确直接影响到数据库的动态性能。Rollback 段的使用用于保存一个事务的操作,以便在某些情况下回退或取消操作。 每个Oracle数据库都有多个回退段。

[C] 回退段的作用
。并发操作时,保证数据的读一致性。
。使用 SQL语句rollback回退一个事务的操作。
。事务恢复的需要。

[D]回退段操作举例
。由于语句错误回退一个事务。
。回退一个事务、或回退事务到一个保存点(SavePoint)。
。由于异常进程中断而回退。
。在例程恢复中回退所有未完成的事务。

// delete操作是最消耗回退段的操作

[E]回退段使用原则
。根据事务大小及数量确定回退段。 // 每四个用户至少对应一个回退段
。每个事务必须对应一个回退段。
。一个事务可以根据回退段中“最少使用原则”来自动对应一个回退段。
[C*]只有delete、insert、update三个命令使用回退段
// 回退段可以自动动态扩展,但不能无限扩展。

/* 如果回退段都已经被用户占用,那么再增加新用户,则新用户使用所有回退段中磁盘扩展量最小的回退段(与其它用户共 享使用),这就是“最少使用原则”。因此,回退段可以共享。
*/

。在创建数据库后,应为系统创建回退段,事务越多,回退段应越多。

3、区(Extents):区是磁盘空间分配最小单位。每一个区的大小都是数据块的整数倍(用户可以指定,默认是5倍)。

SQL> select segment_type, extent_id, bytes, blocks from user_extents where segment_name = 'EMP';
 
(1)区大小控制参数(磁盘存储参数):
// 下面这五个参数对磁盘存储有直接影响
Initial:初始区大小
Next: 增长区大小
Minextents:区的最小个数
Maxextents:区的最大个数
Pctincrease:区的增长百分比

SQL> Create table sales(
 s1 char(20),
 s2 char(20)
 Storage( initial 10K --// 第一个分区的大小
   next 10K  --// 第二个分区的大小
   minextents 1 --// 最少一个分区
   maxextents 121 --// 最多121个分区
   pctincrease 50); -- // 区的增长比例为50%。
以上语句中的Storage部分,在建表时如果不写是要隐含执行的。
1Block = 2K
第一个分区:Initial = 10K = 1Blocks * 5
第二个分区:Next = 10K
第三个分区= Next + next * 50% = 10K + 5K => 变成blocks的整数倍 = 16K
第四个分区 = 第三个分区 * ( 1 + 50%)
...

例:SQL> Create table sales(s1 char(20), s2 char(20)
  Storage(initial 100K next 200K minextents 2 maxextents 121 pctincrease 0);

/* 区太小,会导致区的数目太多,进一步导致磁盘碎片的产生。而区太大,则容易浪费空间。因此,要选择合适的分区大小。最好的办法是根据数据量的大小给表只分一个区。*/
估算分区的大小的方法:以上面例子中的表为例:
(1) 1 行 = 40B
(2) 1block = 2048B , 2048B - 2048 * 20% - 标识= 1547
// 2048 * 20% 表示给一个块儿留的剩余空间,标识是用来存储表中每行在块中的位置的信息,其大小可以通过查询V$type_size来获得
(3) 1547 / 40 = A
(4) 假设表中可能有1百万行的数据(最大数据量),则1000000/A*2K = B 兆。

则 initial 为 B兆, 此时next值不要太大,因为initial区中已经分配了足够的空间,假设是100M,那么可以把Next设置成1M。

(2) 区存储参数可以用于:表空间、表、段(回退段)、索引

(3) 存储参数优先使用原则:
实体级参数> 表空间级对应参数> 系统缺省参数

实体级参数:指建立实体(如建表)时指定的存储参数
表空间级对应参数:可以从dba_tablespaces数据字典中查询。

(4) 查询实体的存储参数:
SQL> select initial_extent, next_extent, min_extents, max_extents, pct_increase
 from user_tables
 where table_name = 'EMP';

[C* 有时SQL*Plus中查询某个字段较多的表时,屏幕宽度不够,而滚动条又不能横向滚动,此时修改环境变量中的arraysize参数,将缓冲区宽度修改一下,默认是1000,可以修改成500,保存设置后即可使用横向滚动条。]

(5)存储参数的修改:
SQL> Alter table emp
 Storage (next 200k maxextents 2000 pctincrease 50); -- // 五个参数中只有这3个能够修改

4、数据块(Blocks): 数据文件存储空间单位,I/O最小单位。数据块大小由参数db_block_size决定,数据库创建后不得修改。
(1)查询数据块大小:
SQL> select value from v$parameter where name = 'db_block_size';


//

你可能感兴趣的:(oracle,职场,休闲,物理结构,数据库体系结构)