一步一步在Linux上安装Oracle 11gR2 RAC (2)

2.2 配置 /etc/hosts文件
参照Figure 2.1网络配置信息表,修改节点1的/etc/hosts配置文件。
[root@node1 ~]# cp /etc/hosts /etc/hosts.bak
[root@node1 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1               localhost
::1             localhost6.localdomain6 localhost6
# node1
172.16.0.191            node1.localdomain               node1
172.16.0.193            node1-vip.localdomain           node1-vip
192.168.94.11           node1-priv.localdomain          node1-priv
# node2
172.16.0.192            node2.localdomain               node2
172.16.0.194            node2-vip.localdomain           node2-vip
192.168.94.12           node2-priv.localdomain          node2-priv
# scan-ip
172.16.0.203            scan-cluster.localdomain        scan-cluster
[root@node1 ~]# 
    
2.3 配置DNS服务器,确认SCAN IP可以被解析
从Oracle 11gR2开始,引入SCAN(Single Client Access Name) IP的概念,相当于在客户端和数据库之间增加一层虚拟的网络服务层,即是SCAN IP和SCAP IP Listener。在客户端的tnsnames.ora配置文件中,只需要配置SCAN IP的配置信息即可,客户端通过SCAN IP、SCAN IP Listener来访问数据库。同之前各版本的RAC相比,使用SCAN IP的好处就是,当后台RAC数据库添加、删除节点时,客户端配置信息无需修改。可以通过配置DNS服务器或GNS来配置SCAN,我们这里以DNS为例来进行配置。

2.3.1 配置DNS服务器
这里,选择IP地址为172.16.0.176的服务器来配置DNS服务器。
①安装DNS软件包:
[root@rdd dns_rpm]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:99:DA:22  
          inet addr:172.16.0.176  Bcast:172.16.15.255  Mask:255.255.240.0
          inet6 addr: fe80::20c:29ff:fe99:da22/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:10237921 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1394986 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3375785216 (3.1 GiB)  TX bytes:596171214 (568.5 MiB)
[root@rdd dns_rpm]# pwd
/root/dns_rpm
[root@rdd dns_rpm]# ll
total 1112
-rw-r–r– 1 root root 1015531 Apr 23 14:53 bind-9.3.6-4.P1.el5_4.2.x86_64.rpm
-rw-r–r– 1 root root   45360 Apr 23 14:53 bind-chroot-9.3.6-4.P1.el5_4.2.x86_64.rpm
-rw-r–r– 1 root root   62251 Apr 23 14:53 caching-nameserver-9.3.6-4.P1.el5_4.2.x86_64.rpm
[root@rdd dns_rpm]# rpm -ivh bind-9.3.6-4.P1.el5_4.2.x86_64.rpm 
warning: bind-9.3.6-4.P1.el5_4.2.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing…                ########################################### [100%]
   1:bind                   ########################################### [100%]
[root@rdd dns_rpm]# rpm -ivh bind-chroot-9.3.6-4.P1.el5_4.2.x86_64.rpm 
warning: bind-chroot-9.3.6-4.P1.el5_4.2.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing…                ########################################### [100%]
   1:bind-chroot            ########################################### [100%]
[root@rdd dns_rpm]# rpm -ivh caching-nameserver-9.3.6-4.P1.el5_4.2.x86_64.rpm 
warning: caching-nameserver-9.3.6-4.P1.el5_4.2.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing…                ########################################### [100%]
   1:caching-nameserver     ########################################### [100%]
[root@rdd dns_rpm]# 
② 配置/var/named/chroot/etc/named.conf文件
先拷贝生成该文件:
[root@rdd dns_rpm]# cd /var/named/chroot/etc/
[root@rdd etc]# ll
total 16
-rw-r–r– 1 root root   405 Apr 18 07:50 localtime
-rw-r—– 1 root named 1230 Jan 21  2010 named.caching-nameserver.conf
-rw-r—– 1 root named  955 Jan 21  2010 named.rfc1912.zones
-rw-r—– 1 root named  113 Apr 23 14:55 rndc.key
[root@rdd etc]# cp -p named.caching-nameserver.conf named.conf
[root@rdd etc]# 
修改后的该文件内容如下:
[root@rdd etc]# pwd
/var/named/chroot/etc
[root@rdd etc]# cat named.conf 
//
// named.caching-nameserver.conf
//
// Provided by Red Hat caching-nameserver package to configure the
// ISC BIND named(8) DNS server as a caching only nameserver 
// (as a localhost DNS resolver only). 
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// DO NOT EDIT THIS FILE – use system-config-bind or an editor
// to create named.conf – edits to this file will be lost on 
// caching-nameserver package upgrade.
//
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        // Those options should be used carefully because they disable port
        // randomization
        // query-source    port 53;
        // query-source-v6 port 53;
        allow-query     { any; };
        allow-query-cache { any; };
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
view localhost_resolver {
        match-clients      { any; };
        match-destinations { any; };
        recursion yes;
        include "/etc/named.rfc1912.zones";
};
[root@rdd etc]# 
说明:为简单起见,将该文件中的127.0.0.1、localhost全部修改成any,且修改时,需要注意左右两边留空格。修改部分在上述配置文件中以红色加粗标示。
通过拷贝来生成/var/named/chroot/etc/named.conf文件时,注意加上-p选项,来保证文件的权限问题,否则会导致DNS服务启不来!
③ 配置Zone文件,修改/var/named/chroot/etc/named.rfc1912.zones文件
配置Zone的目的是为了解析SCAN IP,在该文件末尾添加以下反向Zone:
zone "0.16.172.in-addr.arpa." IN {
        type master;
        file "0.16.172.in-addr.arpa";
        allow-update { none; };
};
配置反向Zone之后的该文件内容如下:
[root@rdd etc]# pwd
/var/named/chroot/etc
[root@rdd etc]# ll
total 20
-rw-r–r– 1 root root   405 Apr 18 07:50 localtime
-rw-r—– 1 root named 1230 Jan 21  2010 named.caching-nameserver.conf
-rw-r—– 1 root root  1200 Apr 23 15:03 named.conf
-rw-r—– 1 root named 1085 Apr 23 15:19 named.rfc1912.zones
-rw-r—– 1 root named  113 Apr 23 14:55 rndc.key
[root@rdd etc]# cat named.rfc1912.zones 
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package 
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// 
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
zone "." IN {
        type hint;
        file "named.ca";
};
zone "localdomain" IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};
zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.ip6.local";
        allow-update { none; };
};
zone "255.in-addr.arpa" IN {
        type master;
        file "named.broadcast";
        allow-update { none; };
};
zone "0.in-addr.arpa" IN {
        type master;
        file "named.zero";
        allow-update { none; };
};
zone "0.16.172.in-addr.arpa." IN {
        type master;
        file "0.16.172.in-addr.arpa";
        allow-update { none; };
};
[root@rdd etc]# 
说明:正常情况下还应该配置正向Zone文件。这里,我们的RAC双节点node1、node2的域名domain都设置为localdomain,而默认情况下,该配置文件(/var/named/chroot/etc/named.rfc1912.zones)的第15行到第20行中已经自带下述正向Zone文件配置信息,所以无需再添加。
zone "localdomain" IN {
        type master;
        file "localdomain.zone";
        allow-update { none; };
};
④ 配置正、反向解析数据库文件。在/var/named/chroot/var/named路径下进行配置
首先,生成正、反向解析数据库文件。利用/var/named/chroot/var/named/localhost.zone复制生成正向解析的数据库文件,利用/var/named/chroot/var/named/localhost.zone复制生成名为0.16.172.in-addr.arpa的反向解析的数据库文件
[root@rdd etc]# pwd
/var/named/chroot/etc
[root@rdd etc]# cd /var/named/chroot/var/named/
[root@rdd named]# ll
total 36
drwxrwx— 2 named named 4096 Aug 26  2004 data
-rw-r—– 1 root  named  198 Jan 21  2010 localdomain.zone
-rw-r—– 1 root  named  195 Jan 21  2010 localhost.zone
-rw-r—– 1 root  named  427 Jan 21  2010 named.broadcast
-rw-r—– 1 root  named 1892 Jan 21  2010 named.ca
-rw-r—– 1 root  named  424 Jan 21  2010 named.ip6.local
-rw-r—– 1 root  named  426 Jan 21  2010 named.local
-rw-r—– 1 root  named  427 Jan 21  2010 named.zero
drwxrwx— 2 named named 4096 Jul 27  2004 slaves
[root@rdd named]# cp -p named.local 0.16.172.in-addr.arpa
[root@rdd named]# ll
total 40
-rw-r—– 1 root  named   426 Apr 23 16:10 0.16.172.in-addr.arpa
drwxrwx— 2 named named 4096 Aug 26  2004 data
-rw-r—– 1 root  named  198 Jan 21  2010 localdomain.zone
-rw-r—– 1 root  named  195 Jan 21  2010 localhost.zone
-rw-r—– 1 root  named  427 Jan 21  2010 named.broadcast
-rw-r—– 1 root  named 1892 Jan 21  2010 named.ca
-rw-r—– 1 root  named  424 Jan 21  2010 named.ip6.local
-rw-r—– 1 root  named  426 Jan 21  2010 named.local
-rw-r—– 1 root  named  427 Jan 21  2010 named.zero
drwxrwx— 2 named named 4096 Jul 27  2004 slaves
[root@rdd named]# 
说明:在上述步骤③中我们没有配置正向Zone文件,故只需生成反向解析数据库文件,正向解析数据库文件利用默认的localdomain.zone文件。
生成的正、反向解析数据库文件名一定要同上述步骤③中定义的正、反向Zone文件一致,否则DNS出错!
然后,定义正、反向解析数据库文件。
在正向解析数据库文件localdomain.zone末尾添加下述内容:
scan-cluster        IN A            172.16.0.203
添加后内容如下:
[root@rdd named]# pwd
/var/named/chroot/var/named
[root@rdd named]# cat localdomain.zone 
$TTL    86400
@               IN SOA  localhost root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
                IN NS           localhost
localhost       IN A            127.0.0.1
scan-cluster        IN A            172.16.0.203
[root@rdd named]# 
在反向解析数据库文件0.16.172.in-addr.arpa末尾添加下述内容:
203     IN PTR  scan-cluster.localdomain.
添加后内容如下:
[root@rdd named]# pwd
/var/named/chroot/var/named
[root@rdd named]# cat 0.16.172.in-addr.arpa 
$TTL    86400
@       IN      SOA     localhost. root.localhost.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS      localhost.
1       IN      PTR     localhost.
203     IN PTR  scan-cluster.localdomain.
[root@rdd named]# 
2.3.2 测试DNS服务器解析SCAN IP正常
首先,在DNS服务器172.16.0.176上启动DNS服务:
[root@rdd named]# /etc/init.d/named status
rndc: connect failed: 127.0.0.1#953: connection refused
named is stopped
[root@rdd named]# /etc/init.d/named start
Starting named: [  OK  ]
[root@rdd named]# /etc/init.d/named status
number of zones: 7
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/1000
tcp clients: 0/100
server is up and running
named (pid  23307) is running…
[root@rdd named]# chkconfig named on
[root@rdd named]#
然后,分别在RAC节点node1、node2的/etc/resolv.conf配置文件中添加下述配置信息:
search localdomain
nameserver 172.16.0.176
添加之后:
[root@node1 ~]# cat /etc/resolv.conf 
search localdomain
nameserver 172.16.0.176
[root@node1 ~]#
最后,测试SCAN IP解析是否成功?
node1测试:
[root@node1 ~]# nslookup 172.16.0.203
Server:         172.16.0.176
Address:        172.16.0.176#53
203.0.16.172.in-addr.arpa       name = scan-cluster.localdomain.
[root@node1 ~]# nslookup scan-cluster.localdomain
Server:         172.16.0.176
Address:        172.16.0.176#53
Name:   scan-cluster.localdomain
Address: 172.16.0.203
[root@node1 ~]# nslookup scan-cluster
Server:         172.16.0.176
Address:        172.16.0.176#53
Name:   scan-cluster.localdomain
Address: 172.16.0.203
[root@node1 ~]# 
node2测试:
[root@node2 ~]# nslookup 172.16.0.203
Server:         172.16.0.176
Address:        172.16.0.176#53
203.0.16.172.in-addr.arpa       name = scan-cluster.localdomain.
[root@node2 ~]# nslookup scan-cluster.localdomain
Server:         172.16.0.176
Address:        172.16.0.176#53
Name:   scan-cluster.localdomain
Address: 172.16.0.203
[root@node2 ~]# nslookup scan-cluster
Server:         172.16.0.176
Address:        172.16.0.176#53
Name:   scan-cluster.localdomain
Address: 172.16.0.203
[root@node2 ~]# 
     
至此,准备工作中的配置SCAN IP通过配置DNS服务器来解析已经成功!

一步一步在Linux上安装Oracle 11gR2 RAC (1)

1 概述和说明
1.1 概述
    本文档用于记录在OEL 5.5 X86_64位系统上安装配置Oracle 11gR2(11.2.0.3.0) RAC的详细步骤。
安装平台选择VMware公司的VMware ESXi Version 4.0的虚拟主机,通过在该虚拟机上配置两台OEL 5.5 X86_64位Linux系统的机器,然后在这两台Linux机器上配置Oracle 11gR2 RAC系统。其中,操作系统选择Oracle公司的OEL 5.5 X86_64位Linux系统,数据库软件采用目前Oracle 11gR2最新版本的11.2.0.3.0。
本文档中假定你已经安装配置好VMware ESXi Version 4.0的虚拟主机,如果没有该环境的话,也可以通过自行安装VMware Server来完成11gR2 RAC的安装配置。
1.2 软件获取
操作系统:  Oracle Enterprise Linux 5
虚拟机软件:VMware Server
其中,Oracle软件可以通过上述连接直接获取版本为11.2.0.1.0的安装介质,或者通过MetaLink官方网站获取最新版本的11.2.0.3.0安装介质,其中patch编号为10404530。
2 安装前准备工作
2.1 配置虚拟机,安装OEL 5.5 X86_64位Linux操作系统
    这里,我们需要在VMware ESXi Version 4.0的虚拟主机上创建两台虚拟机,其中每台机器至少需要配置双网卡,一块网卡作为Public,另一块作为Private,建议IP地址均选择手动配置,而不是DHCP动态分配,且要求指定的IP在网络里是唯一的。主机名也分别要求指定为唯一,避免冲突。主机名、IP地址在前期规划要慎重,一经指定,最好不要轻易改变,避免一些不必要的麻烦。这里列出两台机器前期规划的主机名、IP地址信息:
Hostname
Short Hostname
Type   
IP Address
Interface
node1.localdomain
node1
Public IP
172.16.0.191
eth0
node1-vip.localdomain
node1-vip
Virtual IP
172.16.0.193
eth0:1
node1-priv.localdomain
node1-priv
Private IP
192.168.94.11
eth1
node2.localdomain
node2
Public IP
172.16.0.192
eth0
node2-priv.localdomain
node2-vip
Virtual IP
172.16.0.194
eth0:1
node2-priv.localdomain
node2-priv
Private IP
192.168.94.12
eth1
scan-cluster.localdomain
scan-cluster
SCAN IP
172.16.0.203
eth0

(Figure 2.1网络配置信息表)

其中,每台机器至少需要配置3个IP地址,在安装操作系统的过程中,我们需要配置公网IP和私有IP即可,虚拟IP在安装集群件时分配。Public IPVirtual IPSCAN IP必须配置在同一网段。SCAN IP是Oracle 11g新推出的,在配置11g RAC时需要指定。我们的SCAN IP通过配置DNS服务器来实现,在下文中将给出配置步骤。
2.1.1 登录VMware ESXi Version 4.0虚拟主机,创建新虚拟机
    以root用户登录172.16.0.181的虚拟主机:
    
进入虚拟主机管理界面:
新建虚拟机:
选择Custom,Next进入下一步:
给虚拟机命名为11gnode1,Next:
选择Datastore位置,这里选择第1个名为snap-0f000dba-SQL-Server的存储设备,Next:
虚拟机版本选择version 7,Next:
操作系统类型选择Linux,版本选择Red Hat Enterprise Linux 5(64-bit),Next:
CPU核数选择2,Next:
内存选择2G,Next:
网卡选择2块,一块作为Public,另外一块作为Private,Next:
SCSI驱动器类型选择LSI Logic Parallel,Next:
选择创建新磁盘,Next:
磁盘大小选择20G,Next:
虚拟设备节点选择默认SCSI(0:0),Next:
选中在虚拟机创建之前编辑选项,Continue:
编辑光驱设备,选择ISO文件,找到之前已经准备就绪的OEL 5.5 X86_64位的ISO文件:
选中光驱在启动时连接选项,最后,单击Finish完成。
至此,一台新的虚拟机配置完成。
2.1.2 启动11gnode1虚拟机,安装操作系统
给11gnode1虚拟机加电,进入图形界面安装系统:
回车,进入安装:
Skip,跳过光驱检查:
Next,开始安装Oracle Enterprise Linux:
语言选择—>English,键盘选择–>U.S.English美式键盘,硬盘分区选择最后一个选项Create custom layout,Next:
给硬盘分区,其中SWAP分区选择3500M,剩余空间全部划给根分区/,Next:
网络配置,参照2.1节中IP配置信息,分别配置eth0,eht1两块网卡的IP、及子网掩码、网关、主机名,Next:
时区选择,亚洲/上海,Next:
配置root用户口令,Next:
选择定制软软包,Next:
其中:
Desktop Environments:
           GNOME Desktop Environment
    Applications:  
               Editors
    Development:
               Development Libraries
               Development Tools
               GNOME Software Development
               Legacy Software Development
               X software Development
    Base System : 
               Administration Tools
               Base
               Legacy Software Support
           System Tools
           X Window System
其它的软件包,可以忽略,暂时不装,一来加快操作系统的安装进度,二来其余的软件包对于配置Oracle 11gR2 RAC不需要,如果在将来的安装过程中,系统提示缺失软件包的时候,我们也可以手工从安装光盘中自行安装。Next:
进入格式化文件系统,安装软件包,直到最后:
根据提示,选择Reboot系统:
系统重启之后,Forward:
选择关闭Firewall,Next:
禁用SELinux,Next:
直到最后一步,按照提示,再次重新启动系统,使刚才的配置生效:
重启之后,进入图形界面的登录框:
到此,node1节点机器创建成功。
接下来,完全参照上述创建虚拟机步骤,创建第2个节点,虚拟机命名为11gnode2,在配置网络步骤中,需要注意,将其eth0配置为172.16.0.192,eth1配置为192.168.94.12,主机名为node2.localdomain。
最后,两个节点的机器配置完成!

如何获取Oracle数据库中某表及索引、约束、触发器、对象权限的创建语句?

            在上一篇文章中,我们知道了如何获取Oracle数据库中某个用户下的所有表、索引、约束、触发器的创建脚本?那么对于数据库中特定的某张表而言,又该如何获取建表语句、及索引、约束、外键约束、触发器、对象权限的创建脚本呢?

            在这里,给出一个实现上述功能的脚本:

OCM11g-> cat table_ddl.sql 
-- Be sure the variable 'S' means the Schema name,the 'T' means table name.
-- All these variables should be UPPERCASE.

def S='&1'
def T='&2'
set lines 2000 pages 0 ver off echo off head off feed off
set newpage none
set trimspool on
set long 5000000
col output for a1000 word_wrapped
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true);
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'STORAGE',false);
 
spool &T..sql
select dbms_metadata.get_ddl('TABLE','&T','&S') output from dual;
select dbms_metadata.get_dependent_ddl('INDEX','&T','&S') output from dual;
select dbms_metadata.get_dependent_ddl('CONSTRAINT','&T','&S') output from dual;
select dbms_metadata.get_dependent_ddl('REF_CONSTRAINT','&T','&S') output from dual;
select dbms_metadata.get_dependent_ddl('TRIGGER','&T','&S') output from dual;
 
-- Uncomment to generate object level grants
 select dbms_metadata.get_dependent_ddl('OBJECT_GRANT','&T','&S') output from dual;
 
spool off;
OCM11g-> 

            下述是对于HR用户下的EMPLOYEES表的输出结果:

SQL> conn hr/hR
Connected.
SQL> @table_ddl.sql
Enter value for 1: HR
Enter value for 2: EMPLOYEES

  CREATE TABLE "HR"."EMPLOYEES"
   (    "EMPLOYEE_ID" NUMBER(6,0),
        "FIRST_NAME" VARCHAR2(20),
        "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
        "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
        "PHONE_NUMBER" VARCHAR2(20),
        "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
        "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
        "SALARY" NUMBER(8,2),
        "COMMISSION_PCT" NUMBER(2,2),
        "MANAGER_ID" NUMBER(6,0),
        "DEPARTMENT_ID" NUMBER(4,0),
         CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
         CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE"  ENABLE,
         CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ("EMPLOYEE_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE"  ENABLE,
         CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID")
          REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE,
         CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID")
          REFERENCES "HR"."JOBS" ("JOB_ID") ENABLE,
         CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY ("DEPARTMENT_ID")
          REFERENCES "HR"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS NOLOGGING
  TABLESPACE "EXAMPLE" ;



  CREATE UNIQUE INDEX "HR"."EMP_EMAIL_UK" ON "HR"."EMPLOYEES" ("EMAIL")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE" ;

  CREATE UNIQUE INDEX "HR"."EMP_EMP_ID_PK" ON "HR"."EMPLOYEES" ("EMPLOYEE_ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE" ;

  CREATE INDEX "HR"."EMP_DEPARTMENT_IX" ON "HR"."EMPLOYEES" ("DEPARTMENT_ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE" ;

  CREATE INDEX "HR"."EMP_JOB_IX" ON "HR"."EMPLOYEES" ("JOB_ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE" ;

  CREATE INDEX "HR"."EMP_MANAGER_IX" ON "HR"."EMPLOYEES" ("MANAGER_ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE" ;

  CREATE INDEX "HR"."EMP_NAME_IX" ON "HR"."EMPLOYEES" ("LAST_NAME", "FIRST_NAME")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE" ;



  ALTER TABLE "HR"."EMPLOYEES" MODIFY ("EMAIL" CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE);

  ALTER TABLE "HR"."EMPLOYEES" ADD CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE"  ENABLE;

  ALTER TABLE "HR"."EMPLOYEES" ADD CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ("EMPLOYEE_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  TABLESPACE "EXAMPLE"  ENABLE;

  ALTER TABLE "HR"."EMPLOYEES" MODIFY ("HIRE_DATE" CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE);

  ALTER TABLE "HR"."EMPLOYEES" MODIFY ("JOB_ID" CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE);

  ALTER TABLE "HR"."EMPLOYEES" MODIFY ("LAST_NAME" CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE);

  ALTER TABLE "HR"."EMPLOYEES" ADD CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE;



  ALTER TABLE "HR"."EMPLOYEES" ADD CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY ("DEPARTMENT_ID")
          REFERENCES "HR"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE;

  ALTER TABLE "HR"."EMPLOYEES" ADD CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID")
          REFERENCES "HR"."JOBS" ("JOB_ID") ENABLE;

  ALTER TABLE "HR"."EMPLOYEES" ADD CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID")
          REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE;



  CREATE OR REPLACE TRIGGER "HR"."SECURE_EMPLOYEES"
  BEFORE INSERT OR UPDATE OR DELETE ON employees
BEGIN
  secure_dml;
END secure_employees;
/
ALTER TRIGGER "HR"."SECURE_EMPLOYEES" DISABLE;

  CREATE OR REPLACE TRIGGER "HR"."UPDATE_JOB_HISTORY"
  AFTER UPDATE OF job_id, department_id ON employees
  FOR EACH ROW
BEGIN
  add_job_history(:old.employee_id, :old.hire_date, sysdate,
                  :old.job_id, :old.department_id);
END;
/
ALTER TRIGGER "HR"."UPDATE_JOB_HISTORY" ENABLE;



  GRANT SELECT, REFERENCES ON "HR"."EMPLOYEES" TO "OE";


SQL> 

如何获取Oracle数据库中某个用户下的所有表、索引、约束、触发器的创建脚本?

在Oracle数据库中,如何快速获取某个用户下的所有表、索引、约束及触发器的创建SQL语句呢?本文给出一个简单的示例脚本,经过测试,除位于回收站下的对象及只读视图的约束语句不能获取,其它对象基本均可获取CREATE语句。

脚本内容如下:

[oracle@oracledg ~]$ cat get_ddl.sql 
-- Be sure the variable 'S' means the Schema name,it should be UPPERCASE.
-- And this script COULDNOT get the constraints CREATE DDL,which CONSTRAINT_TYPE is 'O',cause it's READ ONLY on a view.
-- Author Info:Asher Huang
-- http://OracleOnlinux.cn
-- Mail:3dian14@gmail.com

def S='&Schema'
set serveroutput on
set long 20000
set lines 2000 pages 0 ver off echo off head off feed off
set newpage none
set trimspool on
set long 5000000
spool &S..sql 
DECLARE
  CURSOR C1 IS
    SELECT '&S' AS u_name, table_name AS tab_name FROM user_tables;
  CURSOR C2 IS
    SELECT '&S' AS u_name, index_name AS idx_name FROM user_indexes;
  CURSOR C3 IS
    SELECT '&S' AS u_name, constraint_name AS cons_name FROM user_constraints where constraint_type not in('R','O');
  CURSOR C4 IS
    SELECT '&S' AS u_name, table_name AS tab_name FROM user_constraints where constraint_type in('R');
  CURSOR C5 IS
    SELECT '&S' AS u_name, trigger_name AS trig_name FROM user_triggers;
  V_MSG CLOB;
BEGIN
      DBMS_OUTPUT.put_line('The CREATE DDL for schema &S''s Tables are:');
  FOR x IN C1 LOOP
      select dbms_metadata.get_ddl('TABLE', x.tab_name, x.u_name) INTO V_MSG from dual;
      DBMS_OUTPUT.put_line(V_MSG);
  END LOOP;

      DBMS_OUTPUT.put_line('The CREATE DDL for schema &S''s Indexes are:');
  FOR x IN C2 LOOP
      select dbms_metadata.get_ddl('INDEX', x.idx_name, x.u_name) INTO V_MSG from dual;
      DBMS_OUTPUT.put_line(V_MSG);
  END LOOP;

      DBMS_OUTPUT.put_line('The CREATE DDL for schema &S''s Constraints are:');
  FOR x IN C3 LOOP
      select dbms_metadata.get_ddl('CONSTRAINT', x.cons_name, x.u_name) INTO V_MSG from dual;
      DBMS_OUTPUT.put_line(V_MSG);
  END LOOP;

      DBMS_OUTPUT.put_line('The CREATE DDL for schema &S''s Reference Constraints are:');
  FOR x IN C4 LOOP
      select dbms_metadata.get_dependent_ddl('REF_CONSTRAINT', x.tab_name, x.u_name) INTO V_MSG from dual;
      DBMS_OUTPUT.put_line(V_MSG);
  END LOOP;

      DBMS_OUTPUT.put_line('The CREATE DDL for schema &S''s Triggers are:');
  FOR x IN C5 LOOP
      select dbms_metadata.get_ddl('TRIGGER', x.trig_name, x.u_name) INTO V_MSG from dual;
      DBMS_OUTPUT.put_line(V_MSG);
  END LOOP;
END;
/
spool off;
[oracle@oracledg ~]$ 

测试获取SCOTT用户的所有表、索引、约束、触发器创建脚本如下:

[oracle@oracledg ~]$ cat SCOTT.sql 
The CREATE DDL for schema SCOTT's Tables are:

  CREATE TABLE "SCOTT"."DEPT" 
   (    "DEPTNO" NUMBER(2,0), 
        "DNAME" VARCHAR2(14), 
        "LOC" VARCHAR2(13), 
         CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"


  CREATE TABLE "SCOTT"."EMP" 
   (    "EMPNO" NUMBER(4,0), 
        "ENAME" VARCHAR2(10), 
        "JOB" VARCHAR2(9), 
        "MGR" NUMBER(4,0), 
        "HIREDATE" DATE, 
        "SAL" NUMBER(7,2), 
        "COMM" NUMBER(7,2), 
        "DEPTNO" NUMBER(2,0), 
         CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
         CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
          REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"


  CREATE TABLE "SCOTT"."BONUS" 
   (    "ENAME" VARCHAR2(10), 
        "JOB" VARCHAR2(9), 
        "SAL" NUMBER, 
        "COMM" NUMBER
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"


  CREATE TABLE "SCOTT"."SALGRADE" 
   (    "GRADE" NUMBER, 
        "LOSAL" NUMBER, 
        "HISAL" NUMBER
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

The CREATE DDL for schema SCOTT's Indexes are:

  CREATE UNIQUE INDEX "SCOTT"."PK_EMP" ON "SCOTT"."EMP" ("EMPNO") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"


  CREATE UNIQUE INDEX "SCOTT"."PK_DEPT" ON "SCOTT"."DEPT" ("DEPTNO") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

The CREATE DDL for schema SCOTT's Constraints are:

  ALTER TABLE "SCOTT"."EMP" ADD CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE


  ALTER TABLE "SCOTT"."DEPT" ADD CONSTRAINT "PK_DEPT" PRIMARY KEY ("DEPTNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE

The CREATE DDL for schema SCOTT's Reference Constraints are:

  ALTER TABLE "SCOTT"."EMP" ADD CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO")
          REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE

The CREATE DDL for schema SCOTT's Triggers are:
[oracle@oracledg ~]$ 

感谢好人李晨希!!!

啥也不用多说,千言万语浓缩成:感谢!

先看我自己在厦门小鱼网上发的求助帖http://bbs.xmfish.com/read-htm-tid-6978308-fpage-2.html


 

[04-05]SOS:钱包、身份证、银行卡丢失…

各位鱼友:
       你们好!
       本人于昨天晚上(4月4日)大约21:30–21:50分期间,骑自行车载着女朋友,在从莲前嘉盛豪园小区回福满山庄(瑞景城潘宅)的路上,丢失本人钱包,内有现金300元左右,本人身份证一张(4115211982****7019),签发机关:天津市公安局西青分局,银行卡:工商银行一张、建行一张、浦发银行一张,本人厦门社保卡一张
       如有拾到者,请致电18759210738联系失主,或请各位鱼友帮忙转发,必重谢

       恳请管理员不要删帖,同样多谢!!!


下面是同事在新浪微博上发现的好心人http://weibo.com/1690767444/yd61VzGPA


寻失主:今晚在加州商业广场招商莲前支行门口的行人车道上捡到一个 棕色钱包、内含失主身份证、社保卡、地税局发票、若干银行卡、若干人民币及两张女性证件照。失主名为黄伟,天津人。希望失主看到这条微博迅速与我联系。求扩散!@厦门街头巷尾 @厦门商报 @厦门时报 @厦门情报 @厦门卫视 @厦门警方在线

收起|查看大图|向左转|向右转

转发(34)| 收藏| 评论(23)4月4日22:12 来自新浪微博


 

 

感谢这位好心人,待会儿好好答谢这位李晨希好心人。