数据库的第三范式问题

一列列车行驶在北京居庸关长城附近盛开的山桃花海中。
上了年纪的大爷大妈准点前来,早出晚归,堪比上下班。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  随着信息化不断的更新发展,当今各类信息系统的建设过程中,都将数据库的位置摆在核心位置。因此,在系统建设初期,往往会利用各种高可用、高性能、灾备等技术对数据库做稳定、性能、安全进行加固。从而,数据库系统将数据库、主机、存储、网络、应用等技术交错融合,一定程度上给数据库系统故障排查造成难度,进而影响故障恢复时间。本文将简要阐述当数据库发生故障时,通过分析各类日志信息,进而定位数据库故障根源。
  1、数据库的故障号与警报日志
  当数据库遇到错误或故障时,首先需要查看的是发生错误或者故障时的错误代码以及数据库的警报日志。经验分析,数据库绝大部分的故障都能从故障号或者警报日志中清晰定位到。
  1.1、数据库错误故障号
  Oracle数据库本身提供一套健壮的错误代码说明体系。详细定义了各类错误说明以及给出相应的修正建议。
  通常,Oracle将错误主要分为几大类:
数据库软件及数据库本身相关(ORA-);
数据库导入导出工具相关(EXP-/IMP-);
数据库监听程序、网络服务相关(TNS-);
数据库rman备份恢复相关(RMAN-);  当然,还有很多相关附属工具的错误号,由于实际运用并非广泛,故此,本文不作赘述。  Oracle针对各类错误号,提供了一个名为“oerr”的工具用于查阅引起相应错误号的原因以及针对该错误的一些执行建议。  oerr工具的用法:  oerr [ERROR TYPE][ERROR CODE]  其中:
[ERROR TYPE]表示的是错误号的类型,数据库及产品相关的错误类型为“ORA”;数据库导入导出工具相关的错误类型为“EXP”或“IMP”;监听程序或网络服务相关的错误类型为“TNS”;RMAN相关的错误类型为“RMAN”。
[ERROR CODE]表示的是错误号;
  [oracle@db10g ~]$ oerr ora 00257
  , &archiver error. Connect internal only, until freed.&
  //*Cause: The archiver process received anerror while trying to archive a redo log. If the problem is not resolved soon, the database
  will stopexecuting transactions. The most likely cause of this message is thedestination device is out of space to store the redo log file.
  //*Action: Check archiver trace file for adetailed deion of the problem. Also verify that the device specified inthe initialization parameter ARCHIVE_LOG_DEST is set up properly for archiving.
  示例一:通过oerr工具查看引起“ora-00257”错误号的原因以及操作建议
  上述“oerr”工具由Oracle软件自带,装上Oracle产品之后可即可执行。值得注意的是:该工具需要有Oracle软件安装所有者的权限执行。
  Oracle亦提供了相应的联机错误信息说明文档。详细可参考oracle产品官方文档。
  读者可以利用oracle的错误说明,进一步了解错误引起错误代码的原因以及参考Oracle提供的操作建议。
  善于读懂错误代码说明,是分析、定位、解决问题的第一步。
  1.2、数据库警报日志
  oracle数据库的警报日志是在对数据库执行维护时,最需关注的一个文本式日志文件。无论是在日常巡检还是故障现场时,都必须首先对数据库的警报日志执行深入检查。
  数据库警报日志是一个依据数据库运行时间顺序记录的日志信息。该日志主要记录如下信息:
数据库启动时是非默认的初始化参数设置;
所有内部错误(ORA-00600)、数据块错误(ORA-01578)、死锁错误(ORA-00060)信息;
管理操作动作;
自动刷新物化视图时发生的错误;
共享服务器和调度程序相关的错误和信息;  数据库警报日志的格式为:alert_$ORACLE_SID.log;  其中:$ORACLE_SID标识为Oracle的实例名。  数据库警报日志的默认存放位置:
BACKGROUND_DUMP_DEST初始化参数指定该文件存放的位置(Oracle 10g);
可以通过v$diag_info动态性能视图获取警报日志的默认位置(Oracle 11g);  当数据库的故障已经发生之后,此时或许无法捕获到具体的“ORA-”错误号。因此,当发现或怀疑数据库发生故障时,首要检查数据库的警报日志。  而由于数据库的警报日志是按时间顺序记录的,且日志内容记录大量的管理操作记录以及一些内部错误,因此,在一定程度上,能从数据库alert日志中判断数据库最新运行状态。  数据库的警报日志是基于实例的。因此,在集群环境下,每个实例都应有对应的警报日志。  当发现或者疑似数据库存在隐患时,建议检查数据库至少从最近一次启动之后至今的所有警报日志或者最近一个月的警报日志信息。
  ...截取片段...
  Wed Jun19 22:43:52 2013
  Errorsin file /u01/app/oracle/admin/orcl/bdump/orcl_j000_5097.trc:
  ORA-12012:error on auto execute of job 1
  ORA-00001:unique constraint (TARWEN.SYS_C006739) violated
  ORA-06512:at &TARWEN.P_ADDUSER&, line 3
  ORA-06512:at line 1
  Wed Jun19 22:43:57 2013
  Thread1 advanced to log sequence 90
  Current log# 1 seq# 90 mem# 0:/u01/oradata/ORCL/onlinelog/o1_mf_1_8mlyskqz_.log
  ...截取片段...
  示例二:数据库警报日志文件示例
  上述示例二中,分别记录了两条数据库运行记录,每条记录以时间戳为始。
依据示例的记录,第一条说明该数据库在( 22:43:52)时执行一个job号为1的job时出现异常(ORA-12012),异常的原因是违反了唯一性约束(ORA-00001);
第二条记录说明该数据库内部在( 22:43:57)时执行了联机日志文件切换的操作。这是一个正常的管理操作记录;
1.3、数据库trace文件
  数据库的trace文件,是当数据库实例启动或者实例后台进程或用户进程遇到未在预期内的错误时而产生。这类文件对诊断和分析数据库的故障原因有比较大的帮助。依据数据库不同类型进程,数据库产生的trace文件大致也分为如下两类:
后台进程trace跟踪文件;当后台进程遇到未在预期内发生的问题时而产生;默认位置由初始化参数BACKUPGROUND_DUMP_DEST决定;
用户进程trace跟踪文件;当用户进程遇到未在预期内发生的问题时而产生;默认位置由初始化参数USER_DUMP_DEST决定;  数据库trace文件名的格式由下构成:  实例名、进程名、进程号、trc后缀四  部分构成。例如:orcl_j000_5097.trc  当数据库实例或者某进程发生意外结束时,随着会产生相应的trace文件。对于这样意外性的故障的排查,trace文件的检查分析,是即警报文件之后的又一重要诊断参考文件。
  2、高可用集群日志
  在使用集群软件来确保数据库的高可用环境中,集群日志对于整个高可用环境的诊断,有着举足轻重的作用。时常会遇到高可用软件异常导致数据库服务无法正常对外提供服务。此时,需要做的就是对高可用集群软件相关日志做分析诊断。
  对于Oracle数据库,目前可支持的集群软件有如下两大类:
racle公司研发的oracleclusterware
第三方公司(IBM、HP等)研发的诸如HACMP、MC/SG、VCS、Sun Clusterware等  本文仅对Oracleclusterware日志体系结构作简要描述。  [oracle@rac1~]$ tree -d $ORA_CRS_HOME/log  /u01/app/oracle/product/10.2.0/crs_1/log  |-- crs  `-- rac1 &注:此级目录名为主机名 &  |-- admin  |-- client  |-- crsd  |-- cssd  | |-- oclsmon  | `-- oclsomon  |-- evmd  `-- racg  |-- racgeut  |-- racgevtf  `-- racgmain  图一:10.2.0.x下的Clusterware日志体系结构  在整个日志体系结构中,有几类日志在分析诊断集群软件或者集群资源异常时有重要的帮助作用。
alert日志。集群软件运行的警报日志。  位于$ORA_CRS_HOME/log/$HOSTNAME目录下。记录着集群软件启动、重构、投票文件状态变更等重要状态警告信息。该日志文件应该作为检查集群问题的起点。  注:此警报日志非数据库警报日志;
crsd进程日志。集群高可用服务进程日志。  位于$ORA_CRS_HOME/log/$HOSTNAME/crsd目录下。记录着集群高可用服务的及资源的启动、关闭、重构等重要状态信息。当集群服务无法正常启动时,该日志是重点关注的日志文件之一。
ocssd进程日志。集群异步服务进程日志。  位于$ORA_CRS_HOME/log/$HOSTNAME/cssd目录下。记录着判断节点健康状态,心跳机制是否正常等重要的状态信息。当集群服务无法正常启动、节点异常重启、集群服务异常crash时,该日志是重点关注的日志文件之一。
evmd进程日志。集群事件管理进程日志。  位于$ORA_CRS_HOME/log/$HOSTNAME/evmd目录下。负责发布crs产生的各类事件,同时记录着crsd与ocssd进程之间的通信状态。
集群节点应用(Nodeapps)资源日志。  位于$ORA_CRS_HOME/log/$HOSTNAME/racg目录下。负责记录集群节点gsd资源、vip资源、ons资源等Nodeapps资源异常日志。当集群Nodeapps类型资源出现异常时,该类型日志需要重点关注,以寻求资源异常的原因。
其它日志  位于$ORA_CRS_HOME/log/$HOSTNAME/client目录下。有一些集群工具(譬如:ocrcheck、oifcfg、ocrconfig等)执行的日志记录。这类日志,可在诊断分析集群故障时做参考。  [oracle@rac1~]$ tree -d $ORACLE_HOME/log  /u01/app/oracle/product/10.2.0/db_1/log  `-- rac1 &注:此级目录名为主机名&  |-- client  `-- racg  |-- racgeut  |-- racgimon  |-- racgmain  `-- racgmdb  图二:Oracle 10.2.0.x下RAC日志体系结构
RAC资源日志  位于$ORACLE_HOME/log/$HOSTNAME/racg目录下。负责记录Oracle RAC ASM实例资源、数据库实例资源、service资源、监听资源等资源异常日志。当Oracle RAC资源出现异常时,该类型日志需要重点关注,以寻求资源异常的原因。  当集群、集群资源或者集群数据库出现问题时,需要根据实际情况,依次检查上述高可用集群日志,以便快速定位到故障原因。
  3、操作系统日志
  有些时候,数据库、集群出故障了,或许在数据库的警报日志、集群的各类日志中无法直接定位到问题的原因。这时,操作系统日志可能能提供一些关于系统、及主机硬件相关的日志记录与你诊断。
  不同的操作系统平台,操作系统日志存放路径有所不一致。
Linux:/var/log/messages、messages.N(N为1-4);
Solaris:/var/adm/messages、messages.N(N为0-3);
AIX:errpt |more查看;
HP-UX:/var/adm/syslog/syslog.log;  从操作系统的日志中,可以获取跟系统运行有关的相关日志记录。譬如,网卡、光纤卡出现异常中断;磁盘空间满等等。这对诊断数据库、集群故障提供了很大帮助。  详细的系统日志提示意义,可参阅各平台系统管理手册。
  4、其它类型日志
  还有一些类型的日志,在数据库出现异常及定位故障原因时,也具有很大的参考依据。
数据库备份日志
数据库网络服务相关的监听日志、sqlnet.log  数据库的备份,对数据库数据安全的防护,起着举足轻重的作用。因此,正式生产系统,必须部署数据库的备份作业。但是,在对数据库备份作业部署之后,而缺乏持续性的检查、验证,也会对数据库的稳定带来一定的隐患。以下简单举个示例说明:  某高校数字化校园核心数据库的备份采用oraclerman技术执行物理备份。且将数据库的数据备份至异地存储。  该数据库的备份策略大致如下:
每周六执行一次完全备份;
每天执行数据库归档日志备份,且将备份完的归档日志删除;
数据库的备份保留恢复至最近30天;  某日,用户发现在使用门户系统时,频繁报出“ORA-00257”的错误。一度造成业务的中断。经过对错误号信息的检查,发现是由于归档日志耗尽了归档空间而导致数据库hang起,最终出现异常。  但是,缘何归档空间会耗尽了?数据库的备份策略中可是每天都备份归档日志,并删除已备份的归档日志进而释放空间的呀。  于是考虑到是否备份出现异常,导致归档日志没有被正常删除,抑或是每天产生的归档日志量太大(当天产生的日志将整个归档空间耗尽)?在对数据库作相应的日志产生统计之后,发现并非是当天产生的归档日志量太大的问题。  进而检查数据库的备份日志,发现该数据库的备份已经近一周没有备份成功,追溯到第一次备份未成功的时间,发现备份日志报空间不足,无法创建备份文件的错误。而进一步与业务人员了解,在该次备份的前一天,系统进行了大量的数据同步操作,导致产生了大量的归档日志。最终定位到了问题产生的原因。  随后在技术人员的协助下,通过归档部分备份数据,执行归档日志的备份,进而释放出归档空间资源。最终解决问题。  如果数据库出现网络连接异常或疑似网络故障,可以通过监听日志、网络服务日志作进一步的分析。默认情况下,数据库(Oracle 10.2.0)的监听、网络服务日志存放在:$ORACLE_HOME/network/log目录下,如果是集群数据库,需要在每个节点上检查相对应的日志。
  5、性能相关
  如果遇到数据库性能方面的问题,建议采用Oracle提供的几个内置工具(awr、addm、ash)与系统提供的工具(top、vmstat、iostat)相结合。通过这些工具生成的报告,进一步分析出问题的根源,解决问题。
  6、问题分析与处理思路
  数据库的问题,大致可分为两大类,一为数据库系统稳定问题;一为数据库系统性能问题。系统稳定类的问题偏向管理,系统性能类的问题偏向优化。在实际分析与处理这两类问题时,需要采用不同的思路。具体来说:
  在处理系统稳定类的问题,首先要根据数据库提示的错误号,查看错误原因以及相应的操作建议;其次根据错误号进一步分析数据库警报日志、trace诊断日志、数据库集群日志、操作系统日志、备份日志等进一步分析问题产生的原因最终定位。最终排查并解决问题;
  在处理数据库性能类的问题,首先要了解出现性能问题时系统的症状(坚决杜绝所谓的“反应慢”之类的问题反馈字眼);其次根据症状,收集该时间段的awr、addm、ash等诊断报告作初步分析和排查;进而可以通过操作系统的工具(top/topas、iostat、vmstat等)对操作系统的资源使用情况作分析;最终结合各方面的分析检查,循序渐进逐一排查性能影响点,解决性能问题。
  7、小结
  综上,我们简述了当数据库遇到各类问题时,该如何利用各类日志、工具做循序渐进的诊断分析。作为数据库管理员,务必将上述各类日志功能及相关位置记牢。做到在遇到问题时,能沉着应对,冷静处理。
  注:转载于微信公众号
  如有侵权,请联系本公众号删除,谢谢!
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:想问一下~
1.学习~是不是必须掌握数据结构与算法
2.数据结构是以C为基础的那是不是要学C
3.初学者应先学哪些内容?数据结构还是SQL语言还是别的?
谢谢
操作相关信息的语言很多,C和Java、VB都有操作数据库的接口.
数据结构是学习编程的基础,是让教会你如何将要解决的问题的数据化的方法,以及一些基本的算法。
学习数据库看你要从哪个方面去学习,如果只是简单的管理数据库或是对数据库做有限的操作的话,学习好SQL就可以了,由于目前比较多得企业单位用的都是甲骨文公司的Oracle,所以学习好PL/SQL就可以解决很多问题,网上有PL/SQL编程基础下载,看看足亦。
如果你是要做以数据库为依托的大型管理分析程序的话,建议还要学习其他语言,设计界面和处理数据,可以学习Delphi,PB,.net
这里要说明一下,数据结构不是以C为基础,而是因为C语言是早期流行的语言,而且因为其简单易学,用以阐叙数据结构的思想和演示算法有着很好的教学效果,所以很多数据结构的教材都使用了C语言作为讲解的例子。数据结构还是上面我说的,它教会得不是一种方式,而是一种思想,他不是某种程序的思想,而是写所有程序的思想。也有用C++写就的数据结构,也有用Java写就的,关键是教授怎么去...
操作相关信息的语言很多,C和Java、VB都有操作数据库的接口.
数据结构是学习编程的基础,是让教会你如何将要解决的问题的数据化的方法,以及一些基本的算法。
学习数据库看你要从哪个方面去学习,如果只是简单的管理数据库或是对数据库做有限的操作的话,学习好SQL就可以了,由于目前比较多得企业单位用的都是甲骨文公司的Oracle,所以学习好PL/SQL就可以解决很多问题,网上有PL/SQL编程基础下载,看看足亦。
如果你是要做以数据库为依托的大型管理分析程序的话,建议还要学习其他语言,设计界面和处理数据,可以学习Delphi,PB,.net
这里要说明一下,数据结构不是以C为基础,而是因为C语言是早期流行的语言,而且因为其简单易学,用以阐叙数据结构的思想和演示算法有着很好的教学效果,所以很多数据结构的教材都使用了C语言作为讲解的例子。数据结构还是上面我说的,它教会得不是一种方式,而是一种思想,他不是某种程序的思想,而是写所有程序的思想。也有用C++写就的数据结构,也有用Java写就的,关键是教授怎么去教,教得好,什么语言都可以教。
我个人推崇Delphi编程入门 + 数据库基础+PL/SQL编程基础
这样得书籍组合,数据库重点掌握视图和范式,对于数据库,算法不是关键,而数据库得设计才是影响效率得关键。
只要上面三本书读懂了,应该对付一般得数据库问题不是太大了。
而且,最好还要多学习一下网络知识,现在得数据库应用很多都不是简单得一台机器上又是应用程序,又是数据库存储。而是应用和存储分开得模式。就如同电信得工作方式,每个客户的信息都式在电信中心机房的专门的存储设备上也就是数据库里,而在服务大厅里,接待员面前的终端处理信息的时候,他们操作的都是应用程序,但是应用程序最后产生的结果就是读写数据库的操作。因此,这种存储和应用分离的方式就需要对网络也要有所了解。
另外真正的大型企业的数据库大多都是UNIX系统管理数据库,使用小型机处理数据。所以想真正学好数据库,就要在数据库、小型机、网络这三个方面有所突破。这样的人才是真正实用的人才,在哪里都吃的香。
其他答案(共1个回答)
如果你只是做一个数据库管理人员,而不是数据库开发人员,数据结构的重要性就不是那么的明显了!
不过个人觉得还是要学好数据结构!
对于这个问题,我实在不知道怎么给你说.你知道什么叫做1:m的关系吗,你关系在于两张表通过一个数据的关联而形成的数据条数比例,比如:
1、建立一个部门基本信...
先做好核心算法再做界面.
核心算法是有无问题,你的问题是数据结构中的基础问题,随便找一个数据结构的书上都有大大把的现成算法,网上大把源码, 仔细研究后可以少作...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区数据库经典问题
1、存储过程的优点是什么? 存储过程的优点: 1.提高性能 2.减轻网络拥塞 3.一致性较好 4.改善安全机制
2、什么是触发器?触发器有哪几种?触发器有什么优点?
一个触发器是由T-SQL语句集组成的代码块,在响应某些动作时激活该语句集
有insert,delete,update触发器
它防止了对数据的不正确、未授权的和不一致的改变
3、常见的几种约束有哪些?分别代表什么意思?如何使用?
1)实体完整性:主键保证了实体完整性,一个表只有一个主键,但一个主键可有包含多个字段,主键字段不能为空
2)参照完整性:外键保证了引用完整性,一个表可以有多个外键
3)用户定义完整性:CHECK保证了域完整性, 一个表中可以有多个检查性约束
4、事务:是一系列的操作,是数据库应用的基本逻辑单位。
事务性质:ACID特性
原子性(Atomicity):事务的所有操作在数据库中要么全部正确的反映出来,要么完全不反映;
一致性(Consistency):执行前后数据保持一致,比如,转帐执行前后,两者的总钱数保持一致;
隔离性(Isolation):尽管多个事务可能并发执行,但执行的结果与某个串行执行相同,因此,每个事务都感觉不到系统中其他事务在并发执行,隔离性是并发控制的主要任务;
持久性(Durability)一个事务成功执行完成后,它对数据库的改变必须是永久的,即使出现系统故障,持久性是恢复系统的主要任务
5、内联接与外联接
内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种
视图是数据库数据的特定子集。可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据,这种方法可以保护用户和应用程序不受某些数据库修改的影响。2.视图是抽象的,他在使用时,从表里提取出数据,形成虚的表。 视图没有自己的数据,当用户操作视图时,数据库才把相应的操作转化为对应表的操作,视图仅仅是预先定义好的一些SQL操作,它是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。
7、索引:参考文献
第一,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第二,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第一,创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列 上创建索引,例如:
在经常需要搜索的列上,可以加快搜索的速度;
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因 为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那 些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比 例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索 引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因 此,当修改性能远远大于检索性能时,不应该创建索引。
索引的几种方式
1、顺序索引(基本不用)
2、B+树索引(最常用,如的InnoDB)
3、hash索引(用的不多)
8、SQL标准定义的四个隔离级别(都是与事务相关的)
通过一些现象,可以反映出隔离级别的效果。这些现象有:
1、更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。
2、脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
3、非重复读(nonrepeatableread):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
4、幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
下面是隔离级别及其对应的可能出现或不可能出现的现象
Dirty Read
NonRepeatable Read
Phantom Read
Read uncommitted
Read committed
Not possible
Repeatable read
Not possible
Not possible
Serializable
Not possible
Not possible
Not possible
ORACLE的隔离级别
ORACLE提供了SQL92标准中的readcommitted和serializable
mysql的InnoDB存储引擎默认支持的隔离级别是Repeatable read
在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:
◆未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
◆授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
◆可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
◆序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,通过选用不同的隔离等级就可以在不同程度上避免前面所提及的在事务处理中所面临的各种问题。所以,数据库隔离级别的选取就显得尤为重要,在选取数据库的隔离级别时,应该注意以下几个处理的原则:
首先,必须排除“未授权读取”,因为在多个事务之间使用它将会是非常危险的。事务的回滚操作或失败将会影响到其他并发事务。第一个事务的回滚将会完全将其他事务的操作清除,甚至使数据库处在一个不一致的状态。很可能一个已回滚为结束的事务对数据的修改最后却修改提交了,因为“未授权读取”允许其他事务读取数据,最后整个错误状态在其他事务之间传播开来。
其次,绝大部分应用都无须使用“序列化”隔离(一般来说,读取幻影数据并不是一个问题),此隔离级别也难以测量。目前使用序列化隔离的应用中,一般都使用悲观锁,这样强行使所有事务都序列化执行。
剩下的也就是在“授权读取”和“可重复读取”之间选择了。我们先考虑可重复读取。如果所有的数据访问都是在统一的原子数据库事务中,此隔离级别将消除一个事务在另外一个并发事务过程中覆盖数据的可能性(第二个事务更新丢失问题)。这是一个非常重要的问题,但是使用可重复读取并不是解决问题的唯一途径。
9、聚集索引与非聚集索引
聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、&、&=、&、&=)或使用groupby或order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。
vcD4KPHA+CrnY09pteXNxbLXEy/fS/aOsv8nS1LLOv7zV4sDvoaO52NPaQiYjNDM7yve1xNStwO2/ydLUss6/vNXiwO88L3A+Cgo8cD4xMKGiyNXWvs7EvP4gcmVkbyC6zSB1bmRvtcTX99PDPC9wPgo8cD7U2srCzvFUv6rKvL+qyrzWrsewo6zI1da+1tDQtMjrvMfCvCZsdDtUIHN0YXJ0Jmd0O6Os1rTQ0Ln9s8zW0KOsVNa00NDIzrrOd3JpdGUoWCmy2df3x7DPyNKqz/LI1da+1tDQtMjrysq1sbXE0MK1xLzHwryjrLWxVMzhvbvKsaOsyNXWvtbQ0LTI67zHwrwmbHQ7VCBjb21taXQmZ3Q7o6zX3LXEwLTLtb7NysfPyNC0yNXWvqOsuvO4/NDCvMfCvKGjPC9wPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/42.png" alt="">
在这里我们先说恢复的一般方法:
(1)正向扫描日志文件(从头到尾),找出故障发生前已经提交的事务(存在begin transaction和commit记录),将其标识记入重做(redo)队列。同时找出故障发生时未完成的事务(只有begin transaction,没commit),将其标识记入(undo)队列
(2)对undo队列的各事务进行撤销处理。进行undo的处理方法是,反向扫描日志文件,对每个undo事务的更新操作执行反操作,即将日志记录中“更新前的值”写入数据库。
(3)对重做日志中的各事务进行重做操作。进行redo的处理方法是,正向扫描日志,对每个redo事务重新执行日志文件登记操作。即将日志中“更新后的值”写入数据库。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 数据库的第三范式 的文章

 

随机推荐