1.1数据库环境配置原则 
   
 1.1.1操作系统环境: 
   
 对于中小型数据库系统,采用linux操作系统比较合适,对于数据库冗余要求负载均衡能力要求较高的系统,可以采用Oracle9iRAC的集群数据库的方法,集群节点数范围在2—64个。对于大型数据库系统,可以采用SunSolarisSPARC64位小型机系统或HP9000系列小型机系统。RAD5适合只读操作的数据库,RAD1适合OLTP数据库 
   
 1.1.2内存要求 
   
 对于linux操作系统下的数据库,由于在正常情况下Oracle对SGA的管理能力不超过1.7G。所以总的物理内存在4G以下。SGA的大小为物理内存的50%—75%。对于64位的小型系统,Oracle数据库对SGA的管理超过2G的限制,SGA设计在一个合适的范围内:物理内存的50%—70%,当SGA过大的时候会导致内存分页,影响系统性能。 
   
 1.1.3交换区设计 
   
 当物理内存在2G以下的情况下,交换分区swap为物理内存的3倍,当物理内存>2G的情况下,swap大小为物理内存的1—2倍。 
   
 1.1.4其他环境变量参考Oracle相关的安装文档和随机文档。 
   
 1.2数据库设计原则 
   
 1.2.1数据库SID 
   
 数据库SID是唯一标志数据库的符号,命名长度不能超过5个字符。对于单节点数据库,以字符开头的5个长度以内字串作为SID的命名。对于集群数据库,当命名SID后,各节点SID自动命名为SIDnn,其中nn为节点号:1,2,…,64。例如rac1、rac2、rac24。 
   
 1.2.2数据库全局名 
   
 数据库全局名称: 
   
 .domain 
   
 1.2.3数据库类型选择 
   
 对于海量数据库系统,采用datawarehouse的类型。对于小型数据库或OLTP类型的数据库,采用TransactionProcessing类型。 
   
 1.2.4数据库连接类型选择 
   
 Oracle数据库有专用服务器连接类型和多线程服务器MTS连接类型。对于批处理服务,需要专用服务器连接方式,而对于OLTP服务则MTS的世界数据报告连接方式比较合适。由于采用MTS后,可以通过配置网络服务实现某些特定批处理服务采用专用服务器连接方式,所以数据库设计时一般采用MTS类型。 
   
 1.2.5数据库SGA配置 
   
 数据库SGA可以采用手工配置或按物理内存比例配置,在数据库初始设计阶段采用按比例配置方式,在实际应用中按系统调优方式修改SGA。 
   
 1.2.6数据库字符集选择 
   
 为了使数据库能够正确支持多国语言,必须配置合适的数据库字符集,采用UTF8字符集。 
   
 注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,具体过程如下(切记设定的字符集必须是ORACLE支持,不然不能start) 
   
 SQL>shutdownimmediate; 
   
 SQL>startupmount; 
   
 SQL>altersystemenablerestrictedsession; 
   
 SQL>altersystemsetjob_queue_processes=0; 
   
 SQL>数据库程序设计报告alterdatabaseopen; 
   
 SQL>alterdatabasecharactersetinternal_usewe8iso8859p1; 
   
 SQL>shutdownimmediate; 
   
 SQL>startup 
   
 1.2.7数据库其他参数配置 
   
 1.2.7.1DB_FILES 
   
 Db_files是数据库能够同时打开的文件数量,默认值是200个。当数据库规划时文件数量FILES接近或超过200个时候,按以下估计值配置: 
   
 DB_FILES=FILES*1.5 
   
 1.2.7.2Db_block_size 
   
 一个extent要是5个blocks的倍数为好,如:一个blocks是4096字节,那一个extent就是2M、4M或8M为好。Db_block_size是数据库最小物理单元,一旦数据库创建完成,该参数无法修改,db_block_size按以下规则调整: 
   
 数据仓库类型:db_block_size尽可能大,采用8192或16384 
   
 OLTP类型:db_block_size用比较小的取值范围:2048或4096 
   
 Blocks推荐是系统操作的块倍数(裸设备块大小是512字节,NTFS是4K,使用8K的方式在大部分系统上通用)。 
   
 1.2.8数据库控制文件配置 
   
 1.2.8.1控制文件镜象 
   
 多个控制文件存放在不同的物理位置。 
   
 1.2.8.2控制文件配置 
   
 控制文件中参数设置,最大的数据文件数量不能小于数据库参数db_files。 
   
 1.2.9数据库日志文件配置 
   
 1.2.9.1日志文件大小 
   
 日志文件的大小由数据库事务处理量决定,在设计过程中,确保每20分钟切换一个日志文件。所以对于批处理系统,日志文件大小为几百M到几G的大小。对于OLTP系统,日志文件大小为几百M以内。 
   
 1.2.9.2日志文件组数量 
   
 对于批处理系统,日志文系统数据库设计件组为5—10组;对于OLTP系统,日志文件组为3—5组,每组日志大小保持一致;对于集群数据库系统,每节点有各自独立的日志组。 
   
 1.2.9.3日志成员数量 
   
 为了确保日志能够镜象作用,每日志组的成员为2个。 
   
 1.2.10数据库回滚段配置 
   
 在Oracle9i数据库中,设计Undo表空间取代以前版本的回滚段表空间。 
   
 Undo表空间大小的设计规范由以下公式计算: 
   
 Undospace=UR*UPS*db_block_size+冗余量 
   
 UR:表示在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。 
   
 UPS:表示在undo中,每秒产生的数据库块数量。 
   
 例如:在数据库中保留2小时的回退数据,假定每小时产生200个数据库块。则Undospace=2*3600*200*4K=5.8G 
   
 1.2.11数据库临时段表空间配置 
   
 数据库临时段表空间根据实际生产环境情况调整其大小,表空间属性为自动扩展。 
   
 1.2.12数据库系统表空间配置 
   
 系统表空间大小1G左右,除了存放数据库数据字典的数据外,其他数据不得存储在系统表空间。 
   
 1.3数据库表空间设计原则 
   
 1.3.1表空间大小定义原则 
   
 当表空间大小小于操作系统对最大文件限制时,表空间由一个文件组成。如果表空间大小大于操作系统对最大文件限制时,该表空间由多个数据文件组成,表空间的总大小为估算为: 
   
 Tablespace+sum(数据段+索引段)*150%。 
   
 1.3.2表空间扩展性设计原则 
   

 表空间数据文件采用自动扩展的方式,扩展容量快大小按2的整数倍(1M、2M、4M、8M、16M、32M、64M)进行扩展,创建表空间时尽量采用nologing选项。表空间的最大限制一般采用unlimited,除非确切知道表空间数据文件的最大使用范围。(一般windows32位系统的文件最大2G,64位的unix系统系统文件最大128G,但也要注意文件格式设定的文件大小),建议最大为2G。表空间采用local管理方式,例如: 
   
 CREATETABLESPACETBS_USERINFO 
   
 DATAFILE 
   
 '/oradata/tbs_userinfo.dbf' 
   
 SIZE8M 
   
   REUSE 
   
 AUTOEXTENDON 
   
 NEXT2M 
   
 MAXSIZEUNLIMITED 
   
 NOLOGGING 
   
 EXTENTMANAGEMENT 
   
 LOCAL 
   
 AUTOALLOCATE 
   
 SEGMENTSPACEMANAGEMENTAUTO; 
   
 1.4裸设备的使用 
   
 一个scsi设备可以14个分区,unix操作系统256个分区,性能比文件系统方式高15%左右,空间大于要小于(实际分区大小减两个ORACLE的数据块),比如100M,大于为100000K,推荐在unix使用软连接(ln)方式把裸设备形成文件,用加入表空间时加resue选项,当然也可只接把设备加入表空间,移动裸设备使用dd命令 
   
 对于windows平台,oracle提供软连接工具,实现裸设备的使用,计算一条记录的长度 
   
 2数据库逻辑设计原则 
   
 2.1命名规范 
   
 2.1.1表属性规范 
   
 2.1.1.1表名 
   
 前缀为Tbl_。数据表名称必须以有特征含义的单词或缩写组成,中间可以用“_”分割,例如:tbl_pstn_detail。表名称不能用双引号包含。 
   
 2.1.1.2表分区名 
   
 前缀为p。分区名必须有特定含义的单词或字串。 
   
 例如:tbl_pstn_detail的分区p2004100101表示该分区存储2004100101时段的数据。 
   
 2.1.1.3字段名 
   
 字段名称必须用字母开头,采用有特征含义的单词或缩写,不能用双引号包含。 
   
 2.1.1.4主键名 
   
 前缀为PK_。主键名称应是前缀+表名+构成的字段名。如果复合主键的构成字段较多,则只包含第一个字段。表名可以去掉前缀。 
   
 2.1.1.5外键名 
   
 前缀为FK_。外键名称应是前缀+外键表名+主键表名+外键表构成的字段名。表名可以去掉前缀。 
   
 2.1.2索引 
   
 4.1.2.1普通索引 
   
 前缀为IDX_。索引名称应是前缀+表名+构成的字段名。如果复合索引的构成字段较多,则只包含第一个字段,并添加序号。表名可以去掉前缀。 
   
 2.1.2.2主键索引 
   
 前缀为IDX_PK_。索引名称应是前缀+表名+构成的主键字段名,在创建表时候用usingindex指定主键索引属性。 
   
 2.1.2.3唯一所以 
   
 前缀为IDX_UK_。索引名称应是前缀+表名+构成的字段名。 
   
 2.1.2.4外键索引 
   
 前缀为IDX_FK_。索引名称应是前缀+表名+构成的外键字段名。 
   
 2.1.2.5函数索引 
   
 前缀为IDX_func_。索引名称应是前缀+表名+构成的特征表达字符。 
   
 2.1.2.6蔟索引 
   
 前缀为IDX_clu_。索引名称应是前缀+表名+构成的簇字段。 
   
 2.1.3视图 
   
 前缀为V_。按业务操作命名视图。 
   
 2.1.4实体化视图 
   
 前缀为MV_。按业务操作命名实体化视图。 
   
 2.1.5存储过程 
   
 前缀为Proc_。按业务操作命名存储过程 
   
 2.1.6触发器 
   
 前缀为Trig_。触发器名应是前缀+表名+触发器名。 
   
 2.1.7函数 
   
 前缀为Func_。按业务操作命名函数 
   
 2.1.8数据包 
   
 前缀为Pkg_。按业务操作集合命名数据包。 
   
 2.1.9序列 
   
 前缀为Seq_。按业务属性命名。 
   
 2.1.10表空间 
   
 2.1.10.1公用表空间 
   
 前缀为Tbs_。根据存储的特性命名,例如:tbs_parameter。 
   
 2.1.10.2专用表空间 
   
 Tbs_<表名称>_nn。该表空间专门存储指定的某一个表,或某一表的若干个分区的数据 
   
 2.1.11数据文件 
   
 <表空间名>nn.dbf。nn=1,2,3,4,…等。 
   
 2.1.12普通变量 
   
 前缀为Var_。存放字符、数字、日期型变量。 
   
 2.1.13游标变量 
   
 前缀为Cur_。存放游标记录集。 
   
 2.1.14记录型变量 
   
 前缀为Rec_。存放记录型数据。 
   
 2.1.15表类型变量 
   
 前缀为Tab_。存放表类型数据。 
   
 2.1.16数据库链 
   
 前缀为dbl_。表示分布式数据库外部链接关系。 
   
 2.2命名 
   
 2.2.1语言 
   
 命名应该使用英文单词,避免使用拼音,特别不应该使用拼音简写。命名不允许使用中文或者特殊字符。 
   
 英文单词使用用对象本身意义相对或相近的单词。选择最简单或最通用的单词。不能使用毫不相干的单词来命名 
   
 当一个单词不能表达对象含义时,用词组组合,如果组合太长时,采用用简或缩写,缩写要基本能表达原单词的意义。 
   
 当出现对象名重名时,是不同类型对象时,加类型前缀或后缀以示区别。 
   
 2.2.2大小写 
   
 名称一律大写,以方便不同数据库移植,以及避免程序调用问题。 
   
 2.2.3单词分隔 
   
 命名的各单词之间可以使用下划线进行分隔。 
   
 2.2.4保留字 
   
 命名不允许使用SQL保留字。 
   
 2.2.5命名长度 
   
 表名、字段名、视图名长度应限制在20个字符内(含前缀)。 
   
 2.2.6字段名称 
   
 同一个字段名在一个数据库中只能代表一个意思。比如telephone在一个表中代表“电话号码”的意思,在另外一个表中就不能代表“手机号码”的意思。 
   
 不同的表用于相同内容的字段应该采用同样的名称,字段类型定义。 
   
 2.3数据类型 
   
 2.3.1字符型 
   
 固定长度的字串类型采用char,长度不固定的字串类型采用varchar。避免在长度不固定的情况下采用char类型。如果在数据迁移等出现以上情况,则必须使用trim()函数截去字串后的空格。 
   
 2.3.2数字型 
   
 数字型字段尽量采用number类型。 
   
 2.3.3日期和时间 
   
 2.3.3.1系统时间 
   
 由数据库产生的系统时间首选数据库的日期型,如DATE类型。 
   
 2.3.3.2外部时间 
   
 由数据导入或外部应用程序产生的日期时间类型采用varchar类型,数据格式采用:YYYYMMDDHH24MISS。 
   
 2.3.3.3大字段 
   
 如无特别需要,避免使用大字段(blob,clob,long,text,image等)。 
   
 2.3.3.4唯一键 
   
 对于数字型唯一键值,尽可能用系列sequence产生。 
   
 2.4设计 
   
 2.4.1范式 
   
 如无性能上的必须原因,应该使用关系数据库理论,达到较高的范式,避免数据冗余,但是如果在数据量上与性能上无特别要求,考虑到实现的方便性可以有适当的数据冗余,但基本上要达到3NF.如非确实必要,避免一个字段中存储多个标志的做法。如11101表示5个标志的一种取值。这往往是增加复杂度,降低性能的地方。 
   

 2.4.2表设计 
   
 2.4.2.1逻辑段设计原则 
   
 2.4.2.1.1Tablespace 
   
 每个表在创建时候,必须指定所在的表空间,不要采用默认表空间以防止表建立在系统表空间上导致性能问题。对于事务比较繁忙的数据表,必须存放在该表的专用表空间中。 
   
 2.4.2.1.2Pctused 
   
 默认pctused导致数据库物理空间利用率非常低40%左右;对于update比较少或update不导致行增大的表,pctused可设置在60—85之间;对于update能够导致行增大的表,update设置在40—70之间 
   
 2.4.2.1.3Initrans 
   
 对于需要并行查询或者在RAC数据库中需要并行处理的表,initrans设置为2的倍数,否则,不设该值。 
   
 2.4.2.1.4Storage 
   
 2.4.2.1.4.1Initial 
   
 尽量减少表数据段的extents数量,initial的大小尽量接近数据段的大小64K,128K,…,1M,2M,4M,8M,16M,…,等按2的倍数进行圆整。例如表或分区数据段大小为28M,则initial取32M。 
   
 2.4.2.1.4.2Next 
   
 表或分区扩展extents的大小,按上述方法进行圆整。当表或分区数据段无法按Initial接近值进行圆整的情况下,其大小可以按Initial+Next进行圆整。此时,必须设置Minextents=2。例如:表或分区数据段大小为150M,则Initial=128M;Next=32M,Minextents=2。 
   
 2.4.2.1.4.3Minextents 
   
 该参数表示表创建时候Extents的初始数量,一般取1—2。 
   
 2.4.2.1.4.4Pctincrease 
   
 表示每个扩展Extents的增长率,设置pctincrease=0能够获得较好的存储性能。 
   
 2.4.2.2特殊表设计原则 
   
 2.4.2.2.1分区表 
   
 对于数据量比较大的表,根据表数据的属性进行分区,以得到较好的性能。如果表按某些字段进行增长,则采用按字段值范围进行范围分区;如果表按某个字段的几个关键值进行分布,则采用列表分区;对于静态表,则采用hash分区或列表分区;在范围分区中,如果数据按某关键字段均衡分布,则采用子分区的复合分区方法。 
   
 2.4.2.2.2聚蔟表 
   
 如果某几个静态表关系比较密切,则可以采用聚蔟表的方法。 
   
 2.4.2.3完整性设计原则 
   
 2.4.2.3.1主键约束 
   
 关联表的父表要求有主健,主健字段或组合字段必须满足非空属性和唯一性要求。对于数据量比较大的父表,要求指定索引段。 
   
 2.4.2.3.2外键关联 
   
 对于关联两个表的字段,一般应该分别建立主键、外键。实际是否建立外键,根据对数据完整性的要求决定。为了提高性能,对于数据量比较大的标要求对外健建立索引。对于有要求级联删除属性的外键,必须指定ondeletecascade。 
   
 2.4.2.3.3NULL值 
   
 对于字段能否null,应该在sql建表脚本中明确指明,不应使用缺省。由于NULL值在参加任何运算中,结果均为NULL。所以在应用程序中必须利用nvl()函数把可能为NULL值得字段或变量转换为非NULL的默认值。例如:NVL(sale,0)。 
   
 2.4.2.3.4Check条件 
   
 对于字段有检查性约束,要求指定check规则。 
   
 2.4.2.3.5触发器 
   
 触发器是一种特殊的存储过程,通过数据表的DML操作而触发执行,起作用是为确保数据的完整性和一致性不被破坏而创建,实现数据的完整约束。 
   
 触发器的before或after事务属性的选择时候,对表操作的事务属性必须与应用程序事务属性保持一致,以避免死锁发生。在大型导入表中,尽量避免使用触发器。 
   
 2.4.2.4注释 
   
 表、字段等应该有中文名称注释,以及需要说明的内容。 
   
 2.4.3索引设计 
   
 对于查询中需要作为查询条件的字段,可以考虑建立索引。最终根据性能的需要决定是否建立索引。对于复合索引,索引字段顺序比较关键,把查询频率比较高的字段排在索引组合的最前面。在分区表中,尽量采用local分区索引以方便分区维护。 
   
 除非时分区local索引,否则在创建索引段时候必须指定指定索引段的tablespace、storage属性,具体参考4.4.2.1内容。 
   
 2.4.4视图设计 
   
 视图是虚拟的数据库表,在使用时要遵循以下原则: 
   
 从一个或多个库表中查询部分数据项; 
   
 为简化查询,将复杂的检索或字查询通过视图实现; 
   
 提高数据的安全性,只将需要查看的数据信息显示给权限有限的人员; 
   
 视图中如果嵌套使用视图,级数不得超过3级; 
   
 由于视图中只能固定条件或没有条件,所以对于数据量较大或随时间的推移逐渐增多的库表,不宜使用视图;可以采用实体化视图代替。 
   
 除特殊需要,避免类似Select*from而没有检索条件的视图; 
   
 视图中尽量避免出现数据排序的SQL语句。 
   
 2.4.5包设计 
   
 存储过程、函数、外部游标必须在指定的数据包对象PACKAGE中实现。存储过程、函数的建立如同其它语言形式的编程过程,适合采用模块化设计方法;当具体算法改变时,只需要修改需要存储过程即可,不需要修改其它语言的源程序。当和数据库频繁交换数据是通过存储过程可以提高运行速度,由于只有被授权的用户才能执行存储过程,所以存储过程有利于提高系统的安全性。 
   
 存储过程、函数必须检索数据库表记录或数据库其他对象,甚至修改(执行Insert、Delete、Update、Drop、Create等操作)数据库信息。如果某项功能不需要和数据库打交道,则不得通过数据库存储过程或函数的方式实现。在函数中避免采用DML或DDL语句。 
   
 在数据包采用存储过程、函数重载的方法,简化数据包设计,提高代码效率。存储过程、函数必须有相应的出错处理功能。 
   
 2.4.6安全性设计 
   
 4.4.6.1管理默认用户 
   
 在生产环境中,必须严格管理sys和system用户,必须修改其默认密码,禁止用该用户建立数据库应用对象。删除或锁定数据库测试用户scott。 
   
 2.4.6.2数据库级用户权限设计 
   
 必须按照应用需求,设计不同的用户访问权限。包括应用系统管理用户,普通用户等,按照业务需求建立不同的应用角色。 
   
 用户访问另外的用户对象时,应该通过创建同义词对象synonym进行访问。 
   
 2.4.6.3角色与权限 
   
 确定每个角色对数据库表的操作权限,如创建、检索、更新、删除等。每个角色拥有刚好能够完成任务的权限,不多也不少。在应用时再为用户分配角色,则每个用户的权限等于他所兼角色的权限之和。 
   
 2.4.6.4应用级用户设计 
   
 应用级的用户帐号密码不能与数据库相同,防止用户直接操作数据库。用户只能用帐号登陆到应用软件,通过应用软件访问数据库,而没有其它途径操作数据库。 
   
 2.4.6.5用户密码管理 
   
 用户帐号的密码必须进行加密处理,确保在任何地方的查询都不会出现密码的明文。 
   
 2.5SQL编写 
   
 2.5.1字符类型数据 
   
 SQL中的字符类型数据应该统一使用单引号。特别对纯数字的字串,必须用单引号,否则会导致内部转换而引起性能问题或索引失效问题。利用trim(),lower()等函数格式化匹配条件。 
   
 2.5.2复杂sql 
   
 对于非常复杂的sql(特别是有多层嵌套,带子句或相关查询的),应该先考虑是否设计不当引起的。对于一些复杂SQL可以考虑使用程序实现。 
   
 USER_TAB_COMMENTS数据字典 
   
 Commenton可加注解 
   
 2.5.3高效性 
   
 2.5.3.1避免In子句 
   
 使用In或notIn子句时,特别是当子句中有多个值时,且查询数据表数据较多时,速度会明显下降。可以采用连接查询或外连接查询来提高性能。 
   
 Char比varchar查询时高询 
   
 在进行查询及建立索引时,char比varchar的效率要高,当然varchar在存储上比char要好 
   
 2.5.3.2避免嵌套的Select子句 
   
 这个实际上是In子句的特例。 
   
 2.5.3.3避免使用Select*语句 
   
 如果不是必要取出所有数据,不要用*来代替,应给出字段列表,注:不含selectcount(*)。 
   
 2.5.3.4避免不必要的排序 
   
 不必要的数据排序大大的降低系统性能。 
   
 2.5.4健壮性 
   
 2.5.4.1Insert语句 
   
 使用Insert语句一定要给出要插入值的字段列表,这样即使更改了表结构加了字段也不会影响现有系统的运行。 
   
 2.5.4.2Count(*)、Count(*)、count(distinctid)的区别 
   
 Selectcount(*)fromtesttab 
   
 得到表testtab的记录数 
   
 selectcount(id)fromtesttab 
   
 得到表testtabid字段非空记录数 
   
 selectcount(distinctid)fromtesttab 
   
 得到表testtabid字段值非相同记录数 
   
 2.5.4.3Notnull为字段类型性质的约束 
   
 本约束功能在后期无语法使期失效,可使用修改字段类型方式 
   
 altertablemodify字段名类型notnull 
   
 altertablemodify字段名类型 
   

 2.5.4.4外键值可用null的问题 
   
 外键列如没有明确说明notnull,可插入null记录(而null是在外部表的记录中没有的),如无可插null记录的想法,要对外键字段加notnull约束。 
   
 2.5.4.5序列sequence跳号的问题 
   
 sequence因回滚,系统崩溃(使用cache内的值将认为已用),多表引用都将使其跳号,所以不能用于为连续序号utl_row.cast_to_row 
   
 2.5.4.6unicn\intersect\minus使用ordeyby的注意事项 
   
 以上语句进行连表操作,而表同表的字段顺序的类型相同但字段标题名可不同,使用ordeyby时后面如果是字段名,要求所有的表的字段标题名相同,否则用字段的顺序号 
   
 selectid,name,yearfromuser1 
   
 union 
   
 selectno,name,to_number(null)yearfromuser2 
   
 orderby1,name,year 
   
 2.5.5安全性 
   
 2.5.5.1Where条件 
   
 无论在使用Select,还是使用破坏力极大的Update和Delete语句时,一定要检查Where条件判断的完整性,不要在运行时出现数据的重大丢失。如果不确定,最好先用Select语句带上相同条件来果一下结果集,来检验条件是否正确。 
   
 2.5.6完整性 
   
 有依赖关系的表,例如主外键关系表,在删除父表时必须级联删除其子表相应数据,或则按照某种业务规则转移该数据。9I中表中字段缩小及变类型,字段为空或表空,varchar和char长度不变可任意改,字段名和表名可字段可用ALTERTABLEtableSETUNUSED(column)设定为不可用,注意无命令再设为可用 
   
 3备份恢复设计原则 
   
 3.1数据库exp/imp备份恢复 
   
 Oracle数据库的Exp、Imp提供了数据快速的备份和恢复手段,提供了数据库级、用户级和表级的数据备份恢复方式。这种方法一般作为数据库辅助备份手段。 
   
 3.1.1数据库级备份原则 
   
 在数据库的数据量比较小,或数据库初始建立的情况下采用。不适合7*24的在线生产环境数据库备份。 
   
 3.1.2用户级备份原则 
   
 在用户对象表数据容量比较小、或则用户对象初始建立的情况下使用。 
   
 3.1.3表级备份原则 
   
 主要在以下场合采用的备份方式: 
   
 参数表备份 
   
 静态表备份 
   
 分区表的分区备份。 
   
 3.2数据库冷备份原则 
   
 数据库冷备份必须符合以下原则: 
   
 数据库容量比较小。 
   
 数据库允许关闭的情况。 
   
 3.3Rman备份恢复原则 
   
 这种方式适用于7*24环境下的联机热备份情形。 
   
 3.3.1Catalog数据库 
   
 单独建立备份恢复用的数据库实例,尽可能与生产环境的数据库分开,确保catalog与生产数据库的网络连接良好。在9I系统使用良好的备份策略以可,支持完全使用控制文件保存catalog信息,备份策略如下: 
   
 backupspfileformat'/data/backup/%d_SPFILE_%T_%s_%p.bak'; 
   
 sql"altersystemarchivelogcurrent"; 
   
 backuparchivelogallformat'/data/backup/%d_ARC_%T_%s_%p.bak'deleteallinput; 
   
 backupcurrentcontrolfileformat'/data/backup/%d_CTL_%T_%s_%p.bak'; 
   
 在spfile、控制文件、数据库全丢的情况下可通过下面的方式恢复 
   
 RMAN>connecttarget 
   
 connectedtotargetdatabase(notstarted) 
   
 RMAN>svc 连接数据库tartup 
   
 RMAN>restorespfilefrom'/data/backup/COMMDB_SPFILE_20030411_9_1.bak'; 
   
 SQL>startup 
   
 ORA-00205:errorinidentifyingcontrolfile,checkalertlogformoreinfo 
   
 RMAN>restorecontrolfilefrom'd:\DB92_CTL_20031113_9_1.BAK'; 
   
 Moutdatabase: 
   
 RMAN>recoverdatabase; 
   
 RMAN>alterdatabaseopenresetlogs; 
   
 注意:对数据库设定控制文件保存备份信息为365天,具体语句如下。 
   
 altersystemsetcontrol_file_record_keep_time=365SCOPE=BOTH; 
   
 3.3.2ArchiveLog 
   
 设置ArchiveLog的位置,确保存储介质有足够的空间来保留指定时间内archivelog的总量。建设定期对RMAN进行全备份,删除冗余归档日志文件。 
   
 3.3.3全备份策略 
   
 对于小容量数据库,可以采用全备份策略。对于大容量数据库,必须制定全备份策略方案,备份时对archivelog进行转储,同时冷备份catalog数据库。 
   
 3.3.4增量备份策略 
   
 对于大容量数据库数据报告怎么写,必须制定增量备份、累积备份和全备份的周期,备份时对archivelog进行转储,同时冷备份catalog数据库。 
   
 3.3.5恢复原则 
   
 采用Rman脚本进行数据库恢复。数据库恢复有以下几种: 
   
 3.3.5.1局部恢复 
   
 主要用于恢复表空间、数据文件,一般不影响数据库其他操作。 
   
 3.3.5.2完全恢复 
   
 数据库恢复到故障点,由catalog当前数据库决定。 
   
 3.3.5.3不完全恢复 
   
 恢复到数据库的某一时间点或备份点。 
   
 恢复catalog数据库。 
   
 恢复数据库controlfile。 
   
 恢复到数据库某一时间点。 
   
 重设日志序列。 
   
 3.4备用数据库原则 
   
 数据库系统在以下情况下可以考虑采用备用数据库dataguard原则: 
   
 数据库容量适中。 
   
 数据库严格要求7*24不间断,或间断时间要求控制在最小范围内。 
   
 数据库要求有异地备份冗余。 
   
 3.5一些小数据库应用系统设计经验 
   
 使用oemc的oms时,首选项要求是节点和数据库分别加入系统用户(如:administrator)和数据库DBA用户(system)。节点的系统用户必须有批处理作业登录的权限 
   
 agent不能启动,lisnter修改后都要手动删除oracle\ora9\network\agent中的*.q文件 
   
 oracle\admin\my9i\bdump中是用户的出错日志 
   
 改变表的空间的方式altertablehr.ssssmoveTABLESPACEexample(要重建索引);或用imp导入时,设定导入用户只有某一表空间的使用权,无RESOURCE角色和UNLIMITEDTABLESPACE权限 
   
 aletersystemsetlog_checkpoint_to_alter=true,后可报警文件发现checkpoint的起动和结束时间。 
   
 3.6系统调优知识 
   
 3.6.1.1生成状态报表(statspack的使用) 
   
 使用(存放位置@\rdbms\admin\)的文件生成报表用户 
   
 @\rdbms\admin\Spcreate.sql建表 
   
 将timed_statistics设定true 
   
 使用生成的perfstat用户登录,执行以下语句手动收集信息 
   
 Exexstatspack.snap 
   
 Execstatspack.snap(I_SNAP_LEVEL=>0,I_MODEFY_PRAMETER=>TRUE)0级,最少10最大 
   
 使用下面的语句生成状态报表 
   
 @\rdbms\admin\Spreport.sql 
   
 其他相关文件 
   
 deletestats$snapshot;清原来记录数据 
   
 @\rdbms\admin\Saputo.sql 
   
 selectjobfromuser_jobs取用户作业号 
   
 execdbms_remove(作业号) 
   
 timed_statistics=true要求 
   
 @\rdbms\admin\spdaccess数据库使用教程rop.sql; 
   
 3.6.1.2sql追踪 
   
 设定全部用户跟踪 
   
 altersystemsetsql_trace=true; 
   
 用户级别跟踪 
   
 altersessionsetsql_trace=true; 
   
 用户的跟踪文件生成在admin\{pid}\udump\{pid}_ora_{SPID}.trc中,spid从下面语句得到 
   
 SELECTb.namebkpr,s.username,p.spid,s.sid,s.serial#FROMv$bgprocessb,v$sessions,v$processpWHEREp.addr=b.paddr(+)ANDp.addr=s.paddrands.username=user; 
   
 DBA对特定用户跟踪 
   
 execdbms_system_set_Sql_trace_in_session(sid,serial#,true) 
   
 信息从下面得到 
   
 SELECTb.namebkpr,s.username,p.spid,s.sid,s.serial#,osuser,s.program 
   
 FROMv$bgprocessb,v$sessions,v$processp 
   
 WHEREp.addr=b.paddr(+) 
   
 ANDp.addr=s.paddr; 
   
 /*p.spid用于sql_trace时日志编号,dbms_system.set_sql_trace_in_session(sid,erial#,true)*/ 
   
 用户的跟踪文件生成在admin\{pid}\udump中 
   
 系统的跟踪文件生成在admin\{pid}\bdump\alert_{pid}.log 
   
 tkprof.exe将log文件生成格式化文本 
   
 在avRd(ms)20以上说明表空间使用过用频繁,考虑将表分开其他表空间上 
   
 系统变量fast_start_mttr_target的值要大到不产生log等待,当然也可通过加log组使其不等待 
   
 reaolog大小应为每30分钟切换一次 
   
 建议表空间的利用率不超80% 
   
 bufferhit要达80%以上为好 
   
 3.6.1.3内存调整 
   
 一般的内存分配原则 
   
 SGA50%(其中80%DATABUFFER,15%SHAREPOOL,5其他) 
   
 PGA30% 
   
 OS20% 
   
 例如:2G的WINDOWS的平台,OS300M,SAG1.2G,PGA500M 
   
 内存分配的基本单位 
   
 SGA《=128M 4M 
   
 SGA》128M  64位系统16M,32M系统8M 
   
 动态分配时总值不可大于sga_max_size 
   
 通过V$SGA_DYNAMIC_FREE_MEMORY取空闲内存空间 
   
 在缩小时如果内存空间实际在应用中,CPU利用率将达100%,最后将语句出错。 
   
 V$SGASTAT 可看实际的使用情况 
   
 Redologbuffer一般在5M内,可通过v$sessuon_wait看是否等,v$sysstat 
   
 可也通过报警文件看是否等切换,方法可加组。可通过nologging(数据库也要设定支持nologging)方法减少日志文件产生量。 
   
 java_pool没有设定时,使用shared_pool_size 
   
 3.6.1.3.1shared_pool 
   
 本缓冲区用于sql语句,plsql等的对象保存 
   
 Cursor_sharing{Exact|Similar|force}游标共享设定 
   
 Force方式适用OLTP数据库,Exact方式适合数据仓库,similar为智能方式 
   
 hardparses硬SQL语句分析,每秒要底于100次,小要加大shared_pool 
   
 softparse软SQL语句分析,OLTP要达90%以上,小要加大shared_pool 
   
 不建议用无命名PLSQL段 
   
 如果有大PLSQL(存储过程)对象可强制保存于内存,也可加大SHARED_POOL_RESERVED_SIZE,大小不可过SHARED_POOL_SIZE的50%,不然实例不能起动 
   
 3.6.1.3.2db_cache 
   
 本缓冲区用于数据库数据对象保存 
   
 db_cache_advice为on,可以提出通过企业管理器看到系统建议 
   
 通过select*fromv$system_event进行系统查看。 
   
 发现存在freebufferwaits,说明不能将databuffer及时写入datafile; 
   
 可通过增加加CPU后,加db_writer_processes=CPU数改善。 
   
 也可设disk_asynch_io为true,使用异步IO(前提同要操作系统支持)db_writer_processes=1时(只有一个CPU的情况下),也可通加大dbwr_io_slaves来改善。db_writer_processes>1,不可用本功能 
   
 调整效果排序:异步IO>CPU>dbwr_io_slaves 
   
 BufferBusyWaits大说明出现IO冲突 
   
 BufferBusyWaits大和dbbock大说明全表扫描多,说明数据不能读入,可加大 
   
 db_cache_size来改善. 
   
 Undo block大要加大回滚段(手动管理方式,9I默认是自动管理) 
   
 undoheader大要加大回滚段(手动管理方式,9I默认是自动管理) 
   
 db_cache命中率99%,不是唯一因素,关系是不要出现等待。建议达90%以上。 
   
 内存使用建议: 
   
 系统可以设三个缓冲区,建表时可设定用那个缓冲区(默认在db_cache_size) 
   
 db_cache_size   (默认区) 
   
 db_keep_cache_size(常访问,小于db_keep_cache_size的10%的表可放于本区) 
   
 db_recycle_cache_size(一个事物完成后常时间不再使用,或两倍大小于缓冲区) 
   
 3.6.2排序的优化 
   
 9I为专用服务器时系统变量workarea_size_policy设定为auto,statistics_level设定为TYPICAL可获取v$pga_target_advice中的优化建议。参数pga_aggregate_target值为所有连接用户可用排序内存。 
   
 9I为共享服务器时workarea_size_policy设定为menaul,sort_area_size值为每用户排序内存。 
   
 如果内存不足将使用TEMP表空间进行排序,排序使用比率disk/meme应小于5% 
   
 尽量少用排序,如果使用排序功能,尽量在字段上加索引进行优化。 
   
 SQL分析模式:RBO(基于规则)方案小表(驱动表)放在最后,优先使用索引,对SQL语句要求严格(8I以前的模式);CBO(基于开销)根据统计值进行选择开销最少,性能最优的最佳方式进行,但本方式DBA(使用analyzetable语句)要定期进行分析统计.系统设定通过optimizer_mode系统参数 
   
 说明:指定优化程序的行为。如果设置为RULE,就会使用基于规则的优化程序,除非查询含有提示。如果设置为CHOOSE,就会使用基于成本的优化程序,除非语句中的表不包含统计信息。ALL_ROWS或FIRST_ROWS 
   
 始终使用基于成本的优化程序。 
   
 值范围:RULE|CHOOSE|FIRST_ROWS|ALL_ROWS 
   
 默认值:CHOOSE 
   
 {rule(RBO)|choose(自动选择)|fist_rows|fist_rows_n|all_row} 
   
 3.6.3统计信息 
   
 进行某表的统计分析 
   
 EXECUTEdbms_stats.gather_table_stats('HR','EMPLOYEES'); 
   
 查看结果 
   
 SELECTnum_rows,blocks,empty_blocksasempty, 
   
 avg_space,chain_cnt,avg_row_len 
   
 FROMdba_tables 
   
 WHEREowner='HR' 
   
 ANDtable_name='EMPLOYEES'; 
   
 4设计工具 
   
 统一使用sybasepowerdesigner设计工具,在该工具上完成物理模型的设计。所有的数据库对象尽可能在物理模型上进行设计,而且每个物理模型都要有相应的文字描述。 
   
 所有的数据库对象变更以数据库物理模型为基准。为了避免字符敏感问题,产生的脚本以大写字母为标准。