如何通过DBLINK取remote DB的DDL
今天在写一个数据库结构同步小工具,需要用到dbms_metadata.get_ddl这个包取对象的DDL。这个包取本地对象的DDL是没有问题的,但在这个工具中,需要通过DBLINK方式取远端数据库的DDL,经过一番资料查找,找到了解决方法。[@more@]首先尝试直接在dual用dblink,结果出错:SQL> SELECT (DBMS_METADATA.GET_DDL('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230;SELECT (DBMS_METADATA.GET_DDL('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230ORA-31603: object "NEW_A" of type TABLE not found in schema "ADMIN"ORA-0651
联机重定义表在10g的改进
在10g以前,虽然支持联机重定义表,但是联机重定义后的后续工作还有很多,比如创建触发器、索引、约束等等,当一个表包含很多依赖对象时,这个后续工作就非常耗费精力时间,并且很容易漏掉一些东西。值得庆幸的是,10g后这个都不会成为我们的负担,10g的dbms_redefinition新提供一个过程COPY_TABLE_DEPENDENTS,可以帮我们做这件事情。[@more@]下面以联机把一个非分区表转换为分区表为例说明步骤:--1. create table--这一个创建一个与源表结构一样的临时表drop table PROD_USER.PO_ITEMS_TEMP purge;create table PROD_USER.PO_ITEMS_TEM
RAC的VIP切换测试
Oracle 10g开始推出VIP,能够帮助数据库或者程序能够快速地进行failover。本文主要测试RAC如何进行VIP的failover。[@more@]1. 原来的资源状况[root@dwdb01 suk]# crs_statHA Resource Target State ----------- ------ ----- ora.dwdb01.ASM1.asm ONLINE ONLINE on dwdb01 ora.dwdb01.LISTENER_DWDB01.lsnr ONLINE ONLINE on dwdb01 ora.dwdb01.gsd
RAC环境修改spfile的位置
在RAC下spfile位置的修改与单节点环境不完全一致,有些地方需要特别注意,否则可能修改会失败。下面用一个例子说明:SPFILE放在ASM中一个不正确的目录(+ARCH)中,现在想把它放在另外一个目录(+DBSYS)下。以下是具体步骤:[@more@]1. 原spfile位置SQL> show parameter spfileNAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile string +ARCH/dwrac/spfiledwrac.ora2. 拷贝spfile到其他目录由于在ASM中
Nologging对恢复的影响(一)
Nologging在提高性能的同时,会给恢复带来一定的影响。下面通过两个案例来说明它是怎么影响恢复的。第一个案例要验证在先发生nologging操作,再备份数据文件的情况下,是否可以完全恢复数据。[@more@]1. 建表CREATE TABLE SUK.PLOGGING ( A NUMBER, B NUMBER ) PARTITION BY LIST (A) (PARTITION P1 VALUES (1) TABLESPACE SUK , PARTITION P2 VALUES (2) TABLESPACE SUK ) ; CREATE TABLE SUK.PNOLOGGING ( C NUMBER, D NUMBER ) PARTITION BY LIST (C) (PARTITION P1 VALU
一次坏块的处理过程(一)
最近在一个数据库遇到了坏块,以下是处理过程。一、坏块的发现及处理[@more@]首先是在做RMAN备份的时候,看到alert文件有坏块报错:.......Corrupt block relative dba: 0x00925026 (file 2, block 1200166)Fractured block found during backing up datafileData in bad block: type: 6 format: 2 rdba: 0x00925026 last change scn: 0x0578.15b7ebf7 seq: 0x1 flg: 0x06 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x33da0602 check value in block header: 0xf8d0 computed block checksum: 0xd82eReread of blo
联机重定义修改字段类型(NVARCHAR2->VARCHAR2)
今天在调整一个SQL的时候发现有一个表使用了NVARCHAR2字段类型,在于VARCHAR2类型的字段连接时发生隐式转换(VARCHAR2 -> NVARCAHR2),导致SQL走了全表扫描。SQL类似如下:SELECT * FROM T1,T2 WHERE T1.NAME=T2.NAME AND T1.NAME='XXX';其中T1的NAME类型为:NVARCHAR2T2的NAME类型为:VARCHAR2[@more@]这个SQL会发生隐式转换(VARCHAR2 -> NVARCHAR2),所以,实际执行的SQL是:SELECT * FROM T1,T2 WHERE T1.NAME=SYS_OP_C2C(T2.NAME) AND T1.NAME=U'XXX';T2.NAME上多了一个函数,所以不能用到这列上的索引。这个SQL,应该让T1和T2都
只读表空间
顾名思义,只读表空间就是空间只可读,不可写,这一特性对备有有很大的好处,尤其是对数据仓库这种历史数据很少变化,而数据规模又非常庞大的场景。下面通过一些例子来说明只读表空间如何影响备份与恢复。[@more@]1. 创建表空间及表SQL> create tablespace tbs datafile 'E:ORACLEPRODUCT10.2.0ORADATAtbs01.dbf' size 100m;Tablespace createdSQL> create table c2 nologging tablespace tbs as select * from dba_objects;Table createdSQL> alter system checkpoint;System alteredSQL> alter tablespace tbs read only;2.
利用offline datafile文件方式迁移数据
我们可能经常遇到这样的情况:1. 因为存储需要调整,所以需要暂时把部分数据文件从一个存储迁移到另一个存储上2. 随时时间的转移,原来的热点数据变成历史数据,需要这部分数据从好的设备转移到归档设备上我们的选择有多种:1. move table 这种方法的优点是对业务影响较小,几乎可以联机做。但如果对象很多,会比较麻烦,而且还需要重建索引。 2. 直接把数据文件转移 如果数据库可以停机,则是最简单的,但用户一般难以承受完全的停机操作。所以需要找一个折中的办法。 如果这部分数据比较独立、或者不太重要,用户愿意承受操
一次gc buffer busy问题的诊断
最近在做系统上线的性能测试,在测试过程中发现了一个与gc buffer busy相关的性能问题,经过一份周折,最终解决问题。总体来说,这次测试的现象是有三个节点的压力正常,事务处理效率也正常,但另外一个节点事务处理能力很差,且系统负载根本上不去。以下是解决过程。[@more@]首先使用spawrrac.sql出一个RAC AWR报表,以下是关注的主要部分:OS Stat~~~~~~~ Num Load LoadInst # CPUs Begin End % Busy % Usr % Sys % WIO % Idl Busy Time (s) Idle Time (s) Total time (s)------ ---- ------ ------ ------ ---
Oracle并行FAQ
关于Oracle并行的一些简单小结。[@more@] Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4
RAC中的enq: TS等待
前段时间DW系统切换到RAC集群时,出现了严重的enq: TS问题。[@more@]这次问题的现象是原来运行正常的任务忽然变得很慢,分析执行计划后发现是因为执行计划出错,SQL走笛卡尔连接消耗了大量的临时表空间,从而引起了enq: TS等待。这次问题的直接解决方法就是修复执行计划,避免笛卡尔连接,但是仅仅这样做的话,还是存在风险。因为这个问题的根本原因是因为对临时表空间的大量消耗导致,如果以后有超大数据量的计算,那么不可避免需要大量的临时表空间,这个时候,enq: TS也就无法避免了。不过这个问题只在rac出现,单实例不会出现这种问题
RAC备份恢复之Voting备份与恢复
voting disk存储RAC中各个节点成员的信息,它是RAC中很重要的一个组成部分。为了提高安全性,除了mirror外,也要做好定期备份。1、什么时候需要备份voting disk一般来说,voting disk只需要在以下情况下需要备份:1) 刚安装完成2) 添加或删除节点后3) 添加或删除voting disk后 [@more@]2、如何查询voting disk的位置oracle用户下执行:crsctl query css votedisk如:[oracle@dwdb01 ~]$ crsctl query css votedisk 0. 0 /dev/raw/raw4 1. 0 /dev/raw/raw5 2. 0 /dev/raw/raw6located 3 votedisk(s).3、如何备份vo
如何监控分区表边界溢出
在数据仓库环境中,分区表会非常多,尤其是范围分区的表。为了确保业务不受影响,需要确保分区表的分区的边界足够大,以免导入数据时会出错。为了避免出错,很多人设置了maxvalue或者提早分配很多个分区,这些都是不好的习惯。设置MAXVALUE可能会导致两个问题:1) 产生垃圾数据2) 因为疏忽导致MAXVALUE的分区变得巨大,给后续的数据管理带来麻烦提早分配很多个分区也会导致一些问题:1) 也可能会产生垃圾数据2) 不是按需分配可能会导致后续的一系列问题,如因为数据量变化而修改分区方式等更好的做法是只提前分配少量的分区,并密切监控分
静默方式安装11gR2
11g的静默安装与10g过程类似,但是稍有差异,以下简单记录11g的静默安装步骤。[@more@]1. 首先检查必要的包rpm -q binutils compat-libstdc++ elfutils-libelf elfutils-libelf-devel elfutils-libelf-devel-static gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers kernel-headers ksh libaio libaio-devel libgcc libgomp libstdc++ libstdc++-devel make numactl-devel sysstat unixODBC unixODBC-devel pdksh --unixODBC和unixODBC-devel需要X64和i386版本都安装--如果包没有安装,用rpm -ivh安装2. 创建组和用户groupadd
用hash cluster表提高查询性能 (一)
cluster可以把一个或者多个表的数据按照键值聚合在一起,在很多应用场景能提高查询性能。cluster可以为B*Tree cluster也可以是hash cluster,这篇文章主要讨论hash cluster。[@more@]一、hash cluster重要参数与传统的表不同,cluster在创建的时候就要定好大小,预先分配空间,这个步骤至关重要。如果空间分配过大,则会导致空间浪费,如果过小,会导致块溢出(同一个hash key分布在不同的block中),从而导致IO增大。那么,如何合理设定空间呢?这就需要合理设定hashkeys和size两个参数了。hashkeys: cluster预期的唯一键值的数量(count(
RMAN-06207和RMAN-06208的处理
最近新上一套磁带机,重新规划了备份,运行一段时间后,最近两天查看RMAN备份,发现在维护备份集时有如下错误: [@more@]Deleting the following obsolete backups and copies:Type Key Completion Time Filename/Handle-------------------- ------ ------------------ --------------------Backup Set 507 2011-03-29 17:16:12 Backup Piece 35 2011-03-29 17:16:12 ham8euqg_1_1Backup Set 511 2011-03-29 17:19:05 Backup Piece 39 2011-03-29 17:19:05 he
split 分区的简单研究
1、split时需要有多少空闲空间2、split会不会产生大量的redo3、split的实现原理[@more@]我们要分两种情况讨论:1、在split边界的两边都有值2、只在split边界的一边有值第一个问题:1、在split边界的两边都有值我们先创建一个只有20M的表空间,我们构造一个大小为11M的分区,看空间是否足够。drop table s purge;create table s(a char(1950),b date)partition by range(b)(partition p2008 values less than (to_date('2008-12-31','yyyy-mm-dd')) tablespace test) pctfree 0;--让两部分数据差别很大,更能说明问题insert into s select
unusable index对DML/QUERY的影响
简单总结下unusable index对于DML及查询的影响:[@more@]如果skip_unusable_indexes=true,则1) 不管是local还是global index,都不会对DML操作造成影响。2) 对于查询操作,只要用到global index或者用到local index的unusable分区,就会报错如果skip_unusable_indexes=false,则1) 如果是global index,则对该表上所有与索引相关的DML都会失败;对于查询操作,主要是看是否用到unusable的索引,如果用到,则查询失败,如果没有用到,则不受影响。2) 如果是local index,则只会影响是unusable的分区的DML操作,不会影响其他分区。对于查询
RAC和ASM环境下打patch
在RAC环境下打patch与单节点类似,不过在RAC环境下Oracle提供了rolling patch方式,降低打patch对数据库的影响。以下是基于RAC + ASM环境的patch步骤,简单记录。[@more@]1. 首先解压文件[oracle@dwdb01 tmp]$ unzip p10017048_10205_Linux-x86-64.zip Archive: p10017048_10205_Linux-x86-64.zip creating: 10017048/ creating: 10017048/files/ creating: 10017048/files/lib/ creating: 10017048/files/lib/libserver10.a/ inflating: 10017048/files/lib/libserver10.a/kkfd.o creating: 10017048/etc/ creating: 100