文章图片

事情经过:需要对公司的北京数据库完成到南京数据库的整体克隆,克隆过程中发现undo表空间的文件大小为16G,而无任何活动事务,决定丢弃undo表空间的文件,于是模拟一次undo表空间文件丢失的数据库恢复。具体步骤如下:

1.删除undo表空间文件undotbs01.dbf文件。

2.将数据库启动在mount状态。

3.查询表空间和对应的undo文件。

4.将undo表空间数据文件offline,修改undo管理为手动,并shutdown数据库。

5.重启数据库,创建新的undo表空间和对应文件,保持与原来的一致。创建之前要先drop原来的表空间。

6.修改undo管理为自动,重启数据库,显示正常。

7.查看文件列表,显示undo文件undotbs01.dbf已经存在。

文章图片

克隆完数据库之后,对OEM进行配置,使用oracle用户登录系统,启动OEM控制台,系统报错:

OC4J Configuration issue. /u01/oracle/oc4j/j2ee/OC4J_DBConsole_db10_orcl not found.

考虑是OEM没有配置,于是对OEM配置进行初始化。

系统一直提示无效的用户名和密码,另打开一个控制台,对OEM使用的用户进行密码设置。

配置完毕,启动OEM。

显示启动成功。

通过IE访问OEM console,登录后提示错误:java.lang.Exception: UnknownHostException sending request

考虑为hosts文件没有配置,修改hosts文件,添加配置。

重新登录,显示正常。

文章图片

在Sql中使用绑定变量会提高性能,那么他到底是如何提高性能的呢?

tom大师在他的著作《Expert One-on-One Oracle》有一段很详细的描述,其原理大体是:

使用了Bind Var能提高性能主要是因为这样做可以尽量避免不必要的硬分析(Hard Parse)而节约了时间,同时节约了大量的CPU资源。

当一个Client提交一条Sql给Oracle后,Oracle 首先会对其进行解析(Parse),然后将解析结果提交给优化器(Optimiser)来进行优化而取得Oracle认为的最优的Query Plan,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会少部分步骤)。

但是,当Oracle接到 Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。

常见的Parse主要分:

1、Hard Parse (硬解析)

2、Soft Parse (软解

在实际应用中,我们常常遇到数据库克隆的情况,比如说,已经有一套环境,现在需要克隆一套环境,供项目测试用;也或者,本来应用已经初步使用,为了满足需求,需要新增一个数据库,拓展应用。这样的时候,我们需要两个一模一样的数据库应用环境,做数据库环境搭建时只需要将原有的数据环境重新克隆一份即可。

在克隆整个数据库的过程中,需要注意的是:

1.数据库版本要一致。

2.数据库安装的路径要一致。

3.克隆数据库文件的时候要停止原数据库,保证文件一致。

如果上面3个都能保证,克隆过程中会少了很多问题。

数据库版本不一致我没有测试过,安装路径不一致时,在克隆完数据库文件时需要修改spfile,并从spfile启用database。如果克隆数据库文件时没有停止源数据库,可能导致文件不一致,scn不一致而数据库启动不起来,需要做数据库恢复,甚至直接启动不了。

下文为最简单的数据库克隆过程,主要步骤如下:

1.在新环境中创建oracle安装需要的用户、ORACLE_BASE,ORALCE_HOME,ORACLE_SID,内核参数、依赖的lib库、安装目录等。

2.安装oracle,且不要创建数据库。

3.从源数据库环境采用scp -r usename@目标主机地址:ORACLE_HOME命令同步admin、flash_recovery_area、oradata目录,目录中包含各个dump文件,archivelog文件,redol

文章图片

11g SQLPLUS客户端连接10g的服务器,一直报tns解析错误。不解其中原因,遂按照配置的过程,排查原因,详细内容如下:

1.       查看listener是否启动。

2.       查看侦听状态。

3.       查看本地tns配置是否正确。

4.       启用listner 日志跟踪。

Lsnrctl配置

5.       启动日志查看控制台。

6.       客户端用tns ping 测试连接,监视日志输出情况。

客户端显示测试正常,无错误。再查看控制台日志。

7.       再使用sqlplus hr/hr@orcl连接,查看连接情况和控制台。

8.       换一种连接方式,测试。

9.       考虑跟tnsname在cmd输入时候多了分号,而sql>下有无分号均可以。再次进行测试验证。果然如此。

1.确保Oracle的工作模式允许启动任务队列管理器Oracle定时执行“Job Queue”的后台程序是SNP进程,而要启动SNP进程,首先要确保整个系统的模式是可以启动SNP进程的,这需要以DBA的身份去执行如下命令:svrmgrl> alter system enable restricted session;或sql> alter system disenable restricted session;利用如上命令更改系统的会话方式为disenable restricted,为SNP的启动创造条件。2.确保Oracle的系统已经配置了任务队列管理器的启动参数SNP的启动参数位于Oracle的初始化文件中,该文件放在$ORACLE_HOME/dbs路径下,如果Oracle的SID是myora8的话,则初始化文件就是initmyora8.ora,在文件中对SNP启动参数的描述部分如下:job_queue_process=njob_queue_interval=N第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的话,N的配置也要相应地小一点。3.将任务加入到数据库的任务队列中调用Oracle

Creating a Database Manually

1) Choose a unique instance and database name.

2) Choose a database character set.

A database character set must be defined. An optional national character set can also be defined. For example:

- Character set AL32UTF16

- National character set AL16UTF16

3) Set operating system variables.

Four environment variables must be set: ORACLE_HOME, ORACLE_SID, PATH,

LD_LIBRARY_PATH.

- ORACLE_HOME: The top directory in which the Oracle9i server is installed.

- ORACLE_SID: A user-definable name assigned to an instance of a database. Used to distinguish different database instances running on one machine

- PATH: Defines the directories the operating system search to find executables.

- LD_LIBRARY_PATH: Defines the directories in which required library files are stored.

4) Create the initialization parameter file.

The initialization parameter file is create

[oracle@oracle11g ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Feb 15 01:20:26 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL>conn /as sysdba;

Connected.

SQL> desc v$tablespace;  

 Name                                      Null?    Type

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

 TS#                                                NUMBER

 NAME     &

文章图片

优化方案:1.用merge into ..using ...on 替代update ....... where ... in....

2.减少子查询和排序引起的性能花费。

优化前的SQL语句:

update PHONE_NUMBER_POOL p

   set p.QUERY_NUM =

       (select p1.count

          from (select POOL_ID, count(PHONE_NUMBER_ID) count

                  from PHONE_NUMBER_JS

                 group by POOL_ID) p1

         where p1.pool_id = p.pool_id )       

 where p.pool_id in (select pool_id

                       from (select POOL_ID, count(PHONE_NUMBER_ID)

 &nb

原始查询语句如图:

如图中红色部分显示,系统查询时间基本在70秒上下,验证影响系统使用。其中gs_grid_info表5w余条数据,telemt_c_address表500w条数据,c_buildingaddress表6w余条数据。

优化原则:

1.减少查询语句中表嵌套的层次,对分页的rownum从基表提取。

2.使用not exists替代not in子句。

3.使用< 替代<=。

测试结果如下图:

基本在1秒左右。