大虾请进:oracle数据库超大数据量的处理

大虾请进:oracle数据库超大数据量的处理,第1张

通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。

下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。

1.对象的生成和大小的调整。

JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数,从而常常会生成大量的对象(或实例)。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。

例1:关于String ,StringBuffer,+和append

JAVA语言提供了对于String类型变量的 *** 作。但如果使用不当,会给程序的性能带来影响。如下面的语句:

String name=new String("HuangWeiFeng");

Systemoutprintln(name+"is my name");

看似已经很精简了,其实并非如此。为了生成二进制的代码,要进行如下的步骤和 *** 作:

(1) 生成新的字符串 new String(STR_1);

(2) 复制该字符串;

(3) 加载字符串常量"HuangWeiFeng"(STR_2);

(4) 调用字符串的构架器(Constructor);

(5) 保存该字符串到数组中(从位置0开始);

(6) 从javaioPrintStream类中得到静态的out变量;

(7) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);

(8) 复制该字符串缓冲变量;

(9) 调用字符串缓冲的构架器(Constructor);

(10) 保存该字符串缓冲到数组中(从位置1开始);

(11) 以STR_1为参数,调用字符串缓冲(StringBuffer)类中的append方法;

(12) 加载字符串常量"is my name"(STR_3);

(13) 以STR_3为参数,调用字符串缓冲(StringBuffer)类中的append方法;

(14) 对于STR_BUF_1执行toString命令;

(15) 调用out变量中的println方法,输出结果。

由此可以看出,这两行简单的代码,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五个对象变量。这些生成的类的实例一般都存放在堆中。堆要对所有类的超类,类的实例进行初始化,同时还要调用类极其每个超类的构架器。而这些 *** 作都是非常消耗系统资源的。因此,对对象的生成进行限制,是完全有必要的。

经修改,上面的代码可以用如下的代码来替换。

StringBuffer name=new StringBuffer("HuangWeiFeng");

Systemoutprintln(nameappend("is my name")toString());

系统将进行如下的 *** 作:

(1) 生成新的字符串缓冲变量new StringBuffer(STR_BUF_1);

(2) 复制该字符串缓冲变量;

(3) 加载字符串常量"HuangWeiFeng"(STR_1);

(4) 调用字符串缓冲的构架器(Constructor);

(5) 保存该字符串缓冲到数组中(从位置1开始);

(6) 从javaioPrintStream类中得到静态的out变量;

(7) 加载STR_BUF_1;

(8) 加载字符串常量"is my name"(STR_2);

(9) 以STR_2为参数,调用字符串缓冲(StringBuffer)实例中的append方法;

(10) 对于STR_BUF_1执行toString命令(STR_3);

(11)调用out变量中的println方法,输出结果。

由此可以看出,经过改进后的代码只生成了四个对象变量:STR_1,STR_2,STR_3和STR_BUF_1你可能觉得少生成一个对象不会对程序的性能有很大的提高。但下面的代码段2的执行速度将是代码段1的2倍。因为代码段1生成了八个对象,而代码段2只生成了四个对象。

代码段1:

String name= new StringBuffer("HuangWeiFeng");

name+="is my";

name+="name";

代码段2:

StringBuffer name=new StringBuffer("HuangWeiFeng");

nameappend("is my");

nameappend("name")toString();

因此,充分的利用JAVA提供的库函数来优化程序,对提高JAVA程序的性能时非常重要的其注意点主要有如下几方面;

(1) 尽可能的使用静态变量(Static Class Variables)

如果类中的变量不会随他的实例而变化,就可以定义为静态变量,从而使他所有的实例都共享这个变量。

例:

public class foo

{

 SomeObject so=new SomeObject();

}

就可以定义为:

public class foo

{

 static SomeObject so=new SomeObject();

}

(2) 不要对已生成的对象作过多的改变。

对于一些类(如:String类)来讲,宁愿在重新生成一个新的对象实例,而不应该修改已经生成的对象实例。

例:

String name="Huang";

name="Wei";

name="Feng";

上述代码生成了三个String类型的对象实例。而前两个马上就需要系统进行垃圾回收处理。如果要对字符串进行连接的 *** 作,性能将得更差,因为系统将不得为此生成更多得临时变量,如上例1所示。

(3) 生成对象时,要分配给它合理的空间和大小JAVA中的很多类都有它的默认的空间分配大小。对于StringBuffer类来讲,默认的分配空间大小是16个字符。如果在程序中使用StringBuffer的空间大小不是16个字符,那么就必须进行正确的初始化。

(4) 避免生成不太使用或生命周期短的对象或变量。对于这种情况,因该定义一个对象缓冲池。以为管理一个对象缓冲池的开销要比频繁的生成和回收对象的开销小的多。

(5) 只在对象作用范围内进行初始化。JAVA允许在代码的任何地方定义和初始化对象。这样,就可以只在对象作用的范围内进行初始化。从而节约系统的开销。

例:

SomeObject so=new SomeObject();

If(x==1) then

{

 Foo=sogetXX();

}

可以修改为:

if(x==1) then

{

 SomeObject so=new SomeObject();

 Foo=sogetXX();

}

2.异常(Exceptions)

JAVA语言中提供了try/catch来发方便用户捕捉异常,进行异常的处理。但是如果使用不当,也会给JAVA程序的性能带来影响。因此,要注意以下两点:

(1) 避免对应用程序的逻辑使用try/catch

如果可以用if,while等逻辑语句来处理,那么就尽可能的不用try/catch语句。

(2) 重用异常

在必须要进行异常的处理时,要尽可能的重用已经存在的异常对象。以为在异常的处理中,生成一个异常对象要消耗掉大部分的时间。

3 线程(Threading)

一个高性能的应用程序中一般都会用到线程。因为线程能充分利用系统的资源。在其他线程因为等待硬盘或网络读写而 时,程序能继续处理和运行。但是对线程运用不当,也会影响程序的性能。

例2:正确使用Vector类

Vector主要用来保存各种类型的对象(包括相同类型和不同类型的对象)。但是在一些情况下使用会给程序带来性能上的影响。这主要是由Vector类的两个特点所决定的。第一,Vector提供了线程的安全保护功能。即使Vector类中的许多方法同步。但是如果你已经确认你的应用程序是单线程,这些方法的同步就完全不必要了。第二,在Vector查找存储的各种对象时,常常要花很多的时间进行类型的匹配。而当这些对象都是同一类型时,这些匹配就完全不必要了。因此,有必要设计一个单线程的,保存特定类型对象的类或集合来替代Vector类用来替换的程序如下(StringVectorjava):

public class StringVector

{

 private String [] data;

 private int count;

 public StringVector()

 {

this(10); // default size is 10

 }

 public StringVector(int initialSize)

 {

data = new String[initialSize];

 }

 public void add(String str)

 {

 // ignore null strings

 if(str == null) { return; }

 ensureCapacity(count + 1);

 data[count++] = str;

 }

 private void ensureCapacity(int minCapacity)

 {

int oldCapacity = datalength;

if (minCapacity > oldCapacity)

{

 String oldData[] = data;

 int newCapacity = oldCapacity 2;

 data = new String[newCapacity];

 Systemarraycopy(oldData, 0, data, 0, count);

}

 }

 public void remove(String str)

 {

 if(str == null) { return; // ignore null str }

 for(int i = 0; i < count; i++)

 {

// check for a match

if(data[i]equals(str))

{

 Systemarraycopy(data,i+1,data,i,count-1); // copy data

 // allow previously valid array element be gc'd

 data[--count] = null;

 return;

}

 }

 }

 public final String getStringAt(int index)

 {

 if(index < 0) { return null; }

 else if(index > count) { return null; // index is > # strings }

 else { return data[index]; // index is good }

 }

}

因此,代码:

Vector Strings=new Vector();

Stringsadd("One");

Stringsadd("Two");

String Second=(String)StringselementAt(1);

可以用如下的代码替换:

StringVector Strings=new StringVector();

Stringsadd("One");

Stringsadd("Two");

String Second=StringsgetStringAt(1);

这样就可以通过优化线程来提高JAVA程序的性能。用于测试的程序如下(TestCollectionjava):

import javautilVector;

public class TestCollection

{

 public static void main(String args [])

 {

TestCollection collect = new TestCollection();

if(argslength == 0)

{

 Systemoutprintln("Usage: java TestCollection [ vector | stringvector ]");

 Systemexit(1);

}

if(args[0]equals("vector"))

{

 Vector store = new Vector();

 long start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++)

 {

storeaddElement("string");

 }

 long finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

 start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++)

 {

String result = (String)storeelementAt(i);

 }

 finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

}

else if(args[0]equals("stringvector"))

{

 StringVector store = new StringVector();

 long start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++) { storeadd("string"); }

 long finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

 start = SystemcurrentTimeMillis();

 for(int i = 0; i < 1000000; i++) {

String result = storegetStringAt(i);

 }

 finish = SystemcurrentTimeMillis();

 Systemoutprintln((finish-start));

}

 }

}

关于线程的 *** 作,要注意如下几个方面:

(1) 防止过多的同步

如上所示,不必要的同步常常会造成程序性能的下降。因此,如果程序是单线程,则一定不要使用同步。

(2) 同步方法而不要同步整个代码段

对某个方法或函数进行同步比对整个代码段进行同步的性能要好。

(3) 对每个对象使用多”锁”的机制来增大并发。

一般每个对象都只有一个”锁”,这就表明如果两个线程执行一个对象的两个不同的同步方法时,会发生”死锁”。即使这两个方法并不共享任何资源。为了避免这个问题,可以对一个对象实行”多锁”的机制。如下所示:

class foo

{

 private static int var1;

 private static Object lock1=new Object();

 private static int var2;

 private static Object lock2=new Object();

 public static void increment1()

 {

synchronized(lock1)

{

 var1++;

}

 }

 public static void increment2()

 {

synchronized(lock2)

{

 var2++;

}

 }

}

4.输入和输出(I/O)

输入和输出包括很多方面,但涉及最多的是对硬盘,网络或数据库的读写 *** 作。对于读写 *** 作,又分为有缓存和没有缓存的;对于数据库的 *** 作,又可以有多种类型的JDBC驱动器可以选择。但无论怎样,都会给程序的性能带来影响。因此,需要注意如下几点:

(1) 使用输入输出缓冲

尽可能的多使用缓存。但如果要经常对缓存进行刷新(flush),则建议不要使用缓存。

(2) 输出流(Output Stream)和Unicode字符串

当时用Output Stream和Unicode字符串时,Write类的开销比较大。因为它要实现Unicode到字节(byte)的转换因此,如果可能的话,在使用Write类之前就实现转换或用OutputStream类代替Writer类来使用。

(3) 当需序列化时使用transient

当序列化一个类或对象时,对于那些原子类型(atomic)或可以重建的原素要表识为transient类型。这样就不用每一次都进行序列化。如果这些序列化的对象要在网络上传输,这一小小的改变对性能会有很大的提高。

(4) 使用高速缓存(Cache)

对于那些经常要使用而又不大变化的对象或数据,可以把它存储在高速缓存中。这样就可以提高访问的速度。这一点对于从数据库中返回的结果集尤其重要。

(5) 使用速度快的JDBC驱动器(Driver)

JAVA对访问数据库提供了四种方法。这其中有两种是JDBC驱动器。一种是用JAVA外包的本地驱动器;另一种是完全的JAVA驱动器。具体要使用哪一种得根据JAVA布署的环境和应用程序本身来定。

5一些其他的经验和技巧

(1) 使用局部变量。

(2) 避免在同一个类中动过调用函数或方法(get或set)来设置或调用变量。

(3) 避免在循环中生成同一个变量或调用同一个函数(参数变量也一样)。

(4) 尽可能的使用static,final,private等关键字。

(5) 当复制大量数据时,使用Systemarraycopy()命令。

;  

一、 oracle,仅次于微软的世界第二大软件公司

      oracle虽然规模很大,但名声不像微软、ibm那样显赫,很多非计算机专业的在校学生不知道oracle是何物。但是如果你是一位想在毕业后进入it行业的学生,那么,你必须知道什么是oracle。

    首先,oracle是一家软件公司。这家1977成立于加利福尼亚的软件公司是世界上第一个推出关系型数据管理系统(rdbms)的公司。现在,他们的rdbms被广泛应用于各种 *** 作环境:windows nt、基于unix系统的小型机、ibm大型机以及一些专用硬件 *** 作系统平台。事实上,oracle已经成为世界上最大的rdbms供应商,并且是世界上最主要的信息处理软件供应商。现在,oracle是仅次于微软公司的世界第二大软件公司,2000年的销售额为101亿美元。现在oracle在世界范围内大约聘用了4万3千多名专业技术人员,在美国本土有2万1千名。有趣的是,即使在美国本土,oracle的技术人员(主要是程序员)中有40%是印度人,中国人是第二多的,其次才是美国人。

    然后,oracle是一个庞大的品牌系统。如前所述,oracle不仅在全球最先推出了rdbms,并且事实上掌握着这个市场的大部分份额,由于oracle 公司的rdbms都以oracle为名,所以,在某种程度上oracle己经成为了rdbms的代名词。而近几年来,oracle不断积极地扩展自己的业务,成功地开发了许多横向和纵向的产品,譬如oracle自己设计生产的oracle服务器,面对商业客户的商业交易系统(oracle exchange),oracle数据中心等等。同时,oracle还成功开发出了很多面对程序员的开发工具,譬如著名的designer/2000计算机辅助系统工程(case)工具和developer/2000开发包,这些工具作为“设计器”和“开发器”,有力地帮助了程序员的开发工作,也有力地提高了oracle的声誉。此外,oracle还开发了一系列面对不同对象的应用软件,它们被统称为oracle应用软件。这些软件使得oracle被广泛应用到各个领域,同时也为oracle带来滚滚财源。比较常见的oracle软件产品包括:

    ·oracle财务软件(oracle  financial)

    ·oracle制造业软件(oracle manufacturing)

    ·oracle人力资源软件(oracle human resources)

    ·oracle自动控制软件(oracle automotive)

    ·oracle 商业交易系统(oracle exchange)

    以及其他的应用软件。这些软件连同oraclerdbms使得oracle成为一个庞大的品牌系统,深入到了人们生产和生活的各个领域。

    由于oracle拥有多年在各种行业下的多种解决方案,拥有基于不同客户环境的oracle rdmbs服务器工具及规模巨大的应用软件系统,而且,这个庞大的系统正在不同程度、不同层次地为各行各业所广泛应用。因此,能够熟练掌握这个系统的某些方面及适应这个系统的不断更新的专业工程师必然是各界急需的人才,有着良好的就业前景。事实上,oracle公司也认识到了这一点,这就是oracle认证专家——ocp(oracle certified professional)的由来。

二、oracle认证种类介绍

    oracle认证专家——ocp,是由oracle公司授权国际考试认证中心对考生进行的资格认证。考生按考试标准要求参加几门课程的考试(一般为3—5门),在通过全部考试后,便可获得ocp的专家认证。

      目前ocp认证考试分为:

      database administrator:数据库管理员考试认证,简称dba。数据库管理员负责对数据库进行日常的管理、备份及数据库崩溃后的恢复问题。

    database operator:数据库 *** 作员认证考试,简称dbo。数据库 *** 作员主要是基于windows nt的oracle 8数据库管理,能够熟练应用oem等工具完成对数据库的 *** 作及日常的管理工作。

    database developer:数据库开发员认证考试,简称dev。数据库开发员应能熟练掌握用developer/2000的工具建立各种forms应用程序,建立各种标准的以及自定义的报表。

    java developer:java开发人员考试。

    application consultant: oracle产品应用咨询顾问。

    其中,oracle dba是最吃香,但也是最难考的一个认证。在oracle的官方网站上,对dba有以下说明:

    oracle dba专家可以跟上如今日趋复杂的系统环境要求。最好的dba们都在幕后工作,他们小心地维护着系统,使得系统可以每天都平稳地运转,并且防止意外灾难的发生,譬如数据库崩溃或者成小时地宕机。这项艰巨的任务需要对oracle数据库的结构和运行方式有着广泛泛深入的了解,并且有丰富的实战经验。最好的dba可以在取得最佳运行状态及防止他们公司停止运行的突发事件中找到平衡。oracle dba认证考试就是提供一个证明该人可以胜任oracle dba这一职务的认证。本认证考试设计了5门独立的考试,使你可以利用良好的知识获得一个专家认证。

三、如何参加考试?

    ocp认证的所有考试也是通过prometric公司组织的,具体的考试事宜请访问它的官方网站:

    目前ocp每门考试的费用为125美元。

四、如何准备考试?

    1、oracle公司推荐的官方准备途径

    一般来讲,oracle的考试内容比较多,并且考题也很细,对动手能力要求很强。因此,为了有足够的把握,一定要提前充分准备,而且一定要注重动手实践。在oracle官方网站上推荐的通过认证的途径如下,可以进行参考。

    oracle大学:oracle大学提供的教师引导及基于技术的训练(instructor-led training and technology- based training)是准备ocp认证的最好方式,这些课程将为你打下需要通过ocp认证的知识基础。你可以查阅一下课程表来选择理想的准备方式,你当地的oracle大学可以在这方面给你一些最好的建议。你可以访问oracle的网站,获得更多的信息。

    自己准备:实战经验是加深你对oracle考试内容理解的最好方式。oracle建议你将理论学习拓展,在实际工作或是练习中使用新学到的技巧和知识来自学。

    考试内容检查表:使用考试内容检查表(test content checklist)来确定你必须准备的所有题目。oracle会不断地更新考试内容检查表,所以请访问oracle网站 ,下载最新的考试指南。

    其它考试工具:模拟考试题及自我测试软件可以帮助你更好地准备ocp认证考试。oracle和自我测试软件公司(self test software)联合出品了一些高质量的考试软件以帮助考生更好地准备ocp认证考试,这些软件可以通过 oracle 网站 定购。

    事实上,绝大部分的大陆同学都是通过参加培训班来准备考试的,它们不仅辅导通过考试的知识,而且其他信息包括如何报名,考场上如何应考,都可以得到辅导。以上oracle官方的介绍只是一般地对你进行一下有关备考的初级教育,事实上,正像我们前面说过的,作为一个庞大的数据库系统,要想掌握好oracle(更不要说完全掌握了——我甚至怀疑是否有人真正完全掌握过oracle),从任何角度而言都不是一件易事。除非你有足够的决心和耐心,准备将oracle当作你的职业之路并致力于数据库技术的研究,你才有可能真正了解这个庞杂系统的精髓。以下的一些论述将有助于你对oracle有一个初步的了解。

    2、oracle数据库技术基本知识

    (1)oracle数据库涵盖了数据库技术的方方面面。

    尽管关系型数据库从原理上来讲并不是很难,有一些数据库知识的人掌握这些原理并不会花很大的气力,而且,一般的关系型数据库软件,譬如 sql server,用起来并不复杂,但oracle绝对与众不同。作为有史以来最成功的关系型数据库软件,oracle的实现方式和管理维护手段非常丰富,它涉及到很多方面的细节技术。单从任何一个侧面来理解它,是难观其全貌的。要想真的精通它,没有两三年功夫是不行的。单是oracle的技术文档,就足够淹没你的! 具体说来,oracle技术包括以下几个主要方面:oracle系统结构和原理、oracle数据库的安装和配置、oracle数据库的管理、oracle的数据备份与恢复技术、oracle的性能调整、oracle的新产品特性(java支持、应用服务器、时间空间系列、文本服务等)、oracle的并行服务器技术、oracle的数据仓库技术、oracle的对象类型和对象一关系模型等技术……

    毫不夸张地说,以上任何一个部分单独拿出来都是很大的题目!

    (2)oracle技术发展快,技术的关联性大。

    尽管oracle只是一个数据库系统,但在实际应用中,你不可能只面对数据库本身。譬如,你在做oracle数据库的网络管理,你将不可避免地遇到如何与网络通讯、防火墙的技术兼容的问题。同理,你在做其它方面的工作,也肯定有方方面面的技术关联问题需要解决。而且更要命的是,这些技术(包括oracle本身)发展速度都非常快,这就使得跟上它们的发展成为一件十分费劲的事情。

    不过幸运的是,我们并不需要同时了解oracle的所有方面,oracle提供了很多应用方向,我们可以按照偏好,选择其中的一个方向,集中时间和精力,努力在这个方向做到有所成就还不是一件很难的事情。由于oracle目前已是世界上最主要的数据库供应商和第二大软件公司,oracle的数据库技术已经被广泛应用于各个领域,因而市场上对oracle人才的需求量是相当之大,获得ocp认证不愁找不到工作。而以后我们可以在工作中学以致用,再努力地钻研oracle数据库及相关技术。

    3、入门者如何起步?

    说了这么多,想必您可能已经有些心动,那么,面对oracle这样一个庞然大物,你也许会觉得无从下手。为此,我们有一些建议:

    (1)找一本有关数据库原理的书,掌握关系数据库的基本原理——如果你没有学过这样的课程的话。

    (2)阅读参考书并结合上机 *** 作,掌握sql的一般原理及基本用法。

    (3)至少买一本oracle入门级的参考书,并找到一台安装了oracle的某个版本(oracle73以上,最好是 oracle 8)计算机,建立起上机学习环境。

    其中第三点尤其重要,因为没有实践经验,想通过oracle认证只是痴人说梦。或者如果你的预算比较充分,你可以选择参加培训。在选择培训班的时候一定要选择oracle授权的培训班,这样培训的质量才有保证,同时,在报名考试的时候还可以享受一定的折扣。

    与其他很多考试不同,ocp并没有真正意义上的参考书,你要做的就是在上机中不断熟悉oracle的各种应用,书只是用来查阅和参考的。因为从根本上来讲,oracle数据库是一门实践性很强的技术,而oracle认证主要考的是动手能力。因此,没有实践经验,而只靠背学习资料是根本无法通过oracle认证考试的。以下是市面上常见的一些书,在此列出,希望能对大家有一些帮助。

    初级的:《轻松掌握sql结构化查询语言》,《轻松掌握oracle数据库开发》,《oracle开发指南》,《oracle初学者指南》,《oracle8 pl/sql程序设计》。

    高级的;《oracle服务器技术精粹》,《oracle8/8i开发使用手册》,《oracle8份与恢复手册》,《oracle8性能优化与管理手册》。

五、获得ocp认证的好处

    在oracle的官方同站上,oracle公司详细列举了获得ocp认证的种种好处,虽然有自卖自夸之嫌,但总的来说还是很有道理的。大家不妨跟我们一起看看。

    总的来说,it业对专家的要求很高,职业竞争压力很大。无论是新进入这个行业的人,还是此行业中的老手,都需要知道他们的那些技术背景能真正吸引到雇主的眼光。同时,雇主们也需要一个标准帮助他们挑选出那些技术上真正过硬的雇员。ocp认证就能够帮助it业界建立起面向特定职位的选择标准。ocp认证是一个有价值的、业界承认的标准,这个标准可以证明持证者的知识和能力水平。

    oracle认证对技术专家的好处:ocp认证可以给你一个鲜明的优势。ocp认证可以表明你对某一职位及相关的oracle产品有着深刻的理解。成为一个ocp认证专家可以帮助你被更多的雇主注意到,并且增加你获得it业最具挑战性机遇的机会。ocp认证专家们证实了ocp认证的价值:97%的 ocp认为他们获益于ocp认证;89%的ocp认为获得认证后,他们在oracle专家的职位上更具信心;96%的ocp认为他们会建议职业学校(professional college,普遍存在于美国的一种职业教育方式)开相应的课程。

    oracle认证对it雇主的好处:ocp认证同时可以帮助it业的人事经理在应聘者中挑选出符合挑战性职位的员工。对于那些每年把员工送去培训的公司,认证可以保证他们在培训上的钱没有白花--他们的员工获得了对于深入理解和必要的知识。公司也可以把认证和员工的职业发展联合起来,这样可以增强员工的忠诚度及他们在职业岗位上的表现。同时,雇用获得认证的专家可以直接提高公司的实力,国际数据公司(international data corporation)的一项研究显示了这一点。这项研究指出获得认证的专家比那些没有通过认证的平均每人每天多处理40%的支持电话;雇用认证专家的公司比那些没有雇用的公司宕机的时间少49%;对大多数公司的调查显示,在不到9个月内,认证专家为他们节约的费用就超过了他们送专家去培训并获得认证的费用。

oracle 优势很多,大部分银行保险电信大部分是用oracle处理的

优势主要 有

1、处理速度快,非常快

2、安全级别高。支持快闪以及完美的恢复,即使硬件坏了 也可以恢复到故障发前的1s

3、几台数据库做集群数据库,可以做到几秒s以内故障转移,而且数据物理完全一致,现在集群一直是最优秀的解决方案,对于银行保险没有其他太多的选项{数据不丢,快速切换,负载均衡}

4、网格控制,以及 数据仓库方面 也非常强大

对了免费 以及 开源的 言论 都是错误的。。。oracle产品及服务都是付费的,而且价格不菲。比其他数据库要贵,物有所值。oracle不是开源的。不过可以在redhat 或者其他开源 *** 作系统上安装。

mysql在sun没被oracle收购是开源的,免费的,之后oracle公司打算 把mysql打造成不开源,收费模式的。

你最好买一本专门讲ORACLE性能优化的书,好好看看\x0d\1、调整数据库服务器的性能\x0d\Oracle数据库服务器是整个系统的核心,它的性能高低直接影响整个系统的性能,为了调整Oracle数据库服务器的性能,主要从以下几个方面考虑: \x0d\11、调整 *** 作系统以适合Oracle数据库服务器运行\x0d\Oracle数据库服务器很大程度上依赖于运行服务器的 *** 作系统,如果 *** 作系统不能提供最好性能,那么无论如何调整,Oracle数据库服务器也无法发挥其应有的性能。 \x0d\111、为Oracle数据库服务器规划系统资源 \x0d\据已有计算机可用资源, 规划分配给Oracle服务器资源原则是:尽可能使Oracle服务器使用资源最大化,特别在Client/Server中尽量让服务器上所有资源都来运行Oracle服务。 \x0d\112、调整计算机系统中的内存配置 \x0d\多数 *** 作系统都用虚存来模拟计算机上更大的内存,它实际上是硬盘上的一定的磁盘空间。当实际的内存空间不能满足应用软件的要求时, *** 作系统就将用这部分的磁盘空间对内存中的信息进行页面替换,这将引起大量的磁盘I/O *** 作,使整个服务器的性能下降。为了避免过多地使用虚存,应加大计算机的内存。 \x0d\113、为Oracle数据库服务器设置 *** 作系统进程优先级 \x0d\不要在 *** 作系统中调整Oracle进程的优先级,因为在Oracle数据库系统中,所有的后台和前台数据库服务器进程执行的是同等重要的工作,需要同等的优先级。所以在安装时,让所有的数据库服务器进程都使用缺省的优先级运行。 \x0d\12、调整内存分配\x0d\Oracle数据库服务器保留3个基本的内存高速缓存,分别对应3种不同类型的数据:库高速缓存,字典高速缓存和缓冲区高速缓存。库高速缓存和字典高速缓存一起构成共享池,共享池再加上缓冲区高速缓存便构成了系统全程区(SGA)。SGA是对数据库数据进行快速访问的一个系统全程区,若SGA本身需要频繁地进行释放、分配,则不能达到快速访问数据的目的,因此应把SGA放在主存中,不要放在虚拟内存中。内存的调整主要是指调整组成SGA的内存结构的大小来提高系统性能,由于Oracle数据库服务器的内存结构需求与应用密切相关,所以内存结构的调整应在磁盘I/O调整之前进行。 \x0d\121、库缓冲区的调整 \x0d\库缓冲区中包含私用和共享SQL和PL/SQL区,通过比较库缓冲区的命中率决定它的大小。要调整库缓冲区,必须首先了解该库缓冲区的活动情况,库缓冲区的活动统计信息保留在动态性能表v$librarycache数据字典中,可通过查询该表来了解其活动情况,以决定如何调整。 \x0d\ \x0d\Select sum(pins),sum(reloads) from v$librarycache; \x0d\ \x0d\Pins列给出SQL语句,PL/SQL块及被访问对象定义的总次数;Reloads列给出SQL 和PL/SQL块的隐式分析或对象定义重装载时在库程序缓冲区中发生的错误。如果sum(pins)/sum(reloads) ≈0,则库缓冲区的命中率合适;若sum(pins)/sum(reloads)>1, 则需调整初始化参数 shared_pool_size来重新调整分配给共享池的内存量。 \x0d\122、数据字典缓冲区的调整 \x0d\数据字典缓冲区包含了有关数据库的结构、用户、实体信息。数据字典的命中率,对系统性能影响极大。数据字典缓冲区的使用情况记录在动态性能表v$librarycache中,可通过查询该表来了解其活动情况,以决定如何调整。 \x0d\ \x0d\Select sum(gets),sum(getmisses) from v$rowcache; \x0d\ \x0d\Gets列是对相应项请求次数的统计;Getmisses 列是引起缓冲区出错的数据的请求次数。对于频繁访问的数据字典缓冲区,sum(getmisses)/sum(gets)<10%~15%。若大于此百分数,则应考虑增加数据字典缓冲区的容量,即需调整初始化参数shared_pool_size来重新调整分配给共享池的内存量。 \x0d\123、缓冲区高速缓存的调整 \x0d\用户进程所存取的所有数据都是经过缓冲区高速缓存来存取,所以该部分的命中率,对性能至关重要。缓冲区高速缓存的使用情况记录在动态性能表v$sysstat中,可通过查询该表来了解其活动情况,以决定如何调整。 \x0d\ \x0d\Select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads'); \x0d\ \x0d\dbblock gets和consistent gets的值是请求数据缓冲区中读的总次数。physical reads的值是请求数据时引起从盘中读文件的次数。从缓冲区高速缓存中读的可能性的高低称为缓冲区的命中率,计算公式: \x0d\ \x0d\Hit Ratio=1-(physical reds/(dbblock gets+consistent gets)) \x0d\ \x0d\如果Hit Ratio<60%~70%,则应增大db_block_buffers的参数值。db_block_buffers可以调整分配给缓冲区高速缓存的内存量,即db_block_buffers可设置分配缓冲区高速缓存的数据块的个数。缓冲区高速缓存的总字节数=db_block_buffers的值db_block_size的值。db_block_size 的值表示数据块大小的字节数,可查询 v$parameter 表: \x0d\ \x0d\select name,value from v$parameter where name='db_block_size'; \x0d\ \x0d\在修改了上述数据库的初始化参数以后,必须先关闭数据库,在重新启动数据库后才能使新的设置起作用。

在大型的企业应用或企业级的数据库应用中 要处理的数据量通常可以达到几十到几百GB 有的甚至可以到TB级 虽然存储介质和数据处理技术的发展也很快 但是仍然不能满足用户的需求 为了使用户的大量的数据在读写 *** 作和查询中速度更快 Oracle提供了对表和索引进行分区的技术 以改善大型应用系统的性能

使用分区的优点

·增强可用性 如果表的某个分区出现故障 表在其他分区的数据仍然可用

·维护方便 如果表的某个分区出现故障 需要修复数据 只修复该分区即可

·均衡I/O 可以把不同的分区映射到磁盘以平衡I/O 改善整个系统性能

·改善查询性能 对分区对象的查询可以仅搜索自己关心的分区 提高检索速度

Oracle数据库提供对表或索引的分区方法有三种

·范围分区

·Hash分区(散列分区)

·复合分区

下面将以实例的方式分别对这三种分区方法来说明分区表的使用 为了测试方便 我们先建三个表空间

以下为引用的内容

create tablespace dinya_space

datafile /test/demo/oracle/demodata/dinya dnf size M

create tablespace dinya_space

datafile /test/demo/oracle/demodata/dinya dnf size M

create tablespace dinya_space

datafile /test/demo/oracle/demodata/dinya dnf size M

分区表的创建

范围分区

范围分区就是对数据表中的某个值的范围进行分区 根据某个值的范围 决定将该数据存储在哪个分区上 如根据序号分区 根据业务记录的创建日期进行分区等

需求描述 有一个物料交易表 表名 material_transactions 该表将来可能有千万级的数据记录数 要求在建该表的时候使用分区表 这时候我们可以使用序号分区三个区 每个区中预计存储三千万的数据 也可以使用日期分区 如每五年的数据存储在一个分区上

根据交易记录的序号分区建表 以下为引用的内容

SQL> create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date not null

)

partition by range (transaction_id)

(

partition part_ values less than( ) tablespace dinya_space

partition part_ values less than( ) tablespace dinya_space

partition part_ values less than(maxvalue) tablespace dinya_space

);

Table created

建表成功 根据交易的序号 交易ID在三千万以下的记录将存储在第一个表空间dinya_space 中 分区名为:par_ 在三千万到六千万之间的记录存储在第二个表空间

dinya_space 中 分区名为 par_ 而交易ID在六千万以上的记录存储在第三个表空间dinya_space 中 分区名为par_

根据交易日期分区建表

以下为引用的内容

SQL> create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date not null

)

partition by range (transaction_date)

(

partition part_ values less than(to_date( yyyy mm dd ))

tablespace dinya_space

partition part_ values less than(to_date( yyyy mm dd ))

tablespace dinya_space

partition part_ values less than(maxvalue) tablespace dinya_space

);

Table created

这样我们就分别建了以交易序号和交易日期来分区的分区表 每次插入数据的时候 系统将根据指定的字段的值来自动将记录存储到制定的分区(表空间)中

当然 我们还可以根据需求 使用两个字段的范围分布来分区 如partition

by range ( transaction_id transaction_date)

分区条件中的值也做相应的改变 请读者自行测试

Hash分区(散列分区)

散列分区为通过指定分区编号来均匀分布数据的一种分区类型 因为通过在I/O设备上进行散列分区 使得这些分区大小一致 如将物料交易表的数据根据交易ID散列地存放在指定的三个表空间中

以下为引用的内容

SQL> create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date

)

partition by hash(transaction_id)

(

partition part_ tablespace dinya_space

partition part_ tablespace dinya_space

partition part_ tablespace dinya_space

);

Table created

建表成功 此时插入数据 系统将按transaction_id将记录散列地插入三个分区中 这里也就是三个不同的表空间中

复合分区

有时候我们需要根据范围分区后 每个分区内的数据再散列地分布在几个表空间中 这样我们就要使用复合分区 复合分区是先使用范围分区 然后在每个分区内再使用散列分区的一种分区方法 如将物料交易的记录按时间分区 然后每个分区中的数据分三个子分区 将数据散列地存储在三个指定的表空间中

以下为引用的内容

SQL> create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date

)

partition by range(transaction_date)subpartition by hash(transaction_id)

subpartitions store in (dinya_space dinya_space dinya_space )

(

partition part_ values less than(to_date( yyyy mm dd ))

partition part_ values less than(to_date( yyyy mm dd ))

partition part_ values less than(maxvalue)

);

Table created

该例中 先是根据交易日期进行范围分区 然后根据交易的ID将记录散列地存储在三个表空间中

分区表 *** 作

以上了解了三种分区表的建表方法 下面将使用实际的数据并针对按日期的范围分区来测试分区表的数据记录的 *** 作

插入记录

以下为引用的内容

SQL> insert into dinya_test values( BOOKS sysdate);

row created

SQL> insert into dinya_test values( BOOKS sysdate+ );

row created

SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));

row created

SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));

row created

SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));

row created

SQL> insert into dinya_test values( BOOKS to_date( yyyy mm dd ));

row created

SQL> mit;

Commit plete

SQL>

按上面的建表结果 年前的数据将存储在第一个分区part_ 上 而 年到 年的交易数据将存储在第二个分区part_ 上 年以后的记录存储在第三个分区part_ 上

查询分区表记录 以下为引用的内容

SQL> select from dinya_test partition(part_ );

TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE

BOOKS : :

BOOKS : :

SQL>

SQL> select from dinya_test partition(part_ );

TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE

BOOKS

BOOKS

SQL>

SQL> select from dinya_test partition(part_ );

TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE

BOOKS

BOOKS

SQL>

从查询的结果可以看出 插入的数据已经根据交易时间范围存储在不同的分区中 这里是指定了分区的查询 当然也可以不指定分区 直接执行select from dinya_test查询全部记录

在也检索的数据量很大的时候 指定分区会大大提高检索速度

更新分区表的记录

以下为引用的内容

SQL> update dinya_test partition(part_ ) t set em_description= DESK where

t transaction_id= ;

row updated

SQL> mit;

Commit plete

SQL>

这里将第一个分区中的交易ID= 的记录中的item_description字段更新为 DESK 可以看到已经成功更新了一条记录 但是当更新的时候指定了分区 而根据查询的记录不在该分区中时 将不会更新数据 请看下面的例子 以下为引用的内容

SQL> update dinya_test partition(part_ ) t set em_description= DESK where

t transaction_id= ;

rows updated

SQL> mit;

Commit plete

SQL>

指定了在第一个分区中更新记录 但是条件中限制交易ID为 而查询全表 交易ID为 的记录在第三个分区中 这样该条语句将不会更新记录

删除分区表记录

以下为引用的内容

SQL> delete from dinya_test partition(part_ ) t where t transaction_id= ;

row deleted

SQL> mit;

Commit plete

SQL>

上面例子删除了第二个分区part_ 中的交易记录ID为 的一条记录 和更新数据相同 如果指定了分区 而条件中的数据又不在该分区中时 将不会删除任何数据

分区表索引的使用

分区表和一般表一样可以建立索引 分区表可以创建局部索引和全局索引 当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引

局部索引分区的建立

以下为引用的内容

SQL> create index dinya_idx_t on dinya_test(item_id)

local

(

partition idx_ tablespace dinya_space

partition idx_ tablespace dinya_space

partition idx_ tablespace dinya_space

);

Index created

SQL>

看查询的执行计划 从下面的执行计划可以看出 系统已经使用了索引

以下为引用的内容

SQL> select from dinya_test partition(part_ ) t where em_id= ;

Execution Plan

SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )

TABLE ACCESS (BY LOCAL INDEX ROWID) OF DINYA_TEST (Cost=

Card= Bytes= )

INDEX (RANGE SCAN) OF DINYA_IDX_T (NON UNIQUE) (Cost=

Card= )

Statistics

recursive calls

db block gets

consistent gets

physical reads

redo size

bytes sent via SQLNet to client

bytes received via SQLNet from client

SQLNet roundtrips to/from client

sorts (memory)

sorts (disk)

rows processed

SQL>

全局索引分区的建立

全局索引建立时global 子句允许指定索引的范围值 这个范围值为索引字段的范围值

以下为引用的内容

SQL> create index dinya_idx_t on dinya_test(item_id)

global partition by range(item_id)

(

partition idx_ values less than ( ) tablespace dinya_space

partition idx_ values less than ( ) tablespace dinya_space

partition idx_ values less than (maxvalue) tablespace dinya_space

);

Index created

SQL>

本例中对表的item_id字段建立索引分区 当然也可以不指定索引分区名直接对整个表建立索引 如

以下为引用的内容

SQL> create index dinya_idx_t on dinya_test(item_id);

Index created

SQL>

同样的 对全局索引根据执行计划可以看出索引已经可以使用

以下为引用的内容

SQL> select from dinya_test t where em_id= ;

Execution Plan

SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )

TABLE ACCESS (BY GLOBAL INDEX ROWID) OF DINYA_TEST (Cost

= Card= Bytes= )

INDEX (RANGE SCAN) OF DINYA_IDX_T (NON UNIQUE) (Cost=

Card= )

Statistics

recursive calls

db block gets

consistent gets

physical reads

redo size

bytes sent via SQLNet to client

bytes received via SQLNet from client

SQLNet roundtrips to/from client

sorts (memory)

sorts (disk)

rows processed

SQL>

分区表的维护

了解了分区表的建立 索引的建立 表和索引的使用后 在应用的还要经常对分区进行维护和管理 日常维护和管理的内容包括 增加一个分区 合并一个分区及删除分区等等 下面以范围分区为例说明增加 合并 删除分区的一般 *** 作

增加一个分区:

以下为引用的内容

SQL> alter table dinya_test

add partition part_ values less than(to_date( yyyy mm dd ))

tablespace dinya_spa

ce ;

Table altered

SQL>

增加一个分区的时候 增加的分区的条件必须大于现有分区的最大值 否则系统将提示ORA partition bound must collate higher than that of the last partition 错误

合并一个分区

以下为引用的内容

SQL> alter table dinya_test merge partitions part_ part_ into partition part_ ;

Table altered

SQL>

在本例中将原有的表的part_ 分区和part_ 分区进行了合并 合并后的分区为part_ 如果在合并的时候把合并后的分区定为part_ 的时候 系统将提示ORA cannot reuse lower bound partition as resulting partition 错误

删除分区

以下为引用的内容

SQL> alter table dinya_test drop partition part_ ;

Table altered

SQL>

删除分区表的一个分区后 查询该表的数据时显示 该分区中的数据已全部丢失 所以执行删除分区动作时要慎重 确保先备份数据后再执行 或将分区合并

总结

lishixinzhi/Article/program/Oracle/201311/17329

Oracle数据库无响应故障处理方式

Oracle数据库无响应故障,简单地讲就是数据库实例不能响应客户端发起的请求,客户端提交一个SQL后,就一直处于等待数据库实例返回结果的状态。更严重的现象是客户端根本不能连接到数据库,发起一个连接请求后,一直处于等待状态。Oracle数据库无响应故障怎么处理呢下面跟我一起来学习Oracle数据库无响应故障的处理方法吧!

无响应的故障现象一般有以下几种:

1Oracle的进程在等待某个资源或事件

这种现象一般可以从V$SESSION_WAT、V$LATCH、V$LATCHHOLDER等动态视图中检查进程正在等待的资源或事件,而被等待的资源或事件,一直都不能被获取,甚至是很长时间都不可获得。如果这个正在等待的进程持有了其他的资源,则会引起其他的进程等待,这样就很可能引起实例中大范围的会话发生等待。由于进程在等待资源或事件时,通常都处于SLEEP状态,消耗的CPU资源非常少(在等待latch时要稍微多消耗一些CPU资源),所以从OS来看,CPU的消耗并不高,甚至是非常低。

这种因为等待而引起的个别进程Hang,相对比较容易处理。

2 OracleProcess Spins

所谓Spin,就是指Oracle进程中的代码在执行某个过程时,陷入了循环。在V$SESSION视图中,往往可以看到Hang住的会话,一直处于“ACTIVE”状态。对于这样的会话,用“alter system kill session ‘sid,serial#’”命令也不能完全断开会话,会话只能被标记为“killed”,会话会继续消耗大量的CPU。进程Spins由于是在做循环,CPU的消耗非常大,从OS上明显可以看到这样的进程,通常会消耗整个CPU的资源。

而对于这样的Hang住的会话,处理起来相对比较复杂,并且为了从根本上解决问题,需要超过DBA日常维护所需要的技能。

从故障范围来看,无响应故障可以分为以下几种情况:

1 单个或部分会话(进程)Hang住

这种情况属于小范围的故障,业务影响相对较小,一般来说只会影响业务系统的个别模块。在一个多应用系统的数据库上面,如果Hang住的会话比较多,则影响的可能是其中的一个应用系统。这里有一个例外,如果Hang住的进程是系统后台进程,如pmon、smon等,则影响的范围就非常大了,最终甚至会影响整个数据库及所有应用系统。还有值得注意的是,即使是少部分会话Hang住,也要及时处理,否则极有可能会扩散到整个系统。

2 单个数据库实例Hang住

这种情况造成的影响非常大。在这个实例上的所有应用系统均受到严重影响,并且在找到根源并最终解决问题之前,数据库实例往往须要重启。

3 OPS或RAC中的多个实例或所有实例都Hang住

在这种情况下,即使是OPS或RAC,都已经没办法提供高可用特性了。使用这个数据库的所有应用系统将不能继续提供服务,这种情况往往须要重启。

无响应故障成因分析

Oracle数据库无响应,一般主要由以下几种原因引起:

1 数据库主机负载过高,严重超过主机承受能力

比如应用设计不当,数据库性能低下,活动会话数的大量增加,导致数据库主机的负载迅速增加,数据库不能正常 *** 作,并最终Hang住;主机物理内存严重不足,引起大量的换页,特别是在SGA中的内存被大量换出到虚拟内存时,数据库实例往往就会Hang住。

2 日常维护不当、不正确的 *** 作引起数据库Hang住

比如归档日志的存储空间满,导致数据库不能归档,引起数据库Hang住;在一个大并发的繁忙的系

统上,对DML *** 作比较多的大表进行move、增加外键约束等 *** 作也可能使系统在短时间内负载大幅升高,并引起数据库系统Hang住;不正确的资源计划(Resource Plan)配置,使进程得不到足够的CPU等。

3 Oracle数据库的Bug

几乎每个版本都存在着会导致数据库系统Hang住的Bug,这些Bug会在一些特定的条件下触发,特别是在RAC数据库中,引起数据库Hang住的Bug比较多。

4 其他方面的一些原因

比如在RAC数据库中,如果一个节点退出或加入到RAC的过程中,当进行Resource Reconfiguration时,会使系统冻结一段时间,也有可能使系统Hang住。

以上所描述的几种常见的会导致Oracle数据库实例Hang住的原因中,大部分的情况是可以避免的,只要维护得当,一般不会出现这种故障。对于Oracle数据库Bug所导致的数据库无响应故障,由于是在特定的情况下才会触发,所以如果能够尽量对数据库打上最新版本的补丁,并且熟悉当前版本中会导致系统Hang住的Bug以及触发条件,就能够最大限度地避免这种故障的发生,提高系统的可用性。

那么,在数据库Hang住的情况下,如何去分析并发现导致问题的根源一方面,由于系统Hang住会导致业务系统不可用,为了能够尽快地恢复业务,须快速地判断问题所在,然后Kill掉引起故障的会话和进程,或者数据库实例不得不重启以迅速恢复业务;但另一方面,如果只是重启数据库或Kill会话和进程来解决问题,在很多情况下是治标不治本的办法,在以后故障随时可能会出现。如何在二者之间进行抉择呢对于数据库Hang故障的处理,首先是尽可能地收集到系统Hang住时的状态数据,然后尽快地恢复业务,恢复业务后分析收集到的数据,找到数据库系统Hang住的真正原因,然后再进行相应的处理。下一节将详细描述数据库系统Hang住后的处理流程。

无响应故障处理流程

对于Oracle无响应故障的处理,我们可以按下图所示的流程进行。

值得注意的是,上图并不是一个完整的Oracle数据库故障处理流程图,只是处理Oralce数据库无响应这一类特定的故障的流程,只列出了针对这一特定类型故障处理时的关键处理点。不过既然是故障,所以这类故障的处理流程与其他故障的处理流程,有着非常相似的地方。

下面是整个流程的详细说明:

1 在出现数据库无响应故障后,首先确认系统的影响范围,如上节所描述的',是部分业务系统或模块还是所有的业务系统都受影响,是不是整个实例或多个实例都无响应。同时应询问系统维护和开发人员,受影响的系统在出现故障前是否有过变动,包括主机硬件、 *** 作系统、网络、数据库以及应用等。有时一个细小的变动就可能导致出现数据库Hang住这样严重的故障。曾经遇到一个库,应用只是修改了一个SELECT语句就导致了数据库Hang住。

2 为了避免由于网络、数据库监听或客户端因素影响分析,建议都登录到主机上进行 *** 作。

3 如果主机不能登录(为了避免干扰流程主线,这里不讨论如网络问题这样也会导致不能连接的故障),尝试关闭出现问题的业务系统,甚至是所有的业务系统。如果关闭了所有的业务系统之后,仍然不能连接,则只有考虑重新启动数据库主机。在数据库主机重新启动后,使用 *** 作系统工具或OSW等长期监控 *** 作系统的资源使用,同时监控Oracle数据库的性能和等待等。

4 登录上主机后,先用top、topas等命令简单观察一下系统。看看系统的CPU使用、物理内存和虚拟内存的使用、IO使用等情况。

5 使用SQLPLUS连接数据库,如果不能连接,则只能从 *** 作系统上观察系统中是否有异常的现象,比如占用CPU过高的进程。使用gdb、dbx等debugger工具对数据库进行system state dump;使用strace、truss等工具检查异常进程的系统调用;使用pstack、procstack等工具察看异常进程的call stack等。

6 使用SQLPLUS连接上数据库后,进行hanganalyze、system state dump等 *** 作;或检查等待事件、异常会话等正在执行的SQL等待。

7 找到故障产生的原因,如果暂时找不到原因,尽量收集数据。

8确良如果应用急须恢复,可通过Kill会话、重启数据库实例等方式,先恢复应用。

9 根据最终诊断结果,对数据库升级打补丁,或者修改应用等方式从根本上解决问题。

怎样避免数据库出现无响应故障

作为Oracle数据库DBA,除了处理故障之外,更重要的是如何预防故障的发生。根据前面对数据库无响应故障的成因分析,在日常的维护工作中,须做到以下几点:

1 进行正确的维护 *** 作

很多的数据库无响应故障都是由于不正确的维护 *** 作引起的。应避免在业务高峰期做大的维护 *** 作,比如像move、加主外键约束等会长时间锁表的 *** 作。如果的确需要,尽量使用正确的 *** 作方法。比如用ONLINE方式重建索引;建主键、唯一键约束时先建索引,然后在建约束时指定新建的索引,等等。也就是保证系统的并发性、可伸缩性,避免系统串行 *** 作的出现。

2 优化应用设计,优化数据库性能

为避免性能问题导致在业务高峰期数据库不能及时有效处理来自业务的请求,甚至于完全Hang住。对于数据库中存在串行访问的部分进行优化,比如latch、enqueue,还包括不合理的sequence设计等。特别是在RAC数据库中,严重串行访问等待往往更容易引起严重的性能问题。优化应用设计,使数据库具有更好的可伸缩性和并行处理能力,能够有效地避免性能问题引起的数据库Hang住。

3 利用监控系统随时监控系统负载

遇到系统负载过高,内存不足,OS中虚拟内存换页很频繁等情况时,及时采取措施;监控Oracle数据库的核心进程,如pmon、smon等,看是否有异常,如过高的CPU消耗。出现异常应立即处理;监控归档空间和日志切换;监控数据库中的等待事件,比如是否有大量的enqueue、log file switch (archiving needed)、resmgr:become active等待事件等。

4 为数据库打上补丁

很多的无响应故障是由于Oracle的Bug引起的,数据库DBA应关注当前版本中有哪些Bug会导致数据库Hang住,尽量为数据库打上解决这些Bug的补丁。

;

以上就是关于大虾请进:oracle数据库超大数据量的处理全部的内容,包括:大虾请进:oracle数据库超大数据量的处理、Oracle认证基本知识介绍、oracle数据库的优势有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9736326.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存