首页

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 (Page 15 of 23)



March 1, 2006

以前写过一则 Blog , 如何重编译无效的数据库对象. 可是有的时候,因为一些原因,在对一些数据库的 Package 对象的权限做修改之后, 会出现大量的无效对象, 即使反复编译,也是无济于事的.

今天就遇到过一起.

ops$oracle@demo>select object_name,owner,object_type 
from dba_objects where status='INVALID';

OBJECT_NAME OWNER OBJECT_TYPE
---------------------------- -------------------------- ------------------
DRIDDLR CTXSYS PACKAGE BODY

ops$oracle@demo>alter package ctxsys.DRIDDLR compile body;

Warning: Package Body altered with compilation errors.
ops$oracle@demo>execute utl_recomp.recomp_serial('CTXSYS');
PL/SQL procedure successfully completed.

ops$oracle@APAYCA>select object_name,owner,object_type

from dba_objects where status='INVALID';

OBJECT_NAME OWNER OBJECT_TYPE
---------------------------- -------------------------- ------------------
DRIDDLR CTXSYS PACKAGE BODY

因为刚刚撤销了 Public 对 DBMS_METADATA 和 DBMS_JOB 的执行权限. 本着最小权限授予原则,所以决定尝试恢复 CTXSYS 对两个包的执行权限.经过测试,

SQL> grant execute on  DBMS_JOB to ctxsys; 

然后重新编译,成功.

Continue reading "Revoke 权限后出现的无效对象该如何编译" »

| | Comments (0)


February 28, 2006

今天参加培训的时候胡思乱想,忽然间想起来墨菲定律(Murphy's Law)这个有趣的话题. 西方文化中,有很多所谓的"定律", 墨菲定律应该算是一则比较著名的"定律"了.什么是墨菲定律? 最简单的表达形式是"有可能出错的事情,就会出错(Anything that can go wrong will go wrong)"。

爱德华·墨菲、约翰·保罗·斯特拉普和乔治·尼克斯凭这条定律居然还得到了搞笑诺贝尔奖(IgNobel)奖。而墨菲定律的一些衍生版本也的确有趣.比如"东西久久都派不上用场,就可以丢掉;东西一丢掉,往往就必须要用它",再比如"你出去买爆米花的时候,银幕上偏偏就出现了精采镜头".

抛开 Murphy's Law 衍生出来如此多的版本不谈,说一下墨菲定律和 DBA 之间的关系。Anything that can go wrong will go wrong, 这句话对 DBA 来说,应该是引起注意的, 甚至作为金科玉律也不为过,一般来说,没有哪一个人管理的数据库是完美无缺的,但是如果你发现了数据库的缺限置之不理,存在侥幸心理,那么最后往往会发生你最担心的问题。我就曾经亲生经历过几起类似的事件,事后总结的时候想 "如果我...如何做" 就好了. 但是已经发生的事情就不允许假设了.

Continue reading "墨菲定律与 DBA" »

| | Comments (12)


February 25, 2006

最近的 Oracle 产品消息:Oracle Database XE 推出正式版。正式版本在 32-bit 的 Linux 和 Windows 上可用.

  • Installs using native installers
  • English (single byte character set) and International (Unicode) versions available with support for 10 major languages
  • Supports up to 4GB of user data
  • May be installed on a multiple CPU server, but only executes on one processor in any server
  • May be installed on a server with any amount of memory, but will only use up to 1GB RAM of available memory
  • Fully upgradeable to other Oracle Database 10g editions
  • Oracle Text for efficient text-based searches

这个免费版本可以直接平滑升级到 Oracle 的其他版本,而且部署简单,能让开发人员迅速入手。不得不让人深深感到 Oracle 为了争夺客户煞费苦心.

Continue reading "Oracle Database XE 推出正式版" »

| | Comments (8)


February 24, 2006

好长时间没怎么看 Oracle 技术文档了,今天阅读了一篇 Oracle Response Time Optimization with Method R. 这是 Optimizing Oracle Performance 经典图书这本经典图书的主旨方法。R 代表响应时间(response time).具体的定义如下:

  • 1. Target the tasks that are critical to the business.
  • 2. Collect properly scoped, un-aggregated profile data for each task while the task is exhibiting the behavior you want to record.
  • 3. React with the candidate repair that will have the greatest net payoff to the business.
    a. Stop if the cost of the repair exceeds the cost of the problem.
  • 4. Go to step 1.

这里面的核心元素是 Profile .Profile 要提供应用程序到最终用户的响应时间的详细描述.体现到 Oracle 数据库这一层,就是要得到扩展的 SQL Trace 数据。

是不是感觉有些"虚", R 方法和一些我们已知的数据库优化方法颇一些相似之处,但是 Cary Millsap 宣称 R 方法是目前已知 Oracle 优化方法中的最优秀的、最全面的。我们来看看一些简单比较:

Continue reading "Oracle 数据库优化的R方法(Method R)" »

| | Comments (2) | TrackBacks (1)


February 20, 2006

有的时候, DBA 需要迅速找出来同一个 Oracle 数据库上或者不同数据库的两个 Schema 的差异.这种情况应该比较常见,比如测试数据库发布到产品数据库的时候,需要 DBA 做频繁的检查。

应对的办法之一是通过 Toad 这样的 GUI 工具来查找.具体操作应该是很简单的。Oracle 自带的 OEM 工具也有这样的功能( Oracle 变化管理工具包,不过不是免费的)。对于不喜欢图形工具的 DBA 来说, 用手工的方式更容易接受一些。如果已经建立了 Database Link ,可以通过类似如下的 SQL 简单的发现一些差异:

select * from user_tables@a
minus
select * from user_tables@b;

可以考虑先从 用户的 objects 入手,然后表->字段->索引 等等.

在 AskTom 上有一个关于 Schema 比较的讨论,以及一些参予讨论的人提交的 SQL 脚本。

今天测试了一个 Perl 脚本 Schemadiff, 这个工具分两个部分组成,一个执行 Perl 脚本加上一个配置文件。配置文件比较简单。看看就可以清楚。比较结果能够输出为 ASCII 文本与 HTML 两种格式。文本的结果比较类似 Unix 命令 diff 的输出.相对来说,比较直观的了.需要说明的是,使用这个脚本需要安装 DDL::Oracle 包。间接拒绝了对 Perl 不熟悉的朋友.

Continue reading "如何比较两个 Schema 的异同" »

| | Comments (2)


February 17, 2006

小技巧一个:在一个开发环境中,可以考虑把用户的SQL执行计划历史也收集进来.很简单,但是对开发 DBA 会很有帮助, 根据 HASH_VALUE 查询相关过去某个时间段内的 SQL 执行计划.一共两步:

1 Statspack 的 level 6 收集所有的统计和执行计划. 用 level 6 收集快照(Snap)信息:

SQL> execute statspack.snap (i_snap_level=>6);

2 运行 $ORACLE_HOME/rdbms/admin/sprepsql.sql 脚本抽取特定 HASH_VALUE 的 SQL 信息:

Continue reading "用 Statspack 收集 SQL 执行计划历史信息" »

| | Comments (0)


January 31, 2006

Oracle HTML DB 更名Oracle Application Express(APEX) , 与 Oracle 10g Express Edition 的命名原则一致了.

Oracle HTML DB 的开发代号为 Marvel(奇迹),这倒似乎是个不错的名字, Gary Myers 在 Blog 中怀念这个名字. Application Express 这个名字恐怕很多人会和Application Server 混淆,至少我觉得还不如原来的 HTML DB , 听起来大致知道这个工具是作什么的, 或者是 Oracle WebApp Express 也不错 :)

现在在 OTN 上已经有一个针对 Oracle Application Express 的入口. 文档上也去掉了所有的旧的 HTML DB 的字样. 软件下载的位置(Download Apex).

Oracle 在新闻稿中说:

Over 175,000 users have downloaded Oracle Application Express since its initial release in February 2004.
不知道实际上有多少中国用户用这个工具开发具体的应用?

Continue reading "Oracle HTML DB 更名为 Oracle Application Express" »

| | Comments (7) | TrackBacks (1)


January 28, 2006

Oracle XE 目前的技术信息相对还是比较少的,Tom 主持的 XE 论坛也登录不了,大多数时候都是页面打不开,页面打开了,也告诉我没有注册,注册了后告诉我没有权限查看。还是自己捉摸好一点。

如何为 Oracle 10g XE 创建一个新的数据库实例 ? 看了上一篇 Oracle XE 自带的数据库如何创建 的解释之后就容易很多了.

如果是 Windows 平台, 首先确保没甚么重要数据在当前的这个 XE 实例中. 然后调用 oradim -delete -sid xe 删除当前的系统服务(就是 Windows 服务).

然后运行 D:\oraclexe\app\oracle\product\10.2.0\server\config\scripts 中的 XE.bat 批处理即可.速度相对还是比较快的.

Continue reading "Oracle XE 创建新的数据库" »

| | Comments (1) | TrackBacks (1)


January 24, 2006

简单的说了一下Oracle 10g XE 的字符集问题, 我们接下来看看 Oracle 10g XE 自带的数据库如何创建的.

老实说,最开始在 Windows 上安装 XE 的时候,步骤非常简单,还以为 Oracle 已经掩盖了全部细节呢,安装之后浏览一下相关目录就清晰多了.我把 XE 安装到 D: 盘,在 D:\oraclexe\app\oracle\product\10.2.0\server\config\scripts 目录下有如下文件:

2006-01-24  20:47             1,783 cloneDBCreation.sql
2006-01-24  20:47               321 CloneRmanRestore.sql
2006-01-24  20:48             2,410 init.ora
2006-01-24  20:48             2,177 initXETemp.ora
2006-01-24  20:47               929 postDBCreation.sql
2006-01-24  20:47               780 postScripts.sql
2006-01-24  20:47             1,334 rmanRestoreDatafiles.sql
2006-01-24  20:47             1,424 XE.bat
2006-01-24  20:47               716 XE.sql

XE.bat 批处理文件完成如下事情:添加需要的操作系统用户; 创建相关目录存放 Oracle 数据文件;设定 Oracle 环境变量主要是 SID 名字;调用 Oradim 命令创建 XE 的实例; 然后调用 XE.sql 脚本.

XE.sql 脚本首先定义 XE 实例的用户需要用到的密码,然后用 orapwd.exe 创建密码文件, 这些步骤都和普通的 Oracle 创建实例的脚本非常相似.接下里就有意思了:XE.sql 调用 CloneRmanRestore.sql , CloneRmanRestore.sql 调用 rmanRestoreDatafiles.sql.



variable devicename varchar2(255);
declare
omfname varchar2(512) := NULL;
done boolean;
begin
dbms_output.put_line(' ');
dbms_output.put_line(' Allocating device.... ');
dbms_output.put_line(' Specifying datafiles... ');
:devicename := dbms_backup_restore.deviceAllocate;
dbms_output.put_line(' Specifing datafiles... ');
dbms_backup_restore.restoreSetDataFile;
dbms_backup_restore.restoreDataFileTo(1, 'D:\oraclexe\oradata\XE\system.dbf', 0, 'SYSTEM');
dbms_backup_restore.restoreDataFileTo(2, 'D:\oraclexe\oradata\XE\undo.dbf', 0, 'UNDOTBS1');
dbms_backup_restore.restoreDataFileTo(3, 'D:\oraclexe\\oradata\XE\sysaux.dbf', 0, 'SYSAUX');
dbms_backup_restore.restoreDataFileTo(4, 'D:\oraclexe\oradata\XE\users.dbf', 0, 'USERS');
dbms_output.put_line(' Restoring ... ');
dbms_backup_restore.restoreBackupPiece
('D:\oraclexe\app\oracle\product\10.2.0\server\config\seeddb\EXPRESS.dfb', done);
if done then
dbms_output.put_line(' Restore done.');
else
dbms_output.put_line(' ORA-XXXX: Restore failed ');
end if;
dbms_backup_restore.deviceDeallocate;
end;
/

非常有意思.XE 用的是非常规手段: dbms_backup_restore 过程.以前我曾经在 RMAN 备份,未使用catalog,控制文件丢失的解决办法 中作过介绍:

在 Oracle 816 以后的版本中,Oracle 提供了一个包:DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE 包是由 dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚本创建的.catproc.sql 脚本运行后会调用这两个包.所以是每个数据库都有的这个包. 是 Oracle服务器和操作系统之间 IO 操作的接口.由恢复管理器直接调用。

Oracle XE 直接用这个包从一个种子备份 'D:\oraclexe\app\oracle\product\10.2.0\server\config\seeddb\EXPRESS.dfb' 恢复需要的文件.注意到上面只有四个必要的表空间,Oracle 在发行说明中所说的空间限制就是从这个地方而来.至于能否超过 4g 的限制,我后面再分析.

接下来 XE.sql 调用 cloneDBCreation.sql,这个脚本的主要目的是为了创建一个可用的控制文件.
并利用dbms_backup_restore 的 zerodbid(0) 函数创建了一个新的 DBID .

然后

alter database "XE" open resetlogs;
alter database rename global_name to "XE";

并添加了一个临时表空间 Temp.

这个脚本执行之后,XE.sql 调用 postDBCreation.sql, 通过如下过程定义端口:

begin
   dbms_xdb.sethttpport('8080');
   dbms_xdb.setftpport('0');
end;
/

最后 XE.sql 调用 postScripts.sql ,主要是一些后续的操作,Patch 脚本什么的.

到此,数据库创建已经完成.也就是图形化安装的时候 1~5 的几个步骤省略的过程.其实没那么复杂.

如果是 Linux 版本,则这一堆脚本在 /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/config/scripts 这个目录下.除了调用 oradim.exe 命令之外,其他差异不大.

| | Comments (3)


January 23, 2006

有朋友问我关于 Oracle 10g XE 的字符集问题[比如这位]。这个问题首先要看 Oracle XE 的安装文档,当前的 XE 有有两种字符集之分:Western European 与 Universal 。

  • 西欧(Western European)  数据库用 WE8MSWIN1252 字符集创建,适合单字节的拉丁文,HTML DB 的界面是英文。当前的 Beta 版本都用的这个字符集。所以有的朋友在导入数据的时候会遇到问题。
  • Universal 创建数据库的字符集是 AL32UTF8 . HTML DB 可以是双字节文字,比如中文. 要在正式版才可以提供。

那么是不是当前测试版本的 XE 不支持中文存储 ? 其实不是的。参考这个XE NLS_LANG 注册表设定图示 把 字符集设定为 WE8MSWIN1252,或者是 在命令行设定 NLS_LANG 为 AMERICAN_AMERICA.WE8MSWIN1252, 还是可以输入中文并显示中文的。参考这个图. 而在 HTML DB 的界面下,可能显示乱码。需要把 IE 的语言首选项中的英文放到中文前面。

Continue reading "Oracle 10g XE 的字符集问题" »

| | Comments (0) | TrackBacks (2)


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 (Page 15 of 23)