`

Oracle性能调优

 
阅读更多

前言

 

这次,我们将在Linux下来动手完成Oracle数据库的安装与使用。

Oracle本身是可以免费下载的包括 它的企业版以及被它收购的Weblogic和Sun中的几乎任何东西你都可以拿来下载和使用,不像IBM和Tibco一些其它厂商,只有“试用版”给你下载,Oracle的东西没有时间限制,你拿来做练习,搭实验环境都是没有任何的问题的。

但是,如果你出了问题,需要用到Oracle的补丁或者是Oracle的技术支持,这就开始收费。

Oracle就是这种“卖Service”的模式。

还有就是你安装了Oracle后,你的应用是给另一家企业用的或者是带有商业用途,那对不起Oracle也会问你来收费。

在linux下安装oracle是一件令人生畏的事情,其复杂程度远远超过安装linux操作系统本身。如果能够进行成功的安装oracle,那么同时也就顺便掌握了linux一些技术。

本文介绍在redhat linux 下安装oracle 10g 的方法。在这里说明一下,Oracle 10g的g是grid 的缩写,意为网格,目前较为前沿的网络计算技术。

 

一、安装Oracle前的准备

这次我们将在Linux环境下安装Oracle,对Oracle支持最好的莫过于SuSe Linux,但是随着后来RedHat走向了商业化后,RedHat与Oracle公司开始形成一种密切的关系,因此如果你手上有RedHat As 5.5x及以下版本或者是Fedora14及以上版本话那是最好不过了。

Oracle下载地址:进入下载

 

确保你是用的是root帐号,执行下列步骤

 

1.1在Linux上先安装相应的JDK

下载jdk1.6 for Linux,请注意32位与64位的区分,需要和你的操作系统对应上哦!
        

打开一个Terminal窗口

进入到你的jdk下载的目录下并输入:

./jdk-6u19-linux-i586-rpm.bin

我们默认将jdk安装于“/usr/java/jdk1.6.0_19”目录吧。

接下来我们需要修改系统环境变量,在terminal窗口中键入“vi  /etc/profile

在这个profile文件内加入两行:

export JAVA_HOME=/usr/java/jdk1.6.0_19
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

 

1.2测试我们的jdk安装是否正确

打开一个terminal窗口并输入

看到正确的jdk版本信息后即代表我们的jdk在linux下安装正确了

 

1.3Oracle安装前的环境变量配置

还是编辑那个profile文件并加入如下几行:

 

[plain] view plaincopy
 
  1. export JAVA_HOME=/usr/java/jdk1.6.0_19<br />  
  2. export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin<br />  
  3. export ORACLE_BASE=/opt/oracle<br />  
  4. export ORACLE_HOME=$ORACLE_BASE/product/10<br />  
  5. export ORACLE_SID=ktdb<br />  
  6. export ORACLE_TERM=xterm<br />  
  7. export NLS_LANG=AMERICAN_AMERICA.UTF8<br />  
  8. export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib<br />  



 

通过上述环境变量我们可以得知,我们的oracle装安装在/opt/oracle/product/10目录下,所以

 

  • 我们的ORACLE_BASE为: /opt/oracle
  • 我们的ORACLE_HOME即为: /opt/oracle/product/10了。

 

这些变量是Oracle在安装过程中需要读取的,在windows下安装oracle是不需要设这些东西的。

 

1.4 创建Oracle安装时使用的用户与组

打开一个Terminal窗口输入下列命令

 

[plain] view plaincopy
 
  1. groupadd oinstall  
  2. groupadd dba  
  3. useradd -g oinstall -G dba oracle  
  4. passwd oracle  

 

1.5创建Oracle的安装路径并将此路径的读写权限赋予Oracle这个“组”

我们安装Oracle时一般是不会用root用户的,因此我们需要增加一个角色(group),并在这个角色中增加一个用户(oracle)然后用这个用户登录我们的Linux并且执行安装。

 

[plain] view plaincopy
 
  1. mkdir -p /opt/oracle/ product/10  
  2. chown -R oracle.oinstall /opt/oracle/  

 

 

1.6 在profile中设置图形显示参数

打开一个terminal窗口,然后编辑/etc/profile,在其中加入

[plain] view plaincopy
 
  1. xhost +  
[plain] view plaincopy
 
  1. DISPLAY=<machine-name>:0.0; export DISPLAY  

它代表使得所有的用户可以使用图形化界面来运行相关的图形化应用程序,因为Linux的安全机制相当的严格,root是最高权限,除去root以外的其它用户如果需要拥有root才能执行的权限就需要授予权

 

 

1.7 在Linux系统中安装Oracle安装时需要的系统lib库

一般来讲,Oracle主要需要下面的这些Lib库

 

[plain] view plaincopy
 
  1. gcc-3.2.3-2  
  2. make-3.79  
  3. binutils-2.11  
  4. openmotif-2.2.2-16  
  5. setarch-1.3-1  
  6. compat-gcc-7.3-2.96.122  
  7. compat-gcc-c++-7.3-2.96.122  
  8. compat-libstdc++-7.3-2.96.122  
  9. compat-libstdc++-devel-7.3-2.96.122  


但是。。。Linux下的Lib库也是有依赖关系的,我给初学都的建议是你可以在刚开始安装Linux时就选customer install,然后选中相应的lib库,除去open-jdk(这个不能装,装完后sun的jdk就不起作用了,你到时还要卸),把dev相关的lib, gcc相关的lib都选上,还有gnome相关,KDE相关的lib库,有时全选上后回过头来要去安装的package里手工check,有没有java相关的被安装了,如果安装了就一定要把安装项前的勾选项,去掉,一定不能让Linux安装自带的open jdk。

 

 

二、开始在Linux下安装Oracle

Oracle10g在Linux下有版本检查的限制,如果你的Linux RedHat的版本低于5,那么你可以在Oracle的安装盘disk1下,直接运行如下命令调出图形化安装界面

 

[plain] view plaincopy
 
  1. ./runInstaller  


如果你的Linux的版本是AS5.5及以上(目前最新的Linux),那么请你使用下面这条命令来安装Oracle

 

 

[plain] view plaincopy
 
  1. /runInstaller –ignoreSysPrereqs  


这条命令将跳过Oracle安装对于Linux系统内核的检查。

 

主安装界面出现

按照上述步骤一步步把Oracle装上,注意安装时字符集永远选用AL32UTF-8,这样你的Oracle才能支持多语言。

 

三、Oracle安装后的一些设置

3.1 设置Oracle的服务开机自动启动

编辑 /etc/rc.local/文件

以下是dbstart.sh文件的内容

存盘后每次你重启Linux,Oracle就会随着你的Linux的开机而自动运行起来了(还有更专业的设置,将在以后的教程中传授,对于初学者想自己搭个环境的选用这个,嘿嘿)。

 

3.2 设置Oracle的processes, session, Maximum Open Cursor

其们在使用sys用户连上Oracle后可以使用这条命令来显示这三个兄弟

 

[plain] view plaincopy
 
  1. show parameter processes;  


一般安装好后,这个processes默认为150,网上有很多人说如果碰到用户的session不够就去用alter命令改这个session number,其实是不对的。

 

session与processes是绑定的,用下面的公式:

sessions=1.1*processes + 5

所以你只有改这个processes,session才会自动调整,我们可以使用下面这条命令去改变系统中的processes

 

[plain] view plaincopy
 
  1. alter system set processes=500 scope = spfile;  

这个processes不是乱设的,是要和你系统的内核设置去绑定的。

 

四、Oracle的性能调优

 

  • Client Configuration
  • User Role Privilege
  • SGA
  • Table Space
  • Import
  • Oracle And OS Kernel
  • Oracle Under 32 bits OS
  • SQL Plan
  • Table Analyze
  • Partition Table
  • Performance Monitor

 

我们的Oracle性能调优主要用围绕上述几个章节来做介绍,我们不介绍太高深的莫明奇妙的理论,在这边我们对这几个方面做一个统用的解释和实际应用场景,如果是新手,你在看过这篇教程后应该知道一个oracle的性能主要从几个方面(Common)去着手,对一个熟手来说上述每个小节的具体内容都是可以在Oracle的DBA手册中找到更详细的内容。

 

4.1 客户端的配置:TNS(Client Configuration: TNS)

配置主机名:

Oracle的连接服务是基于主机名的,我们需要设置装Oracle这台主机的唯一主机名,这样客户端才能通过TNS来连上Oracle的服务

请更改Oracle所在服务器上的 /etc/hosts文件

 

[plain] view plaincopy
 
  1. # Do not remove the following line, or various programs  
  2.   
  3. # that require network functionality will fail.  
  4.   
  5.   
  6. 192.168.1.3 myoracleserver  
  7.   
  8. 127.0.0.1   localhost.localdomain localhost  


这边的192.168.1.3就是我们的主机ip,后面的myoracleserver就是主机名。

 

 

配置客户端连接

一个客户端如果需要连接Oracle必须安装Oracle Client,可以去Oracle网站上下载进入下载
Oracle11g开始后不再提供图形化的Oracle客户端下载,但尽管是这样你也必须在客户机上尤其是那些支持TNS连接的第三方客户端时都是必须安装Oracle客户端的。
我们选择“管理员"模式进行安装。
安装完后,你会在你的”启动“菜单里找到这样的一个菜单项
 

更改客户端的字体使其可以支持中文的正常显示

编辑注册表

把这个NLS_LANG改成上图中所示,这样你的Oracle的客户端上可以直接通过客户端工具或者是第三方客户端工具进行中文的正常录入了而不是乱码了。

 

4.2 在Oracle中建立帐号与分配权限

使用system帐号登录

创建用户之前先要创建表空间

一般我们创建一个表空间和一个临时表空间

然后我们就可以开始创建用户了

分配角色

对于一个j2ee的应用连接Oracle来说,这个连接用户的角色只需要具有上述两个权限就够用了,有些人喜欢给这个用户DBA权限是太绝对了,当然这样给角色使用起来方便,什么权限都有了,不需要我在开发时再进行细化的设置了。

可是,你有没有想到过,一旦你的应用被人sql injection后,而你的应用上连接着oracle的用户是dba权限,那么你连整个数据库是不是都会被泄密啊?

分配系统角色

分配完角色后不是说等于结束了,还有一个”系统“角色要你分配,给下图所列的一项就够用了。

设置Oracle连接用户最大可登录次数

一个Oracle内的用户默认可以让你重复登录10次,10次的限制一到,这个用户就会被锁住。

可以用下列语句查看一个Oracle用户重复几次后会被锁住的设置参数

 

[plain] view plaincopy
 
  1. SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='FAILED_LOGIN_ATTEMPTS';  

当然这样做是为了安全考虑。

可是,在我们的开发环境中,有时往往因为一个循环,一个登录器,一个线程写错而导致Oracle连接用户重复需要连接Oracle 数次,因此经常开发人员会向DBA抱怨说 “我的用户又被锁住了”。

因此,在开发环境我建议你把这个“重复连接次数”去掉,设成下面这样

 

[plain] view plaincopy
 
  1. ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED  

 

4.3 Oracle SGA

 

  1. SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 
  2. 共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区)。  共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。 
  3. 缓冲区高速缓存:Database Buffer Cache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。 
  4. 大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境。 
  5. Java池:Java Pool为Java命令的语法分析提供服务。 
  6. PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。 

 

关于SGA这块的调整,网上有太多优秀的文章。

一般可以通过修改$ORACLE_HOME/dbs目录下的init.ora文件来自行调整,但是。。。。。。

如果你要调整一个init.ora文件,请使用下面的步骤可确保你的修改不会造成Oracle启动不了

第一步:修改前请先作一份init.ora文件的安全拷贝

在Linux下使用下面这条命令

 

[plain] view plaincopy
 
  1. strings spfilektdb.ora > init.ora.bak  

 

 一个init*.ora对应一个spfile*.ora

第二步:对于这个init.ora.bak文件内的SGA值进行调整
第三步:让Oracle直接用这个被修改后的init.ora.bak来启动数据库实例,请使用sys用户以命令行的方式登录oracle

 

[plain] view plaincopy
 
  1. sqlplus sys/password@databaseSID as sysdba  

登录成功后运行下面两条命令

 

 

[plain] view plaincopy
 
  1. shutdown immediate  
  2. startup pfile='/opt/oracle/product/10/dbs/init.ora.bak‘  


如果Oracle能够正常启动和支持客户端的连接说明我们的改动没有损坏到Oracle已安装的实例

 

第四步:让更改生效使得Oracle每次启动都使用我们修改过后的SGA的值

 

[plain] view plaincopy
 
  1. create spfile from pfile='/opt/oracle/product/10/dbs/init.ora.bak';  
  2. startup force  


如果上述这两条命令没有启动,那么你的Oracle一旦重启后它将还是继续使用原有oracle的SGA配置,而非改动后的配置。

 

 

4.4 Oracle表空间管理

Oracle的表空间文件都放在$ORACLE_HOME/oradata如/opt/oracle/product/10/oradata这样的目录中的

Oracle的表空间支持”热插拨“

即在Oracle运行时发觉表空间不够时可以直接打开Oracle的管理界面来动态给它划一块硬盘空间,或者甚至你又装了一块硬盘进服务后,Oracle可以把表空间在运行时扩展到新插入的磁盘中。

表空间管理

ORACLE的表空间划分将影响ORACLE的数据访问速度。

对于表空间来说,最重要的是如何把要连续访问的段放在一起,但是由于oracle 不能提供基于段的统计信息,所以对数据的物理模型设计和访问模式的详细了解对表空间的规划有非常大的好处。然后基于这些原则,我们就可以制定我们的表空间划分原则了:

  1. 仅在表空间级指定INITIAL、NEXT参数,在创建数据段时不要指定这些参数;
  2. 对每个表空间上的段使用相同的区片尺寸;段参数INITIAL=NEXT,PCTINCREASE=0;可以通过使用Create Tablespace 的‘ MINIMUM EXTENT’ 子句来确保分配的区片是此参数的倍数;
  3. 区片的大小根据段大小来确定,原则是均衡顺序扫描的效率和空间的利用率,同时确保段的区片数目控制在1024之下;根据此原则,在进行相应测试之后,确定以下区片选取规则:

     

    段大小 区片大小
    128M  128K
    128M-4G 4M
    4G及以上 128M

     

  4. Oracle9i引入了本地管理表空间,它在管理和性能上都优于传统的字典管理表空间,它已融合了规则1、2、3 ;要使用此特性,在CREATE TABLESPACE语句中指定EXTENT MANAGEMENT LOCAL子句;
  5. 段的区片数目上限应在4096之下,DML操作在此区片数目范围内不会有明显的性能差异;但某些DDL操作的速度则与区片的数目关系较大;因此合理的区片数目应保持在1024之下;对于持续不断扩展的段,应监控区片数目,在必要时移至其它表空间;
  6. 对于特别大的数据段应控制在4G-128G(Oracle7为5G-160G)之间,它们应存放到单独的表空间上,同时对于这些特大段应考虑使用分区拉提高性能;
  7. 用户的临时表空间应使用TEMPORARY类型;
  8. 当系统的事务规模比较均衡时可以对回滚段使用OPTIMAL参数,否则应避免制定OPTIMAL参数,而定期监控回滚段的大小,并在必要时重建;
  9. 临时段和回滚段绝对不要将用户数据存放到SYSTEM表空间,它是专为永远不会Drop和Truncate的系统数据对象而设计的;
  10. 创建表空间时指定数据文件的大小应=区片整数倍+1数据块,对于Local Managed Tablespace则为区片整数倍+64K;
  11. 当表空间使用统一的区片大小时,不要对其进行空间整理,重整的结果不仅耗费精力而且可能会使性能变差;对于未使用统一的区片尺寸的表空间应通过Export/Import重整;
  12. 提供了Alter Table …Move [Tablespace…]命令可用于快速重整表,Alter Index …Rebuild…[Tablespace…] 命令可用于快速重建索引;

4.5 Import (导入)

当传统的导入导出遇到了海量数据时~

我在以前一个工程碰到过一个真实的案例,48-50张左右的表,每张表最大数据量为1200万,最小的在280-300万左右的数据,占用硬盘空间在14-16GB左右的一个.dmp包。不定期会进行导入导出操作。

于是我们的数据库负责人员就使用传统的imp/exp命令了。

每一次imp都需要耗费达4-6个小时,有时一旦出错。。。完蛋了,这个效率太低,大家不要看1200万这个数量,大家会说:哟,都是几百万的数据,可是这点数据其实还不算是真正的大数据量,imp一次要4-6小时,这是绝对不合理的。

如何让你的imp飞起来

传统的imp命令在导入时,如果只是仅处理数据,千万条数据对Oracle的处理来说根本就是”毛毛雨“啦,关键是在它导入了数据后,而要对每个表重新做一次索引。

一边导一边索引,一边一条条commit,就好比你用一个循环来insert 1万条数据和你改用statemenet.addBatch(query);的效率的对比一样,一定是后者更快更高效。

因此,在碰到这种情况下我们建议对imp导入命令做下面的折分:

 

  • 分段式提交
  • 设置缓冲
  • 先导数据再导索引

 

这样,我们原来的imp命令就变成下面这样的样子了:

 

[plain] view plaincopy
 
  1. imp user2/pwd fromuser=user1 touser=user2 file=file commit=y feedback=10000 buffer=10240000 ignore=y rows=y indexes=n  
  2.   
  3. imp user2/pwd fromuser=user1 touser=user2 file=file commit=y feedback=10000 buffer=10240000 ignore=y rows=n indexes=y  


看到没有,先导数据rows=y indexes=n,再导索引rows=n indexes=y

 

这两条命令是先后发起的,在只导数据时对于上述的14gb左右的一个.dmp包在同样软硬件环境中只用了15-20分钟,后一条建索引语句只用了25-27分钟。

这其中,提高了几倍?大家想想。

 

4.6 Oracle与Linux系统的几个主要内核参数关系

limits.conf文件

编辑这个 /etc/security/limits.conf

 

[plain] view plaincopy
 
  1. * soft nofile 1024  
  2. * hard nofile 1024  


一般这个文件的默认值为1024

 

它代表Linux系统下最大打开文件数,如java里面的jdbc connection操作,new File操作都是一个文件打开操作,1024这个值是很少的。

所以我们把它改成

 

[plain] view plaincopy
 
  1. * soft nofile 300000  
  2. * hard nofile 300000  

 

 

继续修改

 

 

[plain] view plaincopy
 
  1. oracle soft memlock 1048576    
  2. oracle hard memlock 1048576  


这个值如果有的话直接改后面的数字,如果没有的话需要把这两行增加入limits.conf文件中,其中:

 

memlock’s value=Oracle share_pool_size (gb)*1024*1024
所以你的Oracle中的SGA里的share_pool_size的大小是受到这个值的限制的。

改完后重启Linux系统,然后我们可以使用下面的命令来看我们修改的效果。

[plain] view plaincopy
 
  1. ulimit –a  


这个命令可以查看Linux系统当前的最大打开文件数。

 

使用Oracle用户登录

 

[plain] view plaincopy
 
  1. su – oracle  

然后键入

 

 

[plain] view plaincopy
 
  1. ulimit -l  

 

就可以看到oracle soft memlock的相关修改效果了。

关于kernel.*的参数的配置

 

主要是在/etc/sysctl.conf文件中
 
[plain] view plaincopy
 
  1. kernel.shmall = 2097152   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics