循序渐进Oracle:数据库管理、优化与备份恢复
上QQ阅读APP看书,第一时间看更新

2.2 Oracle 的 iSQL*Plus 工具

Oracle的另外一个传统工具是SQL*Plus,SQL*Plus可能是Oracle应用最广泛的数据库工具,在 Linux/UNIX 环境下,通常都是通过这个工具来启动、关闭和维护数据库的。SQL*Plus以其小巧、快捷一直为众多DBA们所喜爱;当然为了格式化更友好地输出,在SQL*Plus中我们往往不得不设置大量的格式化代码。

从Oracle 9i开始,Oracle提供了基于Web方式展现的SQL*Plus工具,也就是iSQL*Plus。iSQL*Plus是基于三层的架构,可以被安装在Oracle服务器上,如果服务器上配置了iSQL*Plus Server,那么客户端只需要浏览器就可以连结并管理 Oracle 数据库,这就省略了以前客户端的安装,大大简化和方便了数据库管理,并且新提供的Web方式展现的iSQL*Plus具有更加友好的用户界面。

2.2.1 Oracle 9i的iSQL*Plus

iSQL*Plus是基于三层结构设计的,在配置应用中,其Client、Middle、Server可以位于同一台机器上也可以位于不同的机器;Oracle试图通过iSQL*Plus的推广,逐渐取代SQL*Plus工具,也许这个Web方式的工具更容易为用户所接受,但是在字符界面,SQL*Plus始终是不可或缺的管理工具。

iSQL*Plus三层模型包括了客户端(iSQL*Plus用户界面,通常是 Web 浏览器)、中间层(iSQL*Plus Server、Oracle Net和 Oracle HTTP Server)和数据库层(Oracle 9i),其架构如图2-26所示。

图2-26 iSQL*Plus三层模型

这三层可位于同一台计算机上,也可位于不同的计算机上。然而iSQL*Plus Server必须与Oracle HTTP Server位于同一台计算机上。中间层负责协调客户端和数据库层之间的交互和资源。数据库层是Oracle 9i,可以通过Oracle Net进行访问。

以下简单介绍一下iSQL*Plus的配置和使用。

1.启动服务器上的HTTP Server

通过“开始”菜单中的快捷命令“Start HTTP Server powered by Apache”,可以启动HTTP Server,如图2-27所示。

图2-27 启动HTTP Server

2.通过浏览器访问HTTP服务器

一般缺省设置的端口及协议是(不同版本/不同平台端口可能不同):HTTP7778端口/HTTPS4443端口。

对于非默认配置,可以直接到$ORACLE_HOME/Apache/Apache目录下查看ports.ini文件,其中记录了端口配置信息:

[Ports]

s_apachePort = 80

s_apachePortSSL = 443

s_jservPort = 8007

Apache Server 的详细配置信息可以在$ORACLE_HOME/Apache/Apache/conf 目录下文件httpd.conf中找到:

# Port: The port to which the standalone server listens.

Port 7778

## When we also provide SSL we have to listen to the

## standard HTTP port (see above) and to the HTTPS port

Listen 7778

Listen 4443

本例设置http://ggqiang:7778和https://ggqiang:4443,在浏览器的地址栏中输入这两个地址后,显示的结果如图2-28所示。

图2-28 显示的结果

3.启动iSQL*Plus

通过在浏览器的地址栏中输入 http://hostname:port/isqlplus,就可以启动 iSQL*Plus,如图2-29所示。

图2-29 启动iSQL*Plus

输入用户名口令等信息就可以登录到数据库,并执行SQL语句及脚本文件,也可以加载脚本来执行,如图2-30所示。

4.以SYSDBA的身份登录

以 SYSDBA 的身份登录,需要在浏览器输入 http://machine_name.domain:7778/isqlplusdba地址,此时会弹出如图2-31所示的“输入网络密码”对话框,需要输入HTTPServer的口令,这个不同于数据库认证。

图2-30 脚本执行示例

图2-31 输入网络密码

需要先创建Apache的认证口令文件,并初始化一个用户:

D:\oracle\ora92\Apache\Apache\bin>htpasswd D:/oracle/ora92/sqlplus/admin/iplusdba.pw admin

Automatically using MD5 format on Windows.

New password: *****

Re-type new password: *****

Adding password for user admin

然后可以用这个用户通过身份认证,通过Apache的系统认证之后就可以以SYSDBA身份登录数据库,如图2-32所示。

以SYSDBA身份,甚至可以通过iSQL*Plus启动和关闭数据库,如图2-33所示。

图2-32 登录数据库

图2-33 启动数据库

2.2.2 Oracle 10g的iSQL*Plus工具

iSQL*Plus 工具在安装软件时可以选择是否安装,一般在选择“可用产品组件”时,可以选择是否安装它,如图2-34所示。

在Windows上,Oracle 10g的iSQL*Plus还增加了一个系统服务,启动该服务后就可以登录iSQL*Plus,或者可以通过以下命令启动和停止该服务:

isqlplusctl start

isqlplusctl stop

在命令行启动过程如下:

图2-34 选择是否安装iSQL*Plus工具

C:\>isqlplusctl start

iSQL*Plus 10.2.0.1.0

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

Starting iSQL*Plus ...

iSQL*Plus started.

通过查看$ORACLE_HOME/install/portlist.ini文件,可以找到当前的iSQL*Plus Application Server的监听端口,默认是5560,以下是我的portlist文件示范:

iSQL*Plus HTTP 端口号 =5560

Enterprise Manager Console HTTP 端口 (eygle) = 1158

Enterprise Manager 代理端口 (eygle) = 3938

打开浏览器,在地址栏中输入地址http://hostname:5560/isqlplus就可以访问iSQL*Plus了,如图 2-35 所示。输入用户名口令及连接标识符就可以连接相应的 Oracle 数据库了,如图 2-35的右图所示。

图2-35 访问iSQL*Plus

如果要修改iSQL*Plus的默认端口,可以修改其配置文件。该配置文件为$ORACLE_HOME/oc4j/j2ee/isqlplus/config/http-web-site.xml,相应的配置为:

<web-site port="5560" display-name="OC4J Java HTTP Web Site">

修改这一端口即可变更iSQL*Plus的端口号。

在默认情况下,SYSDBA 用户无法通过 iSQL*Plus 登录;如果要以 SYSDBA 身份登入iSQL*Plus,则需要通过类似下面的网址登录http://hostname:5560/isqlplus/dba。输入该网址后首先会弹出一个登录框,要求先输入iSQL*Plus DBA的用户和密码,同Oracle 9i类似,这里输入的不是数据库用户,而是iSQL*Plus应用服务器的用户和密码。

要以DBA身份登录iSQL*Plus,必须先配置好OC4J用户。OC4J可以使用两种身份认证方式:基于XML配置文件(jazn-data.xml)和基于LDAP(Oracle Internet Directory)。

通常采用第一种方式进行认证,XML配置文件位于:$ORACLE_HOME/oc4j/j2ee/isqlplus/application-deployments/isqlplus/config。

该文件包含登录用户及口令,密码是加密后存储的,不能手工修改;要想修改该文件内容,需要通过 JAZN(Java AuthoriZatioN)工具来进行配置。JAZN 是 Oracle 提供的 JAAS(Java Authentication and Authorization Service)工具,JAAS 实施了一个 Java 版的 PAM(Pluggable Authentication Module)架构,支持基于用户的认证管理。

通过 JAZN,可以完成包括创建用户、授权等工作;这些工作可以登入 JAZN 命令环境后执行,也可以通过命令行输入单条完整的命令实现。

启动JAZN命令环境可以参考如下步骤。

(1)在命令行进入相关目录,具体路径为$ORACLE_HOME/oc4j/j2ee/isqlplus/application-deployments/isqlplus/。

C:\Oracle\10.2.0\oc4j\j2ee\isqlplus\application-deployments\isqlplus>

(2)确认JAVA_HOME环境变量指向了正确的JDK。JDK需要1.4版本以上,可以使用Oracle自带的JDK,位于$ORACLE_HOME/jdk。

C:\Oracle\10.2.0\jdk\bin>java -version

java version "1.4.2_08"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)

Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)

也可以使用系统其他满足版本要求的JDK:

C:\Oracle\10.2.0\oc4j\j2ee\isqlplus\application-deployments\isqlplus>which java

C:\WINDOWS\system32\java.exe

C:\Oracle\10.2.0\oc4j\j2ee\isqlplus\application-deployments\isqlplus>java -version

java version "1.5.0_08"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_08-b03)

Java HotSpot(TM) Client VM (build 1.5.0_08-b03, mixed mode, sharing)

注意:这里的which命令并非Windows系统自带,来自其他工具增强。

(3)执行以下命令:

java      -Djava.security.properties=$ORACLE_HOME/sqlplus/admin/iplus/provider      -jar $ORACLE_HOME/oc4j/j2ee/home/jazn.jar -user "iSQL*Plus DBA/admin" -password welcome –shell

在Windows平台上,执行结果如下:

C:\Oracle\10.2.0\oc4j\j2ee\isqlplus\application-deployments\isqlplus>java  -Djava.security.properties=c:\ oracle\10.2.0\sqlplus\admin\iplus\provider –jar \

c:\oracle\10.2.0\oc4j\j2ee\home\jazn.jar -user "iSQL*Plus DBA/admin" -password welcome -shell

JAZN:>

其中realm=iSQL*Plus DBA,user=admin,这些可以从XML配置文件中看到:

<jazn-realm>

<realm>

<name>iSQL*Plus DBA</name>

<users>

<user>

<name>admin</name>

<display-name>Realm Administrator</display-name>

<description>Administrator for this realm.</description>

<credentials>{903}ubtKEVZPHqBXthQMG2Pi5mnwWzjLlPHX</credentials>

</user>

</users>

<roles>

<role>

<name>admin</name>

<display-name>Realm Admin Role</display-name>

<description>Administrative role for this realm.</description>

<members>

<member>

<type>user</type>

<name>admin</name>

</member>

</members>

</role>

<role>

<name>webDba</name>

<members>

</members>

</role>

</roles>

</realm>

</jazn-realm>

admin用户的默认密码是welcome,但是admin用户默认没有webDba权限,不能直接用于登录iSQL*Plus。

提示:以上命令需要进入第一步的目录后再执行,否则会报错。

oracle.security.jazn.JAZNRuntimeException: Configuration file "configjazn.xml" does not exist. Check your JAAS configuration settings.

或者

Realm [iSQL*Plus DBA] does not exist in system.

进入了JAZN命令环境之后,我们就可以执行一系列的管理任务,如创建用户、授权等。

查看现有用户:

JAZN:> listusers

iSQL*Plus DBA/admin

JAZN:> listusers "iSQL*Plus DBA"

admin

增加新用户:

JAZN:> adduser "iSQL*Plus DBA" eygle eygle

JAZN:> listusers "iSQL*Plus DBA"

admin

eygle

授予webDba角色:

JAZN:> grantrole webDba "iSQL*Plus DBA" eygle

回收权限:

JAZN:> revokerole webDba "iSQL*Plus DBA" eygle

更改口令:

JAZN:> setpasswd "iSQL*Plus DBA" eygle eygle oracle

删除用户:

JAZN:> remuser "iSQL*Plus DBA" eygle

JAZN:> listusers

iSQL*Plus DBA/admin

熟悉了这几个常用命令之后,最后再创建一个用户 eygle,设置口令为 oracle,并授予webDba角色:

JAZN:> adduser "iSQL*Plus DBA" eygle oracle

JAZN:> grantrole webDba "iSQL*Plus DBA" eygle

JAZN:> listusers "iSQL*Plus DBA"

admin

eygle

接下来需要重新启动iSQL*Plus应用服务器:

C:\Oracle\10.2.0\BIN>isqlplusctl stop

iSQL*Plus 10.2.0.1.0

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

Stopping iSQL*Plus ...

iSQL*Plus stopped.

C:\Oracle\10.2.0\BIN>isqlplusctl start

iSQL*Plus 10.2.0.1.0

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

Starting iSQL*Plus ...

iSQL*Plus started.

再打开浏览器,输入网址 http://hostname:port/isqlplus/dba,如图 2-36 的左图所示。此时弹出“连接到gqgai”对话框,提示要求输入用户名及密码,我们输入刚才创建的用户及口令,认证通过之后就可以以SYSDBA的身份登录数据库了,如图2-36的右图所示。

图2-36 iSQL*Plus的认证页面

2.2.3 SQL*Plus的使用

虽然图形化的管理工具越来越多,易用性也越来越好,但是SQL*Plus的地位一直不可动摇,至今仍是DBA最为常用的数据库管理工具。本节将介绍一些DBA需要了解的SQL*Plus工具的常用技巧和功能。

1.查看SQL的执行计划

通过SQL*Plus中的Autotrace功能,可以查看SQL的执行计划,这在进行SQL诊断和跟踪是极其方便和有效的。在Oracle 9i之中,启用SQL*Plus的Autotrace功能可以参考如下步骤:

SQL> connect / as sysdba

已连接。

SQL> @?\rdbms\admin\utlxplan --这里创建了plan_table表

表已创建。

SQL> create public synonym plan_table for plan_table; --这里创建公用同义词

同义词已创建。

SQL> grant all on plan_table to public ; --使所有用户可以共享plan_table表

授权成功。

SQL> @?\sqlplus\admin\plustrce --创建查看执行计划必要的plustrace角色

SQL> drop role plustrace;

drop role plustrace

*

ERROR 位于第 1 行:

ORA-01919: 角色'PLUSTRACE'不存在

SQL> create role plustrace;

角色已创建

SQL> grant select on v_$sesstat to plustrace;

授权成功。

SQL> grant select on v_$statname to plustrace;

授权成功。

SQL> grant select on v_$session to plustrace;

授权成功。

SQL> grant plustrace to dba with admin option;

授权成功。

SQL> set echo off

SQL> grant plustrace to public ; -- 将plustrace授给public,以便所有用户可以获得

授权成功。

从Oracle 10g 开始,plan_table 已经缺省地被创建,实现了全局共享,简化了Autotrace 的使用。当用户被授予了plustrace权限之后,即可使用Autotrace的功能。

Autotrace几个常用的选项如下:

SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式

SET AUTOTRACE ON EXPLAIN --------- AUTOTRACE只显示优化器执行路径报告

SET AUTOTRACE ON STATISTICS ------ 只显示执行统计信息

SET AUTOTRACE ON ----------------- 包含执行计划和统计信息

SET AUTOTRACE TRACEONLY ---------- 同SET AUTOTRACE ON,但是不显示查询输出

这个功能可以帮助我们获得关于SQL的执行印象:

SQL> create table eygle as select * from dict;

SQL> desc eygle

Name Null? Type

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

TABLE_NAME VARCHAR2(30)

COMMENTS VARCHAR2(4000)

SQL> set autotrace trace explain

SQL> select count(table_name) from eygle;

Execution Plan

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

Plan hash value: 3602634261

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

| Id | Operation  | Name | Rows | Bytes | Cost (%CPU) | Time |

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

| 0 | SELECT STATEMENT       | | 1 | 17 | 4 (0) | 00:00:01   |

| 1 | SORT AGGREGATE    | | 1 | 17 | |  |

| 2 | TABLE ACCESS FULL     | EYGLE | 660 | 11220 | 4 (0) | 00:00:01  |

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

SQL> create index idx_tname on eygle(table_name);

Index created.

SQL> set linesize 120

SQL> select count(table_name) from eygle;

Execution Plan

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

Plan hash value: 3338774945

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

| Id | Operation   | Name  | Rows  | Bytes  | Cost (%CPU)   | Time |

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

| 0 | SELECT STATEMENT  | | 1 | 17 | 3 (0) | 00:00:01|

| 1 | SORT AGGREGATE | | 1 | 17 | | |

| 2 | INDEX FAST FULL SCAN  | IDX_TNAME | 660 | 11220 | 3 (0)  | 00:00:01|

2.生成HTML的页面输出

当我们使用 OEM 或 iSQL*Plus 进行查询或数据访问时,直观的感受是输出界面友好,其实通过 SQL*Plus 完全可以构建友好的输出,满足多样化用户需求。本节通过简单的示例,介绍了如何通过SQL*Plus输出XLS、HTML两种格式的文件。

首先创建两个脚本。

main.sql:用以设置环境,调用具体功能脚本。

get_tables.sql:为实现具体功能之脚本。

通过这样两个脚本可以避免spool中的冗余信息,获得友好的输出显示,示例如下:

(1)main.sql脚本具体如下。

set linesize 200

set term off verify off feedback off pagesize 999

set markup html on entmap ON spool on preformat off

spool tables.xls

@get_tables.sql

spool off

exit

(2)get_tables.sql脚本具体如下。

select owner,table_name,tablespace_name,blocks,last_analyzed

from all_tables order by 1,2;

(3)执行并获得输出:

[oracle@jumper utl_file]$ sqlplus "/ as sysdba" @main

SQL*Plus: Release 9.2.0.4.0 - Production on Mon Apr 25 10:30:11 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:

Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning option

JServer Release 9.2.0.4.0 - Production

Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning option

JServer Release 9.2.0.4.0 - Production

[oracle@jumper utl_file]$ ls -l tables.xls

-rw-r--r-- 1 oracle dba 69539 Apr 25 10:30 tables.xls

此处输出为XLS文件,通过图2-37我们可以看到输出的效果。

图2-37 Excel格式输出

把main.sql脚本中的spool tables.xls更改为spool tables.htm,我们可以获得HTM格式的输出,效果如图2-38所示。

图2-38 查询结果的HTM格式输出

通过SQL*Plus的这一特性和功能,我们就能够对数据库报表生成丰富的展现。

3.常用的SET选项

在使用 SQL*Plus 管理数据库时,我们常常希望更改提示符,增加其他的提示信息,以防止不必要的误操作等。在Oracle 10g中,这些设置变得简化。

SET命令可以帮助我们轻松完成这些设置,例如用户名及身份权限:

SQL> set sqlprompt "_user _privilege> "

SYS AS SYSDBA> select * from dual;

D

-

X

设置显示登录服务器的信息:

SYS AS SYSDBA> set sqlprompt "_user _privilege @ _connect_identifier>"

SYS AS SYSDBA @ enmo>

增加时间显示:

SYS AS SYSDBA @ enmo>set sqlprompt "_user _privilege on _date @ _connect_identifier>"

SYS AS SYSDBA on 15-SEP-10 @ enmo>

对于本地服务器的登录,可以将需要设定的内容保存在$ORACLE_HOME/sqlplus/glogin.sql文件中,就可以每次调用相应的设定显示了。

在执行 SQL 查询输出时,通常缺省的列分隔符是空格,我们可以通过 SET 命令指定自定义的分隔符:

SQL>set linesize 120

SQL>set colsep |

SQL>select username,password,default_tablespace from dba_users

2 where rownum <10;

USERNAME |PASSWORD |DEFAULT_TABLESPACE

----------------------------|----------------------------|--------------------

SYSTEM  |2D594E86F93B17A1 |SYSTEM

SYS  |8A8F025737A9097A |SYSTEM

SCOTT  |F894844C34402B67 |USERS

EYGLE  |B726E09FE21F8E83 |USERS

MGMT_VIEW   |8AD629A4412A591E |SYSTEM

OUTLN  |4A3BA55E08595C81 |SYSTEM

DBSNMP |E066D214D5421CCC |SYSAUX

OLAPSYS  |invalid |SYSAUX

SI_INFORMTN_SCHEMA   |84B8CBCA4D477FA3 |SYSAUX

而如果需要查看SQL的执行时间,则可以通过简单的一句set timing on来实现:

SQL>set timing on

SQL>select user,sysdate ,systimestamp from dual;

USER |SYSDATE |SYSTIMESTAMP

---------|-----------|--------------------------------------

SYS |15-SEP-10 |15-SEP-10 10.28.07.621000 PM +08:00

Elapsed: 00:00:00.05