ORACLE DATAGUARD 配置

1、Data Guard的概念:

Data Guard是一个集合,由一个 primary 数据库(生产数据库)及一个或多个 standby 数据库(最多 9 个)组成。组成

Data Guard 的数据库通过 Oracle Net 连接,并且有可能分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制。

(1).Primary 数据库Data Guard 包含一个 primary 数据库即被大部分应用访问的生产数据库,该库即可以是单实例数据库,也可以是 RAC。

(2).Standby 数据库

Standby 数据库是 primary 数据库的复制(事务上一致)。在同一个 Data Guard 中你可以最多创建 9 个 standby数据库。一旦创建完成,Data Guard 通过应用 primary 数据库的 redo 自动维护每一个 standby 数据库。Standby数据库同样即可以是单实例数据库,也可以是 RAC 结构。

关于 standby 数据库,通常分两类:逻辑 standby物理 standby

逻辑 standby:逻辑 standby 是通过接收 primary 数据库的 redo log,并转换成 sql 语句,然后在 standby 数据库上执行 SQL 语句(SQL Apply)实现同步

物理 standby:物理 standby 是通过接收并应用 primary 数据库的 redo log 以介质恢复的方式(Redo Apply)实现同步

2、Data Guard 服务(Data Guard Services)

(1)、REDO 传输服务(Redo Transport Services)
控制 redo 数据的传输到一个或多个归档目的地,也就是发送(源)和接收(目标)

(2)、Log 应用服务(Log Apply Services)
应用 redo 数据到 standby 数据库,以保持与 primary 数据库的事务一致。
分为 redo应用(恢复的方法)sql应用(日志挖掘sql)

(3)、角色转换服务(Role Transitions)
Dg 中只有两种角色:primary 和 standby。
所谓角色转换就是让数据库在这两个角色中切换,切换也分两种:switchover(正常切换)failover(发生故障)
switchover:转换 primary 数据库与 standby 数据库。switchover 可以确保不会丢失数据。
failover:当 primary 数据库出现故障并且不能被及时恢复时,会调用 failover 将一个 standby 数据库转换为新的 primary 数据库。在最大保护模式或最高可用性模式下,failover 可以保证不会丢失数据。

3、Data Guard 保护模式(Data Guard Protection Modes)

(1)、最大保护(Maximum protection):
这种模式能够确保绝无数据丢失。对网络要求比较高,发送需要对方回复,不回复就不继续工作

(2)、最高性能(Maximum performance):
这种模式提供在不影响 primary 数据库性能前提下最高级别的数据保护策略。不需要回复

(3)、最高可用性(Maximum availability):
这种模式提供在不影响 primary 数据库可用前提下最高级别的数据保护策略。用归档日志,不实时。

4、Data Guard 的软硬件需求

(1)、硬件及操作系统需求
同一个 Data Gurid 配置中的所有 oracle 数据库必须运行于相同的平台。
不同服务器的硬件配置可以不同,比如 cpu ,内存,存储设备
primary 数据库和 standby 数据库的操作系统必须一致,不过操作系统版本可以略有差异,

(2)、软件需求
Data Guard 是 Oracle 企业版的一个特性,标准版是不支持
通过 Data Guard 的 SQL 应用,可以实现滚动升级服务器数据库版本(数据库版本不低于 10.1.0.3)。
同一个 Data Guard 配置中所有数据库初始化参数:COMPATIBLE 的值必须相同。
Primary 数据库必须运行于归档模式,并且务必确保在打开 FORCE LOGGING,
Primary 和 standby 数据库均可应用于单实例或RAC架构下,同一个 data guard 配置可以混合使用逻辑 standby 和物理 standby。
Primary 和 standby 数据库可以在同一台服务器,但需要注意各自的数据文件存放目录,避免重写
或覆盖。
使用具有 sysdba 系统权限的用户管理 primary 和 standby 数据库。
建议数据库必须采用相同的存储架构。
注意各服务器之间的时间一致。

5、data guard 配置:
注意Data Guard 启动顺序:

启动顺序:先standby ,后primary;

关闭顺序:先primary 后standby;

(1).环境说明

host      databasetype        db_unique_name       Oracle Net Service Name
server1   primary             primary              primary
server2   physical standby    standby              standby

(2).配置步骤(默认在主库):

A.强制写日志(Enable Forced Logging)

    SQL> ALTER DATABASE FORCE LOGGING;(ALTER DATABASE no FORCE LOGGING;)

B.创建密码文件(Create a Password File): 如果有了,就不需要再创建

    orapwd file='/u01/standby/orapworcl' password=oracle  entries=10

C.配置standby 日志组(Configure a Standby Redo Log)

  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/app/oracle/oradata/primary/redo4.log') SIZE 50M;
  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 '/u01/app/oracle/oradata/primary/redo5.log') SIZE 50M;
  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '/u01/app/oracle/oradata/primary/redo6.log') SIZE 50M; 
  SQL>ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 '/u01/app/oracle/oradata/primary/redo7.log') SIZE 50M; 

  # 查看日志组信息,是否创建成功
  SQL>SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG;

D.修改主库初始化参数文件(Set Primary Database Initialization Parameters) ==> 添加修改

    DB_NAME=orcl
    DB_UNIQUE_NAME=primary
    LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
    LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary'
    LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
    LOG_ARCHIVE_DEST_STATE_1=ENABLE
    LOG_ARCHIVE_DEST_STATE_2=ENABLE
    LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
    FAL_SERVER=standby
  FAL_CLIENT=primary
  # 下面指定数据文件位置,为了防止主库和备库之间数据路径不一致的情况
    DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    STANDBY_FILE_MANAGEMENT=AUTO

E.修改主库为归档模式(Enable Archiving)

   SQL> SHUTDOWN IMMEDIATE;
   SQL> STARTUP MOUNT;
   SQL> ALTER DATABASE ARCHIVELOG;
   SQL> ALTER DATABASE OPEN;

F.在主库上创建备库的控制文件(Create a Control File for the Standby Database)

   SQL> STARTUP MOUNT;
   SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby.ctl';
   SQL> ALTER DATABASE OPEN;

G.复制一份主库的初始化参数文件,修改为备库的初始化参数文件,并进行修改
(Prepare an Initialization Parameter File for the Standby Database)

    DB_NAME=orcl
    DB_UNIQUE_NAME=standby
    CONTROL_FILES='/../../standby.ctl'
    LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
    LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'
    LOG_ARCHIVE_DEST_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
    LOG_ARCHIVE_DEST_STATE_1=ENABLE
    LOG_ARCHIVE_DEST_STATE_2=ENABLE
    LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
    FAL_SERVER=primary
    FAL_CLIENT=standby
    DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/orcl','/u01/app/oracle/oradata/orcl'
    STANDBY_FILE_MANAGEMENT=AUTO

H.复制主库的数据文件、日志文件、备库控制文件、密码文件到备库(在备库机上需要创建相应目录)
(Copy Files from the Primary System to the Standby System) # 需要关库

     copy data file
          log file 
          standby control file
          password file

I.在主库和备库配置监听器(Configure listeners for the primary and standby databases)
Listener.ora:主库/备库 Lsnrctl 配置(默认配置就可以,必须要有静态注册)
Tnsnames.ora:
主库:服务名为:primary,需要配置primary和standby两个监听器,方便互传
备库:服务名为:standby,需要配置primary和standby两个监听器,方便互传
Lsnrctl start(主库和备库都开启,tnsping primary和tnsping standby 来测试连通性)

J.启动备库到mount状态(Start the Physical Standby Database)

     SQL> STARTUP MOUNT;

K.开启应用日志功能(Start Redo Apply)

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

L.验证主库和备库之间是否成功(Verify the Physical Standby Database Is Performing Properly)

Step 1 :在备库查询归档日志信息

        SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Step 2 :在主库上强制切换日志

        SQL> ALTER SYSTEM SWITCH LOGFILE;

Step 3 :在备库上再次查看归档日志信息

        SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Step 4 :在备库上查询,归档日志是否被应用,如果被应用,则表示搭建成功

        SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

(3).角色切换,正常切换:
Primary 数据库执行:[ 执行下面操作后,主库就变为备库,备库变为主库 ]

       SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
       SQL> alter database commit to switchover to physical standby;
       SQL> shutdown immediate
       SQL> startup mount

说明:
此时 Primary 数据库的 switchover_status 列 的 值 应 该 是 TO STANDBY ,
除了 TO STANDBY 还有 SESSIONS ACTIVE ,说明 当前有人连到数据库中,建议首先查询v$session 视图,中止这些会话连接。如果胆大也可以在切换的时候加上 with session shutdown 子句,自动断开连接在实例中的会话

STANDBY 数据库执行:

       SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
       SQL> alter database commit to switchover to primary;
       SQL> shutdown immediate
       SQL> startup

说明:
此时 Standby 数据库的列值应该是 TO PRIMARY,除了 TO STANDBY 还有 SESSIONS ACTIVE ,和前面的处理方式一样。另外还有 SWITCHOVER PENDING ,这说明当前Standby 数据库没有启用 redo 应用,只需执行:

       SQL> alter database recover managed standby database disconnect from session;

ORACLE RAC 环境搭建

Oracle rac 环境搭建配置:[在RHEL5上搭建RAC环境,节点为双网卡]

node1和node2 节点的配置:

(1).关闭 iptables、禁用 selinux.

  1. /etc/init.d/iptables stop   # 临时关闭防火墙  
  2. Chkconfig  iptables  off    # 关闭防火墙开机启动  
  3. Setenforce 0                # 临时关闭selinux  
  4. 将 /etc/selinux/config 中 Selinux 修改为disabled   # 永久关闭selinux  

(2).配置hosts文件(/etc/hosts)

  1. Vim  /etc/hosts  
  2. 文件修改如下:[ 解析文件,尽量写成标准格式]  
  3. 127.0.0.1 localhost.localdomain localhost  
  4. ::1 localhost6.localdomain6 localhost6  
  5. # Public Network – (eth0)  
  6.   192.168.1.110   rac1.xcg.com    rac1  
  7.   192.168.1.111   rac2.xcg.com    rac2  
  8. # Private Interconnect – (eth1)  
  9.   10.0.0.110    rac1-priv.xcg.com   rac1-priv  
  10.   10.0.0.111    rac2-priv.xcg.com   rac2-priv  
  11. # Public Virtual IP (VIP) addresses – (eth0)  
  12.   192.168.1.66   rac1-vip  
  13.   192.168.1.88   rac2-vip  
  14. # Private Storage Network for Openfiler – (eth1)  # 存储没有做多路冗余  
  15.   192.168.1.120     storage.xcg.com   storage  

(3).安装相关RPM包[安装相应名字的RPM包即可]

  1. binutils-2.15.92.0.2-13.EL4  
  2. compat-db-4.1.25-9  
  3. compat-libstdc++-296-2.96-132.7.2  
  4. control-center-2.8.0-12  
  5. gcc-3.4.3-22.1.EL4  
  6. gcc-c++-3.4.3-22.1.EL44  
  7. glibc-2.3.4-2.9  
  8. glibc-common-2.3.4-2.9  
  9. gnome-libs-1.4.1.2.90-44.1  
  10. libstdc++-3.4.3-22.1  
  11. libstdc++-devel-3.4.3-22.1  
  12. make-3.80-5  
  13. pdksh-5.2.14-30  
  14. sysstat-5.0.5-1  
  15. xscreensaver-4.18-5.rhel4.2  
  16. setarch-1.6-1  
  17. libaio-0.3.103-3  
  18. libXp  

(4).修改参数

A.内核参数

  1. Vim  /etc/sysctl.conf  
  2. kernel.shmall = 2097152  
  3. kernel.shmmax =      # 内存的一半  
  4. kernel.shmmni = 4096  
  5. kernel.sem = 250 32000 100 128  
  6. fs.filemax = 65536  
  7. net.ipv4.ip_local_port_range = 1024 65000  
  8. net.core.rmem_default = 262144  
  9. net.core.rmem_max = 262144  
  10. net.core.wmem_default = 262144  
  11. net.core.wmem_max = 262144  
  12.   
  13. /sbin/sysctl  -p   # 使配置生效  

B.对进程数和打开的文件数设置限制

  1. Vim   /etc/security/limits.conf  
  2. oracle           soft    nproc   2047  
  3. oracle           hard    nproc   16384  
  4. oracle           soft    nofile  1024  
  5. oracle           hard    nofile  65536  
  6.   
  7. Vim  /etc/pam.d/login   
  8. session    required     /lib/security/pam_limits.so  

C.配置  Hangcheck  计时器

  1. Vim  /etc/rc.d/rc.local   
  2. modprobe  hangcheck-timer hangcheck_tick=30  hangcheck_margin=180  

D.修改系统版本:

  1. Vim  /etc/redhat-release  # 将里面的5 改为 4  

(5).创建组、oracle用户等[ 注意新建用户的ID号一致 ]

  1. mkdir /u01/app -p  
  2. /usr/sbin/groupadd oinstall   
  3. /usr/sbin/groupadd dba   
  4. /usr/sbin/useradd   -g  oinstall  -G   dba  -d  /u01/app/oracle  oracle   
  5. passwd  oracle   # 为oracle用户设置密码,密码建议为oracle  
  6. chown -R 775 oracle.oinstall  /u01  
  7. xhost +  

(6).设置oracle用户的.bash_profile [ 此参数文件,需要在测试 ]

  1. Vim  .bash_profile   # 切换到oracle用户  
  2. TMP=/tmp;export TMP   
  3. TMPDIR=$TMP;export TMPDIR   
  4. ORACLE_BASE=/u01/app/oracle;export ORACLE_BASE   
  5. ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1;export ORACLE_HOME   
  6. ORA_CRS_HOME=$ORACLE_BASE/product/10.2.0/crs;export ORA_CRS_HOME  
  7. ORACLE_SID=rac1 ;export ORACLE_SID   # 这里的RAC1 在node2节点上要改为 RAC2  
  8. LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH  
  9. PATH=$ORACLE_HOME/bin:$PATH; export PATH  
  10. TNS_ADMIN=$ORACLE_HOME/network/admin ; export  TNS_ADMIN  
  11. export ORACLE_TERM=xterm  
  12. export ORACLE_OWNER=oracle  
  13. Export ORA_NLS10=$ORACLE_HOME/nls/data  
  14. #  Export ORA_NLS10=$ORACLE_HOME/ocommon/nls/data  
  15. export CLASSPATH=$ORACLE_HOME/JRE  
  16. export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib  
  17. export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib  
  18. export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib  
  19.   
  20. source /u01/app/oracle/.bash_profile  

(7).配置ssh [ ssh 需要对等,也就是说,连接是不要输入 ]

Node1 节点

切换到oracle用户:

  1. $ mkdir   ~/.ssh   
  2. $ chmod   755   ~/.ssh   
  3. $ /usr/bin/ssh   -keygen   -t   rsa   #  下面都是回车  
  4. $ /usr/bin/ssh  -keygen   -t   dsa    #  下面都是回车  
  5. $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys   
  6. $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys   
  7. $ scp ~/.ssh/authorized_keys rac2:~/.ssh/authorized_keys  

Node2 节点

切换到oracle用户:

  1. $ mkdir   ~/.ssh   
  2. $ chmod   755   ~/.ssh   
  3. $ /usr/bin/ssh   -keygen   -t   rsa   #  下面都是回车  
  4. $ /usr/bin/ssh  -keygen   -t   dsa    #  下面都是回车  
  5. $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys   
  6. $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys   
  7. $ scp ~/.ssh/authorized_keys rac1:~/.ssh/authorized_keys</pre>  
  8. #### Node 1和node 2 进行对等测试[务必所有都测试到,如果后面报KSH错,就是这里没测好,重测即可]  
  9. Node1:ssh rac1 date  
  10.        ssh rac1-priv date  
  11.        ssh rac2 date  
  12.        ssh rac2-priv date  
  13. Node2:ssh rac1 date  
  14.        ssh rac1-priv date  
  15.        ssh rac2 date  
  16.        ssh rac2-priv date  

(8).安装ASM包[按顺序装,具体可参展asm博文] ==>两个node节点都需要装包,创建磁盘只需在1个节点

  1. oracleasm-support-2.1.8-1.el5.i386.rpm  
  2. oracleasm-2.6.18-194.el5PAE-2.0.5-1.el5.i686.rpm  
  3. oracleasmlib-2.0.4-1.el5.i386.rpm  
  4. Root用户执行: /etc/init.d/oracleasm configure  依次输入:oracle,oinstall,y,y 
  5. 创建相应的asm磁盘:/etc/init.d/oracleasm createdisk data1  /dev/sda5 [下面不做演示]  
  6. 查看asm磁盘:/etc/init.d/oracleasm listdisks  
  7. 扫描磁盘:/etc/init.d/oracleasm scandisks  

(9).时间同步:节点之间的时间同步[可配置时间同步服务器]

2.共享存储的配置:

在storgae端安装scsi-target-utils*的包

  1. 修改/etc/tgt/target.conf文件  
  2. target iqn.201307.com.xcg.storsge:disk1
  3.   backing-store  /dev/sda7  
  4.       Scsi_id:xcg  
  5.   backing-store  
  6. target
  7. 启动scsi服务:  
  8. /etc/init.d/tgtd start  
  9.   
  10. 查看设备导出情况:  
  11. tgtadm –lld iscsi —mode target –op show  

3.在node1和node2节点端安装客户端工具:[两个节点都做此操作]

  1. iscsi-initiator-utils  
  2. 启动iscsid服务:service iscsid restart  
  3. 设置为开机启动:chkconfig iscsid on  
  4. 发现导出设备:iscsiadm -m discovery -t sendtargets -p storage # storage也可写IP地址  
  5. 连接导出设备:iscsiadm -m node -l  
  6. 断开连接: iscsiadm -m node -u  

4.在node1和node2节点上制作几个raw设备:

  1. # 修改/etc/udev/rules.d/60-raw.rules 文件  
  2. ACTION==”add”, KERNEL==”sdc1″,RUN+=”/bin/raw /dev/raw/raw3 %N”  
  3. ACTION==”add”, KERNEL==”sdc2″,RUN+=”/bin/raw /dev/raw/raw4 %N”  
  4. ACTION==”add”, KERNEL==”sdc3″,RUN+=”/bin/raw /dev/raw/raw5 %N”  
  5.   
  6. # 修改/etc/udev/rules.d/50-udev.permissions  
  7. ACTION==”add”,KERNEL==”raw[1-5]”, OWNER=”oracle”, GROUP=”oinstall”, MODE=”660″  
  8.   
  9. 启动udev服务:start_udev  
  10. 查看裸设备:cd /dev/raw/ –> ll 下面如果有对应的设备名称,且oracle..oinstall权限  

5.安装oracle clusterware软件[oracle 用户解压,安装]

执行安装程序,后面为图形化操作界面,省略[如需重新安装,删除/etc/oracle 和 /etc/init.d/init.*]

按照提示,执行相应的脚本

注:

报错1:shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory

解决方法:

  1. $ vim  vipca   
  2. … …   
  3. Linux)   
  4. LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:$ORACLE_HOME/srvm/lib:$LD_LIBRA  
  5. RY_PATH    
  6. export LD_LIBRARY_PATH   
  7. echo $LD_LIBRARY_PATH   
  8. echo $CLASSPATH   
  9. #Remove this workaround when the bug 3937317 is fixed   
  10. arch=`uname -m`   
  11. if [ “$arch” = “i686” -o “$arch” = “ia64” ]   
  12. then   
  13. # LD_ASSUME_KERNEL=2.4.19   
  14. # export LD_ASSUME_KERNEL   
  15. echo — 这里一定要加上,不然返回会报错,就修改这三行  
  16. fi  
  17.   
  18. 报错2:Error 0(Native: listNetInterfaces:[3])或eth0 不是public  
  19. 解决方法:  
  20. 在 CRS_HOME 下 运行 oifcfg 命令:  
  21. # ./oifcfg setif -global eth0/192.168.0.0:public  
  22. # ./oifcfg setif -global eth1/10.0.0.0:cluster_interconnect  
  23. # ./oifcfg getif  
  24. — 注意这里最后一个是 0. 代表一个网段。 在一个节点设置之后,其他节点也能看到。   
  25. 然后在手工运行 vipca 添加  虚拟IP 即可。  
  26. 如果还有报错:  
  27.   
  28. 执行此命令,查看包是否安装完整:[此命令在clustware软件包里] ==&gt; 查看官方文档  
  29.   
  30. ../clusterware/cluvfy/runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose  
  31.   
  32. 执行此命令: ./crs_stat -t -v # 下面都online ,则表示安装完成  

6.安装数据库软件:

装数据库软件

配置asm磁盘组

配置监听器(netmgr)

再利用dbca创建库

7.检查相应状态:

  1. 查看总体状态: ./crs_stat -t -v  
  2. 检查crs状态:crsctl check crs  
  3. 所有实例和服务的状态: srvctl status database -d orcl    # orcl为数据库名称  
  4. 单个实例的状态:srvctl status instance -d orcl -i orcl2   # orcl2为实例名称  
  5. 在数据库全局命名服务的状态:srvctl status service -d orcl -s orcl_taf    # 服务名  
  6. 特定节点上节点应用程序的状态: srvctl status nodeapps -n rac1 # rac1节点  
  7. ASM 实例的状态: srvctl status asm -n rac2  
  8. 列出配置的所有数据库:srvctl config database  
  9. 显示 RAC 数据库的配置:srvctl config database -d orcl  
  10. 显示指定集群数据库的所有服务: srvctl config service -d orcl  
  11. 显示节点应用程序的配置 —(VIP、GSD、ONS、监听器): srvctl config nodeapps -n rac2 -a -g -s -l  
  12. 显示 ASM 实例的配置:srvctl config asm -n rac2  

8.启动/停止集群

停止 Oracle RAC 10g 环境

第一步是停止 Oracle 实例。

当此实例(和相关服务)关闭后,关闭 ASM 实例。

最后,关闭节点应用程序(虚拟 IP、GSD、TNS 监听器和 ONS) 。

  1. $ export ORACLE_SID=rac1  
  2. $ emctl stop dbconsole  
  3. $ srvctl stop instance -d orcl -i rac1  
  4. $ srvctl stop instance -d orcl -i rac2 [ 可选 ]  
  5. $ srvctl stop asm -n rac1  
  6. $ srvctl stop asm -n rac2 [ 可选 ]  
  7. $ srvctl stop nodeapps -n rac1  
  8. $ srvctl stop nodeapps -n rac2 [ 可选 ]  

启动 Oracle RAC 10g 环境

第一步是启动节点应用程序(虚拟 IP、GSD、TNS 监听器和 ONS) 。

当成功启动节点应用程序后,启动 ASM 实例。

最后,启动 Oracle 实例(和相关服务)以及企业管理器数据库控制台。[ 可选参数同上 ]

  1. $ export ORACLE_SID=rac1  
  2. $ srvctl start nodeapps -n rac1  
  3. $ srvctl start asm -n rac1  
  4. $ srvctl start instance -d orcl -i rac1  
  5. $ emctl start dbconsole  

使用 SRVCTL 启动/停止所有实例

启动/停止所有实例及其启用的服务。

  1. $ srvctl start database -d orcl  
  2. $ srvctl stop database -d orcl  

详细参数,请看下面的选项:

附件:

遵循以下步骤启动和停止单独的应用程序资源。

  1. srvctl start nodeapps -n   
  2. srvctl start nodeapps -n   
  3. srvctl start asm -n   
  4. srvctl start asm -n   
  5. srvctl start database -d   
  6. srvctl start service -d  -s   
  7. crs_stat -t  
  8. srvctl stop service -d  -s   
  9. srvctl stop database -d   
  10. srvctl stop asm -n   
  11. srvctl stop asm -n   
  12. srvctl stop nodeapps -n   
  13. srvctl stop nodeapps -n   
  14. crs_stat -t  

ORACLE 恢复目录数据库

1.crosscheck command: # crosscheck 检测备份文件的有效性

  1. crosscheck backup;A(available) X(expired)  
  2. crosscheck backupset;  
  3. crosscheck backup of tablespace users;  
  4. crosscheck backup of datafile 1;  
  5. crosscheck backup of controlfile;  
  6. crosscheck backup of tag=”;  
  7. crosscheck archivelog all;  
  8. crosscheck backup of spfile;  
  9.   
  10. demo 1:  
  11. sys>alter system switch logfile;  
  12. $rm archivelog  
  13. rman>crosscheck archivelog all;  
  14. rman>delete expired archivelog all; # 删除所有过期的归档日志  
  15.      or delete copycopy of archivelog sequence xx;  

2.修改备份文件的有效性(change command) # change 修改备份文件的有效性

  1. change backupset xx available;  
  2. change backupset 29 unavailable;  
  3. change backup of database available;  
  4.   
  5. demo 1:  
  6. rman>backup as copycopy datafile 4 format=’/u02/app/oracle/df_%s_%t.dbf’;  
  7. rman>list copycopy;  
  8. rman>change datafilecopy ‘/u02/app/oracle/DF_22_663294060.DBF’ unavailable;  
  9. rman>list copycopy;  
  10. rman>change datafilecopy ‘/u02/app/oracle/DF_22_663294060.DBF’ available;  
  11. rman>list copycopy;  

3.catalog 注册信息(catalog command) # catalog 注册信息

  1. catalog datafilecopy ‘file_name’;  
  2. catalog archivelog ‘arch_file’,’arch_file’;  
  3. catalog archivelog    
  4.   
  5. demo 1:  
  6. sys>alter tablespace users begin backup;  
  7. cp /u01/app/oracle/oradata/orcl/users01.dbf /u02/app/oracle/oradata/orcl/users01.dbf (backup)  
  8. sys>alter tablespace users end backup;  
  9. rman>list copycopy;  
  10. rman>catalog datafilecopy ‘/u02/app/oracle/oradata/orcl/users01.dbf’;  
  11. rman>list copycopy  

4.取消注册(Uncataloging RMAN Records)

  1. CHANGE … UNCATALOG command   
  2. CHANGE ARCHIVELOG … UNCATALOG;  
  3. CHANGE DATAFILECOPY ‘/DB01/BACKUP/users01.dbf’ UNCATALOG;  
  4.   
  5. sys>alter system switch logfile;  
  6. rman>list copycopy;  
  7. rman>change archivelog ‘file_name’ uncatalog;  
  8. rman>catalog archivelog ‘file_name’ ;  
  9. rman>list copycopy;  

5.恢复目录数据库(recovery catalog database)

  1. (1).create user rman identified by rman   # 可以自定义一个表空间  
  2.     default tablespace sysaux  
  3.     quota unlimited on sysaux;  
  4. (2).grant recovery_catalog_owner,connect,resource to rman;  
  5. (3).rman catalog rman/rman;       
  6.    # 有了恢复目录再执行备份,需要使用此命令 rman  target sys/oracle@orcl  catalog rman/rman  
  7. (4).create catalog tablespace sysaux;  # 创建恢复目录  
  8. (5).register database;(unregister database);  
  9. (6).resync catalog;  
  10.   select * from RC_BACKUP_SET;  

RMAN 不完全恢复

不完全恢复:

1).lost all(丢失所有文件,记得记录好:DBID=1341461043)

  1. rman>backup database;  
  2. sql>insert into …  
  3. sql> alter system switch logfile;  
  4. rm all file(spfile,controlfile,redo log file,data file)  
  5. shutdown abort  
  6. rman>start nomount;  
  7.      set dbid=    ;  
  8.      restore spfile from autobackup;  
  9.      shutdown abort;  
  10.      startup nomount;  
  11.      restore controlfile from autobackup;  
  12.      alter database mount;  
  13.      restore database;  
  14.      recover database;  
  15.      alter database open resetlogs;  

2).基于时间点的不完全恢复:

  1.   rman target /  
  2.   rman>backup database;(backup database plus archivelog  delete all input;  # 备份数据库包括归档日志,并删除已经备份的归档日志)  
  3.   
  4.   sys>alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;  # 修改系统时间格式  
  5.   sys>select sysdate from dual;  
  6.   sys>drop user hr cascade;  
  7.   
  8.  rman:  
  9.      SYS>shutdown immediate;  
  10.      SYS>startup mount;  
  11.      RMAN> run{  
  12.             set until time “to_date(‘xxxxxx’,’yyyy-mm-dd hh24:mi:ss’)”;  
  13.             restore database;  
  14.             recover database;  
  15.            alter database open resetlogs;  
  16.            }  
  17.      or  
  18.      RMAN>run{  
  19.           shutdown immediate;  
  20.           startup mount;  
  21.           sql ‘alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;  
  22.           set until time ‘xxxxxxxx’;  
  23.           restore database;  
  24.           recover database;  
  25.           alter database open resetlogs;  
  26.       }     
  27.   
  28. select recid,sequence#,resetlogs_change#,resetlogs_time from v$log_history;  

3).基于SCN号的不完全恢复(scn-incomplete)

  1. $rman target /  
  2.      rman>backup database;(backup database plus archivelog  delete all input)  
  3.   
  4.    sys:  
  5.      SYS>select current_scn from v$database;  
  6.      SYS>drop table scott.emp purge;  
  7.   
  8.    rman:  
  9.    RMAN>startup force mount;  
  10.    RMAN>run{  
  11.            set until scn=xxxxxx;  
  12.            restore database;  
  13.            recover database;  
  14.            }  
  15.   alter database open resetlogs;  

4).基于sequence的不完全恢复(sequence-incomplete)

  1. sys>select name,SEQUENCE#,STATUS,DELETED,APPLIED,ARCHIVED from v$archived_log;  
  2.      sys>select * from v$log;  
  3.   
  4.      rman>backup database  
  5.      sys>alter system switch logfile;  
  6.      $rm *.dbf, rm a archivelog  
  7.   
  8.      rman>startup mount   
  9.      rman>run(  
  10.           set until sequence xx thread 1;  
  11.           restore database;  
  12.           recover database;  
  13.           }  
  14.      alter database open resetlogs;  

5).丢失所有控制文件的情况:
a).从备份中恢复控制文件

  1. RMAN>backup database;  
  2. $>rm *.ctl  
  3. RMAN> restore controlfile from ‘file_name’;  
  4. SYS> shutdown abort  
  5. SYS> startup mount;  
  6. ***********************************************************  
  7. SYS> select FILE#,CHECKPOINT_CHANGE# from v$datafile;  
  8.      select FILE#,CHECKPOINT_CHANGE# from v$datafile_header;  # 查询相应信息  
  9. ***********************************************************  
  10. RMAN>restore database;  
  11. SYS> recover database using backup controlfile until cancel;(filename)  
  12. SYS> alter database open resetlogs;  

b).重建控制文件:

  1. sys>alter database backup controlfile to trace;  
  2. $>vi trace file  
  3. sys>startup nomount;  
  4. sys>@trace_file;  

6)丢失当前重做日志文件、一个数据文件(lost current redo log file a data file)

  1. rman>backup database;  
  2. sys>select * from v$log;  
  3. $rm current redo log file  
  4. sys>shutdown abort  
  5. sys>startup  
  6. sys>alter database clear unarchived logfile group 3;  
  7. rman>restore database;  
  8. sys>recover database until cancel;  
  9. sys>alter database open resetlogs  

7)丢失重做日志文件,无备份(lost redo log file (without backup))

  1. sys>recover database until cancel;  
  2.        auto  
  3. sys>alter database open resetlogs;  
  4.   
  5. _allow_resetlogs_corruption=true   # 在参数文件,添加这一行  
  6. _corrupted_rollback_segments=true  
  7. _offline_rollback_segments=true  
  8. select KSPPINM from x$ksppi  

RMAN 备份和恢复

在归档模式下:

1.rman登陆,备份全库

     $rman target /
     RMAN>backup database;             # DBID=1180863394,数据库唯一标识号

1).丢失所有数据文件下的恢复:

       $rm *.dbf         # 模拟丢失所有数据文件
       RMAN>shutdown abort
       $rman target /
       RMAN>startup mount;         # 在RMAN下,启动数据库到mount状态
       RMAN>restore database;      # 还原数据库[RMAN自动根据备份还原数据库]
       RMAN>recover database;      # 恢复数据库[应用归档日志的过程]
       RMAN>alter database open;

2).在数据库关闭的情况下,丢失一个数据文件:

       $rman target /
       RMAN>backup as backupset database;    # 备份数据库,以备份集的方式
       $rm user01.dbf                # 模拟一个数据文件丢失
       $rman target /
       RMAN>shutdown abort
       RMAN>startup mount;           # 登陆RMAN,数据库启动到mount状态
       RMAN>restore datafile xx;     # 还原数据文件[xx 代表数据文件的编号]
       RMAN>recover datafile xx;     # 恢复数据文件
       RMAN>alter database open;

3).在数据库open的情况下,丢失一个数据文件:

       RMAN>sql 'alter tablespace ts_name offline immediate';   # 让丢失的那个数据文件脱机
       RMAN>restore tablespace ts_name;         # 还原数据文件
       RMAN>recover tablespace ts_name;         # 恢复数据文件
       RMAN>sql 'alter tablespace ts_name online';   # 使数据文件联机

4).系统表空间数据文件丢失:

        $rm system file
        shutdown abort            # 模拟系统表空间数据文件丢失
        RMAN>startup mount        # 启动到mount状态
        RMAN>restore datafile 1;  # 还原数据文件
        RMAN>recover datafile 1;  # 恢复数据文件
        RMAN>alter database open;

5).丢失UNDO表空间数据文件:

        rm undo file
        shutdown abort;        # 模拟undo数据文件丢失
        rman tartget /
        RMAN>startup mount;    # 登陆RMAN,启动到mount状态
        RMAN>report schema;    # 显示所有数据文件对象
        RMAN>restore datafile x;  # 还原指定数据文件[这里特指UNDO]
        RMAN>recover datafile x;  # 恢复指定数据文件
        RMAN>alter database open;

6).数据文件丢失,还原数据文件到一个新的位置:

       alter tablespace users offline immediate;
       or alter database datafile x offline;          # 使用上面两种方法,使数据文件脱机
       RMAN> run{
             set newname for datafile '/u01/app/oracle/oradata/orcl/DATA_TS01.DBF'
             to '/u02/app/oracle/oradata/orcl/DATA_TS01.DBF';    # 将旧文件制定到新的地点
             restore datafile 6;   # 还原数据文件
             switch datafile 6;    # 数据文件切换[此步很重要,移动要做]
             recover datafile 6;   # 恢复数据文件
             }                         
       RMAN>sql 'alter tablespace users online';  # 联机

7).恢复数据库到一台新的主机[可以算是迁移数据库]

前期准备:
A.记录源数据库的DBID[这里很重要,必须记录]
B.复制源数据库参数文件到新的主机相应的目录[…./dbs/….]
C.确认源数据库有备份,包括控制文件[建议,开启自动备份 CONFIGURE CONTROLFILE AUTOBACKUP on],方便新的主机访问

还原数据库到新的主机:[在新主机上操作]

(1).$ setenv ORACLE_SID orcl # 设置实例[原数据库的实例名]

(2).$ rman TARGET / # 登陆RMAN

(3).RMAN> SET DBID 1090770270; # DBID设置为源数据库的DBID,可以在源数据库上,通过V$DATABASE视图查询

(4).RMAN> STARTUP NOMOUNT; # 启动数据库到nomount状态 [这里会报下面的错]

startup failed: ORA-01078: failure in processing system parameters

(5).还原参数文件

      RMAN>RUN
          {
           RESTORE SPFILE FROM AUTOBACKUP;    # 还原参数文件,关闭数据库
           SHUTDOWN ABORT;
          }

(6).修改参数文件,相应文件的位置[这里建议新机器的路径和目前机器的路径一致]

(7).RMAN> STARTUP NOMOUNT ; # 用新的参数文件启动到nomount状态

(8).还原控制文件

      RUN
       {
         RESTORE CONTROLFILE FROM AUTOBACKUP;
         ALTER DATABASE MOUNT;
       }

(9).还原数据文件和日志文件

            RUN
               {  # 重命名相关数据文件,日志文件
                SET NEWNAME FOR DATAFILE 1 TO '?/oradata/test/system01.dbf';
                SET NEWNAME FOR DATAFILE 2 TO '?/oradata/test/undotbs01.dbf';
                SET NEWNAME FOR DATAFILE 3 TO '?/oradata/test/sysaux.dbf';
                SET NEWNAME FOR DATAFILE 4 TO '?/oradata/test/users01.dbf';
                SET NEWNAME FOR DATAFILE 5 TO '?/oradata/test/example01.dbf';
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo01.log''
                  TO ''?/oradata/test/redo01.log'' ";
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo02.log''
                 TO ''?/oradata/test/redo02.log'' ";
                SQL "ALTER DATABASE RENAME FILE ''/u01/app/oracle/oradata/orcl/redo03.log''
                TO ''?/oradata/test/redo03.log'' ";
                RESTORE DATABASE;
                SWITCH DATAFILE ALL;    # 数据文件切换[重要]
                RECOVER DATABASE;
               }

(10).以RESETLOGS方式打开数据库:

RMAN> ALTER DATABASE OPEN RESETLOGS;

2.备份相关视图
v$backup_files
v$backup_datafile
v$backup_set
v$backup_piece
v$backup_redolog
v$backup_spfile
v$backup_device
v$rman_configuration
v$copy_corruption

oracle 查询优化器(optimizer)

1.优化器分类:
基于规则的优化器[Rule-based optimizer] ==> 10g中已经不使用
基于成本的优化器[Cost-Based Optimizer]

2.设置优化器模式:
查看数据库缺省优化:show parameter mode

基于实例:
alter system set optimizer_mode ={Choose|Rule|First_rows|First_rows_n|All_rows}

基于会话:
ALTER SESSION SET optimizer_mode ={Choose|Rule|First_rows|First_rows_n|All_rows}

参数意义:
CHOOSE:仅在9i及之前版本中被支持,10g已经废除。
RULE:仅在9i及之前版本中被支持,10g已经废除。
ALL_ROWS:在10g中为默认值,以吞吐量为基础
FIRST_ROWS:CBO尽可能快速的返回结果集的前面少数行记录,以响应速度为基础
FIRST_ROWS_n:不论是否存在统计信息,都使用CBO优化器,并以最快的速度返回前n行记录,n可以是1,10,100,1000。

3.影响执行计划的因素:

(1).访问路径
优化器可用的访问路径如下:

a.全表扫描(Full Table Scans)
注:访问数据量大,返回数据超过5%,不建议使用索引
oracle扫描时,多块读(一次I/O,读多个块,块必须连续,默认为16个块,具体查看 show parameter db ==> db_file_multiblock-read-count)

b.Rowid扫描(Rowid Scans):最快

c.索引扫描(Index Scans):唯一性索引,索引中最快的一种[空值不入索引,需要加一常量,使空值进入索引]
索引扫描类型:
唯一索引扫描(Index Unique Scans)
索引范围扫描(Index Range Scans):基于规则的,不支持组合索引
索引降序范围扫描(Index Range Scans Descending)
跳跃式索引扫描(Index Skip Scans):数据类型不一致
全索引扫描(Full Index Scans)
快速全索引扫描(Fast Full Index Scans)
索引连接(Index Joins)
注:组合索引中,是将组合看成列,如果查询中包涵非索引的列,则只走组合索引的第一列

d.簇扫描(Cluster Scans):
在被索引的簇中,有着相同簇键值的行存储在同一数据块中。执行簇扫描时,首先通过扫描簇索引获得被检索行的Rowid,然后使用Rowid来定位具体的行。

e.散列扫描(Hash Scans):
散列扫描就是在一个散列簇中定位数据行。在一个散列簇中,具有相同散列值的行存储在相同的数据块中。
在执行散列扫描时,首先通过一个散列函数来获得散列值,然后用散列值在数据块中定位具体行

(2).连接(join)
连接方式:

嵌套循环:[Nested loop join] ==>USE_NL(table1 table2)hint is used.(/*+ use_nl(e d) */)

hash循环:[Hash join] ==> USE_HASH(table1 table2)

排序合并:[Sort-merge join] ==>use_merge(table1 table2)

(3).物化视图(materialized views)
物化视图创建格式:

  1. CREATE MATERIALIZED VIEW mview_name  
  2. [TABLESPACE ts_name]  
  3. [PARALLEL (DEGREE n)]  
  4. [BUILD {IMMEDIATE|DEFERRED}]  
  5. [{ REFRESH {FAST|COMPLETE|FORCE}  
  6. [{ON COMMIT|ON DEMAND}] | NEVER REFRESH } ]  
  7. [{ENABLE|DISABLE} QUERY REWRITE]  
  8. AS SELECT … FROM …  

注:
refresh [fast|complete|force] 视图刷新的方式:
fast: 增量刷新.
假设前一次刷新的时间为t1,那么使用fast模式刷新物化视图时,只向视图中添加t1到当前时间段内,主表变化过的数据.
为了记录这种变化,建立增量刷新物化视图还需要一个物化视图日志表。
create materialized view log on 表名 with ……
complete:全部刷新。相当于重新执行一次创建视图的查询语句。
force: 这是默认的数据刷新方式。当可以使用fast模式时,数据刷新将采用fast方式;否则使用complete方式。
范例:

  1. sys> conn hr/hr  
  2. hr_1>create table e as select * from employees;  
  3. hr_1>create table d as select * from departments;  
  4. hr_1>insert into e select * from e;(54784 row)  
  5. hr_1>insert into d select * from d;(55296 row)  
  6.   
  7. hr_2>set autot on  
  8. hr_2>set timing on  
  9. hr_2>select dd.department_name,sum(ee.salary) from e ee,d dd where ee.department_id=dd.department_id group by dd.department_name;  
  10.   
  11. sys> grant CREATE MATERIALIZED VIEW to hr;  
  12.   
  13. sys> CREATE MATERIALIZED VIEW LOG ON e WITH SEQUENCE, ROWID  
  14.      (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID)  
  15. INCLUDING NEW VALUES;  
  16.   
  17. sys> CREATE MATERIALIZED VIEW LOG ON d WITH SEQUENCE, ROWID(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID)  
  18. INCLUDING NEW VALUES;  
  19.   
  20. hr_1>create materialized view depart_sal_sum  
  21.      refresh fast  
  22.      on commit  
  23.      ENABLE QUERY REWRITE as  
  24.      select dd.department_name,sum(ee.salary) from e ee,d dd where ee.department_id=dd.department_id group by dd.department_name;  
  25.   
  26. hr_2>select dd.department_name,sum(ee.salary) from e ee,d dd where ee.department_id=dd.department_id group by dd.department_name;  

删除物化视图: drop materialized view 视图名称

物化视图表:user_mviews

查看相应信息:
select MVIEW_NAME,QUERY from user_mviews;

有关oracle优化入门知识

1.优化的几个方面:
应用
实例配置
操作系统

2.解决优化问题的步骤:
收集信息
分析数据
部分解决[每次只解决一个问题]

3.指标:
最短应答时间:服务时间+等待时间
最少资源使用:

4.告警日志的位置
10g下,在bdump目录的下的alert.log,为文本格式,可直接打开,需定期删除,不然会无线增大
11g下,为自动诊断资料库,在diag/rdbms/目录下,为xml格式,建议使用em[企业管理器]查看

5.后台进程跟踪文件,在bdump目录下:
格式:数据库名字+进程号+线程号.trc

6.用户追踪文件
10g下,在udump目录下,
11g下,在trace目录下
格式:数据库名字+ora+进程号

7.跟踪的分类:

(1).用户自己追踪自己:

  1. sys>grant alter session to scott; # 授予用户权限  
  2. scott>alter session set sql_trace=true; # 开启自己跟踪自己的权限  
  3. scott>select * from emp # 这里可以执行任意DML语句….  
  4. scott>alter sessiom set sql_trace=false; # 关闭跟踪  

查看跟踪文件:
存放位置:/u01/app/oracle/admin/orcl/udump/*
在此目录下,执行LL -t,默认最上面一个就是刚才的文件,也可以使用v$session和v$process两个视图查出进程号
因此文件不易读,需转换成可读的文本:

  1. 格式:  
  2. tkprof 原文件名 新文件名 explain=用户名/密码 sys=no  
  3. 如下:  
  4. tkprof orcl_ora_1928.trc 2.txt explain=scott/tiger sys=no  

现在就可以查看输出文件了

(2).自动追踪:

  1. SYS>@/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/plustrce; # 自动追踪需要plutrce角色,需要安装  
  2. SYS>grant plustrace to scott; # 将角色授予scott用户  
  3. SCOTT>@/u01/app/oracle/product/10.2.0/db_1/rdbsms/admin/utlxplan; # 安装执行计划表  
  4. demo:  
  5. scott>set autotrace on   # 开启自动追踪,这种是查询时就显示执行计划,比较方便  
  6. scott>select ename,sal from e where empno=7902;  
  7. scott>create index e_empno_ename_sal on e(empno,ename,sal);  
  8. scott>select ename,sal from e where empno=7902;  
  9.   
  10. explain plan   # 手动生成一个执行计划  
  11. scott>explain plan for select ename,sal from e where empno=7902;  
  12. scott>select * from table(dbms_xplan.display);  

8.清空共享池/buffer_cache:

  1. 清空共享池:alter system flush shared_pool    # 字典信息,库信息都被清楚,生产环境下,不要做此操作,影响性能  
  2. 清空buffer_cache:alter system flush buffer_cache # 清空所有缓存的数据信息  

9.dbms_monitor跟踪:

(1).跟踪会话:# 多用于跟踪用户的session_id

  1. SYS>dbms_monitor.SESSION_TRACE_ENABLE(session_id,serial_num,wait,binds);  
  2. SYS>dbms_monitor.SESSION_TRACE_disABLE(session_id,serial_num);  

(2).跟踪服务名:

  1. # 同一用户从不同客户端登陆同一服务  
  2. $sqlplus scott/tiger@orcl  
  3. $sqlplus scott/tiger@orcl  
  4. SYS>exec dbms_monitor.SERV_MOD_ACT_TRACE_ENABLE(service_name=>’orcl’); # 开启追踪,服务名就是网络服务名  
  5. SCOTT_1>select * from emp where empno=7788;  
  6. SCOTT_2>select * from emp where empno=7369;  
  7. SYS>exec dbms_monitor.SERV_MOD_ACT_TRACE_DISABLE(service_name=>’orcl’); # 关闭追踪  
  8. $trcsess output=trace.txt service=orcl * # 将不同终端信息汇总  
  9. $tkprof trace.txt tk.txt explain=scott/tiger sys=no # 转换文件格式为文本格式  
  10. $vi tk.txt # 查看文本信息  

10.以上的一些操作,oracle提供一个b/s架构的企业管理器,方便管理[非常方便]

(1).查询em是否已经安装[默认,安装数据库时,数据库就已经安装] –> 安装了EM,在数据库家目录会有一个和你主机名差不多的目录

  1. SYS>select comp_name,version from dba_registry;  
  2. SYS>select OCCUPANT_NAME,SPACE_USAGE_KBYTES from v$sysaux_occupants;  

(2).创建企业管理器:

  1. a.配置资料库:  
  2. $emca -repos create  
  3. b.配置数据库控制台:  
  4. $emca -config dbcontrol db  
  5. c.开启企业管理器[em]  
  6. $emctl start dbconsole  

(3).删除企业管理器:

  1. a.停止企业管理器[em]  
  2. $emctl stop dbconsole  
  3. b.删除数据库控制台:  
  4. $emca -deconfig dbcontrol db  
  5. c.删除资料库  
  6. $emca -repos drop  

11.statspack:
(1).安装statspack,使用spcreate.sql脚本:

  1. sys>@/u01/oracle/app/oracle/product/10.2.0/db_1/rdbms/admin/spcreate; # 删除使用spdrop.sql  
  2. sys>select OCCUPANT_NAME,SPACE_USAGE_KBYTES from V$SYSAUX_OCCUPANTS;  
  3. sys>exec statspack.snap; # 创建一个snapshot,一般每隔20分钟执行一次  
  4. …  
  5. …  
  6. sys>exec statspack.snap;  
  7. sys>@$ORACLE_HOME/rdbms/admin/spreport # 生成报告,需要至少2个snapshot,才可以生成报告  
  8. # 报告默认存放在用户家目录下  
  9. # 还有一些脚本:  
  10. Automate the collection of statistics with spauto.sql.  
  11. Produce a report by using spreport.sql or sprepsql.sql.  
  12. Purge Statspack data with statspack.purge or sppurge.sql.  
  13. Truncate all Statspack tables with sptrunc.sql.  
  14. Export the Statspack repository with spexp.par.  

12.awr:automatic workload repository ==> 自动负载资料库
# 每小时收集一次,保留7天[放在sysaux下面],后台进程为:mmon
ADDM:自动数据库诊断监控器,自动分析

13.以上这些,oracle的企业管理器都提供了这种操作,非常方便。

oracle 锁机制

1.锁的类型有:[oracle锁机制是自动管理]

dml 锁

ddl 锁

shared 锁

互斥锁 : 主要针对内存的的锁[share pool]

2.锁的模式有:

0:none

1:null

2:row share(RS) (lock a row in shared mode)   ==> 行级锁
加锁语法:LOCK TABLE TableName IN ROW SHARE MODE;
仅能保护表不被删除

3:row exclusive(RX) (lock a row in exclusive mode)    ==> 行级排它锁
加锁语法:LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
不允许改变表的结构,可删除表内数据,但不可删除列

4:share(S) (lock the entire table in shared mode)    ==> 共享锁
加锁语法:LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;
不允许两个人同时对一张表执行除select的dml语句或ddl语句

5:share row exclusive(SRX)(lock the table in shared mode but a row in exclusive) ==> 共享行级排它锁
加锁语法:Lock Table TableName In Share Row Exclusive Mode;
仅能查询(独占行,不得执行dml,除select外)

6:exclusive(X) (lock the entire table in exclusive mode) ==> 排他锁
加锁语法:Lock Table TableName In Exclusive Mode;
仅能查询

3.与锁相关的视图
DBMS_LOCK
V$DLM_ALL_LOCKS
V$DLM_LOCKS
V$ENQUEUE_LOCK
V$GLOBAL_BLOCKED_LOCKS
V$LOCK
V$LOCKED_OBJECT
V$LOCKS_WITH_COLLISIONS
V$LOCK_ACTIVITY
V$LOCK_ELEMENT
V$_LOCK

4.解锁及 Kill Session:
使用下面的语法查出锁并杀掉 Session。
SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID;
ALTER SYSTEM KILL SESSION ‘SID,SERIAL#’;

oracle 日志挖掘(LogMiner)

1.LogMiner工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己数据库的重作日志文件,也可以用来分析其他数据库的重作日志文件。
总的说来,LogMiner 工具的主要用途有:

(1).跟踪数据库的变化:可以离线的跟踪数据库的变化,而不会影响在线系统的性能。

(2).回退数据库的变化:回退特定的变化数据,减少point-in-time recovery的执行。

(3).优化和扩容计划:可通过分析日志文件中的数据以分析数据增长模式。

(4).确定数据库的逻辑损坏时间:准确定位操作执行的时间和SCN ==> 基于时间和SCN 的恢复

(5).确定事务级要执行的精细逻辑恢复操作

(6).执行后续审计

2.用户执行日志挖掘,需要权限:execute_catralog_role

3.安装LogMiner 工具,必须首先要运行下面这样两个脚本:

  1. $ORACLE_HOME/rdbms/admin/dbmslm.sql      #  创建DBMS_LOGMNR 包,该包用来分析日志文件。  
  2. $ORACLE_HOME/rdbms/admin/dbmslmd.sql    #  用来创建DBMS_LOGMNR_D 包,该包用来创建数据字典文件。  
  3. # 注:这两个脚本必须均以SYS 用户身份运行。  

4.基本对象
Source Database: 日志所属的数据库
Mining Database: 执行LogMiner 操作要使用的数据库,相同硬件平台,相同字符集,版本不低于Source Database
LogMiner字典: 日志文件中,对于表等用户对象,并不是保存名字,而是保存一个ID号;
建立字典文件的目的就是使logminer在分析时可以将Object ID翻译成我们所熟悉的对象名,在Source Database上生成

5.LogMiner字典三种类型:

(1).使用源数据库数据字典[ 表结构无变化 Source-DB必须OPEN,只能跟踪DML不能为DDL ]

  1. SQL> exec DBMS_LOGMNR.START_LOGMNR(OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG );  

(2).摘取LogMiner字典到重做日志[ Source-DB 必须OPEN, Archivelog模式 ]

  1. SQL> exec DBMS_LOGMNR_D.BUILD(OPTIONS=>DBMS_LOGMNR_D.STORE_IN_REDO_LOGS );  

(3).摘取LogMiner 字典到字典文件,配置字典文件所在目录: 静态参数: UTL_FILE_DIR
建立字典文件:

  1. SQL> exec dbms_logmnr_d.build (dictionary_filename=>’dictionary.ora’,  
  2. dictionary_location=>’/u02/app/oracle/logminer’,  
  3. OPTIONS=>DBMS_LOGMNR_D.STORE_IN_FLAT_FILE ); # 存储到平面文件  

6.与LogMiner相关的数据字典:

  1. v$loghist   # 显示历史日志文件的一些信息  
  2. v$logmnr_dictionary   # 因logmnr 可以有多个字典文件,显示字典文件信息  
  3. v$logmnr_parameters   # 显示logmnr 的参数  
  4. v$logmnr_logs   # 显示用于分析的日志列表信息  
  5. v$logmnr_contents   # 挖掘结果  
  6. dbms_logmnr_d   # 生成日志挖掘数据字典  
  7. dbms_logmnr   # 日志挖掘相关函数  

7.使用LogMiner 进行分析[完整顺序]

(1).设定用于LogMiner分析的日志文件存放的位置
设置 UTL_FILE_DIR,需要重启数据库。
设置 utl_file_dir=* 表示你能操作任何目录
在initsid.ora文件中加入utl_file_dir 参数或者:

  1. SQL> alter system set utl_file_dir=’/u02/app/oracle/logminer’ scope=spfile;  
  2. SQL> shutdown immediate  
  3. SQL> starup  

(2).生成数据字典文件

  1. SQL> exec dbms_logmnr_d.build (dictionary_filename=>’dict.ora’,dictionary_location=>’/u02/app/oracle/logminer’,);  
  2. # 注 dictionary_location 指的是Logminer 数据字典文件存放的位置,它必须匹配utl_file_dir 的设定。
    dictionary_filename 指的是放于存放位置的字典文件的名字,名字可以任意取。

(3).建立日志分析表
建立日志分析表数据库必须在mount或nomount状态;建立日志分析表,使用dbms_logmnr.add_logfile()

  1. SQL>exec dbms_logmnr.add_logfile(logfilename=>’/u01/app/oracle/oradata/orcl/redo02.log’,options=>dbms_logmnr.new);  
  2. # 其中的options有三种取值:  
  3. dbms_logmnr.new:用于建一个日志分析表  
  4. dbms_logmnr.addfile:用于加入用于分析的的日志文件  
  5. dbms_logmnr.removefile:用于移出用于分析的日志文件  

(4).启动LogMiner进行分析
[分析指定的时间段或者指定的scn号]

  1. SQL>dbms_logmnr.start_logmnr(DictFileName =>’/u02/app/oracle/logminer/dict.ora’,starttime => to_date(‘20080710 09:15:00′,’yyyymmdd hh24:mi:ss’),endtime => to_date(‘20080710 10:00:00′,’yyyymmdd hh24:mi:ss’));  
  2. # 即分析2008 年7 月10 日这天9:15 至10:00 这段时间,并把分析结果放到数据字典中以用于查询。还有两个参数startscn (起始SCN号) 及endscn (终止SCN) 号。  
  3. 或者[全部分析]  
  4. SQL>exec dbms_logmnr.start_logmnr(DictFileName =>’/u02/app/oracle/logminer/dict.ora’);  

(5).查看日志分析的结果[存储在此视图内:V$logmnr_contents] ==> 具体查询操作,需根据实际情况来查询

查看DML操作:

  1. SQL>SELECT operation, sql_redo, sql_undo FROM V$logmnr_contents WHERE table_name=’E’;  
  2. # 注:其中operation指的是操作,sql_redo指的是实际的操作,sql_undo指的是用于取消的相反的操作。  

查看DDL操作:

  1. SQL>SELECT timstamp, sql_redo FROM v$logmnr_contents WHERE upper(sql_redo) like ‘%TRUNCATE%’;  

(6).结束LogMiner的分析

  1. SQL>exec dbms_logmnr.end_logmnr;  

8.案例:

  1. SYS>alter system set utl_file_dir=’/u02/app/oracle/logminer’ scope=spfile;  
  2. SYS>shutdown immediate  
  3. SYS>startup  
  4. SYS>exec dbms_logmnr_d.build(‘dict.ora’,’/u01/app/oracle/logminer’);  
  5. SYS>exec dbms_logmnr.add_logfile(logfilename=>’/u01/app/oracle/oradata/orcl/redo01.log’,options=>dbms_logmnr.new);  
  6. SYS>exec dbms_logmnr.start_logmnr(DictFileName =>’/u02/app/oracle/logminer/dict.ora’);  
  7. SYS>select username,scn,to_char(timestamp,’yyyy-mm-dd hh24:mi:ss’),sql_redo from v$logmnr_contents where table_name=’E’;  
  8. SYS>exec dbms_logmnr.end_logmnr;  

oracle 数据库的升级

1.oracle数据库升级
基于 Linux(Oracle Linux 5.4/2.6.18-164.el5PAE)平台下 Oracle 10.2.0.1 升级到10.2.0.4

2.下载升级的软件包:从oracle官网下载升级包:
注: 9i 以前,无论升级/降级,数据库都是 startup migrate
10g 后增加了 upgrade 参数,升级可直接用 startup upgrade,降级仍是 startup migrate

3.升级的步骤如下:

1)单实例升级先决条件:

(1).表空间需求
确保 system 表空间至少有10M 空间可用,下面给出查询语句

  1. SELECT upper(f.tablespace_name) “tablespace_name”,d.tot_grootte_mb “tablespace_size(M)”,  
  2.        d.tot_grootte_mb – f.total_bytes “used_size(M)”,  
  3.        to_char(round((d.tot_grootte_mb – f.total_bytes) / d.tot_grootte_mb * 100,2),’990.99′) “Usage_Percent”,  
  4.        f.total_bytes “free_size(M)”  
  5. FROM   
  6. (SELECT tablespace_name,round(SUM(bytes) / 1024 / 1024) total_bytes,round(MAX(bytes) / (1024 * 1024), 2) max_bytes  
  7.  FROM sys.dba_free_space  GROUP BY tablespace_name) f,(SELECT dd.tablespace_name,  
  8.          round(SUM(bytes) / 1024 / 1024) tot_grootte_mb  
  9.         FROM sys.dba_data_files dd  GROUP BY dd.tablespace_name) d  
  10.  WHERE d.tablespace_name = f.tablespace_name  
  11.  ORDER BY 2 DESC;  

(2).系统参数:
确保参数 SHARED_POOL_SIZE 和 JAVA_POOL_SIZE 大于150MB 以上,为加快升级速度,在系统内存可用的情况下,可临时调大这2个参数

  1. SQL> SHOW PARAMETER SHARED_POOL_SIZE  
  2. SQL> SHOW PARAMETER JAVA_POOL_SIZE  
  3. SQL> ALTER SYSTEM SET SHARED_POOL_SIZE=’200M’ SCOPE=spfile;  
  4. SQL> ALTER SYSTEM SET JAVA_POOL_SIZE=’200M’ SCOPE=spfile;  

2).实施升级

(1).收集升级前数据库信息[很重要,需要根据里面的内容去更改相应内容,注意保留]

  1. SQL> spool upgrade_info.log  
  2. SQL> @utlu112i.sql  
  3. SQL> spool off  

(2).查询库中是否有invalid的对象:

  1. SQL> select comp_name,version,status from sys.dba_registry;  
  2. 注:如果有无效选项,重新使用此脚本utlrp.sql编译无效对象  

(3).关闭需要升级的实例

  1. SQL> shutdown immediate  
  2. 停止与该实例相关的所有后台进程  
  3. lsnrctl stop  # 关闭监听器  
  4. emctl stop dbconsole # 关闭em  

(4).备份 Oracle Home 目录及数据库

  1. tar -cvf $ORACLE_BASE /orabak/ –确保 Oracle 相关的所有配置都位于$ORACLE_BASE 目录,如监听等  
  2. cp *.dbf con*.ora redo*.log /orabak/ –对数据库实施冷备  

(5).升级软件[ 升级数据库软件 ]

  1. ./runIstanller –> oracle 账户  
  2. root.sh –> root 账户  

(6).更新数据字典:[ 升级数据库 ]

  1. SQL> startup upgrade  
  2. SQL> spool patch.log  
  3. SQL> @$ORACLE_HOME/rdbms/admin/catupgrd.sql   
  4. SQL> spool off  

(7).重编译失效对象:

  1. sql>shutdown immediate  
  2. sql>startup  
  3. SQL>@$ORACLE_HOME/rdbms/admin/utlrp.sql  

(8).升级后的检测

  1. SQL>select comp_name,version,status from sys.dba_registry;  
  2. 检查组件的升级情况  
  3. SQL>select * from utl_recomp_errors;  

(9).修改兼容性参数

  1. SQL> alter system set compatible=’10.2.0.4.0′ scope=spfile;  

(10).重新启动数据库:

  1. SQL> SHUTDOWN  
  2. SQL> STARTUP  

(11).如果使用了恢复目录,则执行下面的命令

  1. $ rman catalog username/password@alias  
  2. RMAN> UPGRADE CATALOG;  

(12).升级回退:

  1. SQL> STARTUP DOWNGRADE  
  2. SQL> SPOOL downgrade.log  
  3. SQL> @catdwgrd.sql (10.2.10 运行的是这个,而10.1 降级用的是 d92000.sql,即dold_release.sql)  
  4. Sql>spool off  
  5. Sql>shutdown immediate  

(13).检查升级后的情况

  1. SQL> select comp_name,version,status from sys.dba_registry;  
  2. SQL> select * from utl_recomp_errors;