oracle学习大全

 

 

[第一章] Oracle 数据库体系结构

物理结构

逻辑结构

内存结构

进程结构

 

[数据库管理员DBADatabase Administrator]

DBA职责:

Oracle核心软件安装与产品升级

。为数据库系统分配存储空间及规划未来存储需求

。创建数据库存储结构

。用户权限与角色管理

。监视与控制用户对数据库的存储

。维护数据库安全

。完成数据库备份与恢复

。监视与优化数据库性能

 

一、物理结构:数据库是由构成数据库的操作系统文件所组成。

UNIX:/u01/app/oracle/oradata/db_name/ *.*

Windows NT/2000: D:\Oracle\oradata\db_name\*.*

 

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

 

包含三类物理文件:

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 200204

         2          1        197    1048576          1 NO  INACTIVE                112335 200204

         3          1        198    1048576          1 NO  INACTIVE                132450 200204

        

[如果当前日志文件损坏,则数据库无法恢复。(打死也恢复不了)。]

[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 200204

         2          1        197    1048576          1 NO  INACTIVE                112335 200204

         3          1        198    1048576          1 NO  INACTIVE                132450 200204

上述显示结果中的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 200204

         2          1        197    1048576          1 NO  INACTIVE                112335 200204

         3          1        198    1048576          1 NO  INACTIVE                132450 200204

         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 200204

         2          1        201    1048576          1 NO  INACTIVE                153435 200204

         3          1        202    1048576          1 NO  CURRENT                 153436 200204

         4          1        200    5242880          2 NO  INACTIVE                153434 200204

/*****************************************************************************************************/

 

B. 删除日志文件组:

SQL> Alter database DROP logfile group n;

 

说明:(1Current, 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]设置表空间offlineonlineread onlyread 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*]只有deleteinsertupdate三个命令使用回退段

// 回退段可以自动动态扩展,但不能无限扩展。

 

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

*/

 

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

 

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';

 

[2002.05.13]

//=====================================================================================================================

三、内存结构:

1、系统全局区SGASystem Glbal Area):共享的系统内存区域。SGA由三部分组成:数据缓冲区、日志缓冲区、共享池。

(1) 数据缓冲区(Database Buffer Cache): 存储由磁盘数据文件读入的数据,所有用户共享。数据缓冲区大小由参数db_block_buffers确定。

 。数据缓冲区大小:db_block_buffers * db_block_size

 。参数文件位置:

 Windows NT: D:\oracle\admin\db_name\pfile\init.ora

 UNIX: /home/app/oracle/admin/db_name/pfile/initSID.ora

 

 // Dirty: 数据被修改而未写盘。Pinned: 未修改的数据

 LRU( Least Recently Used): 最近最少使用原则

 

(2) 日志缓冲区(Log Buffer Cache): 存储数据库修改信息,由LGWR将日志缓冲区数据写入磁盘日志文件组。

 。大小由参数log_buffer确定

 

(3) 共享池(Shared Pool): SQL 缓冲区及数据字典区。对于SQLPL/SQL程序进行语法分析、编译的内存区域。

 。大小由参数SHARED_POOL_SIZE来确定。(在参数文件中,单位为字节)

 。分三部分:Libary cache, Data Dictionary cache, UGA(User Global Area)

 

 

 [C*] SQL 语句执行计划:

  Rule_Based: 基于规则,只考虑语句运行效率,不考虑成本。

  Cost_Based: 基于成本,考虑代价,硬件资源占用小。

SGA = db_block_buffers * db_block_size + log_buffer + shared_pool_size

 

[在实用情况中,SGA当然是越大越好,但最大不要超过系统可用内存的55%57%]

 

。查询SGA及数据参数取值:

SVRMGR> show sga

SVRMGR> show parameter

SVRMGR> show parameter db

SVRMGR> show parameter log

SVRMGR> show parameter 参数名称

 

SQL> select * from v$sga;

SQL>select * from v$sgastat;

 

查询数据库名称:SQL> select name from v$database;

查询数据库实例名称:SQL> select instance_name from v$instance;

 

2、程序全局区PGA(Pragram Global Area): 非共享区域,主要是用户编程时变量、数组工作区域。

 

3、排序区SORT AREA:用户使用order by排序、汇总时临时工作区域。排序区大小由参数SORT_AREA_SIZE确定。

 

4、大区(Large Pool): 使用于数据备份工具Rman, 只用在Oracle8以上的版本数据库,大区的大小由参数:Large_Pool_size确定。

 

5Java语言区(Java Pool): 用于Oracle 8iOracle9i中的Java语言。Java区的大小由参数Java_Pool_Size确定。

 

四、Oracle 实例的进程结构:

1、什么是Oracle实例?

  数据库启动时,系统分配SGA内存区域,同时启动后台进程,该SGA与后台进程合称为一个Oracle实例(Instance)

Instance ==> SGA + Background Processes

 

数据库与实例相联系,有一个数据库就有一个实例。实例名用参数instance_name表示,数据库名用参数db_name表示。

 

 。数据库实例名:

 instance_name (Oracle参数)

 ORACLE_SID(操作系统环境变量)

 Unix系统中选择数据库实例:

 $ORACLE_SID=ora8i

 $export ORACLE_SID

 存取另一个数据库时:

 $ ORACLE_SID=ora835

 $ export ORACLE_SID

 $ svrmgrl

 Windows NT/2000中选择数据库实例:

 c:\> set ORACLE_SID=ora8i

 C:\> svrmgrl

 C:\> set ORACLE_SID=ora835

 C:\> svrmgrl

 [*] Windows NT/2000中,数据库实例名定义在注册表中。

 

2Oracle实例的进程结构:

 Oracle进程:单进程

    多进程==> 用户进程、服务器进程、后台进程。

 Dnnn(Dispatcher): 调度进程

 ARCH:归档进程

 PMON: 进程监控

 SMON: 系统监控

 CKPT: checkpoint

 RECO: Recovery

 

 [*] 进程数量的限制参数:ProcessesOracle数据库进程数Processes < Unix 操作系统核心参数SEMMNS(这个参数指定Unix的最大进程数)

 

 // 查询后台进程及说明

 SQL> select name, description from v$bgprocess;

1 用户与服务器进程

 。用户进程(User Precess)在用户运行应用程序时自动产生。

 

[*] 数据存取方法:

a. 用户发出查询命令,产生user进程,server进程查找内存。

b. server 进程在内存没有找到数据时,则server进程从数据文件中读数据,则server进程在LRU找空闲块。

c. LRU中的dirty--> Dirty List

d. Dirty List超长(threshold), 通知DBWR刷新缓冲区。

e. 从磁盘读数据进入空闲内存。

 

(2) 后台进程:

 [A]DBWR:数据写入进程。该进程将数据缓冲区数据写入磁盘数据文件,是进行数据缓冲区管理的后台进程。

 

 设置DBWR进程数量参数:DB_WRITE_PROCESSES=1-10

 进程名称依次为:DBW0, DBW1, ... DBW9

 

 [B]LGWR:日志写入进程。将日志缓冲区日志信息写入磁盘日志文件组,在日志切换时,再将日志信息由归档进程ARCH写入磁盘或磁带,产生归档日志。一个数据库只有一个LGWR日志写入进程。

 

 [C]PMON(Process Monitor): 进程监控。在用户进程中断时,负责清理该用户所占用的硬件资源。

 

 [D]SMON(System Monitor):系统监控。负责清理用户不再使用的临时段。

 

 [E]ARCH:归档进程。该进程在日志切换时,负责将日志信息写到指定的磁盘存储目录,产生归档日志,是与数据库备份有关的一个后台进程。在缺少状态下该进程不存在(因为oracle默认安装状态为下日志为非归档方式)。

 [*] ARCH有关的数据库参数:

 。启动归档进程参数:log_archive_start=true (缺省为false)

 。确定归档日志文件磁盘存储目录:log_archive_dest=目录名

 log_archive_dest=/home/oracle/archive

 log_archive_dest=d:\oracle\archive

 。确定归档文件存储格式:log_archive_format=%t.%s.arc  

 /* %t:表示线程号 %s:表示日志序列号,这样文件不会同名。可以不要%t, 扩展名自己给,也可以不要扩展名。如%s.log。如果写成%S(大写的S),则文件名前面加零对齐。如123.log 会变成00123.log这种形式。*/

 

 。确定归档日志文件镜象目录:

 log_archive_duplex_dest=镜像目录名 (Oracle8以上)

 log_archive_duplex_dest=/home1/oracle/archive

 

 Oracle8i启用新的日志文件存储目录:

 log_archive_dest_n = 'Location=目录名'(Oracle8i以上) n<=5 // oracle9in <= 10

 

 log_archive_dest_1 = 'location=/home1/oracle/archive'

 log_archive_dest_2 = 'location=/home2/oracle/archive'

 ...

 log_archive_dest_5 = 'location=/home5/oracle/archive'

 

 [注意:]归档日志存储目录要么为2个,即使用dest and duplex_dest这种方式,要么为5个,即使用dest_n这种方式,两种方式不能混用。

 

 。失效参数(Oracle8i):

 log_archive_dest_state_n=DEFER(失效)

 log_archive_dest_state_n=ENABLE(生效)

 

 //使相应目录失效:log_archive_dest_state_1 = DEFER

 [*]也可以在线设置失效:SQL> alter system set log_archive_dest_state_1=defer;

 

 。启动多个归档进程参数:log_archive_max_processes = 110  //要启动几个就写几

 归档进程名称依次为:ARCH0, ARCH1, ... ARCH9

 

 // 以上参数查询请在svrmgrl中使用:show parameter log

 

 [SVRMGR> shutdown abort 是比shutdown immediate更有效的关闭数据库的命令]

 

 [F] CKPT:检验点(Checkpoint)进程,用来同步各个数据文件。Checkpoint_Change#

 

 a. checkpoint产生的六个条件[参考PowerPiont教程:dba_结构.ppt P61]

 

 // DBA强制产生检验点:SQL> alter system checkpoint;

 

 b. 检验点的几个参数

/* SVRMGR> show parameter checkpoint

NAME                                TYPE    VALUE

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

log_checkpoint_interval             ??    10000

log_checkpoint_timeout              ??    1800

log_checkpoints_to_alert            ???  FALSE

*/

 

五、Oracle连接配置结构

 

3、多线程服务器体系结构MTS(Multithreaded Server)

 

SVRMGR> show parameter mts;

 

[第二章 数据库启动与关闭]

 

一、数据库启动:

Unix:

 login: oracle

 Password: xxxx

 $

 $ORACLE_HOME: /home/app/oracle/product/8.1.7

 $ svrmgrl

 SVRMGR>connect internal

 SVRMGR> startup

 SVRMGR> exit

 [*]启动监听进程:

 $lsnrctl start

 如果在启动时报错,检查:/home/app/oracle/product/8.1.7/network/admin/listener.ora

 $lsnrctl stop  // 停止监听进程

 $lsnrctl status  // 显示监听进程状态

 

二、数据库启动过程:

1、启动数据库实例: ORACLE instance started

 。读取参数文件

 。分配SGA

 。启动后台进程

 // 如果启动出现问题,有可能是因为参数文件有问题或者内存不足。

2、数据库安装:Database mounted

 。读取控制文件

 。打开控制文件

 // 如果启动出现问题,可能是控制文件出现问题。

3、打开数据库:Database opened

 。打开全部数据文件

 。打开全部日志文件

 // 如果有一个文件出现问题,则数据库不能启动。

 

数据库文件读取顺序:参数文件 ==> 控制文件 ==> 日志、数据文件,三类文件中不能有一个文件损坏,否则数据库不能启动。

 

4、数据库启动过程中可以使用的选项:

 

SVRMGR> startup OPEN --123 // OPEN与不加OPEN效果相同,123指三个步骤:启动实例 ==> 安装数据库 ==> 打开数据库

SVRMGR> startup MOUNT --12 启动实例=> 安装数据库

SVRMGR> startup NOMOUNT -- 1  只启动数据库实例

 

(1) OPEN用于数据库的正常启动(或不加OPEN)

(2) MOUNT的使用方式:

 。用于修改数据库归档方式

 。用于数据库恢复。Recovery命令在mount状态使用。

mount状态,所有v$xxxx 数据字典可以使用,所有alter database命令可以使用。

 

(3) NOMOUNT的使用方式:

 。创建控制文件

 。创建新的数据库

 

(4) 数据库在MOUNT下可以使用的选项:

SVRMGR> startup MOUNT

SVRMGR> Alter database ARCHIVELOG;  // 将数据库由非归档方式修改为归档方式

[*] SVRMGR> Alter database NOARCHIVELOG; // 将数据库由归档方式修改为非归档方式

// SVRMGR> archive log list

// SVRMGR> select log_mode from v$database;

SVRMGR> Alter database OPEN;   // 将数据库由MOUNT直接到OPEN状态。

SVRMGR> Alter database OPEN READ ONLY; // 整个数据库以只读方式打开

SVRMGR> Alter database OPEN READ WRITE; // 整个数据库以读写方式打开(系统缺省方式,不需要写上READ WRITE

 

[2002.05.14]

//=====================================================================================================================

 

(5) 数据库在OPEN下可以使用的选项:

[A]

SVRMGR> startup PFILE=参数文件名称及路径

 

// 在有两个数据库存在的情况下,可以用如下方法同时启动两个数据库。

SVRMGR> startup PFILE=第一个数据库的参数文件名称及路径

SVRMGR> startup PFILE=第二个数据库的参数文件名称及路径

 

[B]

SVRMGR> startup RESTRICT // 限制性数据库启动命令,以这种方式启动数据库后,具有restricted session权限的用户可以连接数据库,其他用户不能连接。

 

DBA可以指定用户连接:

SQL> grant restricted session to scott;  // 指定权限

SQL> revoke restricted session from scott; // 收回权限

 

修改限制:

SQL> Alter system disable restricted session; // 解禁

SQL> alter system enable restricted session;  // 禁止

 

[C]

SVRMGR> startup FORCE // 强制性数据库启动命令

 

[D*] 允许多个选项同时使用,顺序没有关系:

SVRMGR> startup PFILE=c:\init.ora FORCE MOUNT

SVRMGR> startup force restrict pfile=c:\init.ora

 

三、数据库关闭命令:

在关闭服务器之前,必须使用shutdown命令先关闭数据库,再关闭操作系统。

 

SVRMGR> shutdown normal  // 正常关机。系统等待所有用户从数据库中正常退出,很难关掉。

SVRMGR> shutdown immediate // 立即关机。中断现在连接,回退未提交事务,不再接收用户的连接请求。(有的用户数据会丢失)

SVRMGR> shutdown abort  // 异常关机。只关闭实例,释放内存,不保证数据完整性。尽量少用。

SVRMGR> shutdown transactional // 事务终结后关机。等待用户提交数据后关闭数据库。

 

[补充内容]

四、数据库启动过程中失败恢复方法:

 

1、第一步不启动(实例):参数文件错误:参数错误、路径、文件名、参数设置错误等。

 

2、第二步不能mount:控制文件坏。检查有没有镜像文件,如果没有,需要重新创建控制文件。

 

3、第三步,数据库不能Open。数据文件或日志损坏。

 

(1) 数据文件(Datafile)被破坏或被误删除时数据库的恢复方法。

SVRMGR> startup mount

 

[A]如果数据库运行在ARCHIVELOG模式下,使用以下命令:

SVRMGR> alter database datafile '被删数据文件名及路径' OFFLINE;

// 在归档方式下,这个被删的文件可能通过归档日志恢复数据。

 

打开数据库:SVRMGR> Alter database open;

 

[B]如果数据库运行在NOARCHIVELOG模式下,使用以下命令:

SVRMGR> alter database datafile '被删数据文件名及路径' OFFLINE DROP;

// 在非归档方式下,被删数据文件的内容绝对不可能恢复,所以只好DROP掉。

 

打开数据库:SVRMGR> Alter database open;

 

(2) 日志文件(Redo Log Files)被破坏或被误删除时数据库的恢复方法。

SVRMGR> startup mount

 

删除被物理破坏的日志文件组:

SVRMGR> Alter database drop logfile group n;

 

增加已经被物理破坏的日志文件组:

SVRMGR> Alter database add logfile group n('日志成员文件', '日志成员文件') size xxM;

 

SVRMGR> Alter database open;

 

// 如果当前日志被破坏,则恢复操作将比较复杂,必须通过数据库备份来恢复(不完全恢复)

 

4、重新创建控制文件(Control Files):

创建控制文件的语法:

SVRMGR> startup nomount

    Create controlfile database 数据库名称

    logifle

    group 1 (日志文件名及路径'', '日志文件名及路径') size xxM,

    group 2 (日志文件名及路径'', '日志文件名及路径') size xxM,

    ...

    noresetlogs

    datafile

    '第一个数据文件名称及路径' size xxM,  // xxM中不能出现小数点儿,如果有小数,就使用K,如果仍然有小数,则使用字节。

    '第二个数据文件名称及路径' size xxM,

    ...

    character set zhs16gbk;

   

SVRMGR> startup nomount

  Create controlfile database ora8i

  logfile

  group 1 ('d:\oracle\oradata\ora8i\redo01.dbf') size 1M,   

  group 2 ('d:\oracle\oradata\ora8i\redo02.dbf') size 1M,

  group 3 ('d:\oracle\oradata\ora8i\redo03.dbf') size 1M,

  noresetlogs

  datafile

  'd:\oracle\oradata\ora8i\system01.dbf' size 70M,

  'd:\oracle\oradata\ora8i\rbs01.dbf' size 520M,

  ...

  character set zhs16gbk;

 

 

 

SQL> select bytes/1024/1024, blocks, file_name from dba_data_files;

// 通过这个命令来查询数据文件的大小,以Oracle中查询的数据为准,不要根据操作系统显示的文件大小来决定,建议事先做好备份。

 

[*C] 修改数据库名称时,需要重新创建数据库控制文件,语法如下(注意与上面的语法稍有不同):

SVRMGR> startup nomount

    Create controlfile set database 新数据库名称  // 这一行有不同,注意:数据库的名称一般不要超过5个字符。

    logifle

    group 1 (日志文件名及路径'', '日志文件名及路径') size xxM,

    group 2 (日志文件名及路径'', '日志文件名及路径') size xxM,

    ...

    resetlogs       // 这一行也有不同

    datafile

    '第一个数据文件名称及路径' size xxM,  // xxM中不能出现小数点儿,如果有小数,就使用K,如果仍然有小数,则使用字节。

    '第二个数据文件名称及路径' size xxM,

    ...

    character set zhs16gbk;

   

五、检测数据库文件工具:DBVerify

 

使用方法:

C:\> dbv file=文件名及路径 logfile=输出结果文件名 blocksize=数据块大小(缺省是2K,否则指出) start=起始数据块 end=终止数据块

 

可以检测数据、日志及控制文件等。如果不加start end,则默认检测整个数据文件。

 

[第三章 OracleUnix下安装]

 

一、创建数据库安装用户

 

*1OracleUnix下运行平台:

 Sun Solaris(Sun SPARC)(SolarisOracle目前运行最多的平台)

 HP-UX

 IBM-AIX

 COMPAQ Tru64-Unix(ALPHA)

 SCO UNIX(PC)

 Linux(PC)

 SGI

 // 前三种平台上运行的最多

 

*2、用户组名:dba(Oracle7, Oracle8)

  oinstall(Oracle8i, Oracle9i)

 

*3、在Unix下,与用户所在组有关的文件:/etc/group

如果要加新组就在此文件中新加一行,如:

oinstall::20:oracle,oraweb

// gid < 1024,组号越大,权限越小。

 

*4、与用户有关的文件:/etc/passwd

oracle8i:x:30:20:Oracle8i for Unix:/u01/app/oracle/product/8.1.7:/bin/sh

用户名:x:用户号:组号:描述(可省略):文件系统名称:shell

 

//# admintool  Sun的图形管理工具

//# sam   HP-UX

//# scoadmin  SCO UNIX

 

二、创建Oracle数据库安装目录

Unix下安装数据库,最好使用Oracle建议设置的标准目录:

OFA(Optimal Flexible Architecture):将Oracle的系统文件与数据库文件分别存储。

 

OFA要求创建两个目录:

$ORACLE_BASE

$ORACLE_HOME

 

假设目录为:/u01/app/oracle/product/8.1.7

则:$ORACLE_BASE = /u01/app/oracle    // 这个目录下的各个子目录存放数据库文件

$ORACLE_HOME = /u01/app/oracle/product/8.1.7  // 这个目录存储系统文件

 

例如:$ORACLE_BASE/oradata存储数据文件

 

$df -k // 查看文件系统的使用率,如果超过80%,就不要再继续添加文件,否则文件系统将十分慢

 

#mkdir app

# cd app

# mkdir oracle

...

# mkdir 8.1.7

 

# chgrp -R oinstall oracle //-R包括子目录,将oracle目录的属组改为oinstall

# chown -R oracle oracle  // oracle(第二个)目录的属主改为oracle用户

 

# ls -al

 

三、编辑安装用户的.profile文件,定义操作系统环境变量

 

NLS_LANGOracle用户在安装时默认安装为与操作系统一致的字符集,因此要想在英文版本的操作系统上安装支持中文的Oracle时,务必要设置这个环境变量。

 

#vi .profile // 内容如下:

ORACLE_BASE=/u01/app/oracle

export ORACLE_BASE

ORACLE_HOME=$ORACLE_BASE/product/8.1.7

export ORACLE_HOME

ORACLE_SID=ora8i  // 数据库实例名

export ORACLE_SID

ORACLE_TERM=sun  //终端类型,SCOvt100,防止字符混乱

export ORACLE_TERM

NLS_LANG="simplified chinese"_china.zhs16gbk (oracle8.0以后)

       .zhs16cgb231280(oracle 8以前,为保持数据兼容,如要导入oracle7的数据,建议选择这一个)

export NLS_LANG

LD_LIBRARY_PATH=/usr/lib:$ORACLE_HOME/lib

export LD_LIBRARY_PATH

ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data

export ORA_NLS33

TMPDIR=/var/tmp

export TMPDIR

PATH=/bin:$ORACLE_HOME/BIN:/usr/sbin;/opt/bin

export PATH

 

// .profile文件应该放在$ORACLE_HOME目录下。

 

四、配置操作系统核心

 

五、安装过程:

在安装光盘下运行:$./runInstall

 

 

[第四章 创建Oracle数据库、表空间管理、回退段管理]

 

一、创建数据库

1、确定数据库名、实例名、服务名

数据库名参数:db_name = prod

数据库实例名参数:instance_name = prod

域名:db_domain

数据库服务名参数:service_names = prod[.域名] //服务名等于:数据库名.域名,为了省事,一般不要域名。

 

2、创建新数据库的参数文件:init.ora

 

需要修改的参数:

db_name

instance_name

service_names

control_files : d:\oracle\oradata\prod\... 01 02 03

background_dump_dest: 后台信息跟踪文件的存储位置d:\oracle\oradata\prod\bdump

user_dump_dest: 用户信息跟踪文件的存储位置d:\Oracle\oradata\prod\udump

sql_trace = true

 

 

3、设置操作系统参数:主要是设置ORACLE_SID选择数据库实例

Unix下设置实例的方法:

$ORACLE_SID=ora8i

$export ORACLE_SID

 

换成另外一个:

$ORACLE_SID=prod

$export ORACLE_SID

 

 

Windows NT/2000下,有一个实例写在注册表中,如果要进入第二个数据库,设置方法如下:

C:\> set ORACLE_SID=ora8i

C:\> set ORACLE_SID=prod

 

// 为了不致发生混乱,每次在使用数据库之前,进行上述设置。

 

4、创建数据库实例

语法:C:\>oradim -new -sid [实例名] -intpwd [口令] -startmode auto -pfile [数据库参数文件名称及路径]

 

 。红色部分需要用户确定

 startmode: auto, manual

 。参数文件名称及路径:

 Unix:

  /u01/app/oracle/admin/db_name/pfile/initSID.ora

  /u01/app/oracle/product/8.1.7/dbs/initSID.ora // 这是oracle直接读取的参数文件

 // Unix中上面的dbs目录是pfile目录的symbol link,即两上文件是同一个文件。

 Windows:

  d:\oracle\admin\db_name\pfile\init.ora

  d:\oracle\ora81\database\initSID.ora   // 这是oracle直接读取的参数文件

 /*第二个文件指向第一个文件,上面这个文件可以随便放到什么位置,只要在第二个文件中通过IFILE指明了其位置,也可以直接用第一个文件的内容替换第二个文件的内容。*/

 

[*] 删除数据库实例方法:

D:\> oradim -delete -sid [实例名]

 

最后的命令格式为:

D:\> oradim -new -sid prod -intpwd prod -startmode auto -pfile d:\oracle\ora81\database\initprod.ora

 

[如果执行了set oracle_sid=prod后,仍然不能通过svrmgrl连接到internal用户,请检查是否在注册表中设置了local串。]

 

5、创建数据库:

SVRMGR> startup nomount

SVRMGR> create database prod

  logfile group 1('d:\oracle\oradata\prod\log1a.log',

     'd:\oracle\oradata\prod\log1b.log') size 2m,

      group 2('d:\oracle\oradata\prod\log2a.log',

     'd:\oracle\oradata\prod\log2b.log') size 2m

  datafile 'd:\oracle\oradata\prod system01.dbf' size 200m

   autoextend on next 10m maxsize 1000m

  character set zhs16gbk;

 

[2002.05.15]

//=====================================================================================================================

 

6、加载数据字典:

(1) 加载常用的数据字典:

SVRMGR>@d:\Oracle\ora81\rdbms\admin\catalog

SVRMGR>@/u01/app/oracle/product/8.1.7/rdbms/admin/catalog

 

(2) 加载PL/SQL程序包:

SVRMGR>@d:\Oracle\ora81\rdbms\admin\catproc

 

(3) 加载Java程序包:

SVRMGR> @d:\oracle\ora8i\javavm\install\initjvm

 

7、网络配置:

配置tnsnames.ora文件

d:\oracle]ora81\network\admin\tnsnames.ora

 

8、以system登录数据库,加载资源文件profile:

SQL> @d:\oracle\ora81\sqlplus\admin\pupbld.sql

 

//如果不运行这个sql程序,普通用户登录时会提示错误。

 

[C*] 对于新数据库,监听程序不用配置,如果运行中出现没有监听,则运行:

D:\> lsnrctl status

查看相应的数据库是否已启动监听。如果没有启动监听,运行:

D:\> lsnrctl stop

D:\> lsnrctl start

重启监听程序。

 

如果在SQL*Plus中登录数据库时,提示service_name丢失,则重启数据库。

 

SQL> select name from v$database; //查询当前数据库

 

[C*]Unix下:$dbassist

 

Windows NT/2000(oracle8i):

程序组-> Database administration-> Database Configration Assistant

 

可以删除已创建的数据库(服务、文件)。

 

通过提示符下命令:oradim -delete -sid prod -srvc oracleserviceprod

 

 

SVRMGR> show parameter license   // 查看最大会话数,0表示没有限制

 

共享服务器连接模式:

最大  缺省    说明

65534 254    最大数据库文件数

254  32    最大日志文件数

5  2    最大日志成员数

 

 

二、表空间管理

 

SQL> select * from dba_free_space;  // 查询表空间是否存在碎片

 

1、创建表空间

(1)语法:SQL> Create Tablespace tablespacename

   Datafile 'filespec' Attributes

   Default Storage

   Online/offline;

 

 

(2)实例:

SQL> Create tablespace sales_2002

 datafile

 'D:\oracle\oradata\ora8i\sales_2002_01.dbf' size 100m,

 'D:\Oracle\oradata\ora8i\sales_2002_02.dbf' size 100m

 autoextend on next 100m maxsize unlimited,   // 每个文件都可以加上这一行,表空间的扩展属性

 'D:\oracle\oradata\ora8i\sales_2002_03.dbf' size 100m

 default storage(initial 100k

     next 100k

     minextents 1

     maxextents unlimited

     pctincrease 0);

    

    

(3)查询表空间与数据文件对应关系:

SQL> select tablespace_name, bytes, blocks, autoextensible, file_name from dba_data_files;

 

(4)创建临时表空间:在创建表空间时增加临时表空间关键字:temporary

 

SQL> Create tablespace temp_data datafile 'd:\oracle\oradata\ora8i\acc01.dbf' reuse

default storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0)

TEMPORARY;

 

说明:A.上例中的reuse指在相应的目录已经存在一个acc01.dbf(大小已经确定,例如一个被删除的表空间,但物理文件未被删除),则按这个文件的大小新建文件,内容将被覆盖。如果文件不存在,需要使用size来确定大小。

 

B. 临时表空间用于排序,在创建用户时可以为用户指定专用的临时表空间。临时表空间不得用于创建永久性实体(例如表)。

SQL> create table aa(c1 number(10)) tablespace sales_2002;

SQL> create table bb(c1 number(10)) tablespace temp_data;

 

 

C. 查询表空间类型:SQL> select tablespace_name, contents from dba_tablespaces;

 

2、改变表空间:

 

1)为表空间增加数据文件:

SQL> Alter tablespace sales_2002 ADD

 datafile

 'd:\oracle\oradata\ora8i\sales_2002_04.dbf' size 10m,

 'd:\oracle\oradata\ora8i\sales_2002_05.dbf' size 10m

 autoextend on next 50m maxsize 1000m;

 

(2) 将数据文件从一个磁盘移动到另一个磁盘

 。将表空间脱机offline

  SQL> Alter tablespace sales_2002 offline;

 。物理移动:将要移动的表空间文件复制或移动到目的磁盘

 。逻辑移动

  SQL> alter tablespace sales_2002

   rename datafile

   'd:\oracle\oradata\ora8i\sales_2002_04.dbf',

   'd:\oracle\oradata\ora8i\sales_2002_05.dbf'

   to

   'c:\sales_2002_04.dbf',

   'c:\sales_2002.05.dbf';

 。将表空间联机online

  SQL> alter tablespace sales_2002 online;

 

其中,system表空间数据文件不得移动。

 

(3) 修改表空间的缺省存储参数

 

SQL> alter tablespace sales_2002

 default storage(

 initial 1m

 next 1m

 minextents 2

 maxextents 200

 pctincrease 50);

 

3、删除表空间

SQL> Drop tablespace 表空间名;  // 空的表空间。

SQL> Drop tablespace 表空间名 INCLUDING CONTENTS;  // 如果表空间中已经建表,必须加Including contents参数。

 

删除表空间后,再物理删除相应的表空间文件,一定要确认是否删除了正确的物理文件,在UNIX下,任何文件对root用户来说都没有保护措施,可以随便删除。

 

三、Oracle8i启用本地化管理(Locally Managed Tablespaces):

表空间类型:数据字典管理表空间,本地化管理表空间

 

本地化管理表空间自动消除磁盘碎片

 

SQL> create tablespace account datafile 'd:\oracle\oradata\ora8i\acc01.dbf' 10m

 default storage(initial 40k next 40k minextents 1 maxextents 121 pctincrease 0);

 

SQL> Alter database datafile 'd:\oracle\oradata\ora8i\acc01.dbf' resize 50m;

 

SQL> Alter tablespace account coalesce;  // 磁盘碎片合并命令。

 

1、区大小相同

SQL> Create tablespace account

 datafile 'd:\oracle\oradata\ora8i\acc01.dbf' size 10m,

 'd:\oracle\oradata\ora8i\acc02.dbf' size 10m

  extent management local uniform size 50k;

// extent management local: 区本地化管理;uniform:每个区大小相同,如果不指定sizesize默认是1m

 

对于实行本地化管理的数据文件仍然可以使用autoextend on next, maxsize等参数。

 

查询表空间类型及区管理方式:

SQL> select tablespace_name, extent_management, allocation_type from dba_tablespaces;

 

2、区大小由系统自动分配相同(系统缺省方式)

SQL> Create tablespace finance

 datafile

 'd:\oracle\oradata\ora8i\fina01.dbf' size 10m

 extent management local autoallocate;   // 缺省状况是autoallocate,如果只写extent management local

 

<=等价=>

SQL> Create tablespace finance

 datafile

 'd:\oracle\oradata\ora8i\fina01.dbf' size 10m

 extent management local;

 

表大小  区大小

64K   64K

1m   1m

64m   8m

1000m  64m

 

3、创建本地化管理临时表空间

SQL> Create temporary tablespace temp1

 tempfile

 'd:\oracle\oradata\ora8i\temp1_01.dbf' size 10m

 extent management local uniform size 10k;

 

[临时表空间不得使用AutoAllocate选项,就算不写uniform,默认也是uniform]

 

SQL> select tablespace_name, extent_management, allocation_type from dba_tablespaces;

 

[2002.05.16]

//=====================================================================================================================

四、回退段管理

1、创建回退段:rbs

 

[*]手动创建数据库后,必须先创建回退段表空间:

SQL> create tablespace rbs

 datafile 'd:\oracle\oradata\ora8i\rbs01.dbf' size 50m;

 

[*]创建回退段:

SQL> Create rollback segment rs01

 tablespace rbs

 storage(initial 40k next 40k

 minextents 2      // 最少是2,不能是1

 maxextents 121

 optimal 120k);  // optimal值的大小至少比2个区的大小要大才有意义,在本例中要大于80K

 

回退段的工作过程:(80K不够用了)扩张->(使用结束)回缩到Optimal ->(120K不够用了)再扩张。

 

新建回退段的缺省状态是offline.

 

SQL> Create rollback segment rs02 tablespace rbs; // 如果不加storage参数,则各参数取缺省值(即表空间的相关值)

 

[*]查询回退段信息:

SQL> select segment_name, tablespace_name, status from dba_rollback_segs;

 

[*]回退段的设计方法:

A. 使用create rollback segment 创建多个回退段,至少四个事务平均一个回退段

B. 修改参数文件,将创建的回退段写入下列参数:rollback_segments=(rs01,rs02,...)

C. 重新启动数据库

 

[*]创建公共回退段:

SQL> create public rollback segment rs10 tablespace rbs;

 

 

修改公共回退段,使公共回退段online:

SQL> alter rollback segment rs10 online;

 

公共回退段不需要修改参数文件即可online

 

查询:SQL> select segment_name, tablespace_name, status, owner from dba_rollback_segs;

 

 

2、修改回退段

 

SQL> Alter rollback segment 回退段名 online/offline; //对于私有回退段来说,只是临时修改,下次数据库启动时,只有参数文件中的回退段是online

 

 

3、删除回退段

A. offline

B. SQL> drop rollback segment 段名;

C. 如果是私有回退段,需要将其从参数文件中去掉。

 

// 无论是公共回退段还是私有回退段,都是系统共用的回退段。即作用相同。

 

[第五章 Oracle 数据库用户管理]

 

// PowerPoint讲义:DBA_用户.PPT

 

一、创建用户的Profile文件

SQL> create profile student limit  // student为资源文件名

 FAILED_LOGIN_ATTEMPTS  3  //指定锁定用户的登录失败次数

 PASSWORD_LOCK_TIME 5  //指定用户被锁定天数

 PASSWORD_LIFE_TIME 30  //指定口令可用天数

 ...

 [参考讲义:P6-P7]

 

二、创建用户

SQL> Create User username

 Identified by password

 Default Tablespace tablespace

 Temporary Tablespace tablespace

 Profile profile

 Quota integer/unlimited on tablespace;

 

:

SQL> Create user acc01

 identified by acc01   // 如果密码是数字,请用双引号括起来

 default tablespace account

 temporary tablespace temp

 profile default

 quota 50m on account;

SQL> grant connect, resource to acc01;

 

[*] 查询用户缺省表空间、临时表空间

SQL> select username, default_tablespace, temporary_tablespace from dba_users;

 

[*] 查询系统资源文件名:

SQL> select * from dba_profiles;

资源文件类似表,一旦创建就会保存在数据库中。

 

/********************************************************************************************

SQL> select username, profile, default_tablespace, temporary_tablespace from dba_users;

 

SQL> create profile common limit

 failed_login_attempts 5

 idle_time 5;

 

SQL> Alter user acc01 profile common;

 

**********************************************************************************************/

 

三、修改用户:

SQL> Alter User 用户名

 Identified 口令

 Default Tablespace tablespace

 Temporary Tablespace tablespace

 Profile profile

 Quota integer/unlimited on tablespace;

 

1、修改口令字:

SQL>Alter user acc01 identified by "12345";

 

2、修改用户缺省表空间:

SQL> Alter user acc01 default tablespace users;

 

3、修改用户临时表空间

SQL> Alter user acc01 temporary tablespace temp_data;

 

4、强制用户修改口令字:

SQL> Alter user acc01 password expire;

 

5、将用户加锁

SQL> Alter user acc01 account lock;  // 加锁

SQL> Alter user acc01 account unlock;  // 解锁

 

四、删除用户

SQL>drop user 用户名;  //用户没有建任何实体

SQL> drop user 用户名 CASCADE;  // 将用户及其所建实体全部删除

 

*1. 当前正连接的用户不得删除。

 

 

五、监视用户:

1、查询用户会话信息:

SQL> select username, sid, serial#, machine from v$session;

 

2、删除用户会话信息:

SQL> Alter system kill session 'sid, serial#';

 

3、查询用户SQL语句:

SQL> select user_name, sql_text from v$open_cursor;

 

 

/***************************************************************************************************************************

SQL> ALTER SESSION SET

 NLS_LANGUAGE= 'SIMPLIFIED CHINESE'

 NLS_TERRITORY= 'CHINA'

 NLS_CURRENCY= 'RMB'

 NLS_ISO_CURRENCY= 'CHINA'

 NLS_NUMERIC_CHARACTERS= '.,'

 NLS_CALENDAR= 'GREGORIAN'

 NLS_DATE_FORMAT= 'yyyy-mm-dd dy'

 NLS_DATE_LANGUAGE= 'SIMPLIFIED CHINESE' 

 NLS_SORT= 'BINARY'

 TIME_ZONE= '+08:00'

 NLS_DUAL_CURRENCY = 'RMB'

 NLS_TIME_FORMAT = 'HH.MI.SSXFF AM'

 NLS_TIMESTAMP_FORMAT = 'DD-MON-RR HH.MI.SSXFF AM'

 NLS_TIME_TZ_FORMAT = 'HH.MI.SSXFF AM TZH:TZM'

 NLS_TIMESTAMP_TZ_FORMAT = 'DD-MON-RR HH.MI.SSXFF AM TZH:TZM'

***************************************************************************************************************************/

 

[第六章 Oracle权限与角色管理]

 

一、Oracle 权限管理

SQL> grant connect, resource, dba to acc01;

 

SQL> revoke connect, resource from acc01;

 

二、Oracle 角色管理(参考讲义)

 

SQL> Create Role <role_name>

 Identified by password/ Not Identified;

 

SQL> Alter Role <role_name> ...

 

SQL> Grant <privs> to <role_name>;

 

SQL> Grant <role_name> to <user_name>

 

SQL> Set Role <role_name>

 All Except <role_name2> / None  // 使角色生效或失效

 

 

[第七章 Oracle 数据库备份与恢复]

 

一、Oracle归档方式

 

确认数据库归档方式:

 

SVRMGR> archive log list;

 

SQL> select log_mode from v$database;

 

 

二、Oracle归档方式配置步骤:

 

1、启动自动归档进程ARCH

 log_archive_start=true

 

2、确定归档日志文件存储目录

 log_archive_dest=目录名

 

3、确定归档日志文件存储格式

 log_archive_format=%t_%s.arc

 

4、确定归档日志文件镜像目录:

 log_archive_duplex_dest=镜像目录名

 

5、以MOUNT方式启动数据库,修改数据库归档方式:

 SVRMGR> connect internal

 SVRMGR> startup mount

 SVRMGR> alter database archivelog;

 SVRMGR> alter database open;

 

// 前面1234四个参数都在参数文件中。

 

[*]Oracle8i以后,可以使用多个镜像目录:[8i最多是5个,9i10个,与duplex方式不能混用]

log_archive_dest_1='location=d:\oracle\archive1'

log_archive_dest_2='location=d:\oracle\archive2'

log_archive_dest_3='location=d:\oracle\archive3'

 

[*]归档文件的格式为二进制,可以没有后缀。

 

实际操作:

1、在d:\oracle目录下建立archive1, archive2两个目录

2、修改init.ora文件,增加下面四行:

log_archive_start=true

log_archive_format=%t_%s.arc

log_archive_dest=d:\oracle\archive1

log_archive_duplex_dest=d:\oracle\archive2

 

3、进入svrmgrl

SVRMGR> connect internal/oracle

SVRMGR> shutdown immediate

SVRMGR> startup mount

SVRMGR> alter database archivelog;

SVRMGR> alter database open;

 

4、进入SQL*Plus

SQL> alter system switch logfile;

 

//检查d:\oracle\archive1archive2目录下是否有归档的日志文件。

 

[*]在线启动或关闭归档方式

SQL> Alter system archive log start;

SQL> Alter system archive log stop;

 

 

三、数据库物理备份

[*]为了最大限度地进行恢复,应选择最合理的备份方法来防止介质失败导致的数据丢失。

(1)非归档的操作系统备份

(2)归档的操作系统备份

(3)Export工具备份

注释:

。用归档的操作系统备份的方法来恢复到介质失败后的失败点。

。用其它的恢复方法恢复到介质失败后的最后一次备份点。

。用Export工具创建一个直接的数据库备份文件,它不能与归档log文件组合使用。

 

 

1、完全数据库脱机备份:可以在归档及非归档两种模式下使用。

操作步骤:

(1)编写一个要备份的最新的文件列表。

(2)SHUTDOWN命令关闭Oracle例程。

(3)用操作系统的备份工具,备份所有的数据文件、Redo Log文件、控制文件、参数文件。

(4)重启Oracle例程。

 

2、部分数据库联机备份:

备份步骤如下:

(1) 确认数据库运行在ARCHIVELOG下。

(2) 对于某一个表空间进行备份:

SQL> Alter tablespace 表空间名 begin backup;

 

(3) 操作系统备份相应数据文件

 

(4) 设置表空间备份结束标识:

SQL> Alter tablespace 表空间名 end backup;

 

恢复数据文件:

SVRMGR> Alter database RECOVER datafile '数据库文件名及路径';

 

<=等价=>

 

SVRMGR> RECOVER datafile '数据库文件名及路径';

 

3、部分数据库脱机备份:

备份步骤如下:

(1) 确认数据库运行在ARCHIVELOG下。

(2)将某一个表空间脱机:

SQL> Alter tablespace 表空间名 offline;

 

(3) 操作系统备份相应数据文件

 

(4) 将表空间联机:

SQL> Alter tablespace 表空间名 online;

 

恢复时也需要进行恢复数据文件:

SVRMGR> Alter database RECOVER datafile '数据库文件名及路径';

 

<=等价=>

 

SVRMGR> RECOVER datafile '数据库文件名及路径';

 

四、完全数据库恢复应用实例

[*]完全数据库恢复的语法:

  在数据库关闭时,数据库恢复语法(可以Mount):

 

SVRMGR> Alter database recover datafile 'filespec';

SVRMGR> Alter database recover database;

SVRMGR> Recover datafile 'filespec';

SVRMGR> recover database;

 

13及第24条命令分别等价。

 

  在数据库运行时,数据库恢复语法(OPEN):

SVRMGR> recover tablespace 表空间名;

SVRMGR>recover datafile 'filespec';

 

1、数据库文件被删除,数据库关闭时,数据库恢复方法:

A、复制数据文件的备份文件

B、以mount方式启动数据库

C、恢复数据文件

SVRMGR> alter database recover datafile '数据文件名';

D、打开数据库

SVRMGR> alter database open;

 

2、数据库在运行时,数据文件被删除的数据库恢复方法:

A、将数据文件设置为offline:

SVRMGR> alter database datafile '数据文件名' offline;

 

B、复制数据文件的备份文件

C、恢复数据文件

SVRMGR> alter database recover datafile '数据文件名';

 

D、将数据文件设置为online:

SVRMGR> alter database datafile '数据文件名' online;

 

 

3、数据文件被删除,该数据文件没有备份,数据库恢复方法:

A、以mount方式启动数据库

B、运行以下命令:

SVRMGR> Alter database create datafile '被删除数据文件名及路径'

    as '被删除数据文件名及路径';

 

C、恢复数据文件

SVRMGR> alter database recover datafile '数据文件名';

 

D、打开数据库

SVRMGR> alter database open;

 

五、不完全数据库恢复实例:

 

1、恢复一个被Dropped的基表:

A、关闭数据库

B、拷贝全部的数据文件(不拷贝日志及控制文件)

注:这些拷贝的数据文件是以前做的数据文件的备份,现在拷贝回数据库数据文件所在目录,覆盖掉原来的。当然,最好在覆盖之前将现在的数据文件及归档日志做好备份。

 

C、实施基于时间的不完全数据库恢复

SVRMGR> Alter database recover database until time '2002-05-17:9:00:00';

D、打开数据库

SVRMGR> Alter database open RESETLOGS;

// 执行了resetlogs之后,文件同步号将从0开始,以前所有的归档日志全部失效。

 

2、恢复一个被Dropped的表空间:

A、查询跟踪文件,确定表空间删除时间

D:\oracle\admin\db_name\bdump\sidAlrt.log

 

B、关闭数据库,复制未删除表空间前的全部数据文件及控制文件,不复制日志文件。

 

C、实施基于时间的数据库恢复:

SVRMGR> Alter database recover database until time '2002-05-17:9:00:00' using backup controlfile;

 

D、打开数据库

SVRMGR> Alter database open RESETLOGS;

 

六、数据库逻辑备份:(Export/Import)

 

1exp user01/user01 file=user01  // 用户方式:将user01用户的所有数据导出到user01.dmp文件中

2exp user01/user01 file=user01_table tables=(emp,dept, pay, ...)   // 表方式,将指定用户的指定表导出。

3exp    // 交互方式

4、卸出(导出)大表:

exp user/password file=filename direct=y  ...

// 加上direct=y,表明用直接路径卸出数据,不通过内存,直接卸出到磁盘,效率高,节省内存。

 

4、全部数据库卸出:

exp system/manager file=fulldb full=y direct=y

 

// 加上full=y,表示将整个数据库全部卸出。

 

用户方式和表方式可以在NT UNIX之间的Oracle进行数据传输,但整个数据库方式不能,因为包含了相关的数据文件信息。

 

 

七、卸出表空间:

1、检验表空间自包含性:检查表空间是不是与其它表空间有外键约束,有外键约束的不能卸出。

SQL> execute ...

 

2、将表空间设为只读

 

3、使用export卸出表空间

exp transport_tablespace=y tablespaces=mis file=expdat.dmp

 

4、使用Import装入表空间

imp transport_tablespace=y datafile='d:\oracle\oradata\x.dbf' tablespaces=mis file=expdat.dmp

 

 

八、Windows 计划任务备份数据文件

1C:\> net start schedule //启动计划服务

    net stop schedule //停止计划服务

   

2AT命令安排计划:

C:\>at 22:00 /every:m,t,w,th, f, s, su d:\fullback.bat // 每周一到周日的晚上十点运行d:\fullback.bat批处理文件

 

C:\>at /delete /yes  // 删除全部计划

 

3fullback.bat

svrmgrl @d:\fullback.sql

 

4fullback.sql

connect internal/oracle

shutdown immediate

host copy d:\oracle\oradata\ora8i\*.* e:\back

startup

 

 

还可以为数据库在线备份建立脚本通过AT调用执行,实现数据库的联机备份。

 

 

[第八章 Oracle 数据库的优化与调整]

 

一、下面三个参数属于SGA区的设置,主要看服务器内存是不是需要扩充。

 

1、数据缓冲区计算:(DB_BLOCK_BUFFERS)

 

SQL> select 1 - (phy.value /(blk.value+con.value))

 "   Hit Ratio"

 from v$sysstat phy, v$sysstat blk, v$sysstat con

 where phy.name = 'physical reads' and

   blk.name = 'db block gets' and

   con.name = 'consistent gets'

  

Hit Ratio最好是大于90%,需要在数据库在最繁忙的时候的命中率,否则需要增加内存。

 

 

2、日志缓冲区计算(log_buffer)

v$latch

 

sum(misses) 越接近于零越好。

 

3、共享池大小计算(shared_pool_size)

(1) v$librarycach:  PINS(命中),Reloads(失败)

 

Reloads/(pins + reloads) * 100 -> 失败率 -> 应小于1%,否则需要扩内存。

 

(2) v$rowcache: GETS(取到),  GETMISSES(失败)

 

 

二、排序区参数计算(SORT_AREA_SIZE):v$sysstat

 

sorts(disk) / sorts(memory)+sorts(disk)  失败率 < 10%

 

三、磁盘存储参数测算:

计算以下存储参数:

initial

next

minextents

maxextents

pctincrease

 

如果使用本地化管理,不需要计算以上参数。

 

四、数据库参数自动统计计算

1、修改参数文件:timed_statistics=true,重启数据库

 

2、在数据库最繁忙的时段运行下面两个SQL程序(在Oracle目录中搜索这两个文件)

 

SVRMGR>@d:\oracle\ora81\rdbms\admin\utlbstat.sql   

SVRMGR>@d:\oracle\ora81\rdbms\admin\utlestat.sql

 

3、查询d:\report.txt来看统计结果。

 

五、回退段优化设计

1、对于大事务,设计大回退段,提高数据操作速度。

 

步骤如下:

A、创建一个专用的回退段表空间。例如:rb100

B、在回退段表空间rbs100上创建大的回退段。

SQL> create rollback segment rbs100

 tablespace rbs100

 storage(initial 50m);

C、使回退段表空间online

SQL> Alter rollback segment rbs100 online;

 

D、指定用户使用专用的回退段表空间:

SQL> set transaction use rollback segment rbs100;  // 必须在事务开始前指定

 

E、事务结束后,删除回退段及表空间。

 

 

教师操作实例:

System用户操作:

SQL> create tablespace rbs1 datafile 'd:\oracle\oradata\ora8i\rbs1_01.dbf' size 10m

 

SQL> create rollback segment rbs100 tablespace rbs1;

 

SQL> alter rollback segment rbs100 online;

 

SCOTT用户操作:

CREATE table bb(s1 char(20));

 

insert into bb values('abcdefghi');

 

commit;   // 必须在事务开始之前设置回退段

 

set transaction use rollback segment rbs100;

 

 

system用户操作:

 

alter rollback segment rbs100 offline;

 

drop rollback segment rbs100

 

drop tablespace rbs1;

 

2、回退段I/O调整,具体步骤:

A、创建多个回退段表空间,对就不同物理磁盘,以平衡磁盘I/O

B、在多个表空间上分别创建回退段。例如:

rbs1:rbs01, rbs02, rbs03, rbs04, rbs05

rbs2: rbs06, rbs07, rbs08, rbs09, rbs10

 

C、修改参数文件,使回退段交叉排放。例如:

rollback_segments=(rbs01,rbs06,rbs02,rbs07,rbs03,rbs08,...)

 

 

[Oracle Developer/2000 系统开发工具]

 

简介:

Form: 开发基于Form应用系统,是Developer/2000的主要开发工具。

Report: 报表开发工具,开发设计各种报表。

Graphics:图形设计工具,开发基于数据库的图形界面

 

Form 包括以下三个工具:

Form Builder 设计与开发组件

Form compiler 编译组件

Form Runtime 运行组件

 

[Form Builder 设计]

 

一、创建一个简单的Form应用

 

表在Form Builder中称为数据块。

 

在新建的Form中的表格字段中可以输入查询条件,按F8按条件查询。

 

另外,可以在字段中输入变量,例如:emp表中的sal(工资)字段输入变量:x,在执行查询时,输入:x> 2000 and :x < 3000,则表示查询工资在20003000之间的人员。如果要查询1981年的人员,则在date字段输入:x,条件为:To_Char(:x, 'yyyy) = '1981'

 

查询最大工资::x = (select max(sal) from emp)

 

二、创建主从型Form应用:

1、使用主表创建主块

2、使用子表创建子块

3、建立主表与子表之间的关联

 

三、布局设计(Layout)

 

四、域属性表(Properties): 双击某字段即可调出属性表

 

格式掩码

 

五、创建文本项(Text Item):

 

文本项:用于显示数据库的统计结果

 

名称

数据类型

格式掩码

计算模式

汇总函数:总和

数据块:emp

数据项:fullsal

 

 

公式:水平计算

汇总:垂直计算

 

工资及奖金合计::sal + nvl(:comm,0)

 

数据->用项同步化

 

记录->显示的项数:0 -> 1

 

六、创建值列表LovList of Value):

 

七、创建按钮(Push Button):

 

1、创建文本类型按钮:

数据查询,条件查询,工资总和,报表打印、退出系统

2、创建图标类型按钮:

1)常用缺省图标:

save:数据提交

rt_rdel:数据删除

rt_radd: 数据插入

rt_rec4: >>

rt_rec3: >

rt_rec2: <

rt_rec1: <<

 

2)更改按钮属性

图标化:是

图标文件名:<Icon File path>

鼠标导航:否

显示的项数:1

 

(3) 增加按钮提示

保存

删除

插入数据

第一条记录

下一条记录

上一条记录

最后一条记录

 

 

八、创建显示项(Display Item):

显示项:只读数据项,用于显示数据库的统计结果。

 

 

九、创建单选按钮(Radio Button):

 

(1) 增加了单选按钮后,先到对象导航器中修改“Radio Group”的属性

 

名称:

鼠标导航:否

数据类型:数值

初始值:10

 

 

财务部(10)、销售部(20)、开发部(30)、网络中心(40

 

// 数据->需要:如果选择,则表明数据为非空,不允许为空,如果不在表中输入查询条件,则不允许移动光标焦点,应选

 

十、复选框(Check Box)

 

增加一个复选框,修改其属性:

名称:

标签文本:

复选时的值:y

未复选时的值:n

鼠标导航:否

显示的项数:1

数据库项:否

 

[Trigger 触发器设计]

一、按钮触发器设计:

触发器类型:WEHN-BUTTON-PRESSED

触发器代码:使用PL/SQL及函数编写程序代码。

 

Execute_Query;   // 执行查询的函数,这是写在相应按钮上的PL/SQL执行语句的脚本

 

编译,关闭,执行。

 

 

Enter_Query; // 条件查询函数

 

Exit_Form; // 退出系统函数

 

常用的对于数据库操作的函数:

Create_Record;  // 数据插入

Delete_Record;  // 数据删除

Commit_Form;  // 数据提交

Execute_Query;  // 无条件数据查询

Enter_Query;  // 条件查询

Next_Record;  // 下一条记录

Previous_Record;  // 上一条记录

First_Record;  // 第一条记录

Last_Record;  // 最后一条记录

Scroll_Up;  // 上滚一屏

Scroll_Down;  // 下滚一屏

Exit_Form;  // 退出系统

 

这些函数名不区分大小写。

 

如果在执行查询时提示Oracle错误,不能查询,有可能就是因为Form中一个与数据库字段无关的对象的数据库项设置成了,将其改成即可。

 

工资总和按钮的WHEN-BUTTON-Pressedpl/sql脚本:select sum(sal) into :Display_sumsal from emp;

 

 

二、创建Form级触发器完成数据库的自动查询与统计:

A. Form启动时,进行自动查询

 

触发器名称:WHEN-NEW-FROM-INSTANCE

对象导航器->表格->Form1->触发器->新增

 

脚本内容:Execute_Query;

 

 

B. Form启动时,进行自动统计计算

 

触发器名称:POST-QUERY

对象导航器->表格->Form1->触发器->新增

select sum(sal) into :Display_sumsal from emp;

 

C. 显示动态时间:

触发器名称:POST-QUERY

自动显示统计时间:yyyymmDD

增加一个显示项:DISPLAYTIME

数据类型:字符

立体:无

 

修改POST-QUERYR的脚本,增加一行:

:DISPLAYTIME := To_Char(sysdate, 'yyyy""mm""dd""');  --// 显示的是客户端时间

 

select To_Char(sysdate, 'yyyy""mm""dd""') into :DISPLAYTIME from dual; --// 显示的是服务器端时间

 

[C*]在编辑触发器脚本中汉字不能正确显示的解决办法:

先退出FormBuilder。然后:

regedit -> HKLM-> Software -> Oracle -> 新建字串de20_plain_edit,键值为1

再重新进入FormBuilder即可解决所有的汉字显示问题。

 

D. Form启动时,MDI窗口最大化及标题设置,同样在FORMPOST-QUERY触发器中设置:

SET_Window_Property(FORMS_MDI_WINDOW, WINDOW_STATE, maximize);

Set_Window_property(FORMS_MDI_WINDOW, TITLE, '公司员工工资情况一览表');

 

设置MDI子窗口Window1:

SET_Window_Property('window1', WINDOW_STATE, maximize);

Set_Window_property('window1', TITLE, '员工管理信息系统 Version 200205 Build 1');

 

 

[*] 进入Form1模块的属性设置-> 菜单模块 -> default&smartbar default表示菜单,smartbar表示工具栏,去掉就表示没有这些东西。

 

[*] Window1属性-> 模式 -> 是。意味着这是mdi窗口中的最后一个窗口。还可以取消最大最小化等按钮,实现mdi子窗口看上去与主窗口好象一个窗口。

 

三、单选按钮触发器:

触发器类型:WHEN-RADIO-CHANGED

脚本:

Declare

 string varchar2(50);

 v_dname dept.dname%type;

Begin

 select sum(sal), count(*) into :Display_item2, :Display_item3 from emp

  where deptno=:select_deptno;

 select dname into v_dname from dept where deptno = :select_deptno;

 string := v_dname || '部门统计结果';

 Message(string);

 

Exception

 when NO_DATA_FOUND THEN

  Message('数据库中没有编码为'||:select_deptno||'的部门。');

End;

 

四、时间触发器(Timer):

1、创建计时器,确定时间间隔:

触发器名称:WHEN-NEW-FORM-INSTANCE

增加脚本:

Declare

 timer_id timer;

Begin

 timer_id := Create_Timer('T1', 1000, REPEAT);

End;

-- T1:计时器名称(大写);1000:时间间隔(毫秒);REPEAT:重复

 

2、创建时间触发器的执行操作:

触发器名称:WHEN-TIMER-EXPIRED

Declare

 t_name varchar2(30);

Begin

 t_name := Get_Application_Property(TIMER_NAME);

 if t_name = 'T1' then Begin

  --显示Server时间

    select To_Char(Sysdate,'yyyy""mm""dd""hh24""mi""ss""')

     into :DisplayTime from dual;

     --显示本机时间

   :DisplayTime :=To_Char(Sysdate,'yyyy""mm""dd""hh24""mi""ss""') ;

 

  --select To_Char(sysdate, 'yyyy""mm""dd""hh24""mi""ss"") into :DisplayTime from dual;

  End;

 End if;

End;

 

五、复选按钮触发器:

触发器类型:WHEN-CHECKBOX-CHANGED

脚本:

Begin

 if :ifprint='y' then

  Set_Item_Property('print_report', ENABLED, PROPERTY_TRUE);  --// 使打印按钮生效

 ELSE

  Set_Item_Property('print_report', ENABLED, PROPERTY_FALSE);  --// 使打印按钮无效

 end if;

end;

 

六、菜单设计

c:\orawin95目录下查找menudef.mmb,然后打开该文件,双击MENUDEF编辑原来的菜单(删除不要的,添加需要的),然后另存为自己的菜单menu1.mmb,然后编译(文件->管理->编译文件CTRL+T)。。然后在Form1的属性设置中,将菜单模块直接设置成菜单文件的名称及路径,例如:e:\xyf\menu1

 

七、基于数据库的图象字段存储:

1、在数据库中创建一个含有图象字段的基表。

SQL>Create table employee as select * from emp;

SQL> alter table employee add(photo long raw);  --//加上long raw字段后,该表就不能再用select * 去查询

 

2、对图象文件进行唯一性编码

 

SQL> Spool e:\empno

SQL> select empno from emp;

SQL> Spool off;

 

生成e:\empno.lst文件,存储了所有雇员的empno列表作为图象文件的唯一性编码

如:7788.jpg...

 

3、创建Form,编写触发器调用图象文件:photo.fmb

photo属性->大小风格 -> 调整

 

empno字段的触发器:WHEN-NEW-ITEM-INSTANCE

Declare

 photo_name varchar2(50);

Begin

 photo_name := 'e:\xyf\'||To_Char(:empno)||'.jpg';

 Read_Image_File(photo_name, 'jpg', 'photo');

End;

 

4、图象数据提交数据库。

 

5、删除本机图象,删除触发器。

 

八、标签画布(Page):

不使用数据块向导,直接在表格处新增一个Form,然后进入布局编辑器,选择左边工具栏中的标签画布新建一个标签画布。然后回到对象导航器,删除原来的画布。

 

在布局编辑器中,在标签位置按鼠标右键->属性选项板,可以进入标签画布的根的属性设置中,而在某个标签的中间部位按鼠标右键->属性选项板,则可以进入这个标签页的属性设置。

 

对象(导航器) -> 数据块 -> 关系 -> 新建:dept.deptno = employee.deptno

 

各个标签页的显示顺序,由在各个页上的数据块在对象导航器中的排列先后顺序确定,可以通过鼠标拖动来直接调整其排列顺序。

 

 

[Oracle Application Server应用服务器]

试验环境:

Oracle Server:

IP: 75.64.23.30

SID: orcl

 

Oracle Application Server:

IP: 75.64.23.40

Host Name: ntsvr1

 

用户:

user01/user01, ... user40/user40

 

一、WWW原理简介

 

URL: Uniform Resource Locator

HTTP: Hyper Text Transfrer Protocol

HTML: Hyper Text Markup Language

 

二、Oracle Application Server概述

 

 

三、Oracle Application Server 服务器启动

在操作系统下命令启动:

$ owsctl start   // 启动OAS服务器

$ owsctl start -nodemgr // 启动OAS管理节点

 

管理节点:

IP: 75.64.23.40:8888  //管理节点的端口号为8888

管理员用户:Admin

 

四、Oracle Application Server 原理简介

http://www.oracle.com:80/news.html     // 静态页面

http://www.oracle.com:121/cgi/plsql/p_query.go  // 动态页面

 

五、Oracle Application Server 配置步骤:

1、加载PL/SQL 程序包(通过IE登录到OAS的远程管理节点)

 

http://ntsvr1:8888/  (配置方法:在c:\windows目录下建立文本文件hosts,内容为:75.64.23.40 ntsvr1)

 

OAS实用程序-> 安装 -> PL/SQL工具包 -> 数据库连接串 -> sys用户口令 -> 应用。

 

如果OASOracle服务器在一台机器上,则使用Oracle_SID,否则要使用连接串。

 

2、创建HTTP监听进程

在创建HTTP监听进程时,需要确定的信息:

监听进程的名称

端口号:(1 - 16653 之间)

主机名称:

 

3、创建DAD(Data Access Description)数据存取描述器,建立OAS与数据库之间的连接

Oracle Application Server => DB存取描述

 

需要确定的信息:

。名称:

。合法的数据库用户名及口令

。数据库位置:

。网络连接串名

 

4、创建应用:

 

选择应用程序所使用的语言:PL/SQL

应用程序名:mis01

 

应用的状态标志一般为红旗,没有关系。

 

5、创建插件。确定信息如下:

。插件名称:mis01

。显示名称: 人员工资信息

。虚拟路径:/cgi/plsql  //这里怎么设置,用户在输入时就要怎样输入URL

。物理路径: %ORAWEB_HOME%\bin

。所连接的数据库信息:通过DAD确定(下拉菜单选择)

 

用户输入URL范例:http://75.64.23.40:1234/cgi/plsql/p_test

 

 

[***]所有配置结束后,重新加载OAS

 

 

六、使用PL/SQL开始Web页面

 

1、标记函数:

htp.htmlOpen   <HTML>

htp.htmlClose </HTML>

htp.headOpen <HEAD>

htp.headClose </HEAD>

htp.bodyOpen    <BODY>

htp.bodyClose   </BODY>

htp.comment      <!--    -->

 

2PL/SQL过程、函数、包:

owa_cookie

owa_image

owa_util

owa_opt_lock

owa_pattern

owa_sec

owa_text

 

 

3

HTML

<html>

<head>

<title>欢迎使用Oracle Application Server</title>

</head>

<body><p>

<strong>欢迎使用Oracle Application Server!</strong></p>

</body>

</html>

 

对应的PL/SQL程序:

Create or Replace Procedure P_ShowExample  AS

       BEGIN

         htp.htmlopen;

         htp.headopen;

         htp.title('Oracle Application Server 4.0!');

         htp.headclose;

         htp.bodyopen;

         htp.strong('欢迎使用Oracle Application Server!');

         htp.bodyclose;

         htp.htmlclose;

       END;

 

SQL*Plus中运行上面的程序创建相应的存储过程。

 

 

4、显示数据库中基表的数据:P_TEST.sql

Create or Replace Procedure P_Test  AS

           ignore boolean;

              BEGIN

                     htp.htmlopen;

                     htp.headopen;

             --      htp.title('Display the Current Users in Oracle Database!');

                     htp.headclose;

                     htp.bodyopen;

                     htp.header(1, '  输出数据库基表中数据');

                     ignore := owa_util.tableprint('emp','BORDER',owa_util.html_table);

                     htp.bodyclose;

                     htp.htmlclose;

              END;

             

5、动态数据基表名称:P_query.sql

运行方法:http://75.64.23.40:1234/cgi/plsql/p_query.go

 

6webalchy.exe: //可以将标准的html文件转换成PL/SQL程序。       

 

 

7、使用列表项,选择部门编码:P_Select.sql

http://75.64.23.40:1234/cgi/plsql/p_select.go

 

[C*] owa_util.TablePrint函数用法

owa_util.tablePrint(c1,c2,c3,c4,c5,c6,c7,c8)

 

其中:

c1: 表名。例如:'emp'

c2: 是否有表格线。'BORDER'

C3: 表格的格式。owa_util.html_table

c4: 基表中的列名。缺省为'*',即所有列

c5: where语句:例如:'where deptno = '||v_deptno||' or sal > '||v_sal|| 'order by sal',

c6: 列名的别名

c7: 最少显示多少行,0(全部显示)

c8: 最大显示多少行,缺省为NULL

 

8、输入员工编码,显示员工信息:P_empno.sql

 

9、多个选择项:列表项及文本框输入:P_Mselect.sql

 

10、使用无线组(Radio Group) 显示部门信息:P_rselect.sql

 

11、向数据库中录入员工信息:P_input.sql

 

 

[Report Builder 报表设计]

一、创建一个简单的报表:

Report Builder -> 工具 -> 报表编辑器 -> 新建查询

 

然后布局向导创建布局。

 

预览界面->点左上角图标 -> 数据模型 -> 再点左上角图标 -> 预览界面

 

二、创建分组报表

在数据模型界面拖动要分组的列到列外即可创建分组。

 

1、增加公式列(水平方向计算):

数据模型->左边工具栏中公式计算图标。

return :sal + nvl(:comm,0);

 

2、增加汇总列(垂直方向计算):

 

每次有新列(域)增加后,都要在数据模型主窗口->鼠标右键->报表向导中进行适当的修改。

 

三、布局设计(Layout)

1、报表向导->标签:修改标签为中文

 

2、视图->布局模型

编辑->选择全部

左边工具栏->添充颜色,格式->字体

 

页边距:相当于页眉,顶部工具栏中按钮。

 

在增加文本框时,如果默认字体不是中文,请先在格式->字体中设置为中文字体,然后再输入。

 

双击域可以设置字段属性。

 

四、创建主从型报表:使用主从型 藏青创建主从型报表

 

1、在对象导航器->报表->新建->手动,进入数据模型窗口。

 

2SQL:

1select * from dept

2 select * from emp

 

3)点击左边纵向工具栏中数据链接:从dept.deptno 拖动到emp.deptno1放开,建立数据链接。

 

4)报表向导

 。风格:上边分组。

 。组:两个组均是纵向

 。域:除了重复的deptno1之外都要

 。模板:无模板。

 

3、在布局模型中调整表格结构

 

 

五、创建矩阵报表:

1、构造矩阵报表至少需要四个组:

一个横向显示数据的组

一个纵向显示数据的组

一个在交叉点显示数据的组

一个矩阵单元组

 

2、操作步骤:

 

1)手动创建一个报表。

 

(2) SQL1:select deptno, job, sum(sal) from emp group by deptno,job;  

 

(3) deptnojob拖出成为两个分组的条件。

 

(4) 点击左方工具栏交叉单元按钮,将G_2.DEPTNO G_3.job括起来,这样成为一个G_4交叉组。

 

(5) 报表向导

风格:矩阵

单元:sum_sal

总计:总和(sum_sal)

模板:无

 

(6) 布局模型重新布局。

 

 

六、分组矩阵报表:

 

(1)手动创建一个报表。

 

(2) SQL1:select To_Char(hiredate, 'yyyy') year, deptno, job, sum(sal) from emp group by To_Char(hiredate,'yyyy'), deptno, job;

 

Q_emp, G1

 

(3) Year,deptnojob拖出成为三个分组的条件。G_year, G_deptno, G_sulsal, G_job, G_cross

 

(4) 点击左方工具栏交叉单元按钮,将G_3.DEPTNO G_4.job括起来,这样成为一个G_5交叉组。

 

(5) 报表向导

风格:分组矩阵

 

 

[Graphics Builder 图表设计]

一、创建饼图(Pie):

1、打开Graphics Builder,连接数据库。

菜单:图表->创建图表

 

2、输入SQL语句确定数据源:select deptno, sum(sal) from emp group by deptno; -> 执行 ->确定

 

3、图表:饼图,名称:Pie

 

4、菜单:图表->框架->饼框架->显示数据值,显示百分比值

 

可以修改所显示数据值的字体、颜色等。可以修改饼图的框架、侧面及阴影的填充颜色等。

 

二、创建列图(Column):

 

1. SQL: select ename, sal from emp

 

2. 名称:column

 

图表框架: 深度尺寸,阴影尺寸,阴影方向。显示绘图框架(选中),显示图例(去掉)。

 

侧面、顶部、阴影的填充颜色,不要修改正面的填充颜色。

 

双击两个坐标轴可以设置坐标轴属性,去掉显示坐标轴标签

 

3. 画一个矩形将图表括起来,填充颜色然后置后,给图表加上标题。

 

 

三、创建主从型图表(Drill-Down):

1、创建主图:pie

select deptno, sum(sal) from emp group by deptno

 

2、创建参数

导航器-> 参数 -> 新增

名称:n

类型:数字

初始值: 10

3、使用参数创建子图

新建图表-> 新建查询 -> select ename, sal from emp where deptno=:n; // 将参数n放入第二个查询中。

子图名:column

 

4、建立两个图表之间的关系

选饼图中心双击->对象属性->细化:

设置参数:N

对于值:DEPTNO

执行查询:query1(新建的子查询)

 

5、运行

 

 

四、图表切割:

选饼图中心双击->对象属性

 

过程->编辑

 

rrow number;

 

chart og_object;

 

BEGIN

 chart := Og_Get_Object('pie'); // 将名为pie的图表放到chart变量中。

 rrow := Og_Get_Row(HITOBJ);

 Og_Set_Explosion(chart, rrow, 'deptno', 50);  // 切割的距离为50个小数点

 Og_update_Chart(Chart, OG_ALL_CHUPDA);

End;

 

 

[Developer/2000集成]

一、Form调用Report:

1、创建一个含有参数的报表:r11

2、在Form中调用Report:Form以前面建立的Form1 (Form3)为例)。

 

报表打印按钮的WHEN-BUTTON-PRESSED脚本:

Declare

 pl_id paramlist;

Begin

 pl_id := Create_Parameter_List('tmpdata');

 Add_Parameter(pl_id, 'dno', TEXT_PARAMETER, To_Char(:deptno));

 Add_Parameter(pl_id,'paramform',TEXT_PARAMETER,'no');

   Run_Product(REPORTS,'e:\xyf\r11.rdf',

    ASYNCHRONOUS,RUNTIME,FILESYSTEM,pl_id,null);

   Destroy_Parameter_List(pl_id);

End;

 

二、Form 调用Graphics:

1、创建一个含有参数的图表

select ename, sal from emp where deptno = :dpt;

 

2、在Form中创建图表项

3、编写触发器调用图表

 

访问表空间权限控制:

去掉用户对某个表空间的访问权限

ALTER USER ZYIBSS QUOTA 0 ON IBMS_DATA_DATA;

ALTER USER ZYIBSS QUOTA 0 ON IBMS_DATA_IDX;

 

增加用户对某个表空间的访问权限

ALTER USER ZYIBSS QUOTA UNLIMITED ON IBMS_DF_DATA;

 

移动表空间:

alter table tcm-user move tablespace  ibms-data-data

 

 

append是优化提示器,这个最好不用,你可以用并行提供来做

insert /*+parallel(emp,2) */ into emp nologging 2是代表什么啊?

2是用2CPU来并发做事

这个有什么好处,可以加快速度?还是 ?

 

能允分利用多处理器的好处喽

会明显变快的

看你的主机是多少CPU的了,我最多用16

反正69012cpu

也可以使用索引提示

 怎么用??

如果用到某个table的索引

 /*+ index(字段名) */

 提前告诉优化器要用到的索引是吗?

/*+ index(table名,字段名)*?

 是的,有时你现成的索引,oracle不一定会用,指定后oracle尽量用你指定的索引

还有什么好东西啊?大哥啊。给我点资料有不咯?呵呵

 /*+ index(table名,字段名)*/这个是放在select语句里吗 ??放在什么位置啊

 放在第一个关健字后梑

 我用了/*+parallel(emp,2) */还要用 NOLOGGING吗??

也可以用

 爽,谢谢。不过很抱歉。今天因为我多加了个/*+append*/使的tcm-cust-rela增大了100多倍,造成表空间不够,所以数据还没有出来,我刚才才通过测试找出来。

 优化器多时oracle会根据实际情况选择一个来用

 INSERT /*+parallel(TCM_CUST,2) */ INTO TCM_CUST NOLOGGING (字段)values() 这种写法对不?

关于这方面的书,我明天找一下,如果有我发给你,我手头上有一本事,但讲的很少。

 好。我现在给你们准备数据。郁闷啊。浪费了一天的时间。

  这样很快的

 690一共12cpu ,我填10个会不会有问题啊?

 晚上别熬的太晚了

 没事,oracle有大量的并发能力,关健要看数据有没有把值设的大一点,现在业务少,可以这么做

 

select * from (select rownum as aa, a.* from tcm_user a where rownum<100) where aa>10

 

 

关于Oracle中的时间计算问题!

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

  to_date('2003-8-1 18:20', 'yyyy-mm-dd HH24:MI') - to_date('2003-7-3 18:35', 'yyyy-mm-dd HH24:MI')

   得到一个值,如何将得到的值转化为分钟?也就是说它们两个值之间相差的分钟?

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

 

(to_date('2003-8-1 18:20', 'yyyy-mm-dd HH24:MI') - to_date('2003-7-3 18:35', 'yyyy-mm-dd HH24:MI'))*24*60

 

(dateA-dateB)*1440 = N

(dateA-dateB)*86400 = N

 

  round()四舍五入

  ceil()大于n的最小整数

 

 

如果不小心把表给delete掉了并且commit了,不要紧,你可以用如下语句进行恢复

 select * from tfm_action_list as of timestamp (systimestamp -interval'4000'second)

 

 

 

 

 

 

 

 

 

 

  

posted @ 2009-07-14 14:43  阿里巴巴的博客  阅读(1422)  评论(0编辑  收藏  举报