暂时未有相关云产品技术能力~
在RHEL 6.5上静默安装Oracle 18c Oracle 18c。18c其实就是12.2.0.2,19c就是12.2.0.3。db_home.zip 安装包大概4.25G,解压后有8.9G,数据库软件安装完成后有9.4G,创建完数据库后有13G。注:安装18c时需要把压缩文件解压到ORACLE_HOME路径下,在此目录下运行./runInstaller 注:该RHEL6.5的OS环境里已经安装了10g,11g,12c,现在需要安装18c。所以,有的OS参数已经不用修改了。 database 介质下载: 渠道1: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 渠道2: https://edelivery.oracle.com/osdc/faces/SoftwareDelivery http://www.oracle.com/technetwork/database/enterprise-edition/downloads/oracle18c-linux-180000-5022980.html 创建数据库用户: /usr/sbin/groupadd -g 54321 oinstall /usr/sbin/groupadd -g 54327 asmdba /usr/sbin/groupadd -g 54328 asmoper /usr/sbin/groupadd -g 54322 dba /usr/sbin/groupadd -g 54323 oper /usr/sbin/groupadd -g 54324 backupdba /usr/sbin/groupadd -g 54325 dgdba /usr/sbin/groupadd -g 54326 kmdba /usr/sbin/groupadd -g 54330 racdba /usr/sbin/useradd -u 54321 -g oinstall -G oper,dba,asmdba,backupdba,dgdba,kmdba,racdba oracle 如果oracle已存在,那么将 useradd 修改为 usermod 。 $ id oracle uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba), 54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54327(asmdba),54330(racdba) 环境变量: export ORACLE_SID=lhr18c export ORACLE_BASE=/u08/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/18.0.0/dbhome_1 安装: https://docs.oracle.com/en/database/oracle/oracle-database/18/ladbi/running-oracle-universal-installer-to-install-oracle-database.html#GUID-DD4800E9-C651-4B08-A6AC-E5ECCC6512B9 1. Log in as the Oracle installation owner user account (oracle) that you want to own the software binaries. 2. Download the Oracle Database installation image files (db_home.zip) to a directory of your choice. For example, you can download the image files to the /tmp directory. 3. Create the Oracle home directory and extract the image files that you have downloaded in to this Oracle home directory. For example: $ mkdir -p /u01/app/oracle/product/18.0.0/dbhome_1 $ chgrp oinstall /u01/app/oracle/product/18.0.0/dbhome_1 $ cd /u01/app/oracle/product/18.0.0/dbhome_1 $ unzip -q /tmp/db_home.zip db_home.zip 8.9G Note: Oracle recommends that the Oracle home directory path you create is in compliance with the Oracle Optimal Flexible Architecture recommendations. Also, unzip the installation image files only in this Oracle home directory that you created. 注: 安装18c时需 要把压缩文件解压到 _ 路径下,在此目录下运行 4. From the Oracle home directory, run the runInstaller command to start the Oracle Database Setup Wizard. $ cd /u01/app/oracle/product/18.0.0/dbhome_1 $ ./runInstaller Note: Run the runInstaller command from the Oracle home directory only. Do not run runInstaller from any other location. 5. In the Select Configuration Option screen, select Create and configure a single instance database. 6. Select your installation type. Installation screens vary depending on the installation option you select. Respond to the configuration prompts as needed. ---静默安装 18c 数据库单机软件 /u08/app/oracle/product/18.0.0/dbhome_1/runInstaller -silent -force -noconfig -ignorePrereq \ oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v18.0.0 \ oracle.install.option=INSTALL_DB_SWONLY \ UNIX_GROUP_NAME=oinstall \ INVENTORY_LOCATION=/u00/app/oraInventory \ ORACLE_BASE=/u08/app/oracle \ oracle.install.db.InstallEdition=EE \ oracle.install.db.OSDBA_GROUP=dba \ oracle.install.db.OSOPER_GROUP=oper \ oracle.install.db.OSBACKUPDBA_GROUP=backupdba \ oracle.install.db.OSDGDBA_GROUP=dgdba \ oracle.install.db.OSKMDBA_GROUP=kmdba \ oracle.install.db.OSRACDBA_GROUP=dba \ oracle.install.db.config.starterdb.type=GENERAL_PURPOSE ---静默安装 18c 数据库 dbca -silent -createDatabase \ -gdbName lhr18c \ -sid lhr18c \ -sysPassword lhr -systemPassword lhr \ -databaseConfigType SI \ -createAsContainerDatabase false \ -useLocalUndoForPDBs true \ -templateName /u08/app/oracle/product/18.0.0/dbhome_1/assistants/dbca/templates/General_Purpose.dbc \ -dvConfiguration false \ -olsConfiguration false \ -datafileJarLocation /u08/app/oracle/product/18.0.0/dbhome_1/assistants/dbca/templates/ \ -datafileDestination /u08/app/oracle/oradata/lhr18c/ \ -recoveryAreaDestination /u08/app/oracle/fast_recovery_area/lhr18c \ -storageType FS \ -registerWithDirService false \ -variables ORACLE_BASE_HOME=/u08/app/oracle/product/18.0.0/dbhome_1,DB_UNIQUE_NAME=lhr18c,ORACLE_BASE=/u08/app/oracle,PDB_NAME=,DB_NAME=lhr18c,ORACLE_HOME=/u08/app/oracle/produ-ct/18.0.0/dbhome_1,SID=lhr18c \ -initParams undo_tablespace=UNDOTBS1,db_block_size=8KB,diagnostic_dest=/u08/app/oracle,remote_login_passwordfile=EXCLUSIVE,db_create_file_dest=/u08/app/oracle/oradata/lhr18c/,au-dit_file_dest=/u08/app/oracle/admin/lhr18c/adump,processes=300,memory_target=529MB,db_recovery_file_dest_size=8106MB,open_cursors=300,compatible=18.0.0,db_name=lhr18c,db_recovery_file_dest=/u08/app/oracle/fast_recovery_area/lhr18c,audit_trail=db \ -sampleSchema TRUE \ -databaseType MULTIPURPOSE \ -automaticMemoryManagement true \ -totalMemory 529 \ -emConfiguration NONE 执行过程 [oracle@rhel6lhr dbhome_1]$ /u08/app/oracle/product/18.0.0/dbhome_1/runInstaller -silent -force -noconfig -ignorePrereq \ > oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v18.0.0 \ > oracle.install.option=INSTALL_DB_SWONLY \ > UNIX_GROUP_NAME=oinstall \ > INVENTORY_LOCATION=/u00/app/oraInventory \ > ORACLE_BASE=/u08/app/oracle \ > oracle.install.db.InstallEdition=EE \ > oracle.install.db.OSDBA_GROUP=dba \ > oracle.install.db.OSOPER_GROUP=oper \ > oracle.install.db.OSBACKUPDBA_GROUP=backupdba \ > oracle.install.db.OSDGDBA_GROUP=dgdba \ > oracle.install.db.OSKMDBA_GROUP=kmdba \ > oracle.install.db.OSRACDBA_GROUP=dba \ > oracle.install.db.config.starterdb.type=GENERAL_PURPOSE Launching Oracle Database Setup Wizard... [WARNING] [INS-13013] Target environment does not meet some mandatory requirements. CAUSE: Some of the mandatory prerequisites are not met. See logs for details. /u00/app/oraInventory/logs/InstallActions2018-08-02_10-43-40AM/installActions2018-08-02_10-43-40AM.log ACTION: Identify the list of failed prerequisite checks from the log: /u00/app/oraInventory/logs/InstallActions2018-08-02_10-43-40AM/installActions2018-08-02_10-43-40AM.log. Then either from the log file or from installation manual find the appropriate configuration to meet the prerequisites and fix it manually. The response file for this session can be found at: /u08/app/oracle/product/18.0.0/dbhome_1/install/response/db_2018-08-02_10-43-40AM.rsp You can find the log of this install session at: /u00/app/oraInventory/logs/InstallActions2018-08-02_10-43-40AM/installActions2018-08-02_10-43-40AM.log As a root user, execute the following script(s): 1. /u08/app/oracle/product/18.0.0/dbhome_1/root.sh Execute /u08/app/oracle/product/18.0.0/dbhome_1/root.sh on the following nodes: [rhel6lhr] Successfully Setup Software with warning(s). [root@rhel6lhr response]# /u08/app/oracle/product/18.0.0/dbhome_1/root.sh Check /u08/app/oracle/product/18.0.0/dbhome_1/install/root_rhel6lhr_2018-08-02_10-49-01-987900512.log for the output of root script [root@rhel6lhr response]# cat /u08/app/oracle/product/18.0.0/dbhome_1/install/root_rhel6lhr_2018-08-02_10-49-01-987900512.log Performing root user operation. The following environment variables are set as: ORACLE_OWNER= oracle ORACLE_HOME= /u08/app/oracle/product/18.0.0/dbhome_1 Copying dbhome to /usr/local/bin ... Copying oraenv to /usr/local/bin ... Copying coraenv to /usr/local/bin ... Entries will be added to the /etc/oratab file as needed by Database Configuration Assistant when a database is created Finished running generic part of root script. Now product-specific root actions will be performed. Oracle Trace File Analyzer (TFA) is available at : /u08/app/oracle/product/18.0.0/dbhome_1/suptools/tfa/release/tfa_home/bin/tfactl [oracle@rhel6lhr dbhome_1]$ dbca -silent -createDatabase \ > -gdbName lhr18c \ > -sid lhr18c \ > -sysPassword lhr -systemPassword lhr \ > -databaseConfigType SI \ > -createAsContainerDatabase false \ > -useLocalUndoForPDBs true \ > -templateName /u08/app/oracle/product/18.0.0/dbhome_1/assistants/dbca/templates/General_Purpose.dbc \ > -dvConfiguration false \ > -olsConfiguration false \ > -datafileJarLocation /u08/app/oracle/product/18.0.0/dbhome_1/assistants/dbca/templates/ \ > -datafileDestination /u08/app/oracle/oradata/lhr18c/ \ > -recoveryAreaDestination /u08/app/oracle/fast_recovery_area/lhr18c \ > -storageType FS \ > -registerWithDirService false \ > -variables ORACLE_BASE_HOME=/u08/app/oracle/product/18.0.0/dbhome_1,DB_UNIQUE_NAME=lhr18c,ORACLE_BASE=/u08/app/oracle,PDB_NAME=,DB_NAME=lhr18c,ORACLE_HOME=/u08/app/oracle/produ-ct/18.0.0/dbhome_1,SID=lhr18c \ > -initParams undo_tablespace=UNDOTBS1,db_block_size=8KB,diagnostic_dest=/u08/app/oracle,remote_login_passwordfile=EXCLUSIVE,db_create_file_dest=/u08/app/oracle/oradata/lhr18c/,au-dit_file_dest=/u08/app/oracle/admin/lhr18c/adump,processes=300,memory_target=529MB,db_recovery_file_dest_size=8106MB,open_cursors=300,compatible=18.0.0,db_name=lhr18c,db_recovery_file_dest=/u08/app/oracle/fast_recovery_area/lhr18c,audit_trail=db \ > -sampleSchema TRUE \ > -databaseType MULTIPURPOSE \ > -automaticMemoryManagement true \ > -totalMemory 529 \ > -emConfiguration NONE [WARNING] [DBT-14502] Oracle Restart is not running in Grid Infrastructure home. Created database will not be registered with Oracle Grid Infrastructure. ACTION: Startup the Oracle Restart in the Grid Infrastructure home. [WARNING] [DBT-06303] Unable to check if location (/u08/app/oracle/oradata/lhr18c/) is on ACFS. [WARNING] [DBT-06303] Unable to check if location (/u08/app/oracle/product/18.0.0/dbhome_1/dbs/) is on ACFS. [WARNING] [DBT-06303] Unable to check if location (/u08/app/oracle/fast_recovery_area/lhr18c/) is on ACFS. [WARNING] [DBT-06208] The 'SYS' password entered does not conform to the Oracle recommended standards. CAUSE: a. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. b.The password entered is a keyword that Oracle does not recommend to be used as password ACTION: Specify a strong password. If required refer Oracle documentation for guidelines. [WARNING] [DBT-06208] The 'SYSTEM' password entered does not conform to the Oracle recommended standards. CAUSE: a. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. b.The password entered is a keyword that Oracle does not recommend to be used as password ACTION: Specify a strong password. If required refer Oracle documentation for guidelines. Prepare for db operation 10% complete Copying database files 40% complete Creating and starting Oracle instance 42% complete 46% complete 50% complete 54% complete 58% complete 60% complete Completing Database Creation 66% complete 69% complete 70% complete Executing Post Configuration Actions 100% complete Database creation complete. For details check the logfiles at: /u08/app/oracle/cfgtoollogs/dbca/lhr18c. Database Information: Global Database Name:lhr18c System Identifier(SID):lhr18c Look at the log file "/u08/app/oracle/cfgtoollogs/dbca/lhr18c/lhr18c.log" for further details. [oracle@rhel6lhr dbhome_1]$ [oracle@rhel6lhr ~]$ cd env_oracle/ [oracle@rhel6lhr env_oracle]$ ll total 36 -rw-r--r-- 1 oracle oinstall 834 Mar 10 2017 env_oracle_all.txt -rw-r--r-- 1 oracle oinstall 27 Jan 19 2015 env_utf8test.sh -rwxrwxrwx 1 oracle oinstall 1181 Mar 21 2016 oracle_10201_env.sh -rwxrwxrwx 1 oracle oinstall 1156 Mar 11 2015 oracle_10204_env.sh -rwxr-xr-x 1 oracle oinstall 1071 Mar 21 15:41 oracle_11201_env.sh -rwxrwxrwx 1 oracle oinstall 1071 Mar 10 2017 oracle_11203_env.sh -rwxrwxrwx 1 oracle oinstall 746 Mar 10 2017 oracle_12102_env.sh -rwxrwxrwx 1 oracle oinstall 746 Mar 10 2017 oracle_12201_env.sh -rwxr-xr-x 1 oracle oinstall 746 Aug 1 18:01 oracle_18c_12202_env.sh [oracle@rhel6lhr env_oracle]$ . oracle_18c_12202_env.sh [oracle@rhel6lhr env_oracle]$ ORACLE_SID=lhr18c [oracle@rhel6lhr env_oracle]$ sas SQL*Plus: Release 18.0.0.0.0 - Production on Thu Aug 2 11:40:46 2018 Version 18.3.0.0.0 Copyright (c) 1982, 2018, Oracle. All rights reserved. Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production Version 18.3.0.0.0 SQL>
Oracle集群(RAC)时间同步(ntp和CTSS) http://blog.itpub.net/26736162/viewspace-2157130/ crsctl stat res -t -init ps -ef|grep ctss crsctl check ctss cluvfy comp clocksync -n all -verbose crsctl start res ora.ctssd -init crsctl stop res ora.ctssd -init Network Time Protocol Setting l You have two options for time synchronization: an operating system configured network time protocol (NTP), or Oracle Cluster Time Synchronization Service. l Oracle Cluster Time Synchronization Service is designed for organizations whose cluster servers are unable to access NTP services. l If you use NTP, then the Oracle Cluster Time Synchronization daemon (ctssd) starts up in observer mode. If you do not have NTP daemons, then ctssd starts up in active mode and synchronizes time among cluster members without contacting an external time server.. 可以采用操作系统的NTP服务,也可以使用Oracle自带的服务ctss,如果ntp没有启用,那么Oracle会自动启用自己的ctssd进程。 从oracle 11gR2 RAC开始使用Cluster Time Synchronization Service(CTSS)同步各节点的时间,当安装程序发现NTP协议处于非活动状态时,安装集群时间同步服务将以活动模式(active)自动进行安装并同步所有节点的时间。如果发现配置了 NTP,则以观察者模式(observer mode)启动集群时间同步服务,Oracle Clusterware不会在集群中进行活动的时间同步。 在RAC中,集群的时间应该是保持同步的,否则可能导致很多问题,例如:依赖于时间的应用会造成数据的错误,各种日志打印的顺序紊乱,这将会影响问题的诊断,严重的可能会导致集群宕机或者重新启动集群时节点无法加入集群。 在Oracle 11gR2前,集群的时间是由NTP同步的,而在11gR2后,Oracle引入了CTSS组件,如果系统没有配置NTP,则由CTSS来同步集群时间。 NTP和CTSS是可以共存的,且NTP的优先级要高于CTSS,也就是说,如果系统中同时有NTP和CTSS,那么集群的时间是由NTP同步的,CTSS会处于观望(Observer)模式,只有当集群关闭所有的NTP服务,CTSS才会处于激活(Active)模式。在一个集群中,只要有一个节点的ntp处于活动状态,那么集群的所有节点的CTSS都会处于激活(Active)模式。 需要注意的是,要让CTSS处于激活(Active)模式,则不仅要关闭ntp服务(/sbin/service ntpd stop),还要删除/etc/ntp.conf文件(mv /etc/ntp.conf /etc/ntp.conf.bak),否则不能启用CTSS。 1.1.1 CTSS同步模式 关闭NTP: /sbin/service ntpd stop mv /etc/ntp.conf /etc/ntp.conf.bak service ntpd status chkconfig ntpd off [root@raclhr-11gR2-N2 ~]# ps -ef|grep ctss root 19678 1 0 19:22 ? 00:00:02 /u01/app/11.2.0/grid/bin/octssd.bin reboot root 20970 20623 0 19:35 pts/4 00:00:00 grep ctss [root@raclhr-11gR2-N2 ~]# [root@raclhr-11gR2-N2 ~]# crsctl stat res -t -init -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.asm 1 ONLINE ONLINE raclhr-11gr2-n2 Started ora.cluster_interconnect.haip 1 ONLINE ONLINE raclhr-11gr2-n2 ora.crf 1 ONLINE ONLINE raclhr-11gr2-n2 ora.crsd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.cssd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.cssdmonitor 1 ONLINE ONLINE raclhr-11gr2-n2 ora.ctssd 1 ONLINE ONLINE raclhr-11gr2-n2 ACTIVE:0 ora.diskmon 1 OFFLINE OFFLINE ora.evmd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.gipcd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.gpnpd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.mdnsd 1 ONLINE ONLINE raclhr-11gr2-n2 [root@raclhr-11gR2-N2 ~]# 节点1的ctss状态: [root@raclhr-11gR2-N1 ~]# crsctl check ctss CRS-4701: The Cluster Time Synchronization Service is in Active mode. CRS-4702: Offset (in msec): 0 [root@raclhr-11gR2-N1 ~]# 节点1的octssd的日志: /u01/app/11.2.0/grid/log/raclhr-11gr2-n1/ctssd/octssd.log 2018-06-30 19:25:56.369: [ CTSS][899475200]sclsctss_gvss2: NTP default pid file not found 2018-06-30 19:25:56.369: [ CTSS][899475200]sclsctss_gvss8: Return [0] and NTP status [1]. 2018-06-30 19:25:56.369: [ CTSS][899475200]ctss_check_vendor_sw: Vendor time sync software is not detected. status [1]. 2018-06-30 19:25:57.002: [ CTSS][916338432]ctss_checkcb: clsdm requested check alive. checkcb_data{mode[0xcc], offset[0 ms]}, length=[8]. 2018-06-30 19:26:01.263: [ CTSS][901576448]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [1]. 2018-06-30 19:26:01.264: [ CTSS][901576448]ctsscomm_msg_hndlr: Received sync msg 2018-06-30 19:26:01.264: [ CTSS][901576448]ctsscomm_msg_hndlr: Received from slave ( mode [0xc4] nodenum [2] hostname [raclhr-11gr2-n2] ) 2018-06-30 19:26:09.267: [ CTSS][901576448]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [1]. 节点1的octssd.log中记录没有发现ntp服务,ctss服务为激活模式。 节点2的ctss状态: [root@raclhr-11gR2-N2 ~]# crsctl check ctss CRS-4701: The Cluster Time Synchronization Service is in Active mode. CRS-4702: Offset (in msec): 0 [root@raclhr-11gR2-N2 ~]# 节点2的octssd的日志: /u01/app/11.2.0/grid/log/raclhr-11gr2-n2/ctssd/octssd.log 2018-06-30 19:28:49.539: [ CTSS][839321344]sclsctss_gvss2: NTP default pid file not found 2018-06-30 19:28:49.539: [ CTSS][839321344]sclsctss_gvss8: Return [0] and NTP status [1]. 2018-06-30 19:28:49.539: [ CTSS][839321344]ctss_check_vendor_sw: Vendor time sync software is not detected. status [1]. 2018-06-30 19:29:05.544: [ CTSS][839321344]ctsselect_msm: CTSS mode is [0xc4] 2018-06-30 19:29:05.544: [ CTSS][839321344]ctssslave_swm1_2: Ready to initiate new time sync process. 2018-06-30 19:29:05.545: [ CTSS][839321344]ctssslave_swm2_1: Waiting for time sync message from master. sync_state[2]. 2018-06-30 19:29:05.546: [ CTSS][845625088]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [2]. 2018-06-30 19:29:05.546: [ CTSS][845625088]ctssslave_msg_handler4_1: Waiting for slave_sync_with_master to finish sync process. sync_state[3]. 2018-06-30 19:29:05.547: [ CTSS][839321344]ctssslave_swm2_3: Received time sync message from master. 2018-06-30 19:29:05.547: [ CTSS][839321344]ctssslave_swm: The system time difference is too small [243] usec. Not adjusting time. 2018-06-30 19:29:05.547: [ CTSS][839321344]ctssslave_swm17: LT [1530358145sec 546888usec], MT [1530358145sec 140655884523349usec], Delta [2314usec] 2018-06-30 19:29:05.547: [ CTSS][839321344]ctssslave_swm19: The offset is [243 usec] and sync interval set to [1] 2018-06-30 19:29:05.547: [ CTSS][839321344]ctssslave_swm: Received from master (mode [0xcc] nodenum [1] hostname [raclhr-11gr2-n1] ) 2018-06-30 19:29:05.547: [ CTSS][839321344]ctsselect_msm: Sync interval returned in [1] 2018-06-30 19:29:05.547: [ CTSS][845625088]ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler 2018-06-30 19:29:07.910: [ CTSS][860387072]ctss_checkcb: clsdm requested check alive. checkcb_data{mode[0xc4], offset[0 ms]}, length=[8]. 节点2的octssd.log中记录没有发现ntp服务,ctss服务为激活模式,同步时间的主节点是节点1,并且会告诉集群的时间有差异,但是因为差异过小,无需调整。 校验集群的时间: cluvfy comp clocksync -n all -verbose 虽然集群时间不一致,但是这种情况下校验结果是通过的,而且略微的差异范围内集群也会自动同步回来。 [grid@raclhr-11gR2-N1 ~]$ cluvfy comp clocksync -n all -verbose Verifying Clock Synchronization across the cluster nodes Checking if Clusterware is installed on all nodes... Check of Clusterware install passed Checking if CTSS Resource is running on all nodes... Check: CTSS Resource running on all nodes Node Name Status ------------------------------------ ------------------------ raclhr-11gr2-n2 passed raclhr-11gr2-n1 passed Result: CTSS resource check passed Querying CTSS for time offset on all nodes... Result: Query of CTSS for time offset passed Check CTSS state started... Check: CTSS state Node Name State ------------------------------------ ------------------------ raclhr-11gr2-n2 Active raclhr-11gr2-n1 Active CTSS is in Active state. Proceeding with check of clock time offsets on all nodes... Reference Time Offset Limit: 1000.0 msecs Check: Reference Time Offset Node Name Time Offset Status ------------ ------------------------ ------------------------ raclhr-11gr2-n2 0.0 passed raclhr-11gr2-n1 0.0 passed Time offset is within the specified limits on the following set of nodes: "[raclhr-11gr2-n2, raclhr-11gr2-n1]" Result: Check of clock time offsets passed Oracle Cluster Time Synchronization Services check passed Verification of Clock Synchronization across the cluster nodes was successful. 1.1.2 NTP同步模式 开启NTP: mv /etc/ntp.conf.bak /etc/ntp.conf service ntpd status /sbin/service ntpd start # chkconfig ntpd off ps -ef|grep ntp 节点1 : [root@raclhr-11gR2-N1 ~]# crsctl check ctss CRS-4700: The Cluster Time Synchronization Service is in Observer mode. [root@raclhr-11gR2-N1 ~]# crsctl stat res -t -init ora.ctssd 1 ONLINE ONLINE raclhr-11gr2-n1 OBSERVER 节点1的ctss日志: /u01/app/11.2.0/grid/log/raclhr-11gr2-n1/ctssd/octssd.log 2018-06-30 20:51:29.388: [ CTSS][899475200]sclsctss_gvss1: NTP default config file found 2018-06-30 20:51:29.389: [ CTSS][899475200]sclsctss_gvss8: Return [0] and NTP status [2]. 2018-06-30 20:51:29.389: [ CTSS][899475200]ctss_check_vendor_sw: Vendor time sync software is detected. status [2]. 2018-06-30 20:51:29.389: [ CTSS][899475200]ctss_check_vendor_sw: Ctssd is switching to observer role 2018-06-30 20:51:29.389: [ CTSS][899475200]clsctsselect_update_mbrdata: Updating pridata: { version[1] node[1] swversion[186647296] mode[0xee] }. 2018-06-30 20:51:29.639: [ CRSCCL][671086336]clsCclGetPriMemberData: Detected pridata change for node[1]. Retrieving it to the cache. 2018-06-30 20:51:31.434: [ CTSS][916338432]ctss_checkcb: clsdm requested check alive. checkcb_data{mode[0xee], offset[0 ms]}, length=[8]. 2018-06-30 20:51:35.258: [ CTSS][901576448]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [1]. 2018-06-30 20:51:35.258: [ CTSS][901576448]ctsscomm_msg_hndlr: Received sync msg 2018-06-30 20:51:35.259: [ CTSS][901576448]ctsscomm_msg_hndlr: Received from slave ( mode [0xc4] nodenum [2] hostname [raclhr-11gr2-n2] ) 2018-06-30 20:51:35.656: [ CRSCCL][671086336]clsCclGetPriMemberData: Detected pridata change for node[2]. Retrieving it to the cache. 2018-06-30 20:51:43.240: [ CTSS][901576448]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [1]. 2018-06-30 20:51:43.240: [ CTSS][901576448]ctsscomm_msg_hndlr: Received sync msg 2018-06-30 20:51:43.240: [ CTSS][901576448]ctsscomm_msg_hndlr: Received from slave ( mode [0xc6] nodenum [2] hostname [raclhr-11gr2-n2] ) 2018-06-30 20:51:51.217: [ CTSS][901576448]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [1]. 2018-06-30 20:51:51.217: [ CTSS][901576448]ctsscomm_msg_hndlr: Received sync msg 2018-06-30 20:51:51.218: [ CTSS][901576448]ctsscomm_msg_hndlr: Received from slave ( mode [0xc6] nodenum [2] hostname [raclhr-11gr2-n2] ) 2018-06-30 20:51:59.194: [ CTSS][901576448]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [1]. 2018-06-30 20:51:59.194: [ CTSS][901576448]ctsscomm_msg_hndlr: Received sync msg 2018-06-30 20:51:59.195: [ CTSS][901576448]ctsscomm_msg_hndlr: Received from slave ( mode [0xc6] nodenum [2] hostname [raclhr-11gr2-n2] ) 节点1的octssd.log中记录发现ntp服务,ctss服务会自动切换到观望模式。 2018-06-30 20:57:27.608: [ CTSS][839321344]ctsselect_msm: CTSS mode is [0xc6] 2018-06-30 20:57:27.608: [ CTSS][839321344]ctssslave_swm1_2: Ready to initiate new time sync process. 2018-06-30 20:57:27.609: [ CTSS][839321344]ctssslave_swm2_1: Waiting for time sync message from master. sync_state[2]. 2018-06-30 20:57:27.612: [ CTSS][845625088]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [2]. 2018-06-30 20:57:27.613: [ CTSS][845625088]ctssslave_msg_handler4_1: Waiting for slave_sync_with_master to finish sync process. sync_state[3]. 2018-06-30 20:57:27.613: [ CTSS][839321344]ctssslave_swm2_3: Received time sync message from master. 2018-06-30 20:57:27.613: [ CTSS][839321344]ctssslave_swm17: LT [1530363447sec 613028usec], MT [1530363447sec 140655884569984usec], Delta [4410usec] 2018-06-30 20:57:27.613: [ CTSS][839321344]ctssslave_swm19: The offset is [19748 usec] and sync interval set to [1] 2018-06-30 20:57:27.613: [ CTSS][839321344]ctssslave_swm: Received from master (mode [0xee] nodenum [1] hostname [raclhr-11gr2-n1] ) 2018-06-30 20:57:27.613: [ CTSS][839321344]ctsselect_msm: Sync interval returned in [1] 2018-06-30 20:57:27.613: [ CTSS][845625088]ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler 节点2的octssd.log中也会记录发现ntp服务,ctss服务为观望模式,并且同步时间的主节点是节点1。 1.1.3 模拟集群时间不一致 如果在我们生产系统中碰到集群时间不一致会导致什么结果,我们的排查思路是怎么样的,以下是模拟集群时间不一致的场景。 更改节点2的时间,向后推移2天: 将系统时间设定成2018年07月02日的命令如下: #date -s 07/02/2018 将系统时间设定成下午23点23分06秒的命令如下。 #date -s 23:23:06 [root@raclhr-11gR2-N2 ctssd]# crsctl stat res -t -init ora.ctssd 1 ONLINE ONLINE raclhr-11gr2-n2 ACTIVE:172768000 [root@raclhr-11gR2-N2 ctssd]# crsctl check ctss CRS-4701: The Cluster Time Synchronization Service is in Active mode. CRS-4702: Offset (in msec): 172768000 172768000微妙大约为2天: SYS@lhrrac11> select 172768000/1000/24/60/60 from dual; 172768000/1000/24/60/60 ----------------------- 1.99962963 更改节点2的时间后,在ASM和DB的alert日志中产生了以下的告警信息: Time drift detected. Please check VKTM trace file for more details. drift表示漂移。 [grid@raclhr-11gR2-N2 trace]$ pwd /u01/app/grid/diag/asm/+asm/+ASM2/trace [grid@raclhr-11gR2-N2 trace]$ ll -lrt *vktm* -rw-r----- 1 grid oinstall 136 May 17 14:09 +ASM2_vktm_29999.trm -rw-r----- 1 grid oinstall 1847 May 17 14:09 +ASM2_vktm_29999.trc -rw-r----- 1 grid oinstall 529 Jun 4 14:52 +ASM2_vktm_32504.trm -rw-r----- 1 grid oinstall 7238 Jun 4 14:52 +ASM2_vktm_32504.trc -rw-r----- 1 grid oinstall 78 Jun 4 14:59 +ASM2_vktm_14800.trm -rw-r----- 1 grid oinstall 1079 Jun 4 14:59 +ASM2_vktm_14800.trc -rw-r----- 1 grid oinstall 90 Jun 4 17:26 +ASM2_vktm_14991.trm -rw-r----- 1 grid oinstall 1200 Jun 4 17:26 +ASM2_vktm_14991.trc -rw-r----- 1 grid oinstall 89 Jun 29 10:05 +ASM2_vktm_17961.trm -rw-r----- 1 grid oinstall 1200 Jun 29 10:05 +ASM2_vktm_17961.trc -rw-r----- 1 grid oinstall 191 Jul 2 21:35 +ASM2_vktm_19774.trm -rw-r----- 1 grid oinstall 3171 Jul 2 21:35 +ASM2_vktm_19774.trc [grid@raclhr-11gR2-N2 trace]$ cat +ASM2_vktm_19774.trc *** 2018-06-30 19:22:12.650 VKTM running at (1)millisec precision with DBRM quantum (100)ms [Start] HighResTick = 1530357732650537 kstmrmtickcnt = 0 : ksudbrmseccnt[0] = 1530357732 kstmchkdrift (kstmhighrestimecntkeeper:highres): Time stalled at 1530363888044519 *** 2018-06-10 20:04:00.000 kstmchkdrift (kstmhighrestimecntkeeper:highres): Time jumped forward by (172844812599)usec at (1528632240000738) whereas (1000000) is allowed usec代表微秒,ms表示毫秒,1s=1000ms=1000000us VKTM进程发现系统时间变了,alert日志会产生相应的告警信息,从产生的trace文件中可知,系统向前推进了172844812599微秒,也即为2天,也就是我们模拟更改的时间,而允许的差异范围为1秒。 SYS@lhrrac11> select 172844812599/1000/1000/24/60/60 from dual; 172844812599/1000/1000/24/60/60 ------------------------------- 2.00051866 节点2的octssd.log中和ctss状态都记录了偏移的时间: 2018-07-02 21:54:39.330: [ CTSS][1400497920]ctsselect_msm: CTSS mode is [0x84] 2018-07-02 21:54:39.330: [ CTSS][1400497920]ctssslave_swm1_2: Ready to initiate new time sync process. 2018-07-02 21:54:39.330: [ CTSS][1400497920]ctssslave_swm2_1: Waiting for time sync message from master. sync_state[2]. 2018-07-02 21:54:39.331: [ CTSS][1404700416]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [2]. 2018-07-02 21:54:39.331: [ CTSS][1404700416]ctssslave_msg_handler4_1: Waiting for slave_sync_with_master to finish sync process. sync_state[3]. 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctssslave_swm2_3: Received time sync message from master. 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctssslave_swm: The magnitude [172757997797] of the offset [172757997797 usec] is larger than [86400000000 usec] sec which is the CTSS limit. 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctssslave_swm: The magnitude of the systime diff is larger than max adjtime limit. Offset [172757997797] usec will be changed to max adjtime limit [+/- 131071]. 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctssslave_swm15: The CTSS master is behind this node. The local time offset [-131071 usec] is being adjusted. Sync method [2] 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctssslave_swm17: LT [1530539679sec 331583usec], MT [1530366921sec 139882790197210usec], Delta [1267usec] 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctssslave_swm19: The offset is [131071 usec] and sync interval set to [4] 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctssslave_swm: Received from master (mode [0x8c] nodenum [1] hostname [raclhr-11gr2-n1] ) 2018-07-02 21:54:39.331: [ CTSS][1400497920]ctsselect_msm: Sync interval returned in [4] 2018-07-02 21:54:39.331: [ CTSS][1404700416]ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler 集群的时间同步校验也是失败的,校验结果是需要同步节点2的时间,此时因为集群时间差异较大,同步服务往往是无法做到的,只有手工同步才能修复。 校验集群的时间同步: [grid@raclhr-11gR2-N2 ~]$ cluvfy comp clocksync -n all -verbose Verifying Clock Synchronization across the cluster nodes Checking if Clusterware is installed on all nodes... Check of Clusterware install passed Checking if CTSS Resource is running on all nodes... Check: CTSS Resource running on all nodes Node Name Status ------------------------------------ ------------------------ raclhr-11gr2-n2 passed raclhr-11gr2-n1 passed Result: CTSS resource check passed Querying CTSS for time offset on all nodes... Result: Query of CTSS for time offset passed Check CTSS state started... Check: CTSS state Node Name State ------------------------------------ ------------------------ raclhr-11gr2-n2 Active raclhr-11gr2-n1 Active CTSS is in Active state. Proceeding with check of clock time offsets on all nodes... Reference Time Offset Limit: 1000.0 msecs Check: Reference Time Offset Node Name Time Offset Status ------------ ------------------------ ------------------------ raclhr-11gr2-n2 1.727568E8 failed raclhr-11gr2-n1 0.0 passed Result: PRVF-9661 : Time offset is greater than acceptable limit on node "raclhr-11gr2-n2" [actual = "1.727568E8", acceptable = "1000.0" ] PRVF-9652 : Cluster Time Synchronization Services check failed Verification of Clock Synchronization across the cluster nodes was unsuccessful. Checks did not pass for the following node(s): raclhr-11gr2-n2 1.727568E8表示科学计数法,为1.7*10的8次方,即172756800ms,即2天。 在没有同步时间之前,重启节点2是无法正常启动的,从以下命令可知是在ctss这一步有问题,通过重新更改正确时间后,集群才能正常启动。 [root@raclhr-11gR2-N2 ~]# crsctl stat res -t -init -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.asm 1 ONLINE OFFLINE Instance Shutdown ora.cluster_interconnect.haip 1 ONLINE ONLINE raclhr-11gr2-n2 ora.crf 1 ONLINE ONLINE raclhr-11gr2-n2 ora.crsd 1 ONLINE OFFLINE ora.cssd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.cssdmonitor 1 ONLINE ONLINE raclhr-11gr2-n2 ora.ctssd 1 ONLINE OFFLINE ora.diskmon 1 OFFLINE OFFLINE ora.evmd 1 ONLINE OFFLINE ora.gipcd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.gpnpd 1 ONLINE ONLINE raclhr-11gr2-n2 ora.mdnsd 1 ONLINE ONLINE raclhr-11gr2-n2 查看集群的告警日志: /u01/app/11.2.0/grid/log/raclhr-11gr2-n2/alertraclhr-11gr2-n2.log 2018-07-02 22:05:36.344 [ctssd(30350)]CRS-2405:The Cluster Time Synchronization Service on host raclhr-11gr2-n2 is shutdown by user 2018-07-02 22:05:40.689 [ctssd(30358)]CRS-2407:The new Cluster Time Synchronization Service reference node is host raclhr-11gr2-n1. 2018-07-02 22:05:40.689 [ctssd(30358)]CRS-2401:The Cluster Time Synchronization Service started on host raclhr-11gr2-n2. 2018-07-02 22:05:42.704 [ctssd(30358)]CRS-2404:The Cluster Time Synchronization Service detects that the local time is significantly different from the mean cluster time. Details in /u01/app/11.2.0/grid/log/raclhr-11gr2-n2/ctssd/octssd.log. 2018-07-02 22:05:43.395 [ctssd(30358)]CRS-2402:The Cluster Time Synchronization Service aborted on host raclhr-11gr2-n2. Details at in /u01/app/11.2.0/grid/log/raclhr-11gr2-n2/ctssd/octssd.log. 2018-07-02 22:05:44.404 [ohasd(29989)]CRS-2807:Resource 'ora.asm' failed to start automatically. 2018-07-02 22:05:44.405 [ohasd(29989)]CRS-2807:Resource 'ora.crsd' failed to start automatically. 2018-07-02 22:05:44.405 [ohasd(29989)]CRS-2807:Resource 'ora.ctssd' failed to start automatically. 2018-07-02 22:05:44.405 [ohasd(29989)]CRS-2807:Resource 'ora.evmd' failed to start automatically. 查看octssd.log 2018-07-02 22:05:42.702: [ CTSS][1805252352]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [3]. 2018-07-02 22:05:42.702: [ CTSS][1805252352]ctsscomm_recv_cb4_2: Receive active version change msg. Old active version [186647296] New active version [186647296]. 2018-07-02 22:05:42.702: [ CTSS][1805252352]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [2]. 2018-07-02 22:05:42.702: [ CTSS][1805252352]ctssslave_msg_handler4_1: Waiting for slave_sync_with_master to finish sync process. sync_state[3]. 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctssslave_swm2_3: Received time sync message from master. 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctssslave_swm: sendtime{sec[1530540340], usec[690191]}, receivetime{sec[1530540342], usec[702977]}. 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctssslave_swm: The RTT of sync msg [2012786] is too large for time sync to be accurate. Recommends retry. Returns [17]. 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctssslave_swm: Received from master (mode [0x8c] nodenum [1] hostname [raclhr-11gr2-n1] ) 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctsselect_monitor_steysync_mode: Failed in clsctssslave_sync_with_master [17]. Retries [0/3]. 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctssslave_swm1_1: Waiting for last time sync process to finish. sync_state[6]. 2018-07-02 22:05:42.703: [ CTSS][1805252352]ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctssslave_swm1_2: Ready to initiate new time sync process. 2018-07-02 22:05:42.703: [ CTSS][1798948608]ctssslave_swm2_1: Waiting for time sync message from master. sync_state[2]. 2018-07-02 22:05:42.704: [ CTSS][1805252352]ctsscomm_recv_cb2: Receive incoming message event. Msgtype [2]. 2018-07-02 22:05:42.704: [ CTSS][1805252352]ctssslave_msg_handler4_1: Waiting for slave_sync_with_master to finish sync process. sync_state[3]. 2018-07-02 22:05:42.704: [ CTSS][1798948608]ctssslave_swm2_3: Received time sync message from master. 2018-07-02 22:05:42.704: [ CTSS][1798948608]ctssslave_swm: The magnitude [172752141259 usec] of the offset [172752141259 usec] is larger than [86400000000 usec] sec which is the CTSS limit. 2018-07-02 22:05:42.704: [ CTSS][1798948608]ctsselect_monitor_steysync_mode: Failed in clsctssslave_sync_with_master [12]: Time offset is too much to be corrected 2018-07-02 22:05:42.704: [ CTSS][1805252352]ctssslave_msg_handler4_3: slave_sync_with_master finished sync process. Exiting clsctssslave_msg_handler 2018-07-02 22:05:43.395: [ CTSS][2023593728]ctss_checkcb: clsdm requested check alive. checkcb_data{mode[0xd0], offset[172752141 ms]}, length=[8]. 2018-07-02 22:05:43.395: [ CTSS][1798948608]ctsselect_monitor_steysync_mode: CTSS daemon exiting [12]. 2018-07-02 22:05:43.395: [ CTSS][1798948608]CTSS daemon aborting 2018-07-02 22:05:44.398: [ CTSS][2023593728]ctss_checkcb: clsdm requested check alive. checkcb_data{mode[0xd0], offset[172752141 ms]}, length=[8]. 下面开始修复系统: 将系统时间设定成2018年06月30日的命令如下: #date -s 06/30/2018 将系统时间设定成下午23点23分06秒的命令如下。 #date -s 22:14:06 然后重启CRS服务: crsctl stop crs -f crsctl start crs 然后ctss自动同步时间: [root@raclhr-11gR2-N2 ctssd]# crsctl stat res -t -init -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.ctssd 1 ONLINE ONLINE raclhr-11gr2-n2 ACTIVE:100 [root@raclhr-11gR2-N2 ctssd]# crsctl stat res -t -init ora.ctssd 1 ONLINE ONLINE raclhr-11gr2-n2 ACTIVE:0 小麦苗课程 小麦苗课堂开课啦,如下是现有的课程,欢迎咨询小麦苗: 课程名称 课时 上课时间 价格 OCP(从入门到专家) 每年1期,35课时左右/期 20:00-22:00 1588(可优惠) OCM认证 每年N期,9课时/期 20:00-22:00 22888 高可用课程(rac+dg+ogg) 每年1期,20课时左右/期 20:00-22:00 1888(可优惠) Oracle初级入门 每年1期,15课时左右/期 20:00-22:00 800 Oracle健康检查脚本 可微信或微店购买。 88 Oracle数据库技能直通车 包含如下3个课程: ①《11g OCP网络课程培训》(面向零基础) 价值1600元 ②《11g OCM网络班课程培训》(Oracle技能合集)价值10000+元 ③《RAC + DG + OGG 高可用网络班课程》 价值2000元 以上3个课程全部打包只要5888,只要5888所有课程带回家,终身指导!所有课程都是在线讲课,不是播放视频,课件全部赠送! 注意:以上OCP和OCM课程只包括培训课程,不包括考试费用。OCM提供培训+视频,但是不提供练习环境和资料。报名一次,OCP和高可用的课程可以免费终身循环听课。 5888 OCP+高可用(rac+dg+ogg) 报名OCP+高可用课程,可以优惠300元,优惠后的价格为3188. 3188(可优惠) 注意: 1、每次上课前30分钟答疑。 2、OCM实时答疑,提供和考试一样的练习模拟环境,只要按照老师讲的方式来练习,可以保证100%通过。 3、授课方式:YY语音网络直播讲课(非视频) + QQ互动答疑 + 视频复习。 4、OCP课时可以根据大家学习情况进行增加或缩减。 5、以上所有课程均可循环听课。 6、12c OCM课程私聊。 7、Oracle初级入门课程,只教大家最实用+最常用的Oracle操作维护知识。 8、以上所有课程,可以加小麦苗微信(lhrbestxh)或QQ(646634621)详聊,优惠多多。 培训项目 连接地址 DB笔试面试历史连接 http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w OCP培训说明连接 https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA OCM培训说明连接 https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA 高可用(RAC+DG+OGG)培训说明连接 https://mp.weixin.qq.com/s/4vf042CnOdAD8zDyjUueiw OCP最新题库解析历史连接(052) http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA 微店地址 https://weidian.com/s/793741433?wfr=c&ifr=shopdetail About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2018-06-01 06:00 ~ 2018-06-31 24:00 在魔都完成 ● 最新修改时间:2018-06-01 06:00 ~ 2018-06-31 24:00 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麦苗OCP、OCM、高可用网络班:http://blog.itpub.net/26736162/viewspace-2148098/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微信,学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 小麦苗的微信二维码 小麦苗的微店 .............................................................................................................................................
【OCP|052】OCP最新题库解析(052)--小麦苗解答版 OCP最新题库解析历史连接(052):http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA ⊙ 【OCP最新题库解析(052)--题20】Which command is used to display files that⊙ 【OCP最新题库解析(052)--题19】Which two are true about the DRA?⊙ 【OCP最新题库解析(052)--题18】 Which two are true about server-generated⊙ 【OCP最新题库解析(052)--题17】 Which three are true about the (AWR)?⊙ 【OCP最新题库解析(052)--题16】Your database instance is in NOMOUNT state⊙ 【OCP最新题库解析(052)--题15】 Which two are true about roles?⊙ 【OCP最新题库解析(052)--题14】 Which three are true about advisors in an⊙ 【OCP最新题库解析(052)--题13】Archivelog mode is enabled for your databas⊙ 【OCP最新题库解析(052)--题12】 Your database is using AMM⊙ 【OCP最新题库解析(052)--题11】Which is true about the (ADR)⊙ 【OCP最新题库解析(052)--题10】 Which two are true about the Archive (ARCn⊙ 【OCP最新题库解析(052)--题9】You want to install Oracle 11g database⊙ 【OCP最新题库解析(052)--题8】Which two are true about undo tablespaces?⊙ 【OCP最新题库解析(052)--题7】 Examine theses SQL statements and output⊙ 【OCP最新题库解析(052)--题6】Which structure can span multiple data files⊙ 【OCP最新题库解析(052)--题5】Which two are true about roles?⊙ 【OCP最新题库解析(052)--题4】Which four are true about the tools used to?⊙ 【OCP最新题库解析(052)--题3】Which two are true about external tables?⊙ 【OCP最新题库解析(052)--题2】...is true about FAST_START_MTTR_TARGET⊙ 【OCP最新题库解析(052)--题1】Which is true about the SYSTEM and SYSAUX表空间 小麦苗课堂培训认证:OCP培训说明连接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuAOCM培训说明连接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA高可用(RAC+DG+OGG)培训说明连接:https://mp.weixin.qq.com/s/4vf042CnOdAD8zDyjUueiw
Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程? 麦苗答:方法有多种,可以使用DBMS_METADATA.GET_DDL包。 > & > > > < > > > > > >>> > > > > > > > < < & & & & > >> > &
ORA-01578和ORA-26040--NOLOGGING操作引起的坏块-错误解释和解决方案(文档ID 1623284.1) (一)NOLOGGING操作引起的坏块(ORA-01578和ORA-26040)简介 如果只是错误ORA-01578,而没有伴随ORA-26040,那么这个坏块是由其它的原因引起的坏块,可以尝试使用RMAN的BMR(Block Media Recovery)修复。 如果数据段(表段、索引段)被定义为NOLOGGING属性,那么当NOLOGGING加APPEND、UNRECOVERABLE操作修改该数据段或者使用数据泵(DATAPUMP)impdp参数DISABLE_ARCHIVE_LOGGING:Y时,联机重做日志只会记录很少的日志信息。如果这些联机重做日志或归档日志被用来恢复数据文件,那么Oracle会将对应的数据块标志为无效(Soft Corrupt),而且下一次访问这些数据块时,会报ORA-01578和ORA-26040错误。 例如: SQL> select * from test_nologging; ORA-01578: ORACLE data block corrupted (file # 11, block # 84) ORA-01110: data file 4: '/oradata/users.dbf' ORA-26040: Data block was loaded using the NOLOGGING option 数据字典视图DBA_TABLES、DBA_INDEXES、DBA_LOBS、DBA_TAB_PARTITIONS、DBA_LOB_PARTITIONS、DBA_TAB_SUBPARTITIONS中的LOGGING列记录了NOLOGGING属性。若LOGGING='NO'则表示NOLOGGING。 数据泵DATAPUMP的impdp参数DISABLE_ARCHIVE_LOGGING:Y在执行导入时会禁止LOGGING定义,而产生NOLOGGING操作。如果相应的datafile被restored和recovered,那么接下来的涉及到目标表的查询会报错ORA-1578和ORA-26040。如果数据库是FORCE LOGGING模式,那么DISABLE_ARCHIVE_LOGGING选项不会关闭LOGGING。 impdp使用参数“DISABLE_ARCHIVE_LOGGING:Y”的一个例子: impdp scott/tiger directory=DATA_PUMP_DIR dumpfile=dp transform=disable_archive_logging:y NOLOGGING导致的坏块不会导致RMAN备份失败。一般来说soft corrupt block不会导致RMAN备份失败,不需要设置MAXCORRUPT。数据库备份中就会含有soft corrupt block,如果使用这些备份恢复数据,那么恢复的数据也含有soft corrupt block。 除ORA-26040错误之外,当还有一些其他通用信息出现时,block dump可能会被产生。如果数据块的block dump内有byte 0xff信息或者属于某个段,ORA-1578和ORA-26040会因为介质恢复了NOLOGGING的部分导致了corruption而出现。 (二)利用RMAN、DBV检测NOLOGGING导致的坏块 DBV在检测坏块时,如果RDBMS版本小于10.2.0.4,那么DBV打印错误DBV-200,如果RDBMS版本大于或等于10.2.0.4,那么DBV打印错误DBV-201: DBV-00200: Block, dba 46137428, already marked corrupted DBV-00201: Block, DBA 46137428, marked corrupt for invalid redo application RMAN的VALIDATE命令可以用来检测NOLOGGING数据块,检查结果记录在视图V$DATABASE_BLOCK_CORRUPTION(小于12c的版本)和V$NONLOGGED_BLOCK(12c及其以上)。 下面的例子中检查出DATAFILE 4有933坏块,查询V$DATABASE_BLOCK_CORRUPTION或者V$NONLOGGED_BLOCK。 RMAN> VALIDATE DATABASE; ... ..... File Status Marked Corrupt Empty Blocks Blocks Examined High SCN ---- ------ -------------- ------------ --------------- ---------- 4 OK 933 1 6401 2275124 File Name: /oracle/dbs/users.dbf RMAN在检测坏块时,如果RDBMS版本小于10.2.0.5和11.1.0.7,RMAN打印如下错误: 10.2.0.4 and lower, 11.1.0.6, 11.1.0.7: RMAN validate reports it in v$database_block_corruption with CORRUPTION_TYPE=LOGICAL 如果RDBMS版本大于或等于10.2.0.5和11.2.0.1,RMAN报告,查看视图v$database_block_corruption中CORRUPTION_TYPE=NOLOGGING的记录。 10.2.0.5 and 11.2.0.1+: RMAN validate reports it in v$database_block_corruption with CORRUPTION_TYPE=NOLOGGING 在12c及以后版本中,RMAN validate的结果不在视图v$database_block_corruption中,而是在视图v$nonlogged_block。从12.2 版本开始,可以使用新的命令:“validate .. nonlogged block”去验证nologging的block。 在以下的例子中,数据文件5和6有nologged的block: RMAN> validate database nonlogged block; Starting validate at ... using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=133 device type=DISK channel ORA_DISK_1: starting validation of datafile channel ORA_DISK_1: validation complete, elapsed time: 00:00:35 List of Datafiles ================= File Status Nonlogged Blocks Blocks Examined Blocks Skipped ---- ------ ---------------- --------------- -------------- 1 OK 0 106363 0 2 OK 0 78919 0 3 OK 0 96639 0 4 OK 0 4991 0 5 OK 400 2559 0 6 OK 569 2559 0 Details of nonlogged blocks can be queried from v$nonlogged_block view 在告警日志中会更新以下信息: Started Nonlogged Block Replacement recovery(validate) on file 5 (ospid 26351 rcvid 10616970560844821494) Finished Nonlogged Block Replacement recovery(validate) on file 5. 400 blocks found Started Nonlogged Block Replacement recovery(validate) on file 6 (ospid 26351 rcvid 10616970560844821494) Finished Nonlogged Block Replacement recovery(validate) on file 6. 569 blocks found (三)监控NOLOGGING操作 若执行了NOLOGGING操作,并且之后在没有备份的情况下,RMAN命令“REPORT UNRECOVERABLE”可以查询出被影响的datafile。 RMAN> report unrecoverable; using target database control file instead of recovery catalog Report of files that need backup due to unrecoverable operations File Type of Backup Required Name ---- ----------------------- ----------------------------------- 4 full or incremental /oracle/dbs/users.dbf 当初始化参数db_unrecoverable_scn_tracking设置为true(默认值,该参数在10g中是不可用的),那么V$DATAFILE中以下列会被更新; SYS@lhr121> select UNRECOVERABLE_CHANGE# , 2 UNRECOVERABLE_TIME , 3 FIRST_NONLOGGED_SCN , 4 FIRST_NONLOGGED_TIME from v$datafile where file#=6; UNRECOVERABLE_CHANGE# UNRECOVERABLE_TIME FIRST_NONLOGGED_SCN FIRST_NONLOGGED_TIM --------------------- ------------------- ------------------- ------------------- 2878238 2018-04-10 10:53:47 2878238 2018-04-10 10:53:47 在11.2.0.4 或12.1.0.2+版本中,设置event 16490的情况下,物理备库的MRP进程会检查出NOLOGGING变化,并记录在alert log。 ORA-16490 "logging invalidated blocks on standby due to invalidation redo" "INVD_BLKS: Invalidating (file <file number>, bno <block number>)" "fname: 'Datafile name'. rdba: ..." (四)识别数据块什么时候被标志为NOLOGGING 识别数据块什么时候被标志为NOLOGGING,可以将trace文件中数据块SCN或者v$database_block_coruption视图中CORRUPTION_CHANGE#值转换为时间: ① 使用trace文件中数据块SCN,例如: Start dump data blocks tsn: 60 file#: 4 minblk 84 maxblk 84 buffer tsn: 3 rdba: 0x02c00054 (11/84) scn: 0x0771.4fa24eb5 seq: 0xff flg: 0x04 tail: 0x4eb500ff 提取SCN值0x0771.4fa24eb5,删除'.',然后转换0x07714fa24eb到十进制511453045995。 ② 使用v$database_block_coruption视图中CORRUPTION_CHANGE#值 如果运行RMAN validate命令后,v$database_block_coruption视图中corruption_type='NOLOGGING' (10.2.0.5 和 11.2.0.1+),那么CORRUPTION_CHANGE#列的值就是十进制的SCN值。可以使用下面的方法获得SCN Timestamp时间: select scn_to_timestamp(&&decimal_scn) from dual; 如果运行RMAN validate: select file#, block#, scn_to_timestamp(CORRUPTION_CHANGE#) from v$database_block_corruption where CORRUPTION_TYPE='NOLOGGING'; 在12c中: select file#, block#, scn_to_timestamp(NONLOGGED_START_CHANGE#) from v$nonlogged_block; 如果查询gv$archived_log 或 gv$log_history遇到错误ORA-08181: alter session set nls_date_format = 'DD-MON-YY HH24:MI:SS'; select first_time, next_time from gv$archived_log where &decimal_scn between first_change# and next_change#; 或 select first_time from gv$log_history where &decimal_scn between first_change# and next_change#; 如果运行RMAN validate: alter session set nls_date_format = 'DD-MON-YY HH24:MI:SS'; select file#, block#, first_time, next_time from v$archived_log, v$database_block_corruption where CORRUPTION_CHANGE# between first_change# and next_change# and CORRUPTION_TYPE='NOLOGGING'; 或 select file#,block#,first_time from v$log_history, v$database_block_corruption where CORRUPTION_CHANGE# between first_change# and next_change# and CORRUPTION_TYPE='NOLOGGING'; 12c: alter session set nls_date_format = 'DD-MON-YY HH24:MI:SS'; select file#, block#, first_time, next_time from v$nonlogged_block, v$archived_log where NONLOGGED_START_CHANGE# between first_change# and next_change#; 或 select file#, block#, first_time from v$nonlogged_block, v$log_history where NONLOGGED_START_CHANGE# between first_change# and next_change#; (五)SYSAUX表空间、AWR、EM等出现NOARCHIVELOG和NOLOGGING问题 如果数据库版本是11.1.0.6 或 11.1.0.7 或 11.2.0.1,对NOLOGGING对象执行过DIRECT PATH操作,并且后续执行了RECOVER DATABASE命令,即使数据库FORCE LOGGING是打开的情况下,会出现ORA-1578和ORA-26040错误。这种问题经常发生在SYSAUX表空间中的AWR或EM对象。请参考Note 1071869.1。注意数据库当前版本可能已经大于11.1 或者 11.2.0.1但是问题可能是在升级之前产生的。这个约束在11.2.0.2以上版本中取消,这个问题在10g不会发生。 RDBMS版本变化: RDBMS版本 变化 10.2.0.4+ DBverify报告NOLOGGING block错误信息 "DBV-00201: Block, DBA <rdba>, marked corrupt for invalid redo application" 10.2.0.5, 10.2.0.1+ RMAN validate命令检查NOLOGGING block,在v$database_block_coruption视图中记录corruption_type='NOLOGGING' 11g+ 引入db_unrecoverable_scn_tracking参数 11.1.0.6 or 11.1.0.7 or 11.2.0.1 NOARCHIVELOG模式数据库,对NOLOGGING对象执行了DIRECT PATH操作,并且以后手动恢复数据库,即使打开了FORCE LOGGING,也会报ORA-1578 和 ORA-26040。这个约束在11.2.0.2以上版本取消,这个问题在10g不会发生。 12c RMAN validate的结果不在视图v$database_block_corruption中,而是在视图v$nonlogged_block 12.2 以下RMAN命令被引入: RMAN> validate [database / datafile] nonlogged block; RMAN> recover [database / datafile] nonlogged block; -> 对于 Standby 数据库 (六)解决方法 NOLOGGING操作引起的坏块是不能修复的,比如“Media Recovery”或“RMAN blockrecover”都无法修复这种坏块。可行的方法是在NOLOGGING操作之后立刻备份对应的数据文件。 如果错误是执行RMAN DUPLICATE 或 RESTORE之后产生的,那么在源库打开FORCE LOGGING,然后再重新运行RMAN DUPLICATE 或 RESTORE。 alter database force logging; 如果错误出现在物理STANDBY数据库,那么可以从主库恢复被影响的数据文件(只有当主库没有这个问题的情况下)。参考文档Doc ID 958181.1。在Oracle 12c中可以使用RMAN选项RECOVER NONLOGGED BLOCK with DATAFILE、TABLESPACE、DATABASE。例如: RMAN> RECOVER DATABASE NONLOGGED BLOCK; 为了避免这个问题发生,在主库强制生产日志: alter database force logging; 如果同一个datafile的数据块在主库出现nologging坏块,但是备库没有,可以通过手动跳过(dbms_repair)坏块或者设置event 10231。主库出现nologging坏块可能是由于主库执行过备份恢复或者之前是备库,执行了switchover。 如果NOLOGGING数据块位于空闲数据块(dba_free_space视图可以查询到),那么DBVerify检查会发现这个问题,报错DBV-00201或者在v$database_block_corruption视图中显示。对于这种情况,可以等待到这个数据块被重用时会自动格式化或者手动强制格式化。 如果是索引,那么可以重新创建(drop/create)索引。如果是表,那么可以使用存储过程DBMS_REPAIR.SKIP_CORRUPT_BLOCKS跳过坏块,然后考虑是否重建表。 在删除有坏块的段之后,这个坏块就处于空闲状态,后续可以被分配给其他对象或段,当这个坏块被分配给其它对象或段时,这个数据块被重新格式化。如果v$database_block_corruption视图中还是显示为坏块,那么可以手动运行rman validate来清除视图中的信息。 如果是LOB,那么请参考Note 293515.1。 实验一:DISABLE_ARCHIVE_LOGGING:Y RMAN> list backupset of datafile 6; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ ------------------- 12 Full 352.78M DISK 00:03:21 2018-04-09 14:50:59 BP Key: 12 Status: AVAILABLE Compressed: YES Tag: TAG20180409T144738 Piece Name: /u04/flash_recovery_area/LHR121/backupset/2018_04_09/o1_mf_nnndf_TAG20180409T144738_fdp34bfm_.bkp List of Datafiles in backup set 12 File LV Type Ckp SCN Ckp Time Name ---- -- ---- ---------- ------------------- ---- 6 Full 2865977 2018-04-09 14:47:38 /u04/oradata/lhr121/users01.dbf [oracle@rhel6lhr env_oracle]$ impdp scott/tiger dumpfile=log.dmp tables=T_LOG TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y remap_schema=LHR:SCOTT Import: Release 12.1.0.2.0 - Production on Tue Apr 10 10:53:17 2018 Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options ORA-39002: invalid operation ORA-39166: Object SCOTT.T_LOG was not found or could not be exported or imported. [oracle@rhel6lhr env_oracle]$ impdp lhr/lhr dumpfile=log.dmp tables=T_LOG TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y remap_schema=LHR:SCOTT Import: Release 12.1.0.2.0 - Production on Tue Apr 10 10:53:40 2018 Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options Master table "LHR"."SYS_IMPORT_TABLE_02" successfully loaded/unloaded Starting "LHR"."SYS_IMPORT_TABLE_02": lhr/******** dumpfile=log.dmp tables=T_LOG TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y remap_schema=LHR:SCOTT Processing object type TABLE_EXPORT/TABLE/TABLE Processing object type TABLE_EXPORT/TABLE/TABLE_DATA . . imported "SCOTT"."T_LOG" 34.24 KB 9 rows Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER Job "LHR"."SYS_IMPORT_TABLE_02" successfully completed at Tue Apr 10 10:54:14 2018 elapsed 0 00:00:32 [oracle@rhel6lhr env_oracle]$ rm -rf /u04/oradata/lhr121/users01.dbf [oracle@rhel6lhr env_oracle]$ rman target / Recovery Manager: Release 12.1.0.2.0 - Production on Tue Apr 10 10:55:09 2018 Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved. connected to target database: LHR121 (DBID=3221842516) RMAN> restore datafile 6; Starting restore at 2018-04-10 10:55:17 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=29 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring datafile 00006 to /u04/oradata/lhr121/users01.dbf channel ORA_DISK_1: reading from backup piece /u04/flash_recovery_area/LHR121/backupset/2018_04_09/o1_mf_nnndf_TAG20180409T144738_fdp34bfm_.bkp RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of restore command at 04/10/2018 10:55:20 ORA-19870: error while restoring backup piece /u04/flash_recovery_area/LHR121/backupset/2018_04_09/o1_mf_nnndf_TAG20180409T144738_fdp34bfm_.bkp ORA-19573: cannot obtain exclusive enqueue for datafile 6 RMAN> startup force mount Oracle instance started database mounted Total System Global Area 658505728 bytes Fixed Size 2927864 bytes Variable Size 285213448 bytes Database Buffers 364904448 bytes Redo Buffers 5459968 bytes RMAN> restore datafile 6; Starting restore at 2018-04-10 10:57:02 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=12 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring datafile 00006 to /u04/oradata/lhr121/users01.dbf channel ORA_DISK_1: reading from backup piece /u04/flash_recovery_area/LHR121/backupset/2018_04_09/o1_mf_nnndf_TAG20180409T144738_fdp34bfm_.bkp channel ORA_DISK_1: piece handle=/u04/flash_recovery_area/LHR121/backupset/2018_04_09/o1_mf_nnndf_TAG20180409T144738_fdp34bfm_.bkp tag=TAG20180409T144738 channel ORA_DISK_1: restored backup piece 1 channel ORA_DISK_1: restore complete, elapsed time: 00:00:03 Finished restore at 2018-04-10 10:57:06 RMAN> recover datafile 6; Starting recover at 2018-04-10 10:57:13 using channel ORA_DISK_1 starting media recovery archived log for thread 1 with sequence 39 is already on disk as file /u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_39_fdp3bvmm_.arc archived log for thread 1 with sequence 40 is already on disk as file /u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_40_fdp3bvoz_.arc archived log for thread 1 with sequence 41 is already on disk as file /u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_41_fdp7bhhl_.arc archived log for thread 1 with sequence 42 is already on disk as file /u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_42_fdp7ccfv_.arc archived log for thread 1 with sequence 43 is already on disk as file /u04/flash_recovery_area/LHR121/archivelog/2018_04_10/o1_mf_1_43_fdr7xxg4_.arc archived log for thread 1 with sequence 44 is already on disk as file /u04/flash_recovery_area/LHR121/archivelog/2018_04_10/o1_mf_1_44_fdr7yc13_.arc archived log file name=/u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_39_fdp3bvmm_.arc thread=1 sequence=39 archived log file name=/u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_40_fdp3bvoz_.arc thread=1 sequence=40 archived log file name=/u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_41_fdp7bhhl_.arc thread=1 sequence=41 archived log file name=/u04/flash_recovery_area/LHR121/archivelog/2018_04_09/o1_mf_1_42_fdp7ccfv_.arc thread=1 sequence=42 media recovery complete, elapsed time: 00:00:01 Finished recover at 2018-04-10 10:57:15 RMAN> alter database open; Statement processed RMAN> SYS@lhr121> select * from v$nonlogged_block; FILE# BLOCK# BLOCKS NONLOGGED_START_CHANGE# NONLOGGED_START_TIM NONLOGGED_END_CHANGE# NONLOGGED_END_TIME RESETLOGS_CHANGE# RESETLOGS_TIME OBJECT# REASON CON_ID ---------- ---------- ---------- ----------------------- ------------------- --------------------- ------------------- ----------------- ------------------- ---------------------------------------- ------- ---------- 6 1939 1 2878238 2878238 UNKNOWN 0 SYS@lhr121> select file#, block#, scn_to_timestamp(NONLOGGED_START_CHANGE#) 2 from v$nonlogged_block; FILE# BLOCK# SCN_TO_TIMESTAMP(NONLOGGED_START_CHANGE#) ---------- ---------- --------------------------------------------------------------------------- 6 1939 10-APR-18 10.52.44.000000000 AM SYS@lhr121> SELECT TABLESPACE_NAME, 2 SEGMENT_TYPE, 3 OWNER, 4 SEGMENT_NAME, 5 PARTITION_NAME 6 FROM DBA_EXTENTS 7 WHERE FILE_ID = 6 8 AND 1939 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1 9 ; TABLESPACE_NAME SEGMENT_TYPE OWNER SEGMENT_NAME PARTITION_NAME ------------------- ------------------ ------------------ ----------------- ----------------- USERS TABLE SCOTT T_LOG SYS@lhr121> SELECT DBMS_ROWID.ROWID_OBJECT(ROWID) OBJECT_ID, 2 DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) FILE_ID, 3 DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK_ID, 4 COUNT(1) COUNTS 5 FROM scott.t_log 6 GROUP BY DBMS_ROWID.ROWID_OBJECT(ROWID), 7 DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID), 8 DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) 9 ORDER BY DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID); OBJECT_ID FILE_ID BLOCK_ID COUNTS ---------- ---------- ---------- ---------- 94411 6 1939 9 SYS@lhr121> SYS@lhr121> select * from scott.t_log; select * from scott.t_log * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 6, block # 1939) ORA-01110: data file 6: '/u04/oradata/lhr121/users01.dbf' ORA-26040: Data block was loaded using the NOLOGGING option SYS@lhr121> select UNRECOVERABLE_CHANGE# , 2 UNRECOVERABLE_TIME , 3 FIRST_NONLOGGED_SCN , 4 FIRST_NONLOGGED_TIME from v$datafile where file#=6; UNRECOVERABLE_CHANGE# UNRECOVERABLE_TIME FIRST_NONLOGGED_SCN FIRST_NONLOGGED_TIM --------------------- ------------------- ------------------- ------------------- 2878238 2018-04-10 10:53:47 2878238 2018-04-10 10:53:47 实验二:NOLOGGING+APPEND LHR@ora11g > create table test_nologging as select * from user_tables; Table created. LHR@ora11g > alter table test_nologging nologging; Table altered. LHR@ora11g > select tablespace_name from user_tables where table_name='TEST_NOLOGGING'; TABLESPACE_NAME ------------------------------ USERS SYS@ora11g > alter database no force logging; Database altered. SYS@ora11g > select force_logging from v$database; FOR --- NO SYS@ora11g > alter database drop supplemental log data; Database altered. SYS@ora11g > alter database drop supplemental log data(all,primary key,unique,foreign key) columns; Database altered. SYS@ora11g > SELECT supplemental_log_data_min min, 2 supplemental_log_data_pk pk, 3 supplemental_log_data_ui ui, 4 supplemental_log_data_fk fk, 5 supplemental_log_data_all allc 6 FROM v$database; MIN PK UI FK ALL -------- --- --- --- --- NO NO NO NO NO LHR@ora11g > exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@rhel6lhr env_oracle]$ rman target / Recovery Manager: Release 11.2.0.3.0 - Production on Tue Apr 10 13:27:25 2018 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: ORA11G (DBID=4270446895) RMAN> backup datafile 4; Starting backup at 2018-04-10 13:27:37 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=155 device type=DISK channel ORA_DISK_1: starting full datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set input datafile file number=00004 name=/u01/app/oracle/oradata/ora11g/users01.dbf channel ORA_DISK_1: starting piece 1 at 2018-04-10 13:27:39 channel ORA_DISK_1: finished piece 1 at 2018-04-10 13:29:36 piece handle=/u05/app/oracle/flash_recovery_area/ORA11G/backupset/2018_04_10/o1_mf_nnndf_TAG20180410T132739_fdrltcot_.bkp tag=TAG20180410T132739 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:01:58 Finished backup at 2018-04-10 13:29:37 RMAN> exit Recovery Manager complete. [oracle@rhel6lhr oradata]$ sas SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 10 14:14:15 2018 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@ora11g > conn lhr/lhr Connected. LHR@ora11g > insert /*+append */ into TEST_NOLOGGING select * from test_nologging; 3264 rows created. LHR@ora11g > commit; Commit complete. LHR@ora11g > exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@rhel6lhr oradata]$ mv /u01/app/oracle/oradata/ora11g/users01.dbf /u01/app/oracle/oradata/ora11g/users01.dbf_bk [oracle@rhel6lhr oradata]$ [oracle@rhel6lhr oradata]$ sas SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 10 14:11:34 2018 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@ora11g > startup force mount exit ORACLE instance started. Total System Global Area 409194496 bytes Fixed Size 2228864 bytes Variable Size 322964864 bytes Database Buffers 75497472 bytes Redo Buffers 8503296 bytes Database mounted. SYS@ora11g > Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@rhel6lhr oradata]$ [oracle@rhel6lhr oradata]$ [oracle@rhel6lhr oradata]$ [oracle@rhel6lhr oradata]$ [oracle@rhel6lhr oradata]$ rman target / Recovery Manager: Release 11.2.0.3.0 - Production on Tue Apr 10 14:11:57 2018 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: ORA11G (DBID=4270446895, not open) RMAN> restore datafile 4; Starting restore at 2018-04-10 14:12:07 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=133 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/ora11g/users01.dbf channel ORA_DISK_1: reading from backup piece /u05/app/oracle/flash_recovery_area/ORA11G/backupset/2018_04_10/o1_mf_nnndf_TAG20180410T132739_fdrltcot_.bkp channel ORA_DISK_1: piece handle=/u05/app/oracle/flash_recovery_area/ORA11G/backupset/2018_04_10/o1_mf_nnndf_TAG20180410T132739_fdrltcot_.bkp tag=TAG20180410T132739 channel ORA_DISK_1: restored backup piece 1 channel ORA_DISK_1: restore complete, elapsed time: 00:01:16 Finished restore at 2018-04-10 14:13:24 RMAN> recover datafile 4; Starting recover at 2018-04-10 14:13:34 using channel ORA_DISK_1 starting media recovery archived log for thread 1 with sequence 330 is already on disk as file /u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_330_fdrm7pm4_.arc archived log for thread 1 with sequence 331 is already on disk as file /u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_331_fdrmly0v_.arc archived log for thread 1 with sequence 332 is already on disk as file /u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_332_fdrn29bv_.arc archived log for thread 1 with sequence 333 is already on disk as file /u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_333_fdrnohdf_.arc archived log for thread 1 with sequence 334 is already on disk as file /u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_334_fdrnwqqw_.arc archived log file name=/u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_330_fdrm7pm4_.arc thread=1 sequence=330 archived log file name=/u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_331_fdrmly0v_.arc thread=1 sequence=331 archived log file name=/u05/app/oracle/flash_recovery_area/ORA11G/archivelog/2018_04_10/o1_mf_1_332_fdrn29bv_.arc thread=1 sequence=332 media recovery complete, elapsed time: 00:00:01 Finished recover at 2018-04-10 14:13:37 RMAN> alter database open; database opened RMAN> exit Recovery Manager complete. [oracle@rhel6lhr oradata]$ sas SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 10 14:14:15 2018 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@ora11g > select count(1) from lhr.test_nologging; select count(1) from lhr.test_nologging * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 4, block # 180937) ORA-01110: data file 4: '/u01/app/oracle/oradata/ora11g/users01.dbf' ORA-26040: Data block was loaded using the NOLOGGING option SYS@ora11g > select UNRECOVERABLE_CHANGE# , 2 UNRECOVERABLE_TIME , 3 FIRST_NONLOGGED_SCN , 4 FIRST_NONLOGGED_TIME 5 from v$datafile 6 where file#=4; UNRECOVERABLE_CHANGE# UNRECOVERABLE_TIME FIRST_NONLOGGED_SCN FIRST_NONLOGGED_TIM --------------------- ------------------- ------------------- ------------------- 60522292 2018-04-10 14:11:22 60522291 2018-04-10 14:11:22 SYS@ora11g > select * from v$database_block_corruption; no rows selected SYS@ora11g > exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@rhel6lhr oradata]$ rman target / Recovery Manager: Release 11.2.0.3.0 - Production on Tue Apr 10 14:15:42 2018 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: ORA11G (DBID=4270446895) RMAN> validate datafile 4; Starting validate at 2018-04-10 14:15:50 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=21 device type=DISK channel ORA_DISK_1: starting validation of datafile channel ORA_DISK_1: specifying datafile(s) for validation input datafile file number=00004 name=/u01/app/oracle/oradata/ora11g/users01.dbf channel ORA_DISK_1: validation complete, elapsed time: 00:00:35 List of Datafiles ================= File Status Marked Corrupt Empty Blocks Blocks Examined High SCN ---- ------ -------------- ------------ --------------- ---------- 4 OK 103 64922 196829 60543025 File Name: /u01/app/oracle/oradata/ora11g/users01.dbf Block Type Blocks Failing Blocks Processed ---------- -------------- ---------------- Data 0 19747 Index 0 5352 Other 0 106779 Finished validate at 2018-04-10 14:16:26 RMAN> exit Recovery Manager complete. [oracle@rhel6lhr oradata]$ sas SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 10 14:16:44 2018 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@ora11g > select * from v$database_block_corruption; FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO ---------- ---------- ---------- ------------------ --------- 4 180937 15 60522291 NOLOGGING 4 180994 88 60522292 NOLOGGING SYS@ora11g > exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@rhel6lhr oradata]$ rmant target / -bash: rmant: command not found [oracle@rhel6lhr oradata]$ rman target / Recovery Manager: Release 11.2.0.3.0 - Production on Tue Apr 10 14:21:04 2018 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: ORA11G (DBID=4270446895) RMAN> BLOCKRECOVER CORRUPTION LIST; Starting recover at 2018-04-10 14:21:08 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=133 device type=DISK starting media recovery media recovery complete, elapsed time: 00:00:00 Finished recover at 2018-04-10 14:21:10 RMAN> exit Recovery Manager complete. [oracle@rhel6lhr oradata]$ sas SQL*Plus: Release 11.2.0.3.0 Production on Tue Apr 10 14:21:17 2018 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@ora11g > select * from v$database_block_corruption; FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO ---------- ---------- ---------- ------------------ --------- 4 180937 15 60522291 NOLOGGING 4 180994 88 60522292 NOLOGGING About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2018-04-01 06:00 ~ 2018-04-31 24:00 在魔都完成 ● 最新修改时间:2018-04-01 06:00 ~ 2018-04-31 24:00 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麦苗OCP、OCM、高可用网络班:http://blog.itpub.net/26736162/viewspace-2148098/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面试宝典》读者群 小麦苗的微店 .............................................................................................................................................
【OCP|OCM】Oracle培训考证系列 我的个人信息 网名:小麦苗 QQ:646634621 QQ群:618766405 我的博客:http://blog.itpub.net/26736162/abstract/1/ 微信公众号:xiaomaimiaolhr,二维码如下: 小麦苗的微信二维码如下所示,加我时请备注相关信息: 我的微店地址:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ?小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ 博客链接:http://blog.itpub.net/26736162/viewspace-2152182/ 现有课程 课程名称 课时 上课时间(可根据情况调整) OCP(从入门到专家) 每年1-2期,35课时左右/期 每周一、周三、周四、周六 20:00-22:00 OCM认证 每年N期,9课时/期 每周二、周五 20:00-22:00 高可用课程(rac+dg+ogg) 未定 未定 未定 注意: 每次上课前30分钟答疑。 OCM实时答疑,提供和考试一样的练习环境。 授课方式:YY语音直播 + QQ互动答疑 + 视频复习。 OCP课时可以根据大家学习情况进行增加或缩减。 OCP报名可以循环听课,但最多不得超过3期课。 12c OCM课程私聊 OCM 【OCM】想考11g和12c OCM的小伙伴可以和我(lhrbestxh)私聊,非诚勿扰。11g OCM可以保证最低学费、最快训练速度和100%的通过率,非诚勿扰。 11g OCM考试内容思维导图 第一场 第二场 第三场 第四场 第五场 第六场 第七场 第八场 第九场 12c OCM 若要考12C OCM请私聊。 OCM培训说明连接 OCM培训说明连接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA OCP OCP培训说明网络连接 OCP培训说明连接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA 讲课资料及视频下载地址 小麦苗OCP课程讲课资料下载地址:https://share.weiyun.com/a218681375a20d9be37f626fded2d626 小麦苗分享的其它资料: https://share.weiyun.com/5UZtOLs 永久更新地址:http://blog.itpub.net/26736162/viewspace-1624453/ OCP讲课文档 OCP第1期相关视频说明 小麦苗OCP 11g课程第1节--RHEL5.5的安装和基本配置(使用逻辑卷):https://v.qq.com/x/page/u0534y1g6u3.html 小麦苗OCP 11g课程第2节--数据库软件的图形化安装和静默安装,MD5,配置YUM源,安装rlwrap软件:https://v.qq.com/x/page/m05348z2s4v.html 小麦苗OCP 11g课程第3节--图形化建库、静默建库、静默删库、干净地卸载数据库软件、配置数据库资源开机启动、pmap、判断数据库位数等:https://v.qq.com/x/page/x0535r1ucah.html 【已加密】小麦苗OCP 11g课程第4节--SQL语句的分类,如何查看在线和离线文档、sqlplus的使用和设置(导出csv和html文件)、ERRORLOGGING的作用 【已加密】小麦苗OCP 11g课程第5节--基本SELECT语句的写法,NULL的注意事项,Quote (q)语法、模糊查询、WHERE子句和排序 小麦苗OCP 11g课程第6节--IS NULL走索引,LIKE模糊查询走索引,DUAL表详解(包括恢复),Oracle中的函数、隐式类型转换:https://v.qq.com/x/page/s0540b5ih94.html 小麦苗OCP 11g课程第7节--函数的高级应用,组函数,COUNT的用法和区别,MAX和MIN优化写法:http://v.qq.com/x/page/l0540f9nhgh.html 【已加密】小麦苗OCP 11g课程第8节--多表连接、笛卡儿积、层次查询(树形查询)、WITH语法、子查询、合并查询(集合查询)、connect by和笛卡儿积快速构造大表 【已加密】小麦苗OCP 11g课程第9节--创建和管理表、数据字典、数据类型介绍、操作数据(INSERT、UPDATE、DELETE、MERGE)、DML语句优化的方法 【已加密】小麦苗OCP 11g课程第10节--约束、视图、外键约束必须创建索引(死锁)、Top-N 分析、物化视图简介 【已加密】小麦苗OCP 11g课程第11节--序列、索引、同义词、DBLINK、为什么索引没有被使用、哪些操作会导致索引失效、监控索引的使用、预估索引的大小、索引的选择性 【已加密】小麦苗OCP 11g课程第12节--匿名块、存储过程、函数、包的开发、异常处理、自治事务、分批提交DML、利用触发器完成一些监控功能、存储过程和函数返回集合类型 小麦苗OCP 11g课程第13节--ASM的安装和配置、磁盘组的简单维护、创建ASM磁盘的几种常见方式(asmlib)、静默安装GRID软件、EM的创建和使用、如何查看磁盘是否包含数据、如何让crs_stat命令显示完整、kfod命令等:http://v.qq.com/x/page/s0560te3pju.html 【已加密】小麦苗OCP 11g课程第14节--体系结构(内存结构、进程结构、存储结构)--内存组件(SGA+PGA)、数据库和实例的区别、ASMM和AMM、归档模式的切换、多路复用控制文件等 小麦苗OCP 11g课程第15节--EM的维护、参数文件(spfile和pfile)、启动和关闭、告警日志、Oracle Restart(重点)等:http://v.qq.com/x/page/j06000r2u4a.html 【已加密】小麦苗OCP 11g课程第16节--ASM相关维护(磁盘组、OS和ASM文件格式转换)等 【已加密】小麦苗OCP 11g课程第17节--Oracle网络管理(动态注册和静态注册、限定IP访问、sqlnet.ora、listener.ora、tnsnames.ora文件的作用、TWO_TASK、SYS登录报权限不足、ORA-12547等) 【已加密】小麦苗OCP 11g课程第18节--表空间和数据文件管理(bigfile、OMF、表空间大小查询、表空间扩展、表空间配额、移动数据文件、如何删除表空间数据文件) 【已加密】小麦苗OCP 11g课程第19节--数据库用户管理、权限和角色、密码文件(Oracle的两种认证方式等等) 【已加密】小麦苗OCP 11g课程第20节--锁和会话(视图之间的关联关系、如何彻底杀掉会话等)、Undo(作用,存储内容、快清除、ORA-01555)、审计(分类,FGA审计、sysdba审计、AUD$表迁移等) 【已加密】小麦苗OCP 11g课程第21节--AWR(如何获取和阅读)、ASH(如何诊断系统问题)、ADDM、统计信息(学好SQL优化必修的一节课)等 【已加密】小麦苗OCP 11g课程第22节--exp、imp(从dmp文件获取相关信息,例如查看字符集,延迟段创建等)、数据泵expdp和impdp(彻底停止expdp,exclude、include,TTS,network_link,expdp卡死等)等 【已加密】小麦苗OCP 11g课程第23节--sqlldr(各种错误处理、酒店开房数据导入)、外部表(字符集设置)、补丁集更新(PSU、one-off补丁、热补丁) 【已加密】小麦苗OCP 11g课程第24节--故障类别、SCN(系统检查点SCN、文件检查点SCN、开始SCN和结束SCN)、实例恢复(前滚和回滚)、闪回体系(包括7种闪回技术及其原理)、DBA_SOURCE的使用 【已加密】小麦苗OCP 11g课程第25节--延迟段创建导致不能导出空表(只在11.2.0.1中存在)、RMAN简介及其常用命令(show all的配置、list、report、delete等)、备份恢复的类型 【已加密】小麦苗OCP 11g课程第26节--catalog库、RMAN备份(累积和差异增量备份)、块改变跟踪、备份脚本分享、定时任务(crontab + windows下的任务计划) 【已加密】小麦苗OCP 11g课程第27节--密码文件恢复、spfile恢复、控制文件恢复、在线redo和归档文件的恢复、v$archived_log的清理 【已加密】小麦苗OCP 11g课程第28节--数据文件恢复、表空间恢复(Undo表空间的恢复)、DRA(数据恢复顾问)、rm -rf误操作的恢复过程、TRUNCATE恢复方法、在丢失归档的情况下如何进行数据文件的恢复 【已加密】小麦苗OCP 11g课程第29节--日志挖掘logminer、bbed简介、坏块的检测(dbv、rman等)和恢复(BMR、bbed等)、如何确定坏块的对象名、OS备份(冷备和热备及其恢复)、非归档模式备份和恢复、RESETLOGS和NORESETLOGS区别、跨版本恢复、只存在备份片的恢复、恢复流程图 【已加密】小麦苗OCP 11g课程第30节--实验课(数据泵之NETWORK_LINK、duplicate from active复制数据库ASM到FS、TSPITR(表空间基于时间点恢复)、TTS(传输表空间))、测试库搭建等 【已加密】小麦苗OCP 11g课程第31节--JOB(DBMS_JOB、DBMS_SCHEDULER、创建删除JOB、是否正在运行、运行日志、故障处理)、分区表(分区类型、分区表查询优化、索引失效、普通表转换为分区表有哪些办法、压缩分区、分区表收集统计信息) OCP培训课程大纲 注: 1学时=1小时 1课时=1次课=2学时=2小时 安装与卸载 课程模块 培训要点 学时 VMware Workstation虚拟机的相关知识 安装和卸载 版本介绍(32位和64位) 网络配置(配置固定IP地址并且可以上外网) 快照的介绍 VMware Tools 主机和虚拟机资源共享 主机和虚拟机时间同步 虚拟机的配置文件 0.5 Linux的安装(RHEL 5.5) 逻辑卷的管理方式 用户的环境变量配置 PS1环境变量的作用 su - oracle和su oracle的区别 网络环境的简单配置(配置固定IP地址并且可以上外网)、防火墙的配置 学会修改主机名 MD5值的简介和计算 其它OS知识 1.5 Oracle软件单机安装 让Oracle DB、监听和oem开机启动(dbstart) 配置sudo 图形界面和静默方式安装单机软件 1 Oracle ASM的安装 GI的基本安装和配置(图形界面+静默安装) 创建ASM磁盘的几种方式演示 Faking方式 /etc/sysconfig/rawdevices配置raw Udev方式 ASMLIB方式 如何查看磁盘是否包含数据(lquerypv、hexdump) 添加loop设备的方法 如何让crs_stat命令显示完整 静默创建ASM实例和grid用户的监听 命令创建OEM:emca -config dbcontrol db -repos recreate 2 Oracle监听和TNS的简单配置 学会使用netmgr 静默创建监听 0.1 删除数据库的几种方式 dbca -silent DROP DATABASE; 0.2 创建数据库 DBCA图形创建 静默创建 如何设置静默创建数据库为归档模式 静默建库常见问题的处理 手动创建数据库 0.5 管理工具介绍 PLSQL Developer软件使用 学会安装Windows和Linux下的绿色版的Oracle客户端软件 绿色版SecureCRT和SecureFX Xshell调用图形界面 0.5 Oracle软件的卸载 Windows平台(主要是清理注册表) Linux平台 0.5 其它内容 如何判断Oracle是32位还是64位? 在多个不同版本的数据库情况下,如何确定实例的ORACLE_HOME地址? 0.5 SQL基础部分 课程模块 培训要点 学时 SQL简介及分类 SQL语句的分类 COMMIT的类型 教会如何查看在线和离线官方文档 0.5 SQL*Plus 如何导出csv、xls文件 如何导出漂亮的html文件 如何使用上下左右方向键 执行脚本时的搜寻路径 @与@@、&与&&的区别 glogin.sql文件的作用,如何修改命令提示符? ERRORLOGGING的作用 sqlplus调用SQL脚本 shell、bat调用sqlplus命令执行SQL命令 把sqlplus执行结果传递给shell 把shell程序参数传递给sqlplus 为了安全要求每次执行shell都手工输入密码 为了安全从文件读取密码 sqlplus中将行转为列输出 登录SQL*Plus的几种方式(EZCONNECT方式) 安装SQL*Plus的帮助脚本 0.5 基本SELECT语句 语法 别名 运算符 去重 空值 NULL的注意事项,例如如果子查询结果中包含NULL值,那么NOT IN (NULL、AA、BB、CC)返回为空。 IS NULL 走索引 Quote (q)语法 Oracle特殊字符的处理 0.5 WHERE条件和排序 条件 条件中使用字符串和日期 比较条件 模糊查询 1.LIKE模糊查询如何使用索引 2.如何搜索包括%和_符号的行 IN和OR(IN中最多支持1000个列举项) BETWEEN(between包括边界值) 使用NULL/NOT NULL条件 逻辑条件(AND、OR 、NOT)--注意添加括号,防止形成笛卡儿积 排序 升序(ASC) 降序(DESC) 列别名排序 多列排序 0.5 连接类型 交叉连接(笛卡儿积) 内连接(简单连接) 等值连接 自然连接 自连接 非等值连接 外连接 左外连接 右外连接 全外连接 0.2 查询分类 子查询 主查询和子查询的关系 标量子查询---性能问题 关联子查询(标准子查询) 相关子查询 非相关子查询(独立子查询) 返回的行数 单行子查询 多行子查询 返回的列数 单列子查询 多列子查询 子查询中的IN和EXISTS 主查询 0.2 合并查询(集合查询) UNION UNION ALL INTERSECT MINUS 应用 0.2 函数 单行函数 字符函数 数字函数 日期函数 转换函数(隐式类型转换(字符列的值应该加上单引号)) 通用函数 条件表达式有 CASE表达式、DECODE 函数 多行函数(组函数) 组函数的概念及应用 AVG、SUM、MAX、MIN(MAX和MIN的优化写法) COUNT DISTINCT GROUP BY和HAVING 嵌套组函数 扩展内容 如何将一个数字转换为字符串并且按照指定格式显示? ORA-00904: "wm_concat":invalid identifier错误解决 如何判断一个字符串是否含有中文汉字? 如何让日期显示为"年-月-日时:分:秒"的格式? NLS_LANGUAGE的使用 如何判断当天是否月份最后一天? COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名) 的区别(结果和效率) 2 dual表 基本使用 删除后的恢复(若被删除则数据库不能启动,需要设置REPLICATION_DEPENDENCY_TRACKING=FALSE) 扩展 0.2 操作数据 INSERT 插入特殊值 插入指定日期 插入可输入变量 从另外一个表复制 在INSERT语句中使用子查询 DELETE 一道OCM考题 记得加WHERE条件 查找和删除重复的记录 UPDATE 关联更新一定要加WHERE条件 优化写法 MERGE(数据合并) 语法、概念 MERGE语句在优化中的巨大作用 提高DML语句性能的写法 0.5 存储过程、函数、包的开发 PL/SQL块 分支 循环(游标FOR循环) 控制 存储过程 编写 存过中捕获异常的行号 存储过程和函数的区别是什么? 存过中的动态执行语句(动态sql) 存过返回集合 函数 函数返回集合 函数返回系统游标 函数返回索引表 包 一个项目一个包,或一个系统一个包 异常处理 分类 预定义异常 非预定义异常 自定义异常 抛出异常 通过PL/SQL运行时引擎 使用RAISE语句 调用RAISE_APPLICATION_ERROR存储过程 SQLCODE和SQLERRM 如何捕获错误并记录到表中? 存过中捕获异常的行号(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE) Oracle分批提交DML 分批 update 分批 delete 分批 insert 2 基本对象的管理 课程模块 培训要点 学时 DBLINK 概念、分类、创建语法(2种方式)、删除 相关权限、数据字典 讲解一道OCM的考题 0.2 约束 约束的概念和原则 定义约束 几种常见的约束 NOT NULL约束 UNIQUE约束 PRIMARY KEY约束(非空且唯一) FOREIGN KEY约束 1.外键列需创建索引,否则易引起锁问题,导致死锁的产生 2.找出没有建立索引的外键 CHECK约束 管理约束 添加约束 删除约束 级联约束 查看约束 禁用、启用约束 0.5 视图 视图的概念和优势 分类 视图中的规则 管理视图 TOP-N分析 物化视图简介 对比"有无物化视图"前后执行计划的区别 扩展 DBA_UPDATABLE_COLUMNS的作用 在什么情况下可以对视图执行增、删、改操作? 0.3 其它数据库对象 序列 讲解一道OCP和OCM的考题 概念、语法、修改、删除 性能问题 索引 概念、作用、创建、删除 分类 复合索引 函数索引 位图索引 分区索引 全文索引 虚拟索引 不可见索引 重点:不能使用索引的情况 扩展 哪几种情况不能使用索引 如何预估即将创建索引的大小? 如何监控索引的使用状况? 哪些操作会导致索引失效? 什么是索引的选择性(Index Selectivity)? IS NULL如何用到索引? 同义词 概念、创建、删除 扩展 PLAN_TABLE表的真谛 0.5 创建和管理表 表的分类 普通堆表(heap table)---最多包含1000列 全局临时表 会话级 事务级 分区表 范围分区 列表分区 HASH分区 组合分区 索引组织表(IOT) 簇表 外部表 数据字典(dict和tab) 创建表 CTAS及其优化 default选项 数据类型 删除表 引用表 修改表alter 重命名(rename)表或字段的名称 添加、修改、删除列 SET UNUSED及其恢复 移动表所在的表空间 修改表的存储特征 truncate DELETE、DROP和TRUNCATE的区别 给表和列添加注释(COMMENT语句) 提供一个SQL生成开发语句 0.5 数据库管理 体系结构和Oracle Restart 课程模块 培训要点 学时 DB 服务器体系结构 内存结构 SGA 共享池(Shared Pool) 库缓存(Library Cache) 共享SQL区(Shared SQL Area) 私有SQL区(Private SQL Area) 共享PL/SQL区(Shared PL/SQL Area) 控制结构区(Control Structure Area) 数据字典缓存(Data Dictionary Cache) 保留池(Reserved Pool) 结果缓存(Result Cache) 数据缓冲区(Database Buffer Cache) 回收池(Recycle Pool) 保留池(Keep Pool) 默认池(Default Pool) Redo日志缓冲区(Redo Log Buffer) 大池(Large Pool) Java池(Java Pool) 流池(Streams Pool) PGA Private SQL Area(私有SQL区) Cursor and SQL Areas(游标和SQL区) Session Memory(会话内存) Work Area(工作区) AMM和ASMM 进程结构 USER PROCESS(用户进程) SERVER PROCESS(服务器进程) LOCAL=NO LOCAL=YES BACKGROUND PROCESSES(后台进程) 守护程序/应用程序进程 存储结构(物理结构) 数据文件 控制文件---新增控制文件 联机Redo日志文件 参数文件 归档日志文件 归档和非归档的区别 归档和非归档模式互相切换 密码文件 备份文件 告警日志和跟踪文件 2 体系结构部分扩展 AMM和ASMM 区别 互换 自动PGA内存管理 UGA介绍 SHOW SGA和V$SGA的结果区别 0.5 Oracle Restart 简介 Oracle Restart进程启动顺序 控制Oracle Restart 选择正确的SRVCTL实用程序 Oracle Restart配置 使用SRVCTL实用程序 获取有关SRVCTL实用程序的帮助 使用SRVCTL实用程序启动和关闭组件 查看组件状态 显示组件的Oracle Restart配置 手动向Oracle Restart配置添加组件 1 Oracle DB 系统 Oracle DB 物理结构 数据文件(Data files) 控制文件(Control files) 联机Redo日志文件(Online Redo log files) 参数文件(Parameter file) 归档日志文件(Archive log files) 密码文件(Password file) 逻辑结构 表空间(Tablespace) 段(Segment) 数据段 索引段 还原段 临时段 区(Extent) 块(Block) 数据块dump文件详解 数据库实例 OS分配的一块内存 SGA PGA 一些后台进程(PMON、SMON、LGWR、CKPT、DBWn等) 实例和数据库的区别 2 管理数据库实例 课程模块 培训要点 学时 管理数据库实例 OEM 简介和分类 Database Control(数据库控制) Grid Control(GC,网格控制) 维护 卸载:emca -deconfig dbcontrol db -repos drop 单机重建:emca -config dbcontrol db -repos recreate 集群重建:emca -config dbcontrol db -repos recreate -cluster OEM的运行日志路径:$ORACLE_HOME/$HOSTNAME_$ORACLE_SID/sysman/log OEM的安装日志路径:$ORACLE_HOME/cfgtoollogs/emca/ 启动:emctl start dbconsole 关闭:emctl stop dbconsole 运行状态:emctl status dbconsole OEM的界面地址:https://192.168.59.128:1158/em/ 端口的配置文件:$ORACLE_HOME/install/portlist.ini 初始化参数文件 初始化参数值的类型 系统使用情况 普通参数 非凡参数 过时参数 强调参数 隐含参数--隐含参数的设置方法 推导参数 生效时间 动态参数 立即生效 延迟生效 静态参数----SPFILE 简化初始化参数 初始化参数:示例 使用SQL*Plus查看参数 更改初始化参数值 PFILE和SPFILE的区别是什么? 数据库启动和关闭 启动Oracle DB实例 启动Oracle DB实例:NOMOUNT 启动Oracle DB实例:MOUNT 启动Oracle DB实例:OPEN 关闭Oracle DB实例 SHUTDOWN NORMAL SHUTDOWN TRANSACTIONAL SHUTDOWN IMMEDIATE SHUTDOWN ABORT 数据库处于RESTRICT、QUIESCE和SUSPEND状态的区别是什么? 数据库的启动经历几个过程 告警日志 Oracle 10g和11g告警日志文件的位置在哪里? 告警日志的包含内容 管理告警日志 V$DIAG_ALERT_EXT ①使用外部表方式 ②视图V$DIAG_ALERT_EXT ③利用SHELL脚本 使用跟踪文件 2 ASM 课程模块 培训要点 学时 ASM 简介 ASM对于管理员的好处 ASM是什么?它有哪些优点? ASM实例 主要进程 ASM实例初始化参数 数据库实例与ASM之间的交互 ASM相关动态性能视图 系统权限 SYSASM、SYSDBA或SYSOPER 使用OEM管理ASM用户 启动和停止ASM实例 SQL*Plus srvctl asmcmd ASM磁盘 创建ASM磁盘的几种方法 ASM文件和FS文件转换的几种方法 分配单元(AU) ASM磁盘有几种冗余方式? ASM 磁盘的相关视图 ASM磁盘组 ASM故障组 管理磁盘组 创建和删除磁盘组 向磁盘组添加磁盘 从磁盘组删除磁盘 再平衡(Rebalance) ASM磁盘组兼容性 ASM磁盘组属性 检索ASM元数据 视图 asmcmd 与ASM相关的有哪些进程? ASMLIB是什么?常用命令有哪些?其运行日志路径在哪里? 在采用asmlib时,确认物理磁盘的方法 udev是什么?如何配置udev? 多路径(multipath)是什么?如何配置多路径? asmcmd工具详细介绍 asm相关的OCP题目讲解 ASM管理命令行三工具:KFOD、KFED和AMDU 2 网络管理 课程模块 培训要点 学时 网络管理 监听 配置 管理 静态监听和动态监听 listener.ora 服务名 tnsnames.ora 简便连接(EZCONNECT方式) 测试Oracle Net连接 tnsping 其它实用内容 动态注册和静态注册有什么区别? 在Oracle中,如何限定特定IP访问数据库? 如何跟踪tnsping过程? 如何启动Oracle数据库的监听日志? 解释GLOBAL_NAMES设为TRUE的用途。 tnsnames.ora文件的作用是什么? sqlnet.ora文件的作用是什么? TWO_TASK环境变量的作用是什么? 在Windows环境下,错误"ORA-12560: TNS: 协议适配器错误"的常见原因有哪些? Oracle的SYS用户登录报权限不足(ORA-01031: Insufficient Privileges)的常见原因有哪些? 在没有配置ORACLE_HOME环境变量的情况下,如何快速获取数据库软件的ORACLE_HOME目录? 造成错误"ORA-12547: TNS:lost contact"的常见原因有哪些? 2 管理数据库存储结构(表空间和数据文件) 课程模块 培训要点 学时 管理数据库存储结构(表空间和数据文件) 表空间和数据文件 表数据的存储方式 浏览存储结构 表空间的存储 预配置的数据库中的表空间 变更表空间 表空间操作 Oracle管理的文件(OMF) 数据文件的OMF管理 日志文件的OMF管理 使用OMF管理控制文件 使用OMF 创建ASM文件涉及的一些参数 扩大数据库 改变数据文件的名称和位置、移动数据文件 什么是用户的表空间配额(User tablespace Quota) 如何正确的删除表空间数据文件? 表空间管理 表空间大小查询 创建新的表空间 表空间大小为空的原因 扩展表空间 表空间收缩 修改表空间名称 表空间的管理方式 数据文件管理 DBA_DATA_FILES 数据文件大小查询 设置数据文件为自动增长 改变数据文件的大小 数据文件的大小为空 什么是大文件表空间(Bigfile Tablespace)? 1.5 用户、密码文件、权限及角色 课程模块 培训要点 学时 数据库事务处理 数据库事务的开始与结束 COMMIT和ROLLBACK语句 事务控制 事务的控制示例 隐式事务处理 用户及其密码文件 创建、密码 如何重建SCOTT用户 使用工具来创建用户 修改密码 Oracle用户密码含特殊字符时的登陆问题 密码文件 创建、作用 Oracle的两种认证方式 OS验证 密码文件验证 PROFILE管理密码 账户锁定 给账户(用户)解锁 终止密码 密码历史 修改密码为永不过期 Oracle用户被锁原因及办法 用户的状态(ACCOUNT_STATUS的九种状态) 基本状态 正常(OPEN) 锁定状态 LOCKED LOCKED(TIMED) 过期状态 EXPIRED EXPIRED(GRACE) 组合状态 EXPIRED & LOCKED(TIMED) EXPIRED(GRACE) & LOCKED(TIMED) EXPIRED & LOCKED EXPIRED(GRACE) & LOCKED 在不知道用户密码的情况下如何更改密码 用原密码的密文来更改密码 直接更新USER$基表 user$.lCOUNT列记录了失败的登陆次数 11g密码区分大小写--sec_case_sensitive_logon 密码延迟验证 哪些用户密码没有被修改过 密码复杂性校验 删除用户 扩展 SCHEMA和USER的区别 重建scott用户 使用工具来创建用户 使用profile管理口令 什么是用户的表空间配额(User tablespace Quota) 回收DBA角色时需要注意什么问题 权限 概念、视图、基本权限 Oracle权限分类 系统权限(System Privilege)--DBA_SYS_PRIVS 对象权限(Object Privilege)--DBA_TAB_PRIVS 角色权限(Role Privilege)--DBA_ROLE_PRIVS 列权限--DBA_COL_PRIVS 如何获取用户的权限 DBMS_METADATA.GET_GRANTED_DDL 通过数据字典来获取 通过exp或expdp来获取 扩展 如何让普通用户可以TRUNCATE其他用户的表? 关于UNDER ANY TABLE/VIEW权限的解释 用户的权限分为哪几类?如何导出用户的权限? 角色 DBA、SYSDBA和SYSOPER的区别 概念、创建、删除 分类 预定义角色 DBA CONNECT RESOURCE Oracle有哪些预定义角色? 自定义角色 角色生效和失效 锁和会话 课程模块 培训要点 学时 锁 锁的概念、作用 并发和并行 锁的分类 操作/保护对象不同 DML锁 行锁(TX,事务锁) 表锁(TM) 0:NONE 1:NULL 2:SS(Row-S) 3:SX(Row-X) 4:S(Share) 5:SSX(S/Row-X) 6:X(Exclusive) 死锁 行级死锁 1、主键、唯一索引的死锁 2、外键未加索引 3、位图索引遭到并发更新 4、常见事务引发的死锁 5、自治事务引发的死锁 块级死锁 ITL死锁 DDL锁(字典锁) 排它DDL锁(XDDL) 共享DDL锁(SDDL) 分析锁、可中断解析锁 系统锁 闩锁(Latches) 互斥体(Mutexes) 内部锁(Internal Locks) 用户与系统 自动锁(隐式锁) 显式锁 锁的兼容性 锁的数据字典---字段之间的关联关系 新建或重建索引过程中的锁信息的变化 SELECT ... FOR UPDATE DML_LOCKS和DDL_LOCK_TIMEOUT参数 在编译存储过程、函数等对象时无响应- 新建或重建索引的锁信息 对于错误"ORA-08104: this index object 68111 is being online built or rebuilt",应该如何处理? 1 会话 V$SESSION视图 如何查看某一个会话是否被其它会话阻塞? 如何查到会话正在执行的SQL语句? 如何彻底杀掉会话?V$SESSION的STATUS为KILLED的情况下如何找到相关的后台OS进程? 如何让普通用户可以杀掉自己用户的会话? SESSIONS和PROCESSES的关系 如何根据OS进程快速获得DB进程信息与正在执行的语句? 怎么杀掉特定的数据库会话? 如何快速的清理Oracle的进程? 1 审计和Undo 课程模块 培训要点 学时 审计 责任分离 数据库安全性 监视合规性 标准数据库审计 配置审计线索 统一审计线索 默认审计 什么是审计(Audit)? 审计如何分类 迁移SYS.AUD$表到其它表空间 审计中BY ACCESS和BY SESSION的区别是什么? 如何对SYSDBA和SYSOPER进行审计? 什么是细粒度审计? FGA审计和标准审计有什么区别? 1 Undo 还原数据 事务处理和还原数据 存储还原信息 还原数据与重做数据 管理还原 配置还原保留时间 保证还原保留时间 将还原表空间改为固定大小 一般还原信息 使用还原指导 0.5 Undo和Redo Undo的作用 Undo段存储的内容 块清除: 快速块清除(Fast Commit Cleanout) 延时块清除(Delayed Block Cleanout) Undo表空间 系统回滚段(System Rollback Segment)与延迟回滚段(Deferred Rollback Segment) ORA-01555 Redo日志文件(Redo Log Files)的作用是什么? 如何管理联机Redo日志组与成员? 在Oracle中,如果联机Redo日志文件损坏,那么如何恢复? 1 AWR、ASH、ADDM和统计信息 课程模块 培训要点 学时 AWR、ASH、ADDM和统计信息 统计信息(学习SQL优化的必修课) 统计信息的简介和分类 索引统计信息 表统计信息 列统计信息 系统统计信息 内部对象统计信息 自动收集统计信息 统计信息何时变为陈旧状态(10%的含义)? 修改自动收集统计信息的时间 DBA_TAB_MODIFICATIONS 怎样收集表的统计信息?怎样收集分区表的统计信息? 什么是动态采样(Dynamic Sampling)? 如何锁住统计信息? 什么是待定的统计信息(Pending Statistic)? 什么是直方图(Histogram)? 什么是多列统计信息(Extended Statistics)? 基表COL_USAGE$的作用是什么? 新建索引后统计信息是否自动收集? 什么是基数反馈(Cardinality Feedback)? 如何查询表和索引的历史统计信息 Oracle如何并发地收集统计信息? 当收集表的统计信息时应该注意哪些问题? 什么是基数(Cardinality)和可选择率(Selectivity)? 使用SPLIT来拆分某个分区的时候,其拆分出来的新分区的统计信息行数是多少? 当自动收集任务运行时,哪些对象会被收集? 分区表统计信息的更新机制是怎样的? 如何查询表的DML操作数据变化量? 对表执行TRUNCATE操作会将表的统计信息也清除掉吗? 自动负载信息库(AWR) AWR 基础结构 AWR 基线 Enterprise Manager 和 AWR 管理 AWR 统计级别 什么是AWR? 如何获取AWR报告? 定时生成AWR报告 AWR报告中主要关注哪些方面内容? ASH 什么是ASH? 如何获取ASH报告? 如何查看过去某一段时间数据库系统的会话是否有问题? 自动数据库诊断监视器 (ADDM) 什么是ADDM? 如何获取ADDM报告? 自动维护任务 简介 自动维护任务配置 服务器生成的预警 设置阈值 创建和测试预警 预警通知 对预警作出响应 2 JOB和分区 课程模块 培训要点 学时 JOB DBMS_JOB 创建、删除 后台进程 dbms_job package 用法介绍 杀JOB 删除其它用户下的job用 sys.dbms_ijob.remove() 杀会话+杀后台进程 what的写法 存储过程 匿名块 数据字典 所有job(dba_jobs) 正在运行(dba_jobs_running) RAC中指定dbms_job运行在指定实例(instance) 权限 PL/SQL工具创建和管理job DBMS_SCHEDULER DBMS_JOB和DBMS_SCHEDULER之间的区别 创建、删除 带参数 不带参数 通过dbms_scheduler去执行shell脚本 权限 轻量级job(Lightweight Jobs) PL/SQL工具创建和管理job RAC中如何指定JOB的运行实例 如何判断SCHEDULER JOB是否正在运行? DBA_SCHEDULER_JOBS视图的STATE列 DBA_SCHEDULER_RUNNING_JOBS 如何查询SCHEDULER JOB的运行日志? DBA_SCHEDULER_JOB_LOG和DBA_SCHEDULER_JOB_RUN_DETAILS 通过DBMS_SCHEDULER如何调用SHELL脚本?- 如何批量删除JOB? 数据字典 1 分区 分区表简介 何时考虑分区? 分区表有什么优点 有哪些类型的分区?如何选择用哪种类型的分区表? 范围分区(RANGE PARTITION) 哈希分区(HASH PARTITION) 列表分区(LIST PARTITION) 引用分区(REFERENCE PARTITION) 复合分区(组合分区) INTERVAL分区(间隔分区) 月分区 天分区 系统分区 分区模板 分区表的维护 添加分区(add partition) 收缩表分区(coalesce partitions) 删除分区和删除子分区(drop partition) 添加子分区 截断表分区(Truncate Partition)--截断一个分区表中的一个分区的数据 截断分区表的子分区 截断带有约束的分区表 注意事项 移动表分区(Move Partition) 将一个表的分区从一个表空间移动到另一个表空间 压缩表Move--compress 合并分区(Merge Partitions) 重命名某一个分区(Rename Partition) 交换表分区(Exchange Partitions) 修改 list 表分区 修改 list 表分区--Add Values 修改list 表分区--Drop Values 拆分表分区(Split Partition)--分区切割 修改分区表属性 修改表分区默认属性(Modify Default Attributes) 修改表分区当前属性(Modify Partition) 修改分区表的logging属性 并行度 修改表子分区模板(Set Subpartition Template) 分区表的查询优化 单分区查询 跨分区查询 分区表常用数据字典视图有哪些? Oracle之INTERVAL分区的STORE IN属性存储在哪张表中? 如何查询某个分区是否是INTERVAL分区表? 分区表的压缩 分区表压缩 含有子分区的分区表压缩 分区表哪些分区被压缩了 解压缩 分区表单个分区分析(分区表收集统计信息) 指定partname和GRANULARITY 普通表转换为分区表有哪些办法? (1)导出/导入方法(Export/Import Method) (2)子查询插入方法(Insert With a Subquery Method) (3)分区交换方法(Partition Exchange Method) (4)在线重定义方法(DBMS_REDEFINITION Method) 分区表中lob类型的字段 分区表性能注意事项 索引失效的情况 分区表 非分区表 1 备份和恢复(包括闪回) 课程模块 培训要点 学时 备份和恢复的概念 故障类别 语句失败 用户进程失败 网络故障 用户错误 介质故障 实例恢复 实例故障 了解实例恢复:检查点 (CKPT) 进程 实例恢复的阶段 优化实例恢复 使用 MTTR 指导 实例恢复和介质恢复的区别 配置可恢复性 配置快速恢复区 0.5 SCN SCN的组成 SCN的分类 系统检查点SCN(System Checkpoint SCN) 文件检查点SCN(Datafile Checkpoint SCN) 开始SCN(Start SCN) 结束SCN(Stop SCN) 如何查看系统当前SCN SCN与时间的相互转换 0.3 备份 rman 连接数据库 RMAN数据字典 rman命令 列出备份信息(list) 删除备份(delete) 报告命令(report) 可以报告哪些文件需要备份 报告不可恢复的备份集 报告数据库的信息 交叉检查(crosscheck) VALIDATE DATABASE RMAN的配置 CONFIGURE RETENTION POLICY 配置备份保留策略 CONFIGURE BACKUP OPTIMIZATION 配置备份优化 CONFIGURE DEFAULT DEVICE TYPE 配置 IO 设备类型 CONFIGURE CONTROLFILE AUTOBACKUP 配置控制文件自动备份 CONFIGURE DEVICE TYPE 设置并行备份 CONFIGURE DATAFILE BACKUP COPIES 设置备份文件冗余度 CONFIGURE MAXSETSIZE 配置备份集的最大尺寸 CONFIGURE ARCHIVELOG DELETION POLICY RMAN中关于备份或归档文件状态OBSOLETE和EXPIRED的区别是什么? 物理备份和逻辑备份分别是什么? 差异增量备份和累积增量备份的区别是什么? 什么是块改变跟踪? 完全备份 全库备份脚本分享 增量备份 文件备份 数据文件备份 控制文件 spfile 表空间备份 1 恢复 TRUNCATE恢复方法 TSPITR(表空间基于时间点恢复) rm -rf误操作的恢复过程 在丢失归档的情况下如何进行数据文件的恢复 数据文件OFFLINE之后必须要做的一件事是什么? 什么是DRA(Data Recovery Advisor,数据恢复指导)? list failure:列出DRA记录的故障 advise failure:显示建议修复的选项 repair failure:使用RMAN的建议和关闭故障 rm -rf 误操作的恢复过程 丢失了控制文件(多种恢复方法演示) 丢失了在线重做日志文件 数据文件恢复 在NOARCHIVELOG模式下丢失了数据文件 在ARCHIVELOG模式下丢失了非关键数据文件 在ARCHIVELOG模式下丢失了系统关键数据文件 数据故障 只存在备份片如何恢复数据库 spfile恢复(多种恢复方法演示) 表空间恢复 Undo表空间 SYSTEM表空间 其它表空间 归档日志的恢复 restore archivelog 的各种选项 怎样清除v$archived_log视图中的过期信息 1 闪回 闪回的分类 闪回删除(Flashback DROP)--10g,基于回收站(Recycle Bin)特性实现 闪回数据库(Flashback Database)--基于闪回恢复区(Flash Recovery Area)中的闪回日志;10g开始引入,后台进程为:RVWR(Recovery Writer) 闪回数据归档(Flashback Data Archive)--基于闪回归档区(Flashback Archive)中的数据,11g开始引入,进程fbda(Flashback Data Archiver Process) 闪回版本查询(Flashback Version Query),10g 闪回查询(Flashback Query),9i 闪回事务查询(Flashback Transaction Query),10g 闪回表(Flashback TABLE),10g 其它内容 什么是闪回?闪回有哪些分类? Oracle的回收站是什么? 什么是闪回数据归档(Flashback Data Archive)? 什么是闪回数据库? 如何让普通用户可以对DBA_SOURCE视图进行闪回查询? 存储过程被覆盖了,如何恢复? 1 RMAN 高级应用之 Duplicate 复制数据库 Duplicating an Active Database Cloning A Database On The Same Server Using Rman Duplicate From Active Database Duplicating a Database with a Target Connection Duplicating a Database with Recovery Catalog Without Target Connection Duplicating a Database Without Recovery Catalog or Target Connection 1 bbed简介 bbed简介 0.1 rman之块介质恢复 坏块的简介 坏块的检测方法 BMR恢复坏块 如何确定坏块的对象名 如果发现有坏块,那么如何检索其它未坏的数据? 模拟坏块 blockrecover恢复坏块 创建演示环境 单块数据块损坏的恢复处理 多块数据块损坏的恢复处理 坏块的对象定位与影响 bbed模拟 bbed修复坏块示例 0.5 非归档模式备份恢复 非归档的备份方法 非归档模式下的恢复 非归档模式的备份与恢复示例 0.2 OPEN RESETLOGS 使用alter database open resetlogs的场合 为什么使用RESETLOGS? RESETLOGS会执行什么操作? 0.1 4条RECOVER DATABASE命令的区别是什么? 1 RECOVER DATABASE USING BACKUP CONTROLFILE 2 RECOVER DATABASE UNTIL CANCEL 3 RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL; 4 RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE; 0.1 日志挖掘logminer 日志挖掘logminer 0.1 利用增量数据库备份进行恢复 利用增量数据库备份进行恢复 0.1 跨版本恢复 RMAN可以跨版本或跨平台执行还原或复制命令吗? 跨大版本恢复 跨小版本恢复 1 OS备份(物理备份)和恢复 冷备份(一致性备份、脱机备份) --cool backup 冷备份的优缺点 冷备份一般步骤 冷备脚本的写法 存在冷备下的还原(非归档模式) 丢失数据文件 丢失system表空间 丢失sysaux undo丢失 自己建立的表空间(如users,ts_test) temp表空间 日志文件丢失 控制文件丢失 参数文件丢失 密码文件丢失 热备份(非一致性备份、联机备份) --只能用于归档模式 简介 热备的过程 基于数据库的热备 基于表空间的热备 控制文件的热备 参数文件的热备 临时表空间的数据文件、日志文件不需要备份 热备份的相关视图 存在热备下的还原 还原控制文件 还原数据文件 可以脱机的表空间文件 不可以脱机的表空间文件 0.5 移动数据(exp、expdp、sqlldr、外部表) 课程模块 培训要点 学时 exp和imp EXP导出数据 导出表 导出方案 导出数据库 IMP导入数据 导入表 导入方案 导入数据库 imp导入常见问题处理 其它实用内容 可以从dmp文件获取哪些信息? 一、获取基本信息:导出的版本、时间、导出的用户 二、获取dmp文件中的表信息 三、解析dmp文件生成parfile文件 四、如何查看dmp文件的字符集 五、如何将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中? exp的query参数 什么是延迟段创建(Deferred Segment Creation)? Oracle 11g不能导出空表的三种解决方法 exp导出ASH数据 方法1:ctas建表导出,有的客户不让建表 方法2:导出基表的数据 常见错误 XP-00091: Exporting questionable statistics 问题处理方法 EXP-00026: conflicting modes specified IMP-00013: only a DBA can import a file exported by another DBA IMP-00031: 必须指定 FULL=Y 或提供 FROMUSER/TOUSER 或 TABLES 参数 IMP-00002: 无法打开要读取的imp D:/admin.dmp EXP-00008: 遇到 ORACLE 错误 904 imp导入报错:IMP-00037: Character set marker unknown IMP-00010: not a valid export file, header failed verification imp-00051,imp-00008 IMP-00132: first file in the multi-file export is 32 0.5 数据泵(expdp和impdp) Oracle 数据泵:概览 Oracle 数据泵:优点 Oracle Database 11g 中的数据泵增强功能 数据泵的目录对象 创建目录对象 数据泵导出与导入客户机:概览 数据泵实用程序:界面与模式 使用 Database Control 进行数据泵导出 数据泵导出示例 数据泵导出示例:基本选项 数据泵导出示例:高级选项 数据泵导出示例:文件 数据泵导出示例:调度 数据泵导出示例:复查 数据泵导入示例:impdp 其它实用内容 数据泵的一些常用语法命令 如何彻底停止expdp进程? Oracle用户密码含特殊字符时如何登陆? 如何获取数据库DDL的创建语句 imp示例: imp的indexfile选项(indexfile导出表和索引的ddl语句) impdp示例: expdp时显示时间 metrics NETWORK_LINK 选项 只导出元数据 【IMPDP】使用 TRANSFORM选项去掉表空间和存储子句 如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? 12c expdp VIEWS_AS_TABLES选项 过滤对象(exclude、include) 导出数据库连接 导出JOB dba_export_objects 重定义表的Schema或表空间 优化导入/导出效率 impdp传输表空间(OCM考题) expdp 导出sys用户下的表报错ORA-39165 和ORA-39166 数据泵导出导入卡死 使用隐含Trace参数诊断Oracle Data Pump故障 全库导出和导入演示 0.5 SQL*Loader 使用 SQL*Loader 加载数据 SQL*Loader 控制文件 直接路径加载与常规路径加载的比较 如何将文本文件或Excel中的数据导入数据库? 4G大文件导入示例。 0.2 外部表 外部表的优点 使用ORACLE_LOADER定义外部表 使用ORACLE_DATAPUMP填充外部表 使用外部表 基础 只有1列 外部表的parallel 利用外部表查看告警日志 先来个最简单的使用方法 再来个稍微复杂点的 0.2 管理补丁程序 课程模块 培训要点 学时 管理补丁程序 PSU、SPU(CPU)、BP、one-off patch等概念简介 什么是Metalink或MOS Upgrade与Update 如何查找最新的PSU? 如何确认当前数据库已经安装了什么PSU? 如何安装PSU? PSU安装演示 11.2.0.3.0升级到11.2.0.3.1 热补丁安装演示( One-off Patch) 一道OCM考题 0.5 实验课 课程模块 培训要点 学时 实验课 数据泵之NETWORK_LINK Duplicating an Active Database(duplicate复制数据库) Duplicating a Database Without Recovery Catalog or Target Connection Duplicating a Database Without Recovery Catalog or Target Connection TSPITR(表空间基于时间点恢复) 直接复制数据文件实现linux平台数据库复制到windows平台数据库 利用rman来实现linux平台数据库复制到windows平台数据库 热备下的测试库搭建 传输表空间(TTS)一例(linux asm -> win 文件系统) 传输表空间(TTS)一例(win文件系统 -> linux asm ) 传输表空间(TTS)一例(AIX asm -> linux asm ) 传输表空间(TTS)一例(linux asm -> AIX asm) 传输表空间(TTS)一例(linux asm -> AIX asm)--基于RMAN备份 传输表空间(TTS)一例(AIX asm -> linux asm )--基于RMAN AIX平台数据库迁移到Linux--基于RMAN(真实环境) 2 OCP讲课内容思维导图 安装与卸载 SQL基础部分 基本对象的管理 数据库管理部分 体系结构和Oracle Restart 管理数据库实例 ASM 网络管理 表空间及数据文件 事务处理及用户 用户权限及角色 锁和会话 审计和Undo AWR、ASH、ADDM、统计信息 JOB和分区 备份和恢复(包括闪回) 移动数据 管理补丁程序 实验课 OCP讲课文档目录 数据库安装部分的目录 第1章 安装Oracle软件 - 6 - 1.1 Oracle DB 管理员的任务 - 6 - 1.2 用于管理 Oracle DB 的工具 - 7 - 1.3 制定安装计划 - 8 - 1.4 Oracle Grid Infrastructure 和Oracle DB 安装:系统要求 - 9 - 1.5 准备操作系统 - 10 - 1.5.1 设置环境变量 - 11 - 1.5.2 检查系统要求 - 12 - 1.5.3 OUI - 13 - 1.5.4 GI安装 - 15 - 1.5.4.1 Installation Option(安装选项) - 15 - 1.5.4.2 选择产品语言 - 16 - 1.5.4.3 创建 ASM 磁盘组 - 17 - 1.5.4.4 定义 ASM 口令 - 17 - 1.5.4.5 定义已授权的操作系统组 - 19 - 1.5.4.6 指定安装位置 - 20 - 1.5.4.7 创建清单 - 21 - 1.5.4.8 执行先决条件检查 - 22 - 1.5.4.9 验证安装概要数据 - 23 - 1.5.4.10 监视安装进度 - 24 - 1.5.4.11 执行root配置脚本 - 25 - 1.5.4.12 执行 Configuration Assistant - 25 - 1.5.4.13 完成安装 - 27 - 1.5.4.14 配置 FRA 磁盘组 - 27 - 1.5.5 安装 Oracle DB 软件 - 30 - 1.5.5.1 选择安装类型 - 30 - 1.5.5.2 选择网格安装选项 - 31 - 1.5.5.3 选择语言设置 - 32 - 1.5.5.4 选择数据库版本 - 33 - 1.5.5.5 指定安装位置 - 34 - 1.5.5.6 选择操作系统组 - 35 - 1.5.5.7 执行先决条件检查 - 36 - 1.5.5.8 安装概要页 - 37 - 1.5.5.9 安装产品页 - 38 - 1.5.5.10 安装完成 - 39 - 1.5.5.11 安装选项:无提示模式 - 41 - 1.5.5.12 小测验 - 41 - 1.5.5.13 小结 - 42 - 1.5.6 使用DBCA创建Oracle DB - 42 - 1.5.6.1 计划数据库 - 42 - 1.5.6.2 选择适当的字符集 - 44 - 1.5.6.3 Database Configuration Assistant (DBCA) - 48 - 1.5.6.4 Database Templates(数据库模板) - 49 - 1.5.6.5 Database Identification(数据库标识) - 49 - 1.5.6.6 Management Options(管理选项) - 50 - 1.5.6.7 Database Credentials(数据库身份证明) - 50 - 1.5.6.8 Database File Locations(数据库文件位置) - 51 - 1.5.6.9 Recovery Configuration(恢复配置) - 52 - 1.5.6.10 Database Content(数据库内容) - 52 - 1.5.6.11 Initialization Parameters(初始化参数) - 53 - 1.5.6.12 Database Storage(数据库存储) - 54 - 1.5.6.13 Create Options(创建选项) - 54 - 1.5.7 创建数据库设计模板 - 57 - 1.5.8 使用 DBCA 删除数据库 - 58 - 1.5.9 小测验 - 60 - 1.5.10 小结 - 60 - 第2章 RHEL 5.5的OS版本 - 60 - 2.1 安装VMware Workstation 12 Pro - 60 - 2.1.1 校验MD5值 - 61 - 2.2 安装RHEL 5.5的OS版本 - 63 - 2.2.1 简易安装 - 63 - 2.2.2 一般安装过程 - 68 - 2.2.2.1 开始安装 - 83 - 2.2.2.2 建立自定义的分区结构 - 87 - 2.2.2.3 继续 - 92 - 2.3 其它软件安装 - 99 - 2.3.1 安装VMware Tools - 99 - 2.3.1.1 安装完成后设置共享文件 - 104 - 2.3.1.2 设置桌面背景和桌面的大小 - 105 - 2.3.2 设置主机IP地址 - 106 - 2.3.3 中文环境切换成英文环境 - 107 - 2.3.4 配置本地yum源(rhel 5.5) - 107 - 2.3.5 安装rlwrap - 108 - 2.4 对/dev/sdb进行分区 - 109 - 2.4.1 逻辑卷管理的命令 - 116 - 第3章 安装11.2.0.3 64位单机数据库软件 - 117 - 3.1 安装前的准备工作 - 117 - 3.1.1 软件准备 - 117 - 3.1.2 检查硬件 - 117 - 3.1.3 修改hosts文件、修改主机名 - 118 - 3.1.4 安装软件包检查 - 118 - 3.1.5 内核参数--shell限制 - 120 - 3.1.5.1 /etc/security/limits.conf - 120 - 3.1.5.2 /etc/pam.d/login - 121 - 3.1.5.3 /etc/profile - 121 - 3.1.5.4 /etc/sysctl.conf - 121 - 3.1.6 关闭防火墙 - 122 - 3.1.7 关闭耗费资源的服务 - 123 - 3.1.8 禁用selinux - 123 - 3.2 新建用户和组 - 124 - 3.2.1 配置用户的环境变量 - 124 - 3.3 新建安装目录 - 125 - 3.4 将oracle使用者加入到sudo群组中 - 125 - 3.5 准备oracle安装文件 - 125 - 3.5.1 拷贝安装文件 - 125 - 3.5.1.1 计算MD5值 - 128 - 3.5.2 解压安装文件 - 129 - 3.6 开始安装 - 130 - 3.6.1 安装前的检查 - 141 - 3.6.2 执行root.sh脚本 - 144 - 3.7 扩展(静默安装软件) - 145 - 第4章 创建数据库 - 148 - 4.1 DBCA图形创建 - 148 - 4.1.1 启动监听 - 159 - 4.2 DBCA静默方式建库(必会) - 161 - 4.2.1.1 什么是静默建库? - 161 - 4.3 CREATE DATABASE手动建库(OCM) - 163 - 4.4 删除数据库的几种方式 - 164 - 4.5 在多个不同版本的数据库情况下,如何确定实例的ORACLE_HOME地址? - 164 - 第5章 配置监听和TNS - 165 - 5.1 静默创建监听 - 167 - 第6章 其它 - 167 - 6.1 让Oracle DB、监听和oem开机启动(dbstart) - 167 - 6.1.1 方法1:配置Linux的service服务 - 168 - 6.1.2 方法2:配置/etc/rc.d/rc.local文件 - 170 - 6.1.3 总结 - 172 - 6.2 PLSQL Developer软件使用和Windows 下绿色版Oracle客户端的安装和使用 - 172 - 6.2.1 Linux下绿色版Oracle客户端的安装 - 172 - 6.3 配置glogin.sql - 173 - 6.4 如何判断Oracle是32位还是64位? - 173 - 第7章 数据库软件的卸载 - 176 - 第8章 安装grid软件 - 177 - 8.1 OS修改 - 177 - 8.1.1 编辑 /etc/security/limits.conf 文件,在文件尾部添加如下内容: - 177 - 8.1.2 添加grid用户 - 177 - 8.1.3 配置grid用户的环境变量 - 178 - 8.1.4 扩展磁盘空间 - 179 - 8.2 ASM磁盘准备(创建asm磁盘) - 179 - 8.2.1 创建ASM磁盘的方法1--Faking方式 - 179 - 8.2.2 创建ASM磁盘的方法2--直接修改/etc/sysconfig/rawdevices配置raw(rhel6之后不支持) - 182 - 8.2.3 创建ASM磁盘的方法3--Udev方式 - 184 - 一、 uuid方式 - 184 - 2、 配置 udev 绑定的 scsi_id - 187 - 3、 创建并配置udev rules文件 - 188 - 4、 udevadm进行测试 - 189 - 5、 添加完成后,重启 udev,不同 Linux 发行版本重启方式不一样。 - 189 - 6、 查看绑定的 asm,如果此时还是看不到 asm disk,请重启操作系统后再查看。 - 189 - 二、 raw方式 - 190 - 8.2.4 创建ASM磁盘的方法4--ASMLIB方式 - 191 - 一、 系统版本号 - 191 - 二、 Oracle asmlib下载 - 191 - 三、 上传并安装上述的三个rpm软件包 - 193 - 四、 配置ASM - 193 - 五、 系统添加磁盘 - 194 - 六、 grid软件安装完毕后配置asm_diskstring 路径 - 195 - 七、 测试 - 197 - 8.3 安装grid软件 - 198 - 8.3.1 解压软件 - 198 - 8.3.2 开始安装grid软件(图形界面) - 199 - 8.3.2.1 创建ASM磁盘组 - 203 - 8.3.2.2 执行root脚本 - 209 - 8.3.2.3 继续安装 - 210 - 8.3.2.4 测试ASM实例 - 211 - 8.3.3 静默安装grid软件(可选) - 212 - 8.3.3.1 安装grid软件 - 212 - 8.3.3.2 静默创建ASM实例 - 215 - 8.3.3.3 静默创建grid用户的监听 - 216 - 8.4 创建DATA和FRA的ASM磁盘组 - 218 - 8.5 创建asm管理的数据库 - 221 - 8.6 创建EM - 223 - 8.7 其它扩展 - 225 - 8.7.1 在AIX或Linux下,如何查看磁盘是否包含数据? - 225 - 8.7.2 如何让crs_stat命令显示完整 - 227 - 8.7.3 kfod命令 - 227 - 8.7.3.1 在采用asmlib时,确认物理磁盘的方法 - 228 - Oracle基本SQL部分及其基本管理 目录 - 1 - 序言 - 12 - 第1章 SQL简介 - 12 - 1.1 SQL的起源和分类 - 13 - 1.1.1 SQL的起源 - 13 - 1.1.2 SQL的分类 - 13 - 1.2 提交(COMMIT)类型 - 15 - 1.3 如何查询在线和离线的官方文档 - 19 - 第2章 SQL*Plus工具 - 20 - 2.1 SQL 与 SQL*Plus - 20 - 2.2 SQL 语句与SQL*Plus - 20 - 2.2.1 关系对比 - 20 - 2.2.2 关系图 - 21 - 2.3 登录 SQL*Plus - 21 - 2.3.1 EZCONNECT方式 - 22 - 2.3.2 使用 SQL*Plus - 24 - 2.4 SQL*Plus和SQL Developer - 24 - 2.4.1 从Shell脚本调用SQL*Plus - 25 - 2.4.1.1 shell调用 - 25 - 一、 最简单的shell里调用sqlplus - 25 - 二、 把sqlplus执行结果传递给shell方法一 - 26 - 三、 把sqlplus执行结果传递给shell方法二 - 26 - 四、 把shell程序参数传递给sqlplus - 27 - 五、 为了安全要求每次执行shell都手工输入密码 - 27 - 六、 为了安全从文件读取密码 - 28 - 2.4.1.2 bat调用 - 28 - 2.4.2 从SQL*Plus调用SQL脚本 - 29 - 2.4.3 sqlplus中将行转为列输出 - 31 - 2.5 SQL*Plus的设置 - 34 - 2.5.1 显示表结构 - 35 - 2.5.2 SET TIMING ON; 和 SET TIME ON - 35 - 2.5.3 SQL*Plus编辑命令 - 35 - 2.5.4 使用 LIST, n, 和 APPEND - 36 - 2.5.5 SQL*Plus 文件命令 - 36 - 2.5.5.1 导出csv、和html文件 - 37 - 一、 导出csv文件格式 - 37 - 二、 导出html文件格式 - 38 - 2.5.6 如何使用上下左右方向键 - 40 - 2.5.7 设置执行脚本时的搜寻路径 - 41 - 2.5.8 SQL*Plus中@和@@的区别是什么? - 41 - 2.5.9 SQL*Plus中&与&&的区别是什么? - 41 - 2.5.10 glogin.sql脚本的作用是什么?如何修改命令的提示符? - 42 - 2.5.11 SQL*Plus的ERRORLOGGING的作用是什么? - 42 - 2.5.12 如何给SQL*Plus安装帮助? - 43 - 2.6 iSQL*Plus 简介 - 44 - 2.6.1 iSQL*Plus概览 - 46 - 2.6.2 SQL 和iSQL*Plus 交互作用 - 46 - 第3章 基本SELECT语句 - 46 - 3.1 SELECT语句的功能 - 47 - 3.2 选择所有列 - 48 - 3.3 选择指定的列 - 48 - 3.4 SQL语句的编辑 - 49 - 3.5 列标题默认属性 - 49 - 3.6 算术表达式 - 51 - 3.7 定义空值 - 52 - 3.7.1 NULL的注意事项 - 54 - 3.7.2 IS NULL 走索引 - 55 - 3.7.3 多表查询中的空值问题 - 56 - 3.7.3.1 情形一: - 57 - 3.7.3.2 情形二: - 58 - 3.8 定义列别名 - 59 - 3.9 连字运算符 - 61 - 3.9.1 文字字符串 - 62 - 3.10 相同的行--去重(distinct) - 62 - 3.11 Quote (q)--11g新增 - 64 - 3.12 Oracle特殊字符的处理 - 67 - 3.13 本章学习目的 - 68 - 第4章 条件和排序 - 69 - 4.1 用选择限定行 - 69 - 4.1.1 限定语法 - 70 - 4.1.2 使用WHERE子句 - 71 - 4.1.3 条件中使用字符串和日期 - 71 - 4.1.4 比较条件 - 72 - 4.1.4.1 使用比较条件 - 72 - 4.1.4.2 使用BETWEEN条件 - 73 - 4.1.4.3 使用IN条件 - 73 - 4.1.4.4 使用LIKE条件 - 75 - 一、 LIKE模糊查询如何使用索引 - 77 - 4.1.4.5 使用NULL/NOT NULL条件 - 79 - 4.1.5 逻辑条件(AND、OR 、NOT) - 81 - 4.1.5.1 注意问题 - 83 - 4.1.6 优先规则 - 84 - 4.2 排序 - 85 - 4.2.1 降序排序 - 86 - 4.2.2 用列别名排序 - 87 - 4.2.3 多列排序 - 88 - 4.3 总结 - 89 - 第5章 Oracle SQL 单行函数 - 89 - 5.1 学习目的 - 89 - 5.2 SQL函数介绍 - 89 - 5.3 SQL函数分类 - 90 - 5.3.1 单行函数 - 90 - 5.4 DUAL表介绍 - 91 - 5.4.1 扩展 - 92 - 5.5 字符函数 - 93 - 5.5.1 大小写处理函数 - 93 - 5.5.2 字符处理函数 - 94 - 5.6 数字函数 - 96 - 5.7 日期函数 - 97 - 5.7.1 系统日期 - 97 - 5.7.2 用日期计算 - 98 - 5.7.3 日期函数 - 99 - 5.7.4 转换函数 - 100 - 5.7.5 隐式数据类型转换 - 101 - 5.7.5.1 扩展 - 101 - 5.7.6 显式数据类型转换 - 103 - 5.7.6.1 日期格式模板 - 103 - 5.7.6.2 时间格式模板 - 104 - 5.7.6.3 数字格式模板 - 104 - 5.8 嵌套函数 - 104 - 5.9 通用函数 - 104 - 5.10 条件表达式 - 106 - 5.10.1 CASE表达式 - 106 - 5.10.2 DECODE函数 - 107 - 5.11 总结 - 108 - 5.12 扩展 - 109 - 5.12.1 如何将一个数字转换为字符串并且按照指定格式显示? - 109 - 5.12.2 ORA-00904: "wm_concat":invalid identifier错误解决 - 110 - 5.12.3 如何判断一个字符串是否含有中文汉字? - 115 - 5.12.4 在Oracle中,如何判断一个字符串是否为数字? - 117 - 5.12.5 在Oracle中,如何让日期显示为"年-月-日 时:分:秒"的格式? - 118 - 5.12.6 如何判断当天是否月份最后一天? - 119 - 第6章 用组函数合计数据 - 120 - 6.1 学习目的 - 120 - 6.2 组函数的概念 - 121 - 6.3 组函数使用 - 121 - 6.3.1 使用AVG、SUM、MAX、MIN - 122 - 6.3.1.1 MAX和MIN优化写法 - 122 - 6.4 使用COUNT - 124 - 6.4.1 使用COUNT(DISTINCT 列) - 125 - 6.4.2 COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名) - 125 - 6.5 组函数与空值 - 126 - 6.6 GROUP BY 子句 - 127 - 6.7 HAVING 子句 - 128 - 6.8 嵌套组函数 - 128 - 6.9 总结 - 129 - 第7章 从多表中查询数据 - 129 - 7.1 从多表中查询数据 - 129 - 7.2 有效连接条件与笛卡儿积 - 130 - 7.2.1 笛卡尔积是什么? - 130 - 第8章 连接的类型 - 131 - 8.1 等值连接 - 132 - 8.1.1 等值连接中的列别名、表别名 - 134 - 8.1.2 多于两个表的等值连接 - 135 - 8.2 外连接 - 136 - 8.2.1 外连接(扩展) - 140 - 8.3 自连接 - 143 - 8.3.1 自连接(Self Join) - 144 - 8.4 SQL 1999 连接语法介绍 - 145 - 8.4.1 交叉连接 - 145 - 8.4.2 自然连接 - 145 - 8.4.3 ON子句 - 146 - 8.5 关于SQL Join 中 where和and的区别 - 147 - 8.6 层次查询 分层查询 树形查询 - 150 - 8.6.1 层次查询语法结构 - 151 - 8.6.2 分析 - 153 - 8.6.3 SYS_CONNECT_BY_PATH 用于 行列转换 - 166 - 8.6.4 层次查询进阶 - 167 - 8.6.5 综合案例 - 170 - 8.6.6 快速构造大表 - 173 - 8.7 WITH语法 - 174 - 8.8 总结 - 175 - 第9章 子查询 - 175 - 9.1 学习目的 - 176 - 9.2 子查询介绍 - 176 - 9.3 子查询分类 - 178 - 9.3.1 单行子查询 - 178 - ? ?单行子查询:子查询只返回一行 - 178 - ? ?针对单行子查询的条件和普通条件一样 - 178 - ? ?单行子查询中使用HAVING - 178 - ? ?可以把单行子查询想像作一个可变的值。它和一个单一值没什么区别 - 178 - 9.3.2 单行子查询错误 - 181 - 9.3.3 多行子查询 - 182 - 9.3.4 总结 - 184 - 9.3.5 子查询扩展 - 184 - 9.3.5.1 标量子查询和关联子查询 - 185 - 9.3.5.2 子查询中的IN和EXISTS - 186 - 9.3.5.3 多行子查询 - 187 - 9.4 一个案例 - 188 - 第10章 合并查询(集合查询) - 190 - 10.1 UNION - 190 - 10.2 UNION ALL - 191 - 10.3 INTERSECT(相交) - 191 - 10.4 MINUS(相减) - 192 - 第11章 数据字典 - 192 - 11.1 动态性能视图 - 193 - 11.1.1 动态性能视图:注意事项 - 195 - 11.2 数据字典 - 196 - 11.2.1 数据字典视图 - 197 - 11.3 扩展 - 199 - 第12章 创建和管理表 - 201 - 12.1 数据库对象及表介绍 - 201 - 12.2 有关表的最大列数 - 202 - 12.3 表的分类 - 203 - 12.3.1 Oracle的表可以分为哪几类? - 203 - 12.4 表和列的命名规则 - 204 - 12.5 CREATE TABLE语句创建表 - 205 - 12.5.1 用子查询语法创建表(CTAS) - 206 - 12.5.1.1 CTAS及其优化 - 207 - 12.6 DEFAULT选项 - 207 - 12.7 引用表 - 208 - 12.8 数据类型介绍 - 209 - 12.8.1 时间数据类型 - 210 - 12.8.1.1 TIMESTAMP类型 - 210 - 12.8.1.2 INTERVAL YEAR TO MONTH数据类型 - 212 - 12.8.1.3 INTERVAL DAY TO SECOND数据类型 - 213 - 12.9 ALTER TABLE语句 - 214 - 12.9.1 添加列 - 214 - 12.9.2 修改列 - 215 - 12.9.2.1 修改字段的类型、大小和默认值(不能有数据) - 215 - 12.9.3 删除列(删除一个字段或清空某一列的数据) - 215 - 12.9.3.1 SET UNUSED选项 - 216 - 12.9.4 修改表的存储特征 - 217 - 12.9.5 修改表的名字 - 217 - 12.9.6 修改字段的名字 - 217 - 12.9.7 移动表所在的表空间 - 218 - 12.10 删除表 - 218 - 12.11 改变对象名称 - 218 - 12.12 截断表(TRUNCATE) - 219 - 12.13 给表和列添加注释 - 219 - 12.13.1 利用SQL生成需要的SQL语句 - 220 - 12.14 总结 - 222 - 第13章 操作数据 - 222 - 13.1 学习目的 - 222 - 13.2 数据操纵语言 - 223 - 13.3 INSERT插入数据的语法 - 223 - 13.3.1 INSERT插入值的变化 - 225 - 13.3.1.1 插入特殊值 - 225 - 13.3.1.2 插入指定日期 - 226 - 13.3.1.3 插入可输入变量 - 226 - 13.3.1.4 从另外一个表复制 - 226 - 13.3.1.5 在INSERT语句中使用子查询 - 227 - 13.4 UPDATE更新数据的语法 - 227 - 13.4.1 UPDATE更新的例子和问题 - 228 - 13.4.2 用子查询更新两列 - 228 - 13.4.3 更新基于另一个表的行(多表关联更新--使用子查询更新数据) - 229 - 13.4.3.1 例子 - 230 - 13.4.4 更新导致完整性约束报错 - 232 - 13.5 DELETE删除数据的语法 - 233 - 13.5.1 TRUNCATE语句 - 234 - 13.5.2 DELETE更新的例子和问题 - 235 - 13.5.3 从表中删除行 - 235 - 13.5.4 删除基于另一个表的行 - 235 - 13.5.4.1 一道OCM题 - 236 - 13.5.5 删除数据导致的完整性约束 - 237 - 13.5.6 查找和删除重复的记录 - 237 - 13.6 显示默认值 - 238 - 13.7 MERGE合并语句语法 - 238 - 13.7.1 MERGE语句在优化中的巨大作用 - 242 - 13.7.2 DML语句优化的方法 - 243 - 13.8 DELETE、DROP和TRUNCATE的区别是什么? - 244 - 13.9 本章总结 - 245 - 第14章 约束 - 245 - 14.1 约束的概念和原则 - 245 - 14.1.1 约束的概念 - 246 - 14.1.2 约束的原则 - 246 - 14.2 定义约束 - 246 - 14.2.1 定义约束的语法 - 246 - 14.2.2 定义约束分类 - 247 - 14.3 几种常见的约束 - 248 - 14.3.1 NOT NULL约束 - 249 - 14.3.2 UNIQUE约束 - 249 - 14.3.3 PRIMARY KEY约束 - 251 - 14.3.4 FOREIGN KEY约束 - 251 - 14.3.4.1 外键列的索引 - 255 - 14.3.4.2 外键的死锁(外键未加索引) - 258 - 一、 脚本 - 263 - 二、 找出没有建立索引的外键 - 265 - 14.3.5 CHECK约束 - 266 - 14.4 管理约束 - 268 - 14.4.1 添加约束 - 268 - 14.4.2 删除约束 - 270 - 14.4.3 禁用、启用约束 - 271 - 14.4.4 级联约束 - 271 - 14.4.5 查看约束 - 272 - 14.5 ocp - 273 - 14.6 总结 - 274 - 第15章 视图 - 274 - 15.1 视图的概念和优势 - 274 - 15.2 视图的概念 - 275 - 15.2.1 使用视图的优势 - 275 - 15.3 创建简单视图 - 276 - 15.3.1 视图中查询数据 - 277 - 15.4 创建复杂视图 - 277 - 15.5 视图中DML操作的执行规则 - 277 - 15.5.1 With Check OPTION子句 - 278 - 15.5.2 With READ ONLY子句 - 278 - 15.6 管理视图 - 278 - 15.6.1 修改视图 - 279 - 15.6.2 删除视图 - 279 - 15.6.3 内建视图 - 279 - 15.7 视图扩展 - 280 - 15.7.1 Oracle中的视图 - 280 - 15.7.2 在什么情况下可以对视图执行增、删、改操作? - 281 - 15.8 Top-N 分析 - 282 - 15.8.1 扩展 - 283 - 15.9 物化视图简介 - 285 - 15.9.1 扩展 - 286 - 查询重写(QueryRewrite): - 287 - 15.10 总结 - 290 - 第16章 其他数据库对象 - 290 - 16.1 其他数据库对象的作用 - 291 - 16.2 序列 - 291 - 16.2.1 序列的语法 - 292 - 16.2.2 定义及查询序列 - 292 - 16.2.3 NEXTVAL和CURRVAL伪列 - 293 - 16.2.4 使用序列 - 293 - 16.2.5 修改序列 - 294 - 16.2.6 删除序列 - 295 - 16.2.7 麦苗扩展 - 295 - 16.2.7.1 注意内容 - 295 - 16.2.7.2 性能问题 - 296 - 16.2.7.3 OCP和OCM题举例 - 296 - 16.3 索引 - 297 - 16.3.1 索引的优缺点 - 297 - 16.3.2 索引的使用原则 - 298 - 16.3.3 创建索引 - 299 - 16.3.4 查询索引 - 300 - 16.3.5 基于函数的索引 - 300 - 16.3.6 删除索引 - 301 - 16.3.7 麦苗扩展 - 301 - 16.3.7.1 如何预估即将创建索引的大小? - 301 - 16.3.7.2 如何监控索引的使用状况? - 302 - 16.3.7.3 哪些操作会导致索引失效? - 305 - 16.3.7.4 什么是索引的选择性(Index Selectivity)? - 306 - 16.3.7.5 为什么索引没有被使用? - 307 - 16.3.7.6 IS NULL如何用到索引? - 310 - 16.3.7.7 LIKE模糊匹配如何选择索引? - 310 - 16.4 同义词 - 311 - 16.4.1 概念语法 - 311 - 16.4.2 创建和删除同义词 - 311 - 16.4.3 扩展 - 312 - 16.4.3.1 PLAN_TABLE表的真谛 - 312 - 16.5 数据库链接(dblink) - 313 - 16.5.1 dblink扩展 - 314 - 16.5.2 一道OCM考题 - 317 - =================================================== - 317 - 存储过程、函数、包的开发 - 318 - 第17章 PL/SQL 块 - 318 - 17.1 PL/SQL 简介 - 318 - 17.2 程序形式 - 318 - 17.3 编写规范 - 318 - 17.3.1 注释 - 318 - 17.3.2 标志符号的命名规范 - 319 - 17.4 PL/SQL 块(匿名块)结构 - 319 - 17.4.1 声明部分 - 320 - 17.4.2 可执行部分 - 322 - 第18章 控制结构(分支,循环,控制) - 323 - 18.1 简介 - 323 - 18.2 条件分支语句 --if - 323 - 18.3 循环 - 326 - 18.3.1 loop - 326 - 18.3.2 while循环 - 328 - 18.3.3 for 循环 - 330 - 18.3.3.1 游标for循环 - 332 - 18.4 顺序控制 –goto,null - 333 - 18.4.1 goto 语句 - 333 - 18.4.2 null - 335 - 第19章 异常处理 - 337 - 19.1 概述 - 337 - 19.2 异常处理 - 337 - 19.2.1 预定义异常 ( Predefined ) - 337 - 19.2.2 非预定义异常(Non Predefined ) - 343 - 19.2.3 自定义异常(User_define) - 345 - 19.3 抛出异常 - 348 - 19.3.1 raise - 348 - 19.3.2 RAISE_APPLICATION_ERROR - 349 - 19.4 存过中捕获异常的行号 - 350 - 19.5 如何捕获错误并记录到表中? - 354 - 第20章 存储过程(Stored Procedure) - 359 - 20.1 存储过程和函数的区别是什么? - 359 - 20.2 示例 - 359 - 20.2.1 执行和调用存储过程 - 360 - 20.2.1.1 执行存过 - 360 - 20.2.1.2 存过调用存过 - 362 - 第21章 Oracle中的触发器 - 362 - 21.1 一些常用的监控 - 369 - 21.2 Oracle的自治事务是什么? - 374 - 第22章 Oracle中过程/函数返回集合 - 376 - 22.1.1 函数返回系统游标 - 376 - 第23章 Oracle分批提交DML - 377 - 23.1 分批update - 377 - 23.2 分批delete - 378 - 23.3 分批insert - 379 - Oracle 备份恢复(rman、闪回、数据泵、exp、数据迁移等) 目录 - 1 - 第1章 备份和恢复的概念 - 15 - 1.1 故障类别 - 17 - 1.1.1 语句失败 - 17 - 1.1.2 用户进程失败 - 18 - 1.1.3 网络故障 - 19 - 1.1.4 用户错误 - 19 - 1.1.5 介质故障 - 20 - 1.2 Oracle的SCN是什么? - 20 - 1.2.1 SCN的组成 - 20 - 1.2.2 SCN的分类 - 21 - 1.2.3 如何查看系统当前SCN - 22 - 1.2.4 SCN与时间的相互转换 - 22 - 1.2.5 SYS.SMON_SCN_TIME字典基表 - 24 - 1.3 实例恢复(实例故障) - 25 - 1.3.1 实例故障 - 25 - 1.3.2 了解实例恢复:检查点 (CKPT) 进程 - 26 - 1.3.3 实例恢复的阶段 - 28 - 1.3.4 优化实例恢复 - 30 - 1.3.4.1 使用 MTTR 指导 - 31 - 1.3.5 麦苗扩展 - 32 - 1.3.5.1 实例恢复(前滚和回滚) - 32 - 1.4 配置可恢复性 - 35 - 1.5 配置快速恢复区 - 36 - 1.6 测验 - 37 - 1.7 小结 - 37 - 第2章 闪回体系 - 38 - 2.1 什么是闪回?闪回有哪些分类? - 39 - 2.1.1 闪回查询(Flashback Query) - 42 - 2.1.2 闪回版本查询(Flashback Version Query) - 44 - 2.1.3 闪回事务查询(Flashback Transaction Query) - 46 - 2.1.4 闪回表(Flashback TABLE) - 47 - 2.1.5 闪回删除(Flashback DROP) - 51 - 2.1.6 闪回数据库(Flashback Database) - 52 - 2.1.7 闪回数据归档(Flashback Data Archive) - 52 - 2.1.8 相关OCP题目 - 52 - 2.2 Oracle的回收站是什么? - 54 - 2.2.1 相关OCP题目 - 56 - 2.3 什么是闪回数据归档(Flashback Data Archive)? - 58 - 2.3.1 相关OCP题目 - 60 - 2.4 什么是闪回数据库? - 63 - 2.4.1 相关OCP题目 - 65 - 2.5 其它扩展 - 67 - 2.5.1 如何让普通用户可以对DBA_SOURCE视图进行闪回查询? - 67 - 第3章 执行数据库备份 - 68 - 3.1 课程目标 - 68 - 3.2 Oracle Secure Backup - 70 - 3.3 用户管理的备份 - 71 - 3.4 术语 - 72 - 3.5 Recovery Manager (RMAN) - 74 - 3.5.1 rman 连接数据库 - 75 - 3.5.2 RMAN数据字典 - 75 - 3.5.3 rman命令 - 76 - 3.6 RMAN简介 - 76 - 3.7 RMAN的配置 - 79 - 3.7.1 定义RMAN配置 - 79 - 3.7.2 显示RMAN默认配置 - 80 - 3.7.2.1 CONFIGURE RETENTION POLICY 配置备份保留策略 - 81 - 一、 设置 RMAN 备份的保存策略 - 84 - 3.7.2.2 CONFIGURE BACKUP OPTIMIZATION 配置备份优化 - 86 - 3.7.2.3 CONFIGURE DEFAULT DEVICE TYPE 配置 IO 设备类型 - 89 - 3.7.2.4 CONFIGURE CONTROLFILE AUTOBACKUP 配置控制文件自动备份 - 89 - 一、 控制文件快照自动备份 - 90 - 二、 11G新特性-控制文件延迟自动备份 - 90 - 3.7.2.5 CONFIGURE DEVICE TYPE 设置并行备份 - 96 - 3.7.2.6 CONFIGURE DATAFILE BACKUP COPIES 设置备份文件冗余度 - 97 - 3.7.2.7 CONFIGURE MAXSETSIZE 配置备份集的最大尺寸 - 98 - 3.7.2.8 CONFIGURE ARCHIVELOG DELETION POLICY - 98 - 3.7.3 FORMAT参数 - 102 - 3.7.4 配置备份设置 - 102 - 3.7.4.1 调度备份:策略 - 104 - 3.7.4.2 调度备份:选项 - 105 - 3.7.5 OCP - 110 - 3.8 rman 其它命令 - 113 - 3.8.1 列出备份信息(list) - 113 - 3.8.2 删除备份(delete) - 115 - 3.8.2.1 RMAN中关于备份或归档文件状态OBSOLETE和EXPIRED的区别是什么? - 118 - 3.8.3 报告命令(report) - 119 - 3.8.3.1 可以报告哪些文件需要备份 - 119 - 3.8.3.2 报告不可恢复的备份集 - 119 - 3.8.3.3 报告数据库的信息 - 120 - 3.8.4 交叉检查(crosscheck) - 125 - 3.8.5 show - 126 - 3.8.6 VALIDATE DATABASE - 126 - 3.9 批处理命令RUN - 126 - 3.10 物理备份和逻辑备份分别是什么? - 127 - 3.11 catalog库 - 128 - 3.11.1 恢复目录(Recovery Catalog)的概念 - 128 - 3.11.2 如何创建恢复目录(Recovery Catalog) - 129 - 3.11.2.1 例子 - 129 - 3.11.2.2 官网 - 131 - 一、 Prerequisites - 131 - 二、 基本恢复目录 - 133 - 三、 虚拟私有目录--RVPC(RMAN virtual private catalog) - 133 - 3.11.3 Recovery catalog resyncing 恢复目录同步 - 138 - 3.11.4 IMPORT CATALOG - 138 - 3.11.4.1 例子 - 141 - 3.11.5 Managing a Recovery Catalog - 142 - 3.11.6 OCP - 142 - 3.12 BACKUP命令---RMAN备份 - 151 - 3.12.1.1 whole backup - 153 - 3.12.1.2 full backup - 154 - 一、 完全备份示例 - 156 - 3.12.2 备份表空间 - 157 - 3.12.2.1 temp表空间 - 158 - 3.12.3 备份指定数据文件 - 158 - 3.12.3.1 system - 159 - 3.12.4 备份控制文件 - 159 - 3.12.4.1 在线镜像备份 - 162 - 3.12.4.2 自动备份 - 162 - 一、 显式自动备份 - 162 - 二、 隐式自动备份 - 163 - 3.12.4.3 手动备份 - 163 - 一、 备份集备份 - 163 - 二、 镜像复制备份 - 163 - 三、 重建脚本 - 164 - 3.12.4.4 控制文件快照 - 165 - 3.12.5 备份spfile - 172 - 3.12.6 备份归档日志文件 - 172 - 3.12.6.1 归档重做日志的备份与恢复 - 173 - 3.12.6.2 联机日志的备份 - 174 - 3.13 管理备份 - 175 - 3.13.1 查看备份报告 - 177 - 3.13.2 监视快速恢复区 - 178 - 3.13.3 使用 RMAN 命令行 - 179 - 3.14 麦苗扩展 - 180 - 3.14.1 差异增量备份和累积增量备份的区别是什么? - 180 - 3.14.2 什么是块改变跟踪(Block Change Tracking)? - 185 - 3.14.2.1 OCP - 186 - 3.15 我的备份脚本 - 188 - 3.15.1 linux - 189 - 3.15.1.1 nocatalog全备 - 189 - 一、 简易版-归档 - 191 - 二、 简易版-非归档mount全备 - 192 - 3.15.1.2 catalog增量备份脚本 - 193 - 一、 我自己的 - 195 - 3.15.1.3 Nocatalog增量备份脚本 - 198 - 一、 我自己的 - 211 - 3.15.2 windows - 213 - 3.15.2.1 全备--我自己的 - 215 - 3.15.2.2 增量备份 - 216 - 3.15.2.3 设置windows定时任务 - 219 - 一、 XP下设置 - 222 - 3.16 OCP - 224 - 3.17 小测验 - 234 - 3.18 小结 - 234 - 第4章 执行数据库恢复 - 234 - 4.1 课程目标 - 234 - 4.2 打开数据库 - 235 - 4.2.1 使数据库保持在打开状态 - 237 - 4.3 数据库归档恢复 - 238 - 4.4 对数据库进行完全介质恢复 - 238 - 4.5 物理文件恢复 - 239 - 4.5.1 口令文件(密码文件) - 239 - 4.5.2 spfile 丢失 - 239 - 4.5.2.1 数据库没有挂掉 - 239 - 4.5.2.2 数据库已经挂掉 - 240 - 一、 从rman的自动备份中找回 - 240 - 二、 手动创建 - 246 - 4.5.3 controlfile丢失 - 246 - 4.5.3.1 控制文件恢复前的准备 - 248 - 4.5.3.2 有备份情况下的恢复 - 251 - 一、 控制文件之一丢失(单个控制文件丢失或损坏) - 251 - 二、 各种情况下的丢失 - 252 - 三、 使用控制文件快照 - 275 - 4.5.3.3 重建控制文件---无备份情况下的恢复 - 278 - 一、 重建控制文件resetlogs和noresetlogs的区别 - 280 - 二、 在线日志无损情况下的重建 - 300 - 三、 在线日志损坏情况下的重建 - 301 - 四、 具有只读数据文件情况下的重建 - 303 - 4.5.3.4 控制文件不一致 - 307 - 4.5.3.5 OCP - 308 - 4.5.4 Redo文件丢失(online+archive) - 310 - 4.5.4.1 在线Redo日志 - 310 - 一、 查看日志文件的状态 - 312 - 二、 日志文件的恢复方法 - 313 - 三、 数据库归档/非归档模式下inactive redo异常ORA-00316 ORA-00327 - 315 - 四、 正常关闭数据库current redo异常ORA-00316 ORA-01623 - 318 - 五、 数据库异常关闭current/active redo异常ORA-00316 ORA-01624 ORA-01194 - 321 - 六、 Loss of a Redo Log File - 332 - 七、 Loss of a Redo Log Group - 337 - 八、 loss all online redo logs - 339 - 九、 数据库未挂掉的情况下的恢复 - 340 - 4.5.4.2 恢复归档日志archivelog - 341 - 一、 restore archivelog 的各种选项 - 341 - 二、 我的例子 - 351 - 三、 怎样清除v$archived_log视图中的过期信息 - 356 - 4.5.4.3 OCP - 358 - 4.5.5 datafile丢失 - 362 - 4.5.5.1 在NOARCHIVELOG模式下丢失了数据文件 - 364 - 4.5.5.2 在ARCHIVELOG模式下丢失了非关键数据文件 - 365 - 一、 在ARCHIVELOG模式下丢失了系统关键数据文件 - 366 - 4.5.5.3 open状态下可以脱机的文件(sysaux,user等等) - 367 - 一、 修改数据文件名称 - 368 - 4.5.5.4 open状态下不能脱机的文件(system,undo,temp) - 368 - 一、 undo文件丢失 - 373 - 4.5.5.5 Loss of a Noncritical Data File in ARCHIVELOG Mode - 374 - 4.5.5.6 Loss of a System-Critical Data File in ARCHIVELOG Mode - 374 - 一、 system数据文件丢失 - 375 - 二、 【RMAN】SYSTEM表空间数据文件丢失恢复模拟 - 380 - 三、 system - 395 - 4.5.5.7 非归档模式 - 397 - 4.5.5.8 如果删除表空间之前删除了表空间文件,解决办法: - 398 - 4.5.5.9 OCP - 398 - 4.5.5.10 数据文件没有备份的情况 - 399 - 4.5.6 表空间丢失 - 406 - 4.5.6.1 临时表空间数据文件(tempfile)丢失 - 408 - 4.5.6.2 Recovering from a Lost Index Tablespace - 411 - 4.5.6.3 Recovering a Read-Only Tablespace - 412 - 4.5.6.4 undo表空间 - 412 - 一、 有备份 - 426 - 二、 无备份 - 429 - 三、 使用bbed恢复 - 454 - 四、 数据库还没有挂掉的情况下 - 454 - 4.5.7 ORACLE丢失各种文件导致数据库不能OPEN恢复 - 455 - 4.6 麦苗扩展 - 458 - 4.6.1 恢复的分类 - 458 - 4.6.2 介质恢复(MEDIA RECOVERY) - 459 - 4.6.2.1 数据库还原(RESTORE)与数据库恢复(RECOVER) - 459 - 4.6.2.2 完全恢复和不完全恢复 - 462 - 4.6.2.3 完全恢复(Complete Recovery) - 463 - 一、 完全恢复的几种场景 - 465 - 4.6.2.4 不完全恢复的几种类型 - 475 - 4.6.2.5 实例恢复和介质恢复的区别 - 476 - 4.6.3 rm -rf误操作的恢复过程----数据库在无备份且open情况下的恢复 - 477 - 4.6.3.1 实验 - 479 - 4.6.3.2 登录SQLPLUS查看基本信息 - 479 - 4.6.3.3 模拟rm -rf误操作 - 481 - 4.6.3.4 开始恢复 - 483 - 一、 判断句柄位置 - 483 - 二、 恢复数据文件、控制文件、tmp文件和online log文件 - 485 - 三、 如果数据库还没有关掉则关闭数据库 - 489 - 4.6.3.5 总结 - 491 - 4.6.4 TRUNCATE恢复方法 - 491 - 4.6.5 TSPITR(表空间基于时间点恢复) - 492 - 4.6.6 在丢失归档的情况下如何进行数据文件的恢复 - 495 - 4.6.7 数据文件OFFLINE之后必须要做的一件事是什么? - 495 - 4.6.8 什么是DRA(Data Recovery Advisor)? - 498 - 4.6.8.1 Data Recovery Advisor(数据恢复指导) - 499 - 4.6.8.2 数据恢复指导 - 501 - 4.6.8.3 数据故障 - 503 - 一、 列出数据故障 - 504 - 二、 提供修复建议 - 505 - 4.7 基于用户管理恢复的方法 - 508 - 4.8 基于用户管理的完全恢复 - 508 - 4.9 小测验 - 510 - 第5章 日志挖掘logminer - 511 - 5.1 演示 - 515 - 第6章 利用增量数据库备份进行恢复 - 516 - 6.1 自己的脚本 - 516 - 第7章 RMAN高级应用之Duplicate复制数据库 - 519 - 7.1 简介 - 519 - 7.2 duplicate体系结构 - 520 - 7.2.1 Duplicating an Active Database - 521 - 7.2.1.1 Prerequisites Specific to Active Database Duplication - 525 - 7.2.1.2 自己的例子 - 525 - 7.2.2 Cloning A Database On The Same Server Using Rman Duplicate From Active Database - 526 - 7.2.2.1 Configure The Network - 527 - 7.2.2.2 Create A Password File For The New Database - 528 - 7.2.2.3 Create An Init.Ora For The New Database - 528 - 7.2.2.4 Create The Admin Directory For The New Database - 528 - 7.2.2.5 Shutdown And Startup Mount The Source Database - 528 - 7.2.2.6 Startup Nomount The New Database - 529 - 7.2.2.7 Connect To The Target (Source) And Auxiliary (New Clone)Databases Using Rman - 529 - 7.2.2.8 Execute The Duplicate Command - 529 - 7.2.2.9 Remove The Old Pfile - 535 - 7.2.2.10 Check The New Database - 535 - 7.2.3 Duplicating a Database with a Target Connection - 536 - 7.2.4 Duplicating a Database with Recovery Catalog Without Target Connection - 537 - 7.2.5 Duplicating a Database Without Recovery Catalog or Target Connection - 538 - 7.2.5.1 老师例子 - 539 - 7.3 Creating a Backup-Based Duplicate Database - 556 - 7.3.1 Creating an Initialization Parameter File for the Auxiliary Instance - 557 - 7.3.2 Specifying New Names for Your Destination - 558 - 7.3.2.1 SET NEWNAME - 559 - 7.3.3 Specifying Parameters for File Naming - 562 - 7.3.3.1 DB_FILE_NAME_CONVERT - 563 - 7.4 OCP - 563 - 第8章 BBED简介 - 567 - 第9章 rman之块介质恢复 - 568 - 9.1 坏块的简介 - 568 - 9.2 坏块的检测方法 - 569 - 9.3 BMR恢复坏块 - 571 - 9.4 如何确定坏块的对象名 - 571 - 9.5 如果发现有坏块,那么如何检索其它未坏的数据? - 572 - 9.6 模拟坏块 - 573 - 9.6.1 blockrecover恢复坏块 - 573 - 9.6.1.1 创建演示环境 - 573 - 9.6.1.2 单块数据块损坏的恢复处理 - 574 - 9.6.1.3 多块数据块损坏的恢复处理 - 575 - 9.6.1.4 坏块的对象定位与影响 - 577 - 9.6.2 bbed模拟 - 579 - 9.6.2.1 bbed修复坏块示例 - 580 - 9.7 坏块模拟脚本 - 584 - 9.8 OCP - 585 - 第10章 OS备份(物理备份)和恢复 - 587 - 10.1 操作系统备份(物理备份) - 587 - 10.1.1 冷备份(一致性备份、脱机备份) --cool backup - 587 - 10.1.1.1 冷备份的优缺点 - 588 - 10.1.1.2 冷备份一般步骤 - 588 - 10.1.1.3 冷备脚本的写法 - 589 - 一、 冷备脚本 - 592 - 10.1.1.4 存在冷备下的还原(非归档模式) - 592 - 一、 丢失数据文件 - 592 - 二、 日志文件丢失 - 608 - 三、 控制文件丢失 - 612 - 四、 参数文件丢失 - 616 - 五、 密码文件丢失 - 616 - 10.1.1.5 OCP - 617 - 10.1.2 热备份(非一致性备份、联机备份) --只能用于归档模式 - 617 - 10.1.2.1 简介 - 617 - 10.1.2.2 具体操作 - 618 - 一、 热备的过程 - 618 - 二、 基于数据库的热备 - 619 - 三、 基于表空间的热备 - 620 - 四、 控制文件的热备 - 621 - 五、 参数文件的热备 - 622 - 六、 临时表空间的数据文件、日志文件不需要备份 - 622 - 10.1.2.3 热备份的相关视图 - 622 - 10.1.2.4 热备ocp - 625 - 10.1.2.5 存在热备下的还原 - 629 - 一、 还原控制文件 - 629 - 二、 还原数据文件 - 632 - 第11章 非归档模式备份恢复 - 637 - 11.1 非归档的备份方法 - 640 - 11.1.1 非归档全备份 - 641 - 11.2 非归档模式下的恢复 - 643 - 11.3 非归档模式的备份与恢复示例(使用冷备) - 646 - 第12章 OPEN RESETLOGS - 650 - 12.1 使用alter database open resetlogs的场合 - 650 - 12.2 为什么使用RESETLOGS? - 650 - 12.3 RESETLOGS会执行什么操作? - 650 - 12.4 ocp - 651 - 第13章 其它 - 651 - 13.1 下列4条RECOVER DATABASE命令的区别是什么 - 651 - 13.2 RESETLOGS和NORESETLOGS的区别是什么? - 652 - 第14章 跨版本恢复 - 653 - 14.1 RMAN可以跨版本或跨平台执行还原或复制命令吗? - 653 - 14.2 跨小版本 - 655 - 14.3 跨大版本 - 656 - 第15章 只存在备份片的数据库恢复过程 - 656 - 15.1.1 总结 - 656 - 第16章 Oracle恢复流程图 - 656 - 第17章 移动数据 - 658 - 17.1 移动数据:一般体系结构 - 659 - 17.2 exp和imp - 660 - 17.2.1 EXP导出数据 - 661 - 17.2.1.1 导出表 - 664 - 17.2.1.2 导出方案 - 665 - 17.2.1.3 导出数据库 - 665 - 17.2.2 IMP导入数据 - 665 - 17.2.2.1 导入表 - 667 - 17.2.2.2 导入方案 - 668 - 17.2.2.3 导入数据库 - 668 - 17.2.2.4 imp导入常见问题处理 - 670 - 17.2.3 exp和imp的一些其它用法 - 671 - 17.2.4 其它实用内容 - 672 - 17.2.4.1 可以从dmp文件获取哪些信息? - 672 - 一、 获取基本信息:导出的版本、时间、导出的用户 - 672 - 二、 获取dmp文件中的表信息 - 672 - 三、 解析dmp文件生成parfile文件 - 673 - 四、 如何查看dmp文件的字符集 - 673 - 五、 如何将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中? - 674 - 17.2.4.2 exp的query参数和parfile的使用 - 675 - 一、 query和parfile示例 - 676 - 17.2.4.3 什么是延迟段创建(Deferred Segment Creation)? - 677 - 一、 Oracle 11g不能导出空表的三种解决方法 - 679 - 17.2.4.4 exp导出ASH数据 - 680 - 一、 方法1:ctas建表导出,有的客户不让建表 - 680 - 二、 方法2:导出基表的数据 - 682 - 17.2.5 常见错误 - 684 - 17.2.5.1 EXP-00091: Exporting questionable statistics 问题处理方法 - 684 - 17.2.5.2 EXP-00026: conflicting modes specified - 687 - 17.2.5.3 IMP-00013: only a DBA can import a file exported by another DBA - 689 - 17.2.5.4 IMP-00031: 必须指定 FULL=Y 或提供 FROMUSER/TOUSER 或 TABLES 参数 - 690 - 17.2.5.5 IMP-00002: 无法打开要读取的imp D:/admin.dmp - 692 - 17.2.5.6 EXP-00008: 遇到 ORACLE 错误 904 - 692 - 17.2.5.7 imp导入报错:IMP-00037: Character set marker unknown - 693 - 17.2.5.8 IMP-00010: not a valid export file, header failed verification - 696 - 17.2.5.9 imp-00051,imp-00008 - 698 - 17.2.5.10 IMP-00132: first file in the multi-file export is 32 - 699 - 17.2.6 注意事项 - 699 - 17.3 数据泵(expdp和impdp) - 699 - 17.3.1 Oracle 数据泵:概览 - 701 - 17.3.2 Oracle 数据泵:优点 - 702 - 17.3.3 Oracle Database 11g 中的数据泵增强功能 - 703 - 17.3.4 数据泵的目录对象 - 704 - 17.3.4.1 创建目录对象 - 705 - 17.3.5 数据泵导出与导入客户机:概览 - 706 - 17.3.6 数据泵实用程序:界面与模式 - 707 - 17.3.7 使用 Database Control 进行数据泵导出 - 708 - 17.3.8 数据泵导出示例 - 709 - 17.3.8.1 数据泵导出示例:基本选项 - 710 - 17.3.8.2 数据泵导出示例:高级选项 - 710 - 17.3.8.3 数据泵导出示例:文件 - 711 - 17.3.8.4 数据泵导出示例:调度 - 713 - 17.3.8.5 数据泵导出示例:复查 - 714 - 17.3.8.6 数据泵导入示例:impdp - 714 - 17.3.9 使用 Oracle Enterprise Manager 监视数据泵作业 - 715 - 17.3.10 以数据泵旧模式提供移植支持 - 716 - 17.3.11 数据泵旧模式 - 717 - 17.3.12 管理文件位置 - 719 - 17.3.13 麦苗扩展 - 720 - 17.3.13.1 数据泵的一些常用语法命令 - 720 - 17.3.13.2 如何彻底停止expdp进程? - 725 - 17.3.13.3 如何跟踪expdp和SQL*Plus命令? - 727 - 17.3.13.4 如何退出exp、imp、telnet等等交互窗口? - 727 - 17.3.13.5 Oracle用户密码含特殊字符时如何登陆? - 728 - 17.3.13.6 如何获取数据库DDL的创建语句 - 729 - 一、 imp示例(SHOW=Y) - 729 - 二、 imp的indexfile选项(indexfile导出表和索引的ddl语句) - 732 - 三、 impdp示例 - 734 - 四、 只导出元数据完整示例 - 737 - 五、 【IMPDP】使用 TRANSFORM选项去掉表空间和存储子句 - 737 - 17.3.13.7 过滤数据(exclude、include) - 738 - 一、 Exclude 反规则 - 739 - 二、 Include 正规则 - 740 - 三、 高级过滤CONTENT参数 - 741 - 四、 过滤已经存在的数据TABLE_EXISTS_ACTION参数 - 742 - 五、 导出job - 742 - 六、 导出dblink - 743 - 七、 导出公共同义词 - 743 - 17.3.13.8 重定义表的Schema或表空间 - 743 - 17.3.13.9 优化导入/导出效率(expdp/impdp) - 744 - 17.3.13.10 impdp传输表空间(OCM考题) - 748 - 17.3.13.11 注意事项 - 750 - 一、 expdp 导出sys用户下的表报错ORA-39165 和ORA-39166 - 750 - 17.3.13.12 impdp的一些选项 - 752 - 一、 NETWORK_LINK 选项 - 752 - 二、 oracle expdp时显示时间 metrics - 752 - 17.3.13.13 如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? - 753 - 17.3.13.14 12c expdp VIEWS_AS_TABLES选项 - 766 - 17.3.13.15 其它错误 - 768 - 一、 数据泵导出出现ORA-31617错误 - 768 - 17.3.13.16 数据泵导出导入卡死 - 771 - 一、 AIX环境下EXPDP卡住问题处理 - 773 - 17.3.13.17 使用隐含Trace参数诊断Oracle Data Pump故障 - 775 - 17.4 SQL*Loader - 785 - 17.4.1 使用 SQL*Loader 加载数据 - 787 - 17.4.2 SQL*Loader 控制文件 - 787 - 17.4.3 直接路径加载与常规路径加载的比较 - 790 - 17.4.4 麦苗扩展 - 791 - 17.4.4.1 如何将文本文件或Excel中的数据导入数据库? - 791 - 一、 sqlldr高级用法 - 793 - 二、 sqlldr报错处理 - 795 - 17.4.4.2 简单示例 - 797 - 17.4.4.3 2000W酒店开房数据导入 - 798 - 17.5 外部表 - 803 - 17.5.1 外部表的优点 - 804 - 17.5.2 使用ORACLE_LOADER定义外部表 - 805 - 17.5.3 使用ORACLE_DATAPUMP填充外部表 - 806 - 17.5.4 使用外部表 - 807 - 17.5.5 麦苗扩展 - 807 - 17.5.5.1 基础 - 807 - 17.5.5.2 外部表示例 - 809 - 17.5.5.3 只有1列 - 809 - 17.5.5.4 外部表的parallel - 810 - 17.5.5.5 利用外部表查看告警日志 - 810 - 一、 先来个最简单的使用方法 - 810 - 二、 再来个稍微复杂点的 - 812 - 17.5.5.6 2000W酒店开房数据导入 - 814 - 17.6 有关sqlldr和外部表的一道OCM考题 - 815 - 17.7 小测验 - 820 - 17.8 小结 - 820 - Oracle 管理部分(包括体系结构等内容) 目录 - 1 - 第1章 管理数据并发处理(锁和会话) - 14 - 1.1 课程目标 - 14 - 1.2 锁 - 15 - 1.2.1 显式锁定 - 17 - 1.2.2 隐式锁定 - 17 - 1.2.3 按照对象分类锁定 - 17 - 1.3 锁定机制 - 18 - 1.4 数据并发处理 - 19 - 1.5 DML 锁 - 21 - 1.6 入队机制 - 22 - 1.7 锁冲突 - 23 - 1.8 锁冲突的可能原因 - 24 - 1.9 检测锁冲突 - 25 - 1.10 解决锁冲突 - 26 - 1.10.1 使用 SQL 解决锁冲突 - 27 - 1.11 死锁 - 28 - 1.12 锁的扩展 - 28 - 1.12.1 分类 - 29 - 1.12.2 锁的兼容性 - 32 - 1.12.3 锁的数据字典视图 - 33 - 1.12.4 SELECT ... FOR UPDATE - 36 - 1.12.5 DML_LOCKS和DDL_LOCK_TIMEOUT参数 - 36 - 1.12.6 在编译存储过程、函数等对象时无响应 - 36 - 1.12.7 新建或重建索引的锁信息 - 36 - 1.12.8 对于错误"ORA-08104: this index object 68111 is being online built or rebuilt",应该如何处理? - 38 - 1.12.9 会话 - 39 - 1.12.9.1 V$SESSION视图 - 39 - 1.12.9.2 如何查看某一个会话是否被其它会话阻塞? - 42 - 1.12.9.3 如何查到会话正在执行的SQL语句? - 43 - 1.12.9.4 如何彻底杀掉会话?V$SESSION的STATUS为KILLED的情况下如何找到相关的后台OS进程? - 43 - 1.12.9.5 如何让普通用户可以杀掉自己用户的会话? - 44 - 1.12.9.6 SESSIONS和PROCESSES的关系 - 46 - 1.12.9.7 如何根据OS进程快速获得DB进程信息与正在执行的语句? - 47 - 1.12.9.8 怎么杀掉特定的数据库会话? - 48 - 1.12.9.9 如何快速的清理Oracle的进程? - 48 - 1.13 小测试 - 48 - 1.14 小结 - 49 - 第2章 管理还原数据 - 49 - 2.1 还原数据 - 50 - 2.2 事务处理和还原数据 - 52 - 2.3 存储还原信息 - 53 - 2.4 还原数据与重做数据 - 54 - 2.5 管理还原 - 55 - 2.5.1 配置还原保留时间 - 56 - 2.6 保证还原保留时间 - 57 - 2.7 将还原表空间改为固定大小 - 58 - 2.8 一般还原信息 - 59 - 2.9 使用还原指导 - 60 - 2.10 查看系统活动 - 61 - 2.11 扩展 - 62 - 2.11.1 Undo的作用 - 62 - 2.11.2 Undo段存储的内容 - 63 - 2.11.3 块清除 - 64 - 2.11.4 Undo表空间 - 65 - 2.11.5 系统回滚段(System Rollback Segment)与延迟回滚段(Deferred Rollback Segment) - 67 - 2.11.6 ORA-01555 - 67 - 2.11.7 Redo日志文件(Redo Log Files)的作用是什么? - 68 - 2.11.8 如何管理联机Redo日志组与成员? - 69 - 2.11.9 在Oracle中,如果联机Redo日志文件损坏,那么如何恢复? - 70 - 2.12 小测验 - 70 - 2.13 小结 - 71 - 第3章 实施Oracle DB审计 - 72 - 3.1 责任分离 - 73 - 3.2 数据库安全性 - 74 - 3.3 监视合规性 - 75 - 3.4 标准数据库审计 - 76 - 3.5 配置审计线索 - 78 - 3.6 统一审计线索 - 79 - 3.6.1 指定审计选项 - 80 - 3.7 默认审计 - 81 - 3.7.1 Enterprise Manager 审计页 - 82 - 3.7.2 使用和维护审计信息 - 83 - 3.7.3 基于值的审计 - 84 - 3.8 细粒度审计 - 86 - 3.8.1 FGA 策略 - 87 - 3.8.2 审计的 DML 语句: - 89 - 3.8.3 FGA 准则 - 90 - 3.9 SYSDBA审计 - 91 - 3.10 维护审计线索 - 92 - 3.11 Oracle Audit Vault - 93 - 3.12 麦苗扩展 - 94 - 3.12.1.1 什么是审计(Audit)? - 94 - 3.12.1.2 迁移SYS.AUD$表到其它表空间 - 95 - 3.12.1.3 审计如何分类 - 97 - 3.12.1.4 审计中BY ACCESS和BY SESSION的区别是什么? - 97 - 3.12.1.5 如何对SYSDBA和SYSOPER进行审计? - 97 - 3.12.1.6 什么是细粒度审计(精细化审计)? - 98 - 3.12.1.7 如何禁用或删除某个用户下的所有细粒度审计? - 100 - 3.12.1.8 FGA审计和标准审计有什么区别? - 100 - 3.13 小测验 - 101 - 3.14 小结 - 101 - 第4章 数据库维护(AWR、ASH、ADDM) - 102 - 4.1 数据库维护 - 103 - 4.2 查看预警历史记录 - 104 - 4.2.1 术语 - 105 - 4.3 Oracle 优化程序:概览 - 106 - 4.4 统计信息 - 107 - 4.4.1 优化程序统计信息 - 107 - 4.4.2 使用"管理优化程序统计信息"页 - 108 - 4.4.3 手动搜集优化程序统计信息 - 109 - 4.4.4 用于搜集统计信息的首选项 - 111 - 4.4.5 麦苗扩展 - 112 - 4.4.5.1 统计信息的简介和分类 - 112 - 4.4.5.2 索引统计信息 - 115 - 4.4.5.3 列的统计信息 - 115 - 4.4.5.4 系统统计信息 - 118 - 4.4.5.5 内部对象统计信息 - 120 - 4.4.5.6 自动收集统计信息 - 120 - 一、 统计信息何时变为陈旧状态(10%的含义)? - 122 - 二、 修改自动收集统计信息的时间 - 123 - 三、 DBA_TAB_MODIFICATIONS - 125 - 4.4.5.7 怎样收集表的统计信息?怎样收集分区表的统计信息? - 126 - 4.4.5.8 什么是动态采样(Dynamic Sampling)? - 126 - 4.4.5.9 如何锁住统计信息? - 130 - 4.4.5.10 什么是待定的统计信息(Pending Statistic)? - 132 - 4.4.5.11 什么是直方图(Histogram)? - 137 - 4.4.5.12 什么是多列统计信息(Extended Statistics)? - 151 - 4.4.5.13 基表COL_USAGE$的作用是什么? - 160 - 4.4.5.14 新建索引后统计信息是否自动收集? - 160 - 4.4.5.15 什么是基数反馈(Cardinality Feedback)? - 160 - 4.4.5.16 如何查询表和索引的历史统计信息 - 165 - 4.4.5.17 Oracle如何并发地收集统计信息? - 167 - 4.4.5.18 当收集表的统计信息时应该注意哪些问题? - 168 - 4.4.5.19 什么是基数(Cardinality)和可选择率(Selectivity)? - 170 - 4.4.5.20 使用SPLIT来拆分某个分区的时候,其拆分出来的新分区的统计信息行数是多少? - 177 - 4.4.5.21 当自动收集任务运行时,哪些对象会被收集? - 178 - 4.4.5.22 分区表统计信息的更新机制是怎样的? - 178 - 4.4.5.23 如何查询表的DML操作数据变化量? - 179 - 4.4.5.24 对表执行TRUNCATE操作会将表的统计信息也清除掉吗? - 181 - 4.5 自动工作量资料档案库 (AWR) - 182 - 4.5.1 AWR 基础结构 - 183 - 4.5.2 AWR 基线 - 184 - 4.5.3 Enterprise Manager 和 AWR - 185 - 4.5.4 管理 AWR - 186 - 4.5.5 统计级别 - 187 - 4.5.6 麦苗扩展 - 188 - 4.5.6.1 什么是AWR? - 188 - 4.5.6.2 如何获取AWR报告? - 189 - 一、 定时生成AWR报告 - 190 - 4.5.6.3 AWR报告中主要关注哪些方面内容? - 194 - 4.5.6.4 如何在AWR中查看每秒执行事务的个数? - 199 - 4.6 自动数据库诊断监视器 (ADDM) - 200 - 4.6.1 ADDM 查找结果 - 202 - 4.6.2 ADDM 建议 - 203 - 4.6.3 麦苗扩展 - 204 - 4.6.3.1 什么是ADDM? - 204 - 4.6.3.2 如何获取ADDM报告? - 205 - 4.7 ASH - 206 - 4.7.1 什么是ASH? - 206 - 4.7.2 如何获取ASH报告? - 207 - 4.7.3 如何查看过去某一段时间数据库系统的会话是否有问题? - 208 - 4.8 ASH、AWR、ADDM、AWRDDRPT、AWRSQRPT的比对 - 210 - 4.9 指导框架 - 212 - 4.9.1 Enterprise Manager 和指导 - 214 - 4.9.2 DBMS_ADVISOR程序包 - 215 - 4.10 小测验 - 215 - 4.11 自动维护任务 - 216 - 4.11.1 自动维护任务 - 216 - 4.11.2 自动维护任务配置 - 218 - 4.12 服务器生成的预警 - 219 - 4.12.1 设置阈值 - 220 - 4.12.2 创建和测试预警 - 221 - 4.12.3 预警通知 - 222 - 4.12.4 对预警作出响应 - 224 - 4.12.5 预警类型和清空预警 - 225 - 4.13 性能监视 - 226 - 4.13.1 Enterprise Manager 的性能页 - 227 - 4.13.2 细化到特定的等待类别 - 228 - 4.13.3 性能页:吞吐量 - 229 - 4.13.4 性能监视:顶级会话 - 230 - 4.13.5 性能监视:顶级服务 - 231 - 4.14 动态性能统计信息 - 232 - 4.15 故障排除和优化视图 - 233 - 4.16 无效和不可用对象 - 234 - 4.17 小测验 - 235 - 4.18 小结 - 236 - 第5章 JOB - 237 - 5.1 DBMS_JOB - 237 - 5.1.1 dbms_job package 用法介绍 - 241 - 5.1.1.1 DBMS_JOB包权限 - 242 - 5.1.1.2 DBMS_JOB后台进程 - 242 - 5.1.1.3 broken - 243 - 5.1.1.4 change - 244 - 5.1.1.5 interval - 244 - 5.1.1.6 isubmit - 244 - 5.1.1.7 next_date - 245 - 5.1.1.8 remove - 246 - 一、 杀job - 246 - 二、 删除其它用户下的job用 sys.dbms_ijob.remove() - 246 - 5.1.1.9 run - 251 - 5.1.1.10 submit - 252 - 5.1.1.11 user_export - 254 - 5.1.1.12 what - 254 - 一、 例子 - 255 - 5.1.2 RAC中指定dbms_job运行在指定实例 - 257 - 5.1.3 数据字典 - 259 - 5.1.4 OCP课堂 - 261 - 5.2 DBMS_SCHEDULER - 263 - 5.2.1 DBMS_JOB和DBMS_SCHEDULER之间的区别 - 264 - 5.2.2 各个组件(components) - 264 - 5.2.2.1 作业(job): - 264 - 5.2.2.2 时间表(schedule):--默认非禁用 - 264 - 5.2.2.3 程序(program): - 266 - 5.2.2.4 作业类(job_class): - 266 - 一、 管理JobClasses - 270 - 5.2.2.5 窗口(window): - 270 - 5.2.2.6 窗口组(window_group): - 272 - 5.2.3 参数设置 - 274 - 5.2.4 管理job - 278 - 5.2.4.1 启用Jobs - 278 - 5.2.4.2 禁用Jobs - 279 - 5.2.4.3 修改Jobs - 280 - 5.2.4.4 执行Jobs - 282 - 一、 dbms_scheduler.run_job报错 - 284 - 5.2.4.5 停止Jobs - 285 - 5.2.4.6 删除Jobs - 286 - 一、 批量删除job - 287 - 5.2.4.7 指定job的执行频率 - 288 - 5.2.5 创建job - 290 - 5.2.5.1 需要的权限 - 290 - 5.2.5.2 例子 - 291 - 5.2.5.3 通过dbms_scheduler去执行shell脚本 - 292 - 5.2.5.4 例子一 --- 不带参数 - 293 - 5.2.5.5 例子二 --- 带参数 - 295 - 5.2.5.6 含有参数 - 302 - 5.2.5.7 时间段内的job - 304 - 5.2.5.8 指定时间的一次性job - 305 - 5.2.5.9 批量创建job - 305 - 一、 创建job主进程 - 305 - 二、 创建job子进程 - 310 - 5.2.6 判断job是否正在运行 - 312 - 5.2.7 数据字典 - 312 - 5.2.8 Lightweight Jobs - 314 - 5.2.8.1 Persistent Lightweight Jobs - 320 - 5.2.9 OCP课堂 - 321 - 5.3 PL/SQL工具创建和管理job - 323 - 5.3.1 DBMS_JOB - 323 - 5.3.2 DBMS_SCHEDULER - 325 - 5.4 其它实用内容 - 325 - 5.4.1 RAC中如何指定JOB的运行实例? - 325 - 5.4.2 如何判断SCHEDULER JOB是否正在运行? - 328 - 5.4.3 如何查询SCHEDULER JOB的运行日志? - 329 - 5.4.4 通过DBMS_SCHEDULER如何调用SHELL脚本? - 330 - 5.4.5 如何批量删除JOB? - 330 - 5.4.6 已通知停止作业, 但是无法立即停止 - 331 - 5.5 OCP - 332 - 第6章 分区 - 333 - 6.1 分区表简介 - 334 - 6.2 分区表的一些限制条件 - 334 - 6.3 何时考虑分区? - 334 - 6.4 分区表有什么优点? - 334 - 6.5 有哪些类型的分区?如何选择用哪种类型的分区表? - 335 - 6.5.1 RANGE(范围)分区 - 335 - 6.5.2 HASH(哈希)分区 - 336 - 6.5.3 列表分区 - 338 - 6.5.4 复合分区 - 339 - 6.5.4.1 分区模板的应用 - 340 - 一、 分区模板数据字典 - 341 - 6.5.5 Interval分区 - 341 - 6.5.5.1 以月为间隔 - 342 - 6.5.5.2 以天为间隔 - 346 - 6.5.5.3 总结 - 350 - 6.5.5.4 interval分区重命名 - 353 - 一、 注意 - 357 - 6.5.6 System_partitioning - 357 - 6.5.6.1 Restrictions on System Partitioning - 358 - 6.5.6.2 Advantages of System Partitioned Tables - 359 - 6.5.6.3 Supporting Operations with System-Partitioned Tables - 361 - 6.6 分区表的维护 - 363 - 6.6.1 添加分区(add partition) - 364 - 6.6.2 收缩表分区(coalesce partitions) - 366 - 6.6.3 删除分区和删除子分区(drop partition) - 366 - 6.6.4 添加子分区 - 367 - 6.6.5 截断表分区(Truncate Partition)--截断一个分区表中的一个分区的数据 - 367 - 6.6.5.1 截断分区表的子分区 - 368 - 6.6.5.2 截断带有约束的分区表 - 368 - 6.6.5.3 注意事项 - 368 - 6.6.6 移动表分区(Move Partition) - 369 - 6.6.6.1 将一个表的分区从一个表空间移动到另一个表空间 - 370 - 6.6.6.2 压缩表Move--compress - 370 - 6.6.7 合并分区(Merge Partitions) - 371 - 6.6.8 重命名某一个分区(Rename Partition) - 374 - 6.6.9 交换表分区(Exchange Partitions) - 374 - 6.6.10 修改 list 表分区 - 378 - 6.6.10.1 修改 list 表分区--Add Values - 378 - 6.6.10.2 修改 list 表分区--Drop Values - 379 - 6.6.11 拆分表分区(Split Partition)--分区切割 - 380 - 6.6.12 修改分区表属性 - 382 - 6.6.12.1 修改表分区默认属性(Modify Default Attributes) - 382 - 6.6.12.2 修改表分区当前属性(Modify Partition) - 382 - 6.6.12.3 修改分区表的logging属性 - 383 - 6.6.12.4 并行度 - 383 - 6.6.13 修改表子分区模板(Set Subpartition Template) - 383 - 6.6.14 其它 - 385 - 6.7 分区表的查询优化 - 392 - 6.8 分区表常用数据字典视图有哪些? - 394 - 6.8.1 Oracle之INTERVAL分区的STORE IN属性存储在哪张表中? - 401 - 6.8.2 如何查询某个分区是否是INTERVAL分区表? - 402 - 6.9 分区表的压缩 - 402 - 6.9.1 分区表压缩 - 402 - 6.9.2 含有子分区的分区表压缩 - 403 - 6.9.3 分区表哪些分区被压缩了 - 403 - 6.9.4 总结 - 404 - 6.9.5 另一种办法:先置于compress状态后move - 404 - 6.9.6 解压缩 - 405 - 6.10 分区表单个分区分析(分区表收集统计信息) - 405 - 6.11 普通表转换为分区表有哪些办法? - 405 - 6.12 分区表查询 - 410 - 6.12.1 单分区查询 - 410 - 6.12.2 跨分区查询 - 411 - 6.13 分区表中lob类型的字段 - 412 - 6.14 分区表性能注意事项 - 412 - 6.15 索引失效的情况 - 420 - 6.16 OCP讲课 - 421 - 第7章 管理补丁程序 - 422 - 7.1 应用补丁程序版本 - 424 - 7.2 使用补丁程序指导 - 425 - 7.3 使用补丁程序向导 - 426 - 7.4 应用补丁程序 - 427 - 7.5 存放补丁程序 - 428 - 7.6 联机打补丁:概览 - 429 - 7.7 安装联机补丁程序 - 429 - 7.8 联机打补丁的优点 - 431 - 7.8.1 常规打补丁和联机打补丁 - 431 - 7.9 联机打补丁注意事项 - 432 - 7.10 麦苗扩展 - 433 - 7.10.1 PSU升级的过程 - 434 - 7.10.2 PSU(Patch Set Update)、CPU(Critical Patch Update)、BP(Bundle Patch)等概念 - 434 - 7.10.3 如何查找最新的PSU? - 435 - 7.10.4 如何确认当前数据库已经安装了什么PSU? - 435 - 7.10.5 如何安装PSU? - 436 - 7.10.6 Upgrade与Update - 437 - 7.10.7 注意问题 - 437 - 7.10.8 什么是Metalink或MOS? - 437 - 7.10.9 11.2.0.3.0升级到11.2.0.3.1 - 438 - 7.10.10 one-off patch - 439 - 7.10.11 一道OCM题 - 441 - 7.11 小测验 - 442 - 7.12 小结 - 442 - 第8章 使用技术支持(学员自行阅读) - 443 - 8.1 课程目标 - 443 - 8.2 使用支持工作台 - 443 - 8.3 在 Oracle Enterprise Manager 中查看严重错误预警 - 445 - 8.4 查看问题详细资料 - 446 - 8.4.1 查看意外事件详细资料:转储文件 - 447 - 8.4.2 查看意外事件详细资料:检查器查找结果 - 448 - 8.5 创建服务请求 - 449 - 8.6 将诊断数据打包并上载到 Oracle 技术支持 - 450 - 8.7 跟踪服务请求并实施修复 - 451 - 8.8 关闭意外事件和问题 - 453 - 8.9 意外事件打包配置 - 454 - 8.10 Enterprise Manager 针对 ASM 的支持工作台 - 456 - 8.11 使用 Oracle 技术支持 - 457 - 8.12 My Oracle Support 集成 - 458 - 8.12.1 使用 My Oracle Support - 459 - 8.13 调查问题 - 461 - 8.14 记录服务请求 - 463 - 8.15 小结 - 464 - 实验课 实验目录 - 11 - 第1章 数据泵之NETWORK_LINK - 11 - 1.1 博客地址 - 11 - 1.2 环境介绍 - 12 - 1.3 imp和exp简介 - 13 - 1.4 expdp不使用network_link - 15 - 1.5 expdp使用network_link - 18 - 1.5.1 目标数据库创建dblink - 18 - 1.5.2 client端或目标数据库执行 - 19 - 1.5.3 总结 - 21 - 1.6 impdp使用network_link - 21 - 1.6.1 目标数据库创建dblink - 21 - 1.6.2 client或目标端执行 - 22 - 1.6.3 总结 - 23 - 1.7 实验命令 - 23 - 第2章 Duplicating an Active Database(duplicate复制数据库) - 23 - 2.1 博客地址 - 23 - 1.1 duplicate体系结构 - 24 - 1.2 本次实验简介 - 25 - 1.3 本次实验原理 - 26 - 1.4 环境及搭建要求 - 26 - 1.4.1 对辅助数据库的要求 - 27 - 1.5 正式开始 - 28 - 1.5.1 duplicate database 设置 - 28 - 1.5.1.1 创建pfile 参数文件 - 28 - 1.5.1.2 创建密码文件 - 28 - 1.5.1.3 创建和source database的数据文件相关的目录结构 - 29 - 1.5.1.4 启动Auxiliary 到nomout 状态 - 29 - 1.5.2 在Target 和Auxiliary 都配置Oracle Net(Listener.ora and tnsnames.ora) - 30 - 1.5.2.1 测试网络是否配置好 - 33 - 1.5.3 开始RMAN duplicate from active database - 35 - 1.5.4 drop database - 41 - 2.2 OCP讲课(duplicate ACTIVE + ASM-->FS) - 42 - 1.5.5 duplicate database设置 - 42 - 1.5.5.1 创建pfile 参数文件 - 42 - 1.5.5.2 创建密码文件 - 43 - 1.5.5.3 创建和source database的数据文件相关的目录结构 - 43 - 1.5.5.4 启动Auxiliary到nomout状态 - 43 - 1.5.6 在Target和Auxiliary都配置Oracle Net(Listener.ora和tnsnames.ora) - 43 - 1.5.6.1 测试网络是否配置好 - 45 - 2.2.1 准备执行的RUN块 - 45 - 1.5.7 开始RMAN duplicate from active database - 46 - 2.2.2 测试一下dbid和dbname - 46 - 第3章 Duplicating a Database Without Recovery Catalog or Target Connection - 48 - 1.1 本次实验简介 - 48 - 1.2 环境及搭建要求 - 48 - 1.2.1 对辅助数据库的要求 - 48 - 1.3 正式开始 - 50 - 1.3.1 前期准备 - 50 - 1.3.1.1 建表 - 50 - 1.3.1.2 数据库归档模式 - 50 - 1.3.1.3 备份数据库 - 51 - 1.3.1.4 将备份内容拷贝到destination host - 55 - 1.3.1.5 创建pfile 参数文件 - 56 - 1.3.1.6 创建和source database的数据文件相关的目录结构 - 57 - 1.3.1.7 创建密码文件 - 58 - 1.3.2 实施数据库的复制 - 58 - 1.3.2.1 启动Auxiliary 到nomout 状态 - 58 - 1.3.2.2 连接到auxiliary instance并复制数据库 - 59 - 1.3.2.3 可能的报错 - 65 - 一、 fra满了 - 65 - 二、 备份位置 - 66 - 1.3.2.4 验证 - 66 - 1.3.3 drop database - 67 - 第4章 Duplicating a Database Without Recovery Catalog or Target Connection - 68 - 4.1 本次实验简介 - 68 - 4.2 本次实验原理图 - 69 - 4.3 环境及搭建要求 - 69 - 4.3.1 source database环境 - 69 - 4.3.2 对辅助数据库的要求 - 70 - 4.4 正式开始 - 71 - 4.4.1 前期准备 - 71 - 4.4.1.1 建表 - 71 - 4.4.1.2 数据库归档模式 - 73 - 4.4.1.3 备份数据库 - 74 - 4.4.1.4 将备份内容拷贝到destination host - 77 - 4.4.1.5 创建pfile 参数文件 - 77 - 4.4.1.6 创建和source database的数据文件相关的目录结构 - 78 - 4.4.1.7 创建密码文件 - 80 - 4.4.2 实施数据库的复制 - 81 - 4.4.2.1 启动Auxiliary 到nomout 状态 - 81 - 4.4.2.2 连接到auxiliary instance并复制数据库 - 83 - 一、 告警日志 - 93 - 4.4.2.3 可能的报错 - 119 - 二、 fra满了 - 119 - 三、 备份位置 - 120 - 1.1.1.2 验证 - 121 - 4.4.3 drop database - 122 - 第5章 TSPITR(表空间基于时间点恢复) - 124 - 5.1 博客地址 - 124 - 5.2 BLOG文档结构图 - 125 - 5.3 前言部分 - 125 - 5.3.1 导读 - 125 - 5.3.2 实验环境介绍 - 126 - 5.3.3 本文简介 - 126 - 5.4 TSPITR的相关知识点归纳 - 127 - 5.4.1 TSPITR简介 - 127 - 5.4.2 何时使用TSPITR - 127 - 5.5 实验部分 - 128 - 5.5.1 源库做备份操作 - 128 - 5.5.2 建立测试表并做truncate误操作 - 131 - 5.5.3 采用logminer找回误删除的时间点 - 133 - 5.5.4 执行TSPITR之前的检查 - 133 - 5.5.4.1 检查是否自包含 - 133 - 5.5.4.2 检查哪些对象执行TSPITR后将被删除 - 134 - 5.5.5 执行TSPITR - 135 - 5.5.6 online表空间并且导入丢失的对象 - 140 - 5.6 与TSPITR有关的OCP试题部分 - 142 - 5.7 总结 - 146 - 5.8 实验脚本 - 149 - 5.9 RMAN系列参考文章 - 151 - 第6章 直接复制数据文件实现linux平台数据库复制到windows平台数据库 - 152 - 6.1 平台环境概述 - 152 - 6.2 查看字节序 - 152 - 6.3 linux 下操作 - 154 - 6.3.1 linux下生成pfile和control file - 154 - 6.3.2 把linux上/u01/app/oracle/oradata/rman下的数据文件、重做日志文件、归档文件,还有刚才创建的pfile和控制文件及listener.ora、tnsnames.ora文件复制到windows平台上 - 155 - 6.4 windows 下操作 - 155 - 6.4.1 创建一个rman的实例,注意SID要与linux服务器中的相同 - 155 - 6.4.2 修改初始化参数文件,并创建相关目录 - 156 - 6.4.3 创建spfile并启动到nomount状态 - 157 - 6.4.4 将相应的数据文件拷贝到相关的目录然后重建控制文件(也别忘了更改文件路径) - 158 - 6.4.5 打开数据库并添加临时表空间数据文件 - 160 - 6.4.6 由于是64位到32位操作系统,所以需要编译一下内核代码 - 160 - 6.4.7 其它配置工作 - 163 - 6.4.8 测试OK - 163 - 6.4.9 删除数据库做其它测试 - 164 - 第7章 利用rman来实现linux平台数据库复制到windows平台数据库 - 165 - 7.1 平台环境概述 - 165 - 7.2 本次实验简介 - 165 - 7.3 本次实验原理图 - 165 - 7.4 查看字节序 - 165 - 7.5 source database 归档模式 - 167 - 7.6 linux 下操作 - 167 - 7.6.1 建表 - 167 - 7.6.2 rman备份 - 168 - 7.6.3 linux下生成pfile - 173 - 7.6.4 把linux上/home/oracle/oracle_bk/rman/下的所有备份文件复制到windows平台上 - 174 - 7.7 windows 下操作 - 174 - 7.7.1 创建一个rman的实例,注意SID要与linux服务器中的相同 - 174 - 7.7.2 修改初始化参数文件,并创建相关目录 - 175 - 7.7.3 创建spfile并启动到nomount状态 - 176 - 7.7.4 rman 进行数据文件的恢复 - 177 - 7.7.5 由于是64位到32位操作系统,所以需要编译一下内核代码 - 185 - 7.7.6 其它配置工作 - 188 - 7.7.7 测试OK - 188 - 7.7.8 删除数据库做其它测试 - 189 - 第8章 热备下的测试库搭建 - 190 - 8.1 基础知识 - 190 - 8.2 本次实验环境简介 - 190 - 8.3 源库生成热备份文件 - 190 - 8.4 传输备份文件到target库 - 194 - 8.4.1 传输数据文件 - 194 - 8.4.2 传输归档文件 - 194 - 8.5 修改target库的pfile文件并生成pfile文件中的路径 - 195 - 8.6 启动target数据库到nomount状态 - 196 - 8.7 开始创建控制文件 - 196 - 8.7.1 第一步,首先移动相应的数据文件到相应的控制文件记录的目录中 - 197 - 8.7.2 第二步,重新创建控制文件,控制文件创建完成后自动mount - 197 - 8.8 用rman注册一下 - 198 - 8.9 recover到指定的scn - 201 - 8.10 重建临时表空间并配置密码文件以及 TNS 和密码文件等 - 201 - 第9章 传输表空间(TTS)一例(linux asm -> win 文件系统) - 202 - 9.1 场景描述 - 202 - 9.2 环境准备 - 202 - 9.2.1 在源库上创建3个用户应用的表空间 - 202 - 9.2.2 在相应的表空间创建表和索引 - 203 - 9.3 判断平台支持并确定字节序 - 204 - 9.3.1 在源平台查询 - 204 - 9.3.2 在目标平台查询 - 204 - 9.4 选择自包含的表空间集(目前要传输app1tbs和idxtbs这2个表空间) - 205 - 9.4.1 进行检查 - 205 - 9.4.2 查看检查结果 - 205 - 9.5 产生可传输表空间集 - 206 - 9.5.1 使自包含的表空间集中的所有表空间变为只读状态 - 206 - 9.5.2 使用数据泵导出工具,导出要传输的各个表空间的元数据 - 206 - 9.5.2.1 确定导出目录 - 206 - 9.5.2.2 开始导出 - 207 - 9.5.3 生成数据文件 - 208 - 9.6 还原源库中的表空间为读/写模式 - 209 - 9.7 传输文件 - 210 - 9.7.1 传输转储元文件到目标库 - 210 - 9.7.2 查看目标库数据文件位置和目录 - 210 - 9.7.3 拷贝文件到目标库相应位置 - 210 - 9.8 开始导入 - 211 - 9.8.1 生成parfile文件 - 211 - 9.8.2 开始导入 - 211 - 9.8.3 查看目标平台信息 - 212 - 9.9 修改表空间对应的文件名 - 214 - 9.10 结束语 - 216 - 第10章 传输表空间(TTS)一例(win文件系统 -> linux asm ) - 216 - 10.1 场景描述 - 216 - 10.2 环境准备 - 217 - 10.2.1 在源库上创建3个用户应用的表空间 - 217 - 10.2.2 在相应的表空间创建表和索引 - 218 - 10.3 判断平台支持并确定字节序 - 219 - 10.3.1 在源平台查询 - 219 - 10.3.2 在目标平台查询 - 219 - 10.4 选择自包含的表空间集(目前要传输app1tbs和idxtbs这2个表空间) - 220 - 10.4.1 进行检查 - 220 - 10.4.2 查看检查结果 - 220 - 10.5 产生可传输表空间集 - 221 - 10.5.1 使自包含的表空间集中的所有表空间变为只读状态 - 221 - 10.5.2 使用数据泵导出工具,导出要传输的各个表空间的元数据 - 221 - 10.5.2.1 确定导出目录 - 221 - 10.5.2.2 开始导出 - 222 - 10.5.3 将数据文件拷贝到dpdump目录下 - 222 - 10.6 还原源库中的表空间为读/写模式 - 223 - 10.7 传输文件 - 223 - 10.7.1 利用ftp工具传输转储元文件到目标库 - 223 - 10.7.2 查看目标库数据文件位置和导入目录 - 223 - 10.7.3 拷贝文件到目标库相应位置并修改文件权限 - 224 - 10.8 开始导入 - 225 - 10.8.1 生成parfile文件 - 225 - 10.8.2 开始导入 - 225 - 10.8.3 查看目标平台信息 - 226 - 10.9 修改表空间对应的文件名 - 228 - 第11章 传输表空间(TTS)一例(AIX asm -> linux asm ) - 232 - 11.1 场景描述 - 232 - 11.2 环境准备 - 234 - 11.2.1 在源库上创建3个用户应用的表空间,并在相应的表空间创建表和索引 - 234 - 11.3 判断平台支持并确定字节序 - 236 - 11.4 选择自包含的表空间集 - 236 - 11.4.1 进行检查 - 236 - 11.5 产生可传输表空间集 - 237 - 11.5.1 使自包含的表空间集中的所有表空间变为只读状态 - 237 - 11.5.2 使用数据泵导出工具,导出要传输的各个表空间的元数据 - 238 - 11.5.2.1 确定导出目录 - 238 - 11.5.2.2 开始导出 - 239 - 一、 在source端转换(转换字节序可以在sorce端进行也可以在target端进行,我们选择在target端,这个步骤不执行) - 240 - 11.6 还原源库中的表空间为读/写模式 - 242 - 11.7 传输文件 - 243 - 11.7.1 查看目标库数据文件位置和导入目录 - 243 - 11.7.2 利用ftp工具传输转储元文件到目标库DATA_PUMP_DIR目录并修改权限 - 244 - 11.8 开始导入 - 245 - 11.8.1 转换字节序(转换字节序可以在sorce端进行也可以在target端进行,我们选择在target端执行) - 245 - 11.8.2 创建source库的2个用户并赋权限 - 246 - 11.8.3 开始导入 - 247 - 11.8.4 查看目标平台信息 - 247 - 第12章 传输表空间(TTS)一例(linux asm -> AIX asm) - 250 - 12.1 场景描述 - 250 - 12.2 环境准备 - 252 - 12.2.1 在源库上创建3个用户应用的表空间 - 252 - 12.2.2 在相应的表空间创建表和索引 - 253 - 12.3 判断平台支持并确定字节序 - 254 - 12.3.1 在源平台查询 - 254 - 12.3.2 在目标平台查询 - 254 - 12.4 选择自包含的表空间集 - 255 - 12.4.1 进行检查 - 255 - 12.4.2 查看检查结果 - 255 - 12.5 产生可传输表空间集 - 256 - 12.5.1 使自包含的表空间集中的所有表空间变为只读状态 - 256 - 12.5.2 使用数据泵导出工具,导出要传输的各个表空间的元数据 - 256 - 12.5.2.1 确定导出目录 - 256 - 12.5.2.2 开始导出 - 257 - 12.5.3 生成数据文件 - 258 - 12.5.3.1 在source端转换字节序(也可以在target端转换字节序,我们选择在target端转换) - 260 - 12.6 还原源库中的表空间为读/写模式 - 263 - 12.7 传输文件 - 263 - 12.7.1 传输转储元文件到目标库 - 263 - 12.7.2 查看目标库数据文件位置和目录 - 264 - 12.7.3 拷贝文件到目标库相应位置并修改权限 - 264 - 12.8 target端转换字节序 - 265 - 12.9 开始导入 - 266 - 12.9.1 创建source库的2个用户并赋权限 - 266 - 12.9.2 开始导入 - 267 - 12.9.3 查看目标平台信息 - 268 - 12.10 查看导入后结果 - 270 - 第13章 传输表空间(TTS)一例(linux asm -> AIX asm)--基于RMAN备份 - 271 - 13.1 场景描述 - 271 - 13.2 环境准备 - 272 - 13.2.1 在源库上创建3个用户应用的表空间 - 272 - 13.2.2 在相应的表空间创建表和索引 - 274 - 13.3 判断平台支持并确定字节序 - 274 - 13.3.1 在源平台查询 - 274 - 13.3.2 在目标平台查询 - 275 - 13.4 选择自包含的表空间集 - 276 - 13.4.1 进行检查 - 276 - 13.4.2 查看检查结果 - 276 - 13.5 产生可传输表空间集 - 277 - 13.5.1 rman全备份 - 277 - 13.5.2 生成结果集 - 280 - 13.6 传输文件 - 286 - 13.6.1 查看目标库数据文件位置和目录 - 286 - 13.6.2 拷贝文件到目标库相应位置并修改权限 - 287 - 13.7 target端转换字节序 - 287 - 13.8 target端开始导入数据 - 289 - 13.8.1 创建source库的2个用户并赋权限 - 289 - 13.8.2 开始导入 - 290 - 13.8.3 查看目标平台信息 - 290 - 13.9 查看导入后结果 - 291 - 第14章 传输表空间(TTS)一例(AIX asm -> linux asm )--基于RMAN - 293 - 14.1 场景描述 - 293 - 14.2 环境准备 - 294 - 14.2.1 在源库上创建3个用户应用的表空间,并在相应的表空间创建表和索引 - 294 - 14.3 判断平台支持并确定字节序 - 296 - 14.4 选择自包含的表空间集 - 297 - 14.4.1 进行检查 - 297 - 14.5 产生可传输表空间集 - 298 - 14.5.1 rman备份source库 - 298 - 14.5.2 transport tablespace 生成文件 - 300 - 14.6 传输文件到target端 - 305 - 14.6.1 查看目标库数据文件位置和导入目录 - 305 - 14.6.2 拷贝文件到目标库相应位置并修改文件权限 - 306 - 14.7 target端转换字节序 - 307 - 14.8 开始导入 - 307 - 14.8.1 创建source库的2个用户并赋权限 - 308 - 14.8.2 开始导入 - 308 - 14.8.3 查看目标平台信息 - 309 - 第15章 AIX平台数据库迁移到Linux--基于RMAN(真实环境) - 312 - 15.1 场景描述 - 312 - 15.2 源库信息收集 - 314 - 15.2.1 先跑一下健康检查(可选) - 314 - 15.2.2 表空间及数据文件情况 - 315 - 15.2.2.1 表空间大小 - 315 - 15.2.2.2 需要传输的数据文件大小 - 318 - 15.2.3 用户情况(密码、默认表空间、角色和权限,需迁移的schema对象大小、个数、列表) - 318 - 15.2.3.1 需要迁移的用户 - 318 - 15.2.3.2 用户权限 - 319 - 15.2.3.3 用户表大小 - 321 - 15.2.3.4 对象个数 - 322 - 15.2.3.5 对象详细信息 - 322 - 15.2.4 无效对象情况 - 326 - 15.2.5 索引情况 - 327 - 15.2.6 确定是否有业务数据、脚本在例如sys用户等的默认用户下 - 327 - 15.3 判断平台支持并确定字节序 - 327 - 15.4 判断表空间集是否自包含 - 328 - 15.5 产生可传输表空间集 - 329 - 15.5.1 rman备份source库 - 329 - 15.5.2 transport tablespace 生成文件 - 331 - 15.6 传输文件到target端 - 339 - 15.6.1 dbca创建target库 - 339 - 15.6.2 查看目标库数据文件位置和导入目录 - 340 - 15.6.3 利用ftp工具传输转储元文件到目标库 - 341 - 15.6.4 拷贝文件到目标库相应位置并修改文件权限 - 341 - 15.7 target端转换字节序 - 342 - 15.8 开始导入 - 344 - 15.8.1 创建source库的需要迁移的3个用户并赋权限(前边的脚本已经生成,直接拿过来执行) - 344 - 15.8.2 开始导入 - 345 - 15.8.2.1 报错:source和target的compatible参数不同引起ora-00721错误 - 346 - 15.8.3 查看目标平台信息 - 347 - 15.9 导入完成后的结果校验 - 348 - 15.9.1 校验用户情况(密码、默认表空间、角色和权限,需迁移的schema对象大小、个数、列表) - 348 - 15.9.1.1 校验用户 - 348 - 15.9.1.2 用户对象个数 - 349 - 15.9.1.3 对象详细信息 - 350 - 15.9.2 无效对象情况 - 353 - 15.9.3 索引情况 - 354 - 15.10 迁移后续收尾工作 - 354 - 15.11 TTS总结 - 354 - 第16章 只存在备份片的数据库恢复过程 - 354 - 16.1.1 原库备份并传输到测试库 - 355 - 16.1.2 测试库编辑pfile文件 - 359 - 16.1.3 备份集中含有控制文件备份的情况下的恢复--尝试法找回控制文件 - 359 - 16.1.3.1 方法一:采用dbms_backup_restore.restoreControlfileTo从备份片中来尝试找回控制文件 - 360 - 一、 启动数据库到mount状态 - 367 - 二、 重新注册备份集,还原spfile,还原数据库,不完全恢复数据库 - 368 - 16.1.3.2 方法二:尝试采用创建临时库来找回控制文件 - 374 - 一、 搭建临时库来注册备份集 - 374 - 1、 修改dbname和dbid - 377 - 2、 重新注册 - 379 - 二、 还原操作 - 381 - 1、 还原spfile - 381 - 2、 还原控制文件 - 381 - 3、 还原database - 381 - 16.1.3.3 方法三:直接通过restore命令尝试 - 400 - 16.1.3.4 采用os系统命令strings来判断 - 402 - 一、 判断备份集是否含有spfile - 403 - 二、 判断备份集中是否含有control file - 405 - 16.1.4 备份集中无控制文件情况下的数据库恢复--重建控制文件 - 405 - 16.1.5 总结 - 418 - About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2018-03-01 06:00 ~ 2018-03-31 24:00 在魔都完成 ● 最新修改时间:2018-03-01 06:00 ~ 2018-03-31 24:00 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麦苗OCP、OCM、高可用网络班:http://blog.itpub.net/26736162/viewspace-2148098/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面试宝典》读者群 小麦苗的微店 .............................................................................................................................................
在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VARCHAR2(2) DEFAULT 'XXX';”操作时,效率及安全性是必须要考虑的因素。若直接执行,则会在该过程中给表加上6级表锁,也就是连查询都需要等待,这在生产库上是相当危险的操作。因为Oracle在执行上述操作过程中,不仅要更新数据字典,还会刷新全部的记录,并且会使得Undo表空间暴涨,所以,正确的做法是将更新数据字典和更新字段值分开。 例如,表LKILL.T_KILL约有4500W的数据,直接添加一个字段C_LHR需要花费21分钟,如下所示: 12:20:17 SYS@RACLHR2> ALTER TABLE LKILL.T_KILL ADD C_LHR VARCHAR2(100) DEFAULT 'LHR'; Table altered. Elapsed: 00:21:58.53 若修改为如下的方式,则可以显著提高这个操作的性能,但表中原有的记录对于新添加的列为空,新增记录默认值会设置为LHR,那么原有记录的默认值就需要在系统空闲的时候进行批量更新、批量提交或采用系统包DBMS_PARALLEL_EXECUTE来更新,这样不至于大批量锁表,请参考本书中分批更新的部分【 REF _Ref24783 \n \h 3.1.10.5 REF _Ref24783 \h 分批插入、分批更新、分批删除、分批提交】。如下所示: 12:42:17 SYS@RACLHR2> ALTER TABLE LKILL.T_KILL ADD A_LHR VARCHAR2(100); Table altered. Elapsed: 00:00:00.35 13:53:54 SYS@RACLHR2> ALTER TABLE LKILL.T_KILL MODIFY A_LHR VARCHAR2(100) DEFAULT 'LHR'; Table altered. Elapsed: 00:00:00.06 需要注意的是,从Oracle 11g开始,当添加一个带有默认值的非空列时(注意2个条件,NOT NULL和默认值),Oracle不会使用这个默认值来物理更新现有存在的行,Oracle只会存储这个新列元数据(NOT NULL约束和DEFAULT默认值),从而使得对该表的添加带有默认值的非空列操作可以在瞬间完成。当然,从表中检索该列时,会有部分的NVL函数代价。具体的细微差别可以通过10046事件来分析,这里不再详细解析。 从Oracle 12c开始,支持具有默认值的空列的添加列的DDL语句优化,即如下2条SQL语句的效率是一样的,也不存在锁表的现象了: ALTER TABLE LKILL.T_KILL ADD A_LHR VARCHAR2(100); ALTER TABLE LKILL.T_KILL ADD A_LHR VARCHAR2(100) NOT NULL; 示例如下所示: LHR@OCPLHR1> select * from v$version where rownum<=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production LHR@OCPLHR1> set time on 16:59:00 LHR@OCPLHR1> set timing on 16:59:08 LHR@OCPLHR1> CREATE TABLE t1 AS 16:59:21 2 SELECT ROWNUM N1, 16:59:21 3 TRUNC((ROWNUM - 1) / 3) N2, 16:59:21 4 TRUNC(DBMS_RANDOM.VALUE(ROWNUM, ROWNUM * 10)) N3, 16:59:21 5 DBMS_RANDOM.STRING('U', 10) cl 16:59:21 6 FROM DUAL 16:59:21 7 CONNECT BY LEVEL <= 200000; Table created. Elapsed: 00:00:05.72 16:59:45 LHR@OCPLHR1> SELECT d.bytes FROM user_segments d WHERE d.segment_name='T1'; BYTES ---------- 7340032 Elapsed: 00:00:00.09 17:01:00 LHR@OCPLHR1> ALTER TABLE t1 ADD c_ddl NUMBER DEFAULT 666 ; Table altered. Elapsed: 00:00:25.29 17:02:07 LHR@OCPLHR1> SELECT d.bytes FROM user_segments d WHERE d.segment_name='T1'; BYTES ---------- 8388608 Elapsed: 00:00:00.01 17:02:13 LHR@OCPLHR1> ALTER TABLE t1 ADD c_ddl2 NUMBER DEFAULT 888 not null; Table altered. Elapsed: 00:00:00.08 17:02:37 LHR@OCPLHR1> SELECT d.bytes FROM user_segments d WHERE d.segment_name='T1'; BYTES ---------- 8388608 Elapsed: 00:00:00.01 可以看出,在Oracle 11g中,加了NOT NULL约束的SQL语句,可以在瞬间完成添加列的操作,而只设置了默认值的SQL语句使用了25秒的时间。另外,加了NOT NUL约束的SQL语句执行完毕后,表的大小没有变化,这也说明了Oracle并没有做物理更新。 下面查看其执行计划,注意在这里不要使用“SET AUTOT ON”的方式,否则不能看到其真实的执行计划: 17:05:30 LHR@OCPLHR1> SELECT COUNT(*) FROM t1 WHERE c_ddl2=888; COUNT(*) ---------- 200000 Elapsed: 00:00:00.02 17:05:39 LHR@OCPLHR1> select * from table(dbms_xplan.display_cursor); PLAN_TABLE_OUTPUT ------------------------------------------------------------- SQL_ID bq50v8z914juk, child number 0 ------------------------------------- SELECT COUNT(*) FROM t1 WHERE c_ddl2=888 Plan hash value: 3724264953 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 282 (100)| | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | TABLE ACCESS FULL| T1 | 199K| 2530K| 282 (2)| 00:00:04 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(NVL("C_DDL2",888)=888) Note ----- - dynamic sampling used for this statement (level=2) 23 rows selected. 17:08:55 LHR@OCPLHR1> SELECT * FROM t1 WHERE rownum<=1; N1 N2 N3 CL C_DDL C_DDL2 ---------- ---------- ---------- ---------- ---------- ---------- 1 0 8 XYGGZXRRYR 666 888 可以看到,在谓词部分出现了NVL函数。所以,Oracle认为C_DDL2列是空列。 下面测试是否可以使用索引: 17:29:24 LHR@OCPLHR1> CREATE INDEX idx_c_ddl2 ON t1(c_ddl2); Index created. Elapsed: 00:00:00.71 17:31:08 LHR@OCPLHR1> update t1 set c_ddl2='8881' where rownum<=1; 1 row updated. Elapsed: 00:00:00.05 17:31:13 LHR@OCPLHR1> commit; Commit complete. Elapsed: 00:00:00.00 17:31:16 LHR@OCPLHR1> SELECT * FROM t1 WHERE c_ddl2=8881; N1 N2 N3 CL C_DDL C_DDL2 ---------- ---------- ---------- ---------- ---------- ---------- 1 0 8 XYGGZXRRYR 666 8881 Elapsed: 00:00:00.01 17:31:24 LHR@OCPLHR1> select * from table(dbms_xplan.display_cursor); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------- SQL_ID 0sm5s7zkvycrq, child number 0 ------------------------------------- SELECT * FROM t1 WHERE c_ddl2=8881 Plan hash value: 1464185165 ------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 34 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IDX_C_DDL2 | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("C_DDL2"=8881) 19 rows selected. Elapsed: 00:00:00.11 令人惊喜的是,使用了索引。 下面看看在Oracle 12c中的执行情况: LHR@lhr121> set line 120 LHR@lhr121> select * from v$version where rownum<=1; BANNER CON_ID -------------------------------------------------------------------------------- ---------- Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0 Elapsed: 00:00:00.00 LHR@lhr121> CREATE TABLE t1 AS 2 SELECT ROWNUM N1, 3 TRUNC((ROWNUM - 1) / 3) N2, 4 TRUNC(DBMS_RANDOM.VALUE(ROWNUM, ROWNUM * 10)) N3, DBMS_RANDOM.STRING('U', 10) cl 6 FROM DUAL 7 CONNECT BY LEVEL <= 100000; Table created. Elapsed: 00:00:09.41 LHR@lhr121> SELECT d.bytes FROM user_segments d WHERE d.segment_name='T1'; BYTES ---------- 4194304 Elapsed: 00:00:00.33 LHR@lhr121> ALTER TABLE t1 ADD c_ddl NUMBER DEFAULT 666 ; Table altered. Elapsed: 00:00:00.65 LHR@lhr121> SELECT d.bytes FROM user_segments d WHERE d.segment_name='T1'; BYTES ---------- 4194304 Elapsed: 00:00:00.14 LHR@lhr121> ALTER TABLE t1 ADD c_ddl2 NUMBER DEFAULT 888 not null; Table altered. Elapsed: 00:00:00.15 LHR@lhr121> SELECT d.bytes FROM user_segments d WHERE d.segment_name='T1'; BYTES ---------- 4194304 Elapsed: 00:00:00.09 LHR@lhr121> SELECT COUNT(*) FROM t1 WHERE c_ddl2=888; COUNT(*) ---------- 100000 Elapsed: 00:00:00.02 LHR@lhr121> select * from table(dbms_xplan.display_cursor); PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------- SQL_ID bq50v8z914juk, child number 1 ------------------------------------- SELECT COUNT(*) FROM t1 WHERE c_ddl2=888 Plan hash value: 3724264953 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 122 (100)| | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | TABLE ACCESS FULL| T1 | 100K| 1269K| 122 (1)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(NVL("C_DDL2",888)=888) Note ----- - statistics feedback used for this statement 23 rows selected. Elapsed: 00:00:00.05 LHR@lhr121> SELECT COUNT(*) FROM t1 WHERE c_ddl=666; COUNT(*) ---------- 100000 Elapsed: 00:00:00.04 LHR@lhr121> select * from table(dbms_xplan.display_cursor); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------ SQL_ID dph2gfp6f0jja, child number 1 ------------------------------------- SELECT COUNT(*) FROM t1 WHERE c_ddl=666 Plan hash value: 3724264953 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 122 (100)| | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | TABLE ACCESS FULL| T1 | 1000 | 13000 | 122 (1)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00005$",0)),NULL,NVL(" C_DDL",666),'0',NVL("C_DDL",666),'1',"C_DDL")=666) 20 rows selected. Elapsed: 00:00:00.12 LHR@lhr121> SELECT d.column_name, d.column_id,d.hidden_column,d.virtual_column FROM Dba_Tab_Cols d WHERE d.table_name='T1' order by column_id; COLUMN_NAME COLUMN_ID HID VIR --------------- ---------- --- --- N1 1 NO NO N2 2 NO NO N3 3 NO NO CL 4 NO NO C_DDL 5 NO NO C_DDL2 6 NO NO SYS_NC00005$ YES NO 7 rows selected. Elapsed: 00:00:00.32 LHR@lhr121> 从示例可以清楚地看到,在Oracle 12c中,添加具有默认值的DDL优化已扩展到包括默认值的空列。Oracle使用了一个未公开的函数SYS_OP_VECBIT和新的隐藏列SYS_NC00005$,因为该列没有被物理更新。 & 说明: 有关批量更新和DBMS_PARALLEL_EXECUTE的使用更详细的内容可以参考我的BLOG:① http://blog.itpub.net/26736162/viewspace-2140626/ ②http://blog.itpub.net/26736162/viewspace-1684396 About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2018-02-01 06:00 ~ 2018-02-31 24:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ● 好消息:小麦苗OCP、OCM开班啦,详情请点击:http://blog.itpub.net/26736162/viewspace-2148098/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面试宝典》读者群 小麦苗的微店 .............................................................................................................................................
> &&&& &
在AIX或Linux下,如何查看磁盘是否包含数据? 真题1、在AIX或Linux下,如何查看磁盘是否包含数据? 答案:在AIX下,可以使用lquerypv -h来查看磁盘是否包含数据,或磁盘头是否被dd过。这在安装RAC的过程中,是非常实用的一个命令。如果不包括数据的话,那么如下所示: [ZFFR4CB2101:root]/]> lquerypv -h /dev/rhdisk10 00000000 00000000 00000000 00000000 00000000 |................| 00000010 00000000 00000000 00000000 00000000 |................| 00000020 00000000 00000000 00000000 00000000 |................| 00000030 00000000 00000000 00000000 00000000 |................| 00000040 00000000 00000000 00000000 00000000 |................| 00000050 00000000 00000000 00000000 00000000 |................| 00000060 00000000 00000000 00000000 00000000 |................| 00000070 00000000 00000000 00000000 00000000 |................| 00000080 00000000 00000000 00000000 00000000 |................| 00000090 00000000 00000000 00000000 00000000 |................| 000000A0 00000000 00000000 00000000 00000000 |................| 000000B0 00000000 00000000 00000000 00000000 |................| 000000C0 00000000 00000000 00000000 00000000 |................| 000000D0 00000000 00000000 00000000 00000000 |................| 000000E0 00000000 00000000 00000000 00000000 |................| 000000F0 00000000 00000000 00000000 00000000 |................| 如果包括数据的话,那么显示如下所示: [ZFFR4CB2101:root]/]> lquerypv -h /dev/rhdisk10 00000000 00820101 00000000 80000000 B6FE0F29 |...............)| 00000010 00000000 00000000 00000000 00000000 |................| 00000020 4F52434C 4449534B 00000000 00000000 |ORCLDISK........| 00000030 00000000 00000000 00000000 00000000 |................| 00000040 0B200000 00000103 4F43525F 30303030 |. ......OCR_0000| 00000050 00000000 00000000 00000000 00000000 |................| 00000060 00000000 00000000 4F435200 00000000 |........OCR.....| 00000070 00000000 00000000 00000000 00000000 |................| 00000080 00000000 00000000 4F43525F 30303030 |........OCR_0000| 00000090 00000000 00000000 00000000 00000000 |................| 000000A0 00000000 00000000 00000000 00000000 |................| 000000B0 00000000 00000000 00000000 00000000 |................| 000000C0 00000000 00000000 01F80D69 66A0E000 |...........if...| 000000D0 01F80D69 70C48800 02001000 00100000 |...ip...........| 000000E0 0001BC80 0002001C 00000003 00000001 |................| 000000F0 00000002 00000002 00000000 00000000 |................| 在Linux中,可以使用hexdump命令来实现相同的效果,如下所示: [root@OCPLHR ~]# hexdump -n 1024 -C /dev/sdb1 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200 4c 41 42 45 4c 4f 4e 45 01 00 00 00 00 00 00 00 |LABELONE........| 00000210 50 ef ff c1 20 00 00 00 4c 56 4d 32 20 30 30 31 |P... ...LVM2 001| 00000220 53 68 78 53 57 33 43 33 48 64 44 48 33 56 65 79 |ShxSW3C3HdDH3Vey| 00000230 44 54 50 78 4a 6e 42 66 46 37 74 5a 4a 78 79 7a |DTPxJnBfF7tZJxyz| 00000240 00 84 a6 54 02 00 00 00 00 00 03 00 00 00 00 00 |...T............| 00000250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000260 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 |................| 00000270 00 f0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 [root@OCPLHR ~]# hexdump -n 1024 -C /dev/sdb6 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 很明显,磁盘/dev/sdb1已经被使用了,而/dev/sdb6还没有被使用。其中,-n参数表示只格式前n个长度的字符,而-C参数表示每个字节显示为16进制和相应的ASCII字符。 & 说明: 有关lquerypv和hexdump的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2149976/
如何让oracle DB、监听和oem开机启动(dbstart) 让oracle DB、监听和oem开机启动(dbstart) Oracle提供了伴随操作系统自动重启的功能,在Windows中,可以修改“我的电脑-->管理-->服务-->OracleService$ORACLE_SID”,或直接使用Win+R键打开运行窗口,输入services.msc即可打开服务,找到相应的Oracle服务,然后将其属性中的启动类型修改成自动。一般在Windows系统上安装完后会自动设置成自动。 对于Linux/Unix操作系统,如果想设置自动重启,那该如何操作呢?对此Oracle提供了dbstart命令用于启动,可以有2种方法来配置。 1.1.1.1 方法1:配置Linux的service服务 1. 修改/etc/oratab [root@oracle ~]#vim /etc/oratab orcl:/u01/app/oracle/product/11.2.0/dbhome_1:Y #将N改为Y 文件/etc/oratab由root.sh脚本创建,在用DBCA创建实例时也会更新这个文件。当$ORACLE_SID:$ORACLE_HOME:设置为Y时,允许实例自启动,当设置为N时,则不允许自启动。这个文件里的配置仅仅起一个开关的作用,其并不会具体的执行启动和关闭,具体的操作由$ORACLE_HOME/bin/dbstart和dbshut脚本来实现。这2个脚本在执行时会检查/etc/oratab文件里的配置,为Y时才能继续执行。 2. 修改$ORACLE_HOME/bin/dbstart和$ORACLE_HOME/bin/dbshut [root@oracle ~]#vim $ORACLE_HOME/bin/dbstart [root@oracle ~]#vim $ORACLE_HOME/bin/dbshut ORACLE_HOME_LISTNER=$ORACLE_HOME ($1改为$ORACLE_HOME) ORACLE_HOME_LISTNER的位置:Oracle 11g的dbstart在第80行,dbshut文件中在第50行。 3. 建立启动脚本 使用root用户创建脚本: [root@oracle ~]#vim /etc/rc.d/init.d/oracle #!/bin/bash # chkconfig: 2345 99 10 # description: Startup Script for oracle Databases # /etc/rc.d/init.d/oracle export ORACLE_BASE=/u01/app/oracle/ export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 export PATH=$PATH:$ORACLE_HOME/bin export ORACLE_UNQNAME=PROD1 echo " " >> /var/log/oraclelog echo `date +'%Y-%m-%d %H:%M:%S'` >> /var/log/oraclelog case "$1" in start) echo "-----startup oracle-----" >> /var/log/oraclelog su oracle -c "$ORACLE_HOME/bin/dbstart" su oracle -c "$ORACLE_HOME/bin/emctl start dbconsole" touch /var/lock/subsys/oracle echo `date +'%Y-%m-%d %H:%M:%S'` >> /var/log/oraclelog echo "-----startup oracle successful-----" >> /var/log/oraclelog echo "OK" ;; stop) echo "-----shutdown oracle-----" >> /var/log/oraclelog su oracle -c "$ORACLE_HOME/bin/dbshut" su oracle -c "$ORACLE_HOME/bin/emctl stop dbconsole" rm -f /var/lock/subsys/oracle echo `date +'%Y-%m-%d %H:%M:%S'` >> /var/log/oraclelogg echo "-----shutdown oracle successful-----" >> /var/log/oraclelog echo "OK" ;; restart) echo "-----shutdown oracle-----" >> /var/log/oraclelog su oracle -c "$ORACLE_HOME/bin/dbshut" su oracle -c "$ORACLE_HOME/bin/emctl stop dbconsole" rm -f /var/lock/subsys/oracle echo `date +'%Y-%m-%d %H:%M:%S'` >> /var/log/oraclelog echo "-----shutdown oracle successful-----" >> /var/log/oraclelog echo "-----startup oracle-----" >> /var/log/oraclelog su oracle -c "$ORACLE_HOME/bin/dbstart" su oracle -c "$ORACLE_HOME/bin/emctl start dbconsole" touch /var/lock/subsys/oracle echo `date +'%Y-%m-%d %H:%M:%S'` >> /var/log/oraclelog echo "-----startup oracle successful-----" >> /var/log/oraclelog echo "OK" ;; *) echo "Usage: 'basename $0' start|stop|restart" exit 1 esac exit 0 4. 给脚本设置权限 [root@oracle ~]# chmod 755 /etc/rc.d/init.d/oracle 5. 建立服务 [root@oracle ~]# chkconfig --add oracle [root@oracle ~]# chkconfig oracle on [root@oracle ~]# chkconfig --list oracle oracle 0:off 1:off 2:on 3:on 4:on 5:on 6:off 6. 检查是否生效 先使用root用户测试服务是否生效: [root@edsir4p1 ~]# service oracle stop [root@edsir4p1 ~]# service oracle start [root@edsir4p1 ~]# service oracle restart 再重启OS,验证是否生效。 使用service测试: [root@edsir4p1 ~]# service oracle stop Processing Database instance "PROD1": log file /u01/app/oracle/product/11.2.0/dbhome_1/shutdown.log Processing Database instance "PROD2": log file /u01/app/oracle/product/11.2.0/dbhome_1/shutdown.log Oracle Enterprise Manager 11g Database Control Release 11.2.0.1.0 Copyright (c) 1996, 2009 Oracle Corporation. All rights reserved. https://edsir4p1.us.oracle.com:1158/em/console/aboutApplication Stopping Oracle Enterprise Manager 11g Database Control ... ... Stopped. OK [root@edsir4p1 ~]# service oracle start Processing Database instance "PROD1": log file /u01/app/oracle/product/11.2.0/dbhome_1/startup.log Processing Database instance "PROD2": log file /u01/app/oracle/product/11.2.0/dbhome_1/startup.log Oracle Enterprise Manager 11g Database Control Release 11.2.0.1.0 Copyright (c) 1996, 2009 Oracle Corporation. All rights reserved. https://edsir4p1.us.oracle.com:1158/em/console/aboutApplication Starting Oracle Enterprise Manager 11g Database Control ..... started. ------------------------------------------------------------------ Logs are generated in directory /u01/app/oracle/product/11.2.0/dbhome_1/edsir4p1.us.oracle.com_PROD1/sysman/log OK 1.1.1.2 方法2:配置/etc/rc.d/rc.local文件 1. 修改/etc/oratab [root@oracle ~]#vim /etc/oratab orcl:/u01/app/oracle/product/11.2.0/dbhome_1:Y #将N改为Y 2. 修改$ORACLE_HOME/bin/dbstart和$ORACLE_HOME/bin/dbshut [root@oracle ~]#vim $ORACLE_HOME/bin/dbstart [root@oracle ~]#vim $ORACLE_HOME/bin/dbshut ORACLE_HOME_LISTNER=$ORACLE_HOME ($1改为$ORACLE_HOME) ORACLE_HOME_LISTNER的位置:Oracle 11g的dbstart在第80行,dbshut文件中在第50行。 3. 建立启动脚本 将以下脚本添加到/etc/rc.d/rc.local或/etc/rc.local文件中(/etc/rc.local是/etc/rc.d/rc.local的软连接文件): export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 su oracle -c $ORACLE_HOME/bin/dbstart export ORACLE_UNQNAME=PROD1 su oracle -c "$ORACLE_HOME/bin/emctl start dbconsole" 若环境中没有创建EM,则可以不用添加ORACLE_UNQNAME,和emctl这2行。 需要注意的是,/etc/rc.local是/etc/rc.d/rc.local的软连接文件,如下所示: [oracle@edsir4p1-PROD1 ~]$ ll /etc/rc.local lrwxrwxrwx 1 root root 13 Aug 31 2013 /etc/rc.local -> rc.d/rc.local [oracle@edsir4p1-PROD1 ~]$ ll /etc/rc.d/rc.local -rwxr-xr-x 1 root root 401 Jan 2 03:51 /etc/rc.d/rc.local 需要注意的是,在CentOS7中,/etc/rc.d/rc.local的权限被降低了,所以需要执行如下命令赋予其可执行权限 chmod +x /etc/rc.d/rc.local 4. 检查是否生效 先使用root用户测试服务是否生效: [root@edsir4p1 ~]# export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 [root@edsir4p1 ~]# su oracle -c $ORACLE_HOME/bin/dbstart Processing Database instance "PROD1": log file /u01/app/oracle/product/11.2.0/dbhome_1/startup.log Processing Database instance "PROD2": log file /u01/app/oracle/product/11.2.0/dbhome_1/startup.log 再重启OS,验证是否生效。 1.1.1.3 总结 对于这2种方法,需要注意的几个问题: 1. 多个实例都会自动重启。 2. 监听也会自动重启。 3. 重启的详细日志为:$ORACLE_HOME/shutdown.log和$ORACLE_HOME/startup.log。 4. oracle用户的环境变量可以不用配置。 5. ORACLE_UNQNAME的作用是设置EM的环境变量,emctl是启动OEM,若没有则可以不用设置。 6. ORACLE_HOME的作用是设置数据库监听的环境变量。 7. 对于ASM、RAC环境,只需要将数据库资源注册的CRS中,即可实现开机启动。 About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2018-01-01 06:00 ~ 2018-01-31 24:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ● 好消息:小麦苗OCP、OCM开班啦,详情请点击:http://blog.itpub.net/26736162/viewspace-2148098/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
Oracle中的并行 一Oracle中的并行 首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递这个协调进程将需要操作的数据集例如表的数据块分割成很多部分称为并行处理单元然后并行协调进程给每个并行进程分配一个数据单元。例如有四个并行服务进程它们就会同时处理各自分配的单元当一个并行服务进程处理完毕后协调进程就会给它们分配另外的单元如此反复直到表上的数据都处理完毕最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果返回给用户。并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集Oracle会启动几个并行服务进程同时处理这些小数据集最后将这些结果汇总作为最终的处理结果返回给用户。 这种数据并行处理方式在OLAP系统中非常有用OLAP系统的表通常来说都非常大如果系统的CPU比较多那么可以让所有的CPU共同来处理这些数据效果就会比串行执行要好得多。对于OLTP系统通常而言并行并不合适原因是OLTP系统上几乎在所有的SQL操作中数据访问路径基本上以索引访问为主并且返回结果集非常小这样的SQL操作的处理速度一般非常快不需要启用并行。 使用并行方式不论是创建表还是修改表、创建索引、重建索引它们的机制都是一样的那就是Oracle给每个并行服务进程分配一块空间每个进程在自己的空间里处理数据最后将处理完毕的数据汇总完成SQL的操作。 1. 并行执行的使用范围 Oracle的并行技术在下面的场景中可以使用 1PARALLEL QUERY并行查询简称PQ。 2PARALLEL DDL并行DDL操作简称PDDL例如建表、建索引等。 3PARALLEL DML并行DML操作简称PDML例如INSERT、UPDATE、DELETE等。 2. 并行查询PQ 并行查询可以在查询语句、子查询语句中使用但是不可以使用在一个远程引用的对象上例如DBLINK。当一条SQL语句发生全表扫描、全分区扫描及索引快速全扫描的时候若优化器满足下面的条件之一就可以使用并行处理 ① 会话级别会话设置了强制并行例如“ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;”执行“SELECT COUNT(*) FROM TB_PART_LHR;”这里的TB_PART_LHR为分区表。 ② 语句级别SQL语句中有Hint提示例如使用PARALLEL或者PARALLEL_INDEX。如“SELECT /*+ PARALLEL(T 4) */ FROM T;”。 ③ SQL语句中引用的对象被设置了并行属性。在表和索引的定义中增加并行度属性该属性可以在创建表和索引时设置也可对已创建的表和索引的并行度属性进行修改。例如“ALTER TABLE TB_NAME PARALLEL 4;”、“ALTER TABLE TB_NAME PARALLEL (DEGREE DEFAULT);”。取消表或索引的并行度的SQL为“ALTER TABLE TB_NAME NOPARALLEL;”。示例如下 SYS@orclasm > ALTER TABLE SH.SALES PARALLEL (DEGREE 10); Table altered. SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='SALES' AND OWNER='SH'; DEGREE -------------------- 10 SYS@orclasm > ALTER TABLE SH.SALES PARALLEL (DEGREE DEFAULT); Table altered. SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='SALES' AND OWNER='SH'; DEGREE -------------------- DEFAULT SYS@orclasm > ALTER TABLE SH.SALES NOPARALLEL; Table altered. SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='SALES' AND OWNER='SH'; DEGREE -------------------- 1 SYS@orclasm > CREATE TABLE SCOTT.AA AS SELECT * FROM DUAL; Table created. SYS@orclasm > SELECT DEGREE FROM DBA_TABLES WHERE TABLE_NAME='AA' AND OWNER='SCOTT'; DEGREE -------------------- 1 在日常使用上一般不建议在对象级别定义并行度因为这会导致相关对象的操作都变为并行处理而并行处理会占用大量的CPU资源导致数据库整体性能失控。一般在会话或语句级别进行处理。 3. 一些参数 和并行相关的参数较多下面给出几个常见的参数其它参数请参考官方文档 l PARALLEL_MIN_SERVERS默认值为0确定实例上并行执行进程的最小数该值是Oracle实例启动时创建的并行执行进程的数目可以使用“ ps -ef|grep ora_p0”来查看。Oracle RAC多个实例可以有不同的值。若修改了该值则只有当数据库实例重启的情况下后台进程数才会变化。 l PARALLEL_MAX_SERVERS默认值为PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5。该参数确定一个实例并行执行进程和并行恢复进程的最大数。当需求增加时Oracle数据库从实例启动时的进程数增加到该参数值。在默认值计算公式中实例上赋予正在使用的concurrent_parallel_users的值和内存管理设置相关。如果自动内存管理被关闭手工模式那么concurrent_parallel_users为1。如果PGA自动内存管理被开启那么concurrent_parallel_users的值为2.如果除了PGA自动内存管理全局内存管理或SGA内存目标也被使用那么concurrent_parallel_users为4。Oracle RAC多个实例可以有不同值。 l PARALLEL_MIN_TIME_THRESHOLD确定一个语句被考虑采用自动并行度前一个语句将用的最小执行时间。默认值为AUTO表示10s。只有PARALLEL_DEGREE_POLICY被设置为AUTO或LIMITED时自动并行度才被开启。 l PARALLEL_DEGREE_POLICY该参数确定是否开启自动并行度语句排队和内存并行执行。包括MANUAL、LIMITIED和AUTO默认值为MANUAL。如果一个PARALLEL Hint在语句级被使用那么无论PARALLEL_DEGREE_POLICY值被设置成什么自动并行度都将被开启。注意该参数尽量不要修改为AUTO因为相关的Bug较多一般使用MANUAL即可。 n MANUAL关闭自动并行度语句排队和内存并行执行。这恢复并行执行到11.2之前的行为。这是默认设置。 n LIMITED对某些语句开启自动并行执行但语句排队和内存并行执行被关闭。自动并行度仅仅适用那些存取显式用PARALELL语句标示默认并行度的表或索引的语句。并不存取这些被显式标示默认并行度的表或索引的语句将保持手工MANUAL行为。 n AUTO开启自动并行度语句排队和内存并行执行。 4. I/O Calibration和DOP的关系 从Oracle 11.2.0.2开始只有当I/O CalibrationI/O 校准、I/O统计信息被收集才能使用自动并行度DOPAutomatic Degree of Parallelism。当PARALLEL_DEGREE_POLICY被设置为AUTO时Oracle数据库将会基于执行计划中操作的成本和硬件特性来判断是否使用并行。如果一个PARALLEL Hint在语句级被使用那么无论PARALLEL_DEGREE_POLICY的值设置成什么自动并行度都将被开启。 若没有收集I/O Calibration统计数据则在执行计划的Note部分可以看到“automatic DOP: skipped because of IO calibrate statistics are missing”这样的信息。若使用了DOP则可以在执行计划的Note部分可以看到类似于“automatic DOP: Computed Degree of Parallelism is 2”的信息。 Oracle提供了PL/SQL包DBMS_RESOURCE_MANAGER.CALIBRATE_IO来收集I/O Calibration的统计数据。收集I/O Calibration统计数据的持续时间由NUM_DISKS变量与RAC中节点数决定的。视图V$IO_CALIBRATION_STATUS可以查询是否收集了I/O Calibration统计数据。若没有收集I/O Calibration则可以使用如下的存储过程来收集 SET SERVEROUTPUT ON DECLARE lat INTEGER; iops INTEGER; mbps INTEGER; BEGIN --DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat); DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat); DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops); DBMS_OUTPUT.PUT_LINE ('latency = ' || lat); dbms_output.put_line('max_mbps = ' || mbps); END; / 注意DBMS_RESOURCE_MANAGER.CALIBRATE_IO的前两个参数分别为num_disks和max_latency是输入变量并且有三个输出变量。 num_disks为了获得最精确的结果最好提供数据库所使用的真实物理磁盘数。如果是使用ASM来管理数据库文件那么就是指存储数据的磁盘组那么只有存储数据的磁盘组中的物理磁盘作为num_disks变量值不包含FRA磁盘组中的物理磁盘。 latency对数据库块I/O操作允许的最大延迟。 5. 并行DDL操作PDDL 表或索引的CREATE或ALTER操作可以使用并行。例如以下表操作可以使用并行执行 l 建表CREATE TABLE … AS SELECTCTAS l 表移动ALTER TABLE … MOVE l 表分区移动ALTER TABLE … MOVE PARTITION l 表分区并行分解ALTER TABLE … SPLIT PARTITION l 表分区并行合并ALTER TABLE … COALESCE PARTITION l 创建和校验约束ALTER TABLE … ADD CONSTRAINT l 创建索引CREATE INDEX l 重建索引ALTER INDEX … REBULD l 重建索引分区ALTER INDEX … REBULD PARTITION l 索引分区的分解ALTER INDEX … SPLIT PARTITION 6. 并行DML操作PDML Oracle可以对DML操作使用并行执行。如果要让DML操作使用并行执行那么必须显式地在会话里执行如下命令 ALTER SESSION ENABLE PARALLEL DML; 只有执行了这个命令Oracle才会对之后符合并行条件的DML操作并行执行如果没有这个设定那么即使SQL中指定了并行执行Oracle也会忽略它。 以下给出一个并行UPDATE的示例 LHR@TEST> CREATE TABLE TB_LHR20160518 AS SELECT * FROM DBA_OBJECTS; Table created. LHR@TEST> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL')); PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------- Plan hash value: 2194116729 ----------------------------------------------------------------------------- | Id | Operation | Name | TQ |IN-OUT| PQ Distrib | ----------------------------------------------------------------------------- | 0 | UPDATE STATEMENT | | | | | | 1 | UPDATE | TB_LHR20160518 | | | | | 2 | PX COORDINATOR | | | | | | 3 | PX SEND QC (RANDOM)| :TQ10000 | Q1,00 | P->S | QC (RAND) | | 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | | | 5 | TABLE ACCESS FULL| TB_LHR20160518 | Q1,00 | PCWP | | ----------------------------------------------------------------------------- 12 rows selected. LHR@TEST> EXPLAIN PLAN FOR UPDATE /*+ PARALLEL (T1,4) */ TB_LHR20160518 T1 SET OBJECT_NAME='LHR'; Explained. LHR@TEST> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 2194116729 ----------------------------------------------------------------------------- | Id | Operation | Name | TQ |IN-OUT| PQ Distrib | ----------------------------------------------------------------------------- | 0 | UPDATE STATEMENT | | | | | | 1 | UPDATE | TB_LHR20160518 | | | | | 2 | PX COORDINATOR | | | | | | 3 | PX SEND QC (RANDOM)| :TQ10000 | Q1,00 | P->S | QC (RAND) | | 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | | | 5 | TABLE ACCESS FULL| TB_LHR20160518 | Q1,00 | PCWP | | ----------------------------------------------------------------------------- 12 rows selected. LHR@test> ALTER SESSION ENABLE PARALLEL DML; Session altered. LHR@TEST> EXPLAIN PLAN FOR UPDATE /*+ PARALLEL (T1,4) */ TB_LHR20160518 T1 SET OBJECT_NAME='LHR'; Explained. LHR@TEST> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'BASIC +PARALLEL')); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------- Plan hash value: 3729706116 ----------------------------------------------------------------------------- | Id | Operation | Name | TQ |IN-OUT| PQ Distrib | ----------------------------------------------------------------------------- | 0 | UPDATE STATEMENT | | | | | | 1 | PX COORDINATOR | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10000 | Q1,00 | P->S | QC (RAND) | | 3 | UPDATE | TB_LHR20160518 | Q1,00 | PCWP | | | 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | | | 5 | TABLE ACCESS FULL| TB_LHR20160518 | Q1,00 | PCWP | | ----------------------------------------------------------------------------- 12 rows selected. 通过执行计划可以看出只有执行了“ALTER SESSION ENABLE PARALLEL DML;”后UPDATE操作才真正地实现了并行操作如果不执行该语句那么只是执行了并发查询并没有实现并发更新操作。 下表列出了这3种并行处理方式的开启及禁用语句 类别 区别 并行查询PQ 默认 开启 查询 SELECT D.PQ_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid'); 启用、禁用 ALTER SESSION ENABLE PARALLEL QUERY; --启用 ALTER SESSION FORCE PARALLEL QUERY PARALLEL n; --强制开启 ALTER SESSION DISABLE PARALLEL QUERY; --禁用 并行DDLPDDL 默认 开启 查询 SELECT D.PDDL_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid'); 启用、禁用 ALTER SESSION ENABLE PARALLEL DDL; --启用 ALTER SESSION FORCE PARALLEL DDL PARALLEL n; --强制开启 ALTER SESSION DISABLE PARALLEL DDL; --禁用 并行DMLPDML 默认 关闭 查询 SELECT D.PDML_STATUS FROM V$SESSION D WHERE D.SID=USERENV('sid'); 启用、禁用 ALTER SESSION ENABLE PARALLEL DML; --启用 ALTER SESSION FORCE PARALLEL DML PARALLEL n; --强制开启 ALTER SESSION DISABLE PARALLEL DML; --禁用 7. RAC中的并行 如果连接Oracle RAC数据库那么一个节点上的并发操作可以分布到多个节点上同时执行。可以使用视图GV$PX_SESSION查询并行会话的进程。有关RAC可以参考【 REF _Ref2346 \n \h 3.2.16 REF _Ref2346 \h RAC维护】。 这是一个Oracle 11g的RAC环境下面建立一张测试表建立过程中设置表的并行度 [ZFWWLHRDB1:oracle]:/oracle>ORACLE_SID=raclhr1 [ZFWWLHRDB1:oracle]:/oracle>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Fri Sep 30 14:52:23 2016 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SYS@raclhr1> show parameter cluster NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cluster_database boolean TRUE cluster_database_instances integer 2 cluster_interconnects string SYS@raclhr1> CREATE TABLE T_PARALLEL_LHR NOLOGGING PARALLEL 4 2 AS SELECT A.* FROM DBA_OBJECTS A, DBA_TABLES 3 WHERE ROWNUM <= 5000000; Table created. SYS@raclhr1> SELECT * FROM V$MYSTAT WHERE ROWNUM<=1; SID STATISTIC# VALUE ---------- ---------- ---------- 167 0 0 SYS@raclhr1> set autot on SYS@raclhr1> SET LINESIZE 9999 SYS@raclhr1> SET PAGESIZE 9999 SYS@raclhr1> SELECT COUNT(*) FROM T_PARALLEL_LHR a,T_PARALLEL_LHR b where rownum<=1000000; COUNT(*) ---------- 1000000 Execution Plan ---------------------------------------------------------- Plan hash value: 1691788013 ------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | ------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2057M (5)|999:59:59 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | |* 2 | COUNT STOPKEY | | | | | | | | | 3 | PX COORDINATOR | | | | | | | | | 4 | PX SEND QC (RANDOM) | :TQ10001 | 23T| 2057M (5)|999:59:59 | Q1,01 | P->S | QC (RAND) | |* 5 | COUNT STOPKEY | | | | | Q1,01 | PCWC | | | 6 | MERGE JOIN CARTESIAN | | 23T| 2057M (5)|999:59:59 | Q1,01 | PCWP | | | 7 | PX BLOCK ITERATOR | | 4857K| 5396 (1)| 00:01:05 | Q1,01 | PCWC | | | 8 | TABLE ACCESS FULL | T_PARALLEL_LHR | 4857K| 5396 (1)| 00:01:05 | Q1,01 | PCWP | | | 9 | BUFFER SORT | | 4857K| 2057M (5)|999:59:59 | Q1,01 | PCWP | | | 10 | PX RECEIVE | | 4857K| 5396 (1)| 00:01:05 | Q1,01 | PCWP | | | 11 | PX SEND BROADCAST | :TQ10000 | 4857K| 5396 (1)| 00:01:05 | Q1,00 | P->P | BROADCAST | | 12 | PX BLOCK ITERATOR | | 4857K| 5396 (1)| 00:01:05 | Q1,00 | PCWC | | | 13 | TABLE ACCESS FULL| T_PARALLEL_LHR | 4857K| 5396 (1)| 00:01:05 | Q1,00 | PCWP | | ------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(ROWNUM<=1000000) 5 - filter(ROWNUM<=1000000) Note ----- - dynamic sampling used for this statement (level=4) Statistics ---------------------------------------------------------- 112 recursive calls 8 db block gets 72078 consistent gets 74257 physical reads 0 redo size 526 bytes sent via SQL*Net to client 520 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 4 sorts (disk) 1 rows processed 从执行计划可以看到Oracle选择了并行执行。 新建立一个会话在执行上面这个并行查询的同时查询GV$PX_SESSION或GV$PX_PROCESS视图 SYS@raclhr1> SELECT * FROM GV$PX_SESSION WHERE QCSID=167; INST_ID SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE ---------- ---------------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ---------- 1 07000100538364A0 199 35 167 5 1 1 1 1 4 4 1 0700010053894FC0 230 35 167 5 1 1 1 2 4 4 1 0700010053607480 10 37 167 5 1 1 2 1 4 4 1 070001005366F240 38 3 167 5 1 1 2 2 4 4 1 07000100537DAA60 167 5 167 2 070001005383F740 196 43 167 5 1 1 1 3 4 4 2 07000100536D3F20 67 9 167 5 1 1 1 4 4 4 2 07000100536168E0 5 5 167 5 1 1 2 3 4 4 2 07000100536784E0 35 113 167 5 1 1 2 4 4 4 9 rows selected. 很显然并行查询的4个进程已经分布到两个节点上同时执行了每个节点上创建4个并行从属进程。 & 说明 有关Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下Redo、Undo和执行速度的比较具体操作过程可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2125815/ 有关什么是I/O Calibration的更多内容可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2148709/ 有关Oracle中并行的的更多内容可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2149240/ 真题1、在Oracle中I/O Calibration和DOP有什么关系 答案从Oracle 11.2.0.2开始只有当I/O CalibrationI/O 校准、I/O统计信息被收集才能使用自动并行度DOPAutomatic Degree of Parallelism。当PARALLEL_DEGREE_POLICY被设置为AUTO时Oracle数据库将会基于执行计划中操作的成本和硬件特性来判断是否使用并行。如果一个PARALLEL Hint在语句级被使用那么无论PARALLEL_DEGREE_POLICY的值设置成什么自动并行度都将被开启。 若没有收集I/O Calibration统计数据则在执行计划的Note部分可以看到“automatic DOP: skipped because of IO calibrate statistics are missing”这样的信息。若使用了DOP则可以在执行计划的Note部分可以看到类似于“automatic DOP: Computed Degree of Parallelism is 2”的信息。 Oracle提供了PL/SQL包DBMS_RESOURCE_MANAGER.CALIBRATE_IO来收集I/O Calibration的统计数据。收集I/O Calibration统计数据的持续时间由NUM_DISKS变量与RAC中节点数决定的。视图V$IO_CALIBRATION_STATUS可以查询是否收集了I/O Calibration统计数据。若没有收集I/O Calibration则可以使用如下的存储过程来收集 SET SERVEROUTPUT ON DECLARE lat INTEGER; iops INTEGER; mbps INTEGER; BEGIN --DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat); DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat); DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops); DBMS_OUTPUT.PUT_LINE ('latency = ' || lat); dbms_output.put_line('max_mbps = ' || mbps); END; / 注意DBMS_RESOURCE_MANAGER.CALIBRATE_IO的前两个参数分别为num_disks和max_latency是输入变量并且有三个输出变量。 num_disks为了获得最精确的结果最好提供数据库所使用的真实物理磁盘数。如果是使用ASM来管理数据库文件那么就是指存储数据的磁盘组那么只有存储数据的磁盘组中的物理磁盘作为num_disks变量值不包含FRA磁盘组中的物理磁盘。 latency对数据库块I/O操作允许的最大延迟。 & 说明 有关什么是I/O Calibration的更多内容可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2148709/ 释义Oracle11r2中并行执行相关参数 1、PARALLEL_ADAPTIVE_MULTI_USER 参数类型 Boolean默认值 true可修改性 ALTER SYSTEM取值范围 true | false被设置为true时使自适应算法可用该算法被设计来改善使用并行的多用户环境的性能。 该算法在查询开始时基于系统负载来自动减少被要求的并行度。实际的并行度基于默认、来自表或hints的并行度然后除以一个缩减因数。该算法假设系统已经在单用户环境下进行了最优调整。表和hints用默认的并行度。2、PARALLEL_AUTOMATIC_TUNING参数类型 Boolean默认值 false可修改性 No取值范围 true | false注意: PARALLEL_AUTOMATIC_TUNING已经被废弃。保留它仅仅是为了向后兼容。 当该参数设置为true时Oracle决定控制并行执行的所有参数的默认值。除了设置这个参数你必须确定系统中目标表的PARALLEL子句。Oracle于是就会自动调整所有后续的并行操作。 如果你在之前的版本里用了并行执行且现在该参数为true那么你将会因减少了共享池中分配的内存需求而导致对共享池需求的减少。目前这些内存会从large pool中分配如果large_pool_size没被确定那么系统会自动计算出来。 作为自动调整的一部分Oracle将会使parallel_adaptive_multi_user参数可用。如果需要你也可以修改系统提供的默认值。3、PARALLEL_DEGREE_LIMIT参数类型 String语法 PARALLEL_DEGREE_LIMIT = { CPU | IO | integer }默认值 CPU可更改性 ALTER SESSION, ALTER SYSTEM是否基础 No在并行度自动调整的情况下Oracle自动决定一个语句是否并行执行和用什么并行度执行。优化器基于语句的资源需求自动决定一个语句的并行度。 然而为了确保并行服务器进程不会导致系统过载优化器会限制使用的并行度。这个限制通过PARALLEL_DEGREE_LIMIT来强制实施。 值■ CPU最大并行度被系统CPU数限制。计算限制的公式为PARALLEL_THREADS_PER_CPU *CPU_COUNT * 可用实例数默认为簇中打开的所有实例但也能通过PARALLEL_INSTANCE_GROUP或service定义来约束这是默认的。■ IO优化器能用的最大并行度被系统的IO容量限制。系统总吞吐除以每个进程的最大IO带宽计算出。为了使用该IO设置你必须在系统上运行DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程。该过程将计算系统总吞吐和单个进程的最大IO带宽。■ integer当自动并行度被激活时该参数的数字值确定优化器为一个SQL语句能选择的最大并行度。PARALLEL_DEGREE_POLICY被设置为AUTO或LIMITED时自动并行度才可以使用。4、PARALLEL_DEGREE_POLICY参数类型 String语法 PARALLEL_DEGREE_POLICY = { MANUAL | LIMITED | AUTO }默认值 MANUAL可修改性 ALTER SESSION, ALTER SYSTEM是否基础 No PARALLEL_DEGREE_POLICY确定是否开启自动并行度语句排队和内存并行执行。 值 注意如果一个PARALLEL hint在语句级被使用无论PARALLEL_DEGREE_POLICY值设置成什么自动并行度都将被开启。■ MANUAL关闭自动并行度语句排队和内存并行执行。这恢复并行执行到11.2之前的行为。这是默认设置。■ LIMITED对某些语句开启自动并行执行但语句排队和内存并行执行被关闭。自动并行度仅仅适用那些存取显式用PARALELL语句标示默认并行度的表或索引的语句。并不存取这些被显式标示默认并行度的表或索引的语句将保持手工MANUAL行为。■ AUTO开启自动并行度语句排队和内存并行执行。5、PARALLEL_EXECUTION_MESSAGE_SIZE参数类型 Integer默认值 Operating system-dependent可行改性 No值范围 最小值 2148最大值: 32768, 但一些操作系统也许有一个较小值Oracle RAC 多个实例必须有相同的值PARALLEL_EXECUTION_MESSAGE_SIZE确定并行执行前面指并行查询PDML并行恢复复制所用信息的大小。 在大多数平台上默认值如下■ 16384字节如果COMPATIBLE被设置为11.2.0或更高■ 4096字节如果COMPATIBLE被设置为小于11.2.0并且PARALLEL_AUTOMATIC_TUNING被设置为true ■ 2148字节如果COMPATIBLE被设置为小于11.2.0并且PARALLEL_AUTOMATIC_TUNING被设置为false默认值对大多数应用来说是足够的。值越大要求共享池越大。较大的值会带来较好的性能但会消耗较多的内存。因此复制并不能从增加该值中受益。 注意当PARALLEL_AUTOMATIC_TUNING被设置为TRUE时信息缓冲在大池large pool中分配。这种情况下默认值一般是较高的。注意参数PARALLEL_AUTOMATIC_TUNING已经被废弃。6、PARALLEL_FORCE_LOCAL参数类型 Boolean默认值 false可修改性 ALTER SESSION, ALTER SYSTEM值范围 true | false是否基础 No PARALLEL_FORCE_LOCAL控制Oracle RAC环境下的并行执行。默认情况被选择执行一个SQL语句的并行服务器进程能在簇中任何或所有Oracle RAC节点上操作。通过设置PARALLEL_FORCE_LOCAL为true并行服务器进程被限制从而都在查询协调器驻留的同一个Oracle RAC节点上操作语句被执行的节点上 。7、PARALLEL_INSTANCE_GROUP参数类型 String语法 PARALLEL_INSTANCE_GROUP = service_name | group_name默认值 没有默认值并行执行在所有目前活动的实例上开启 可修改性 ALTER SESSION, ALTER SYSTEM值范围 任何服务名或任何活动实例上INSTANCE_GROUPS参数中确定的任何组名Oracle RAC 多个实例能有不同的值PARALLEL_INSTANCE_GROUP是一个仅能在并行模式确定的参数。和服务或INSTANCE_GROUPS参数一起使用,它使你能限制并行查询的操作到一定的实例数。注意INSTANCE_GROUPS参数已经被废弃。该参数支持Oracle用来产生并行执行进程的并行实例组。如果和服务一起使用并行操作将仅在服务中确定的实例上产生并行执行进程。如果和INSTANCE GROUPS一起使用并行操作将仅在那些INSTANCE_GROUPS参数中确定了相匹配的组的实例上产生并行执行进程。 如果被赋予PARALLEL_INSTANCE_GROUP的值是不存在的服务或组名那么操作将会串行执行。没有并行被使用。8、PARALLEL_IO_CAP_ENABLED参数类型 Boolean默认值 false可修改性 ALTER SESSION, ALTER SYSTEM值范围 true | false是否基础 No Oracle RAC 多个实例能有不同的值 注意 PARALLEL_IO_CAP_ENABLED参数被废弃了。保留它的目的仅仅是为了向后兼容。PARALLEL_DEGREE_LIMIT参数设置为IO时可以替代该参数。PARALLEL_IO_CAP_ENABLED确定Oracle是否覆盖默认并行度一直到IO系统支持的值。该新值基于资源管理器的IO校验包的结果计算得出。如果PARALLEL_IO_CAP_ENABLED被设置为true并且数据库的IO能力已经被校验过当IO能力不能支撑可用的CPU数时则Oracle将减少默认并行度。为了校验IO能力用DBMS_RESOURCE_MANAGER.CALIBRATE_IO过程来测量系统的IO容量。Oracle计算并行度以便不超过系统的IO容量。9、PARALLEL_MAX_SERVERS参数类型 Integer默认值 PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5可行改性 ALTER SYSTEM值范围 0 to 3600 Oracle RAC 多个实例可以有不同值 注意该参数适用于单实例和RAC模式的并行执行。PARALLEL_MAX_SERVERS确定一个实例并行执行进程和并行恢复进程的最大数。当需求增加时Oracle数据库从实例启动时的进程数增加到该参数值。公式中实例上赋予正在使用的concurrent_parallel_users的值和内存管理设置相关。如果自动内存管理被关闭手工模式那么concurrent_parallel_users为1。如果PGA自动内存管理被开启那么concurrent_parallel_users的值为2.如果除了PGA自动内存管理全局内存管理或SGA内存目标也被使用那么concurrent_parallel_users为4。 如果你把该参数设置的太低那么有些查询也许在查询期间没有可用的并行执行进程可用。如果你把该参数设置太高那么内存资源在峰值期间也许会短缺这也会降低性能。10、PARALLEL_MIN_PERCENT参数类型 Integer默认值 0可修改性 ALTER SESSION值范围 0 to 100 Oracle RAC 多个实例能有不同的值PARALLEL_MIN_PERCENT使得你确定并行执行需要并行执行进程数的最小百分比。设置该参数确保除非有足够的资源可用否则不会执行并行操作。默认值0意味着没进程的最小百分比被设置。 考虑以下设置PARALLEL_MIN_PERCENT = 50 PARALLEL_MIN_SERVERS = 5 PARALLEL_MAX_SERVERS = 10如果十个并行执行进程中的8个处于繁忙状态仅两个进程可用。如果接着你提交一个并行度8的查询那么最小50%不能被满足。 你能和PARALLEL_ADAPTIVE_MULTI_USER参数一起使用该参数。在多用户环境一个单独的用户或应用能设置PARALLEL_MIN_PERCENT为一个有足够的系统资源和可接受的并行度被返回时使用的最小值。11、PARALLEL_MIN_SERVERS参数类型 Integer默认值 0可修改性 ALTER SYSTEM值范围 0 to value of PARALLEL_MAX_SERVERS Oracle RAC 多个实例可以有不同的值 注意该参数使用单实例和RAC环境的并行执行。PARALLEL_MIN_SERVERS确定实例上并行执行进程的最小数。该值是实例启动时Oracle创建的并行执行进程的数目。12、PARALLEL_MIN_TIME_THRESHOLD参数类型 String语法 PARALLEL_MIN_TIME_THRESHOLD = { AUTO | integer }默认值 AUTO可修改性 ALTER SESSION, ALTER SYSTEM是否基础 No PARALLEL_MIN_TIME_THRESHOLD确定一个语句被考虑采用自动并行度前一个语句将用的最小执行时间。默认地它被设置为10s。只有PARALLEL_DEGREE_POLICY被设置为AUTO或LIMITED时自动并行度才被开启。13、PARALLEL_SERVERS_TARGET参数类型 Integer默认值 PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 2可修改性 ALTER SYSTEM值范围 0 to PARALLEL_MAX_SERVERS是否基础 No PARALLEL_SERVERS_TARGET确定语句排队被采用前运行一个语句允许的并行服务器进程数。当参数PARALLEL_DEGREE_POLICY被设置为AUTO且必需的并行服务器进程不可用时Oracle将排队要求并行执行的SQL语句。一旦系统上活的并行服务器进程数等于PARALLEL_SERVERS_TARGETS语句排队将开始。默认地PARALLEL_SERVERS_TARGETS被设置低于系统上允许的并行服务进程最大数PARALLEL_MAX_SERVERS以确保每个并行语句将获得需要的并行服务资源同时也避免因为过多的并行服务器进程数而导致系统过载。 一个实例上运行的默认并行度的并发并行用户和内存管理设置相关。如果自动内存管理被关闭手工模式那么并发并行用户数为1.如果PGA自动内存管理被开启并发并行用户为2。如果除了PGA内存自动管理还有全局内存管理和SGA内存目标被使用那么并发并行用户数为4。 注意即使语句排队被激活所有串行语句非并行的将立即执行。14、PARALLEL_THREADS_PER_CPU参数类型 Integer默认值 Operating system-dependent, usually 2可修改性 ALTER SYSTEM值范围 Any nonzero number注意这个参数适用于单实例和RAC环境的并行执行。PARALLEL_THREADS_PER_CPU确定实例的默认并行度和并行自适应及负载均衡算法。参数描述并行执行期间每个CPU能处理的并行执行进程或线程数。 默认值和平台有关且在大多数情况下是足够的。当一个具有代表性的并行查询执行且机器出现过载现象时那么你应该减少该参数的值。如果系统是IO限制的你应该增加该参数。 Oracle 11.2中控制并行的新参数 原文地址Oracle 11.2中控制并行的新参数 作者eric0435 在Oracle 11.2中引入了几个新的并行查询参数。对于数据仓库应用来说经常利用并行处理来快速有效地处理信息尤其是查询非常大的表或加入了复杂的算式更应该使用并行查询。在Oracle之前的版本中我们不得不或多或秒的来决定自动并行度。决定一个最佳并行度是非常困难的。真实最佳并行度依赖于数据块在磁盘上的物理位置以及服务器的CPU数量(cpu_count)为了解决并行查询的这些问题在Oracle11.2中引入了以下新的并行查询参数1.parallel_degree_policyparallel_degree_policy参数可以被设置为manual,auto或limited在Oracle11.1中parallel_degree_policy缺省设置为manual(禁用了automatic degree of parallelism,statement queuing与in-memory parallel execution) SQL> show parameter parallel_degree_policy; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string manual SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 84998 (1)| 00:00:06 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 21M| 84998 (1)| 00:00:06 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 22 recursive calls 0 db block gets 469904 consistent gets 313229 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 1 rows processed 但我们可以手动指定并行度 SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string manual SQL> set autotrace on SQL> select /*+ parallel */ count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=5) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 20 recursive calls 4 db block gets 470138 consistent gets 313225 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed parallel_degree_policy=auto就会启用以下新功能:并行度(DOP)将会基于SQL语句中的操作类型和表的大小来自动计算。例如对大表排序的并行度(DOP)可能比对小表操作的并行度高。 如果请求或请求的并行度(DOP)因为并行服务进程正处于繁忙状态而不能获得满足那么Oracle直到有足够的并行子进程可用之前将不会执行语句而不是降低并行度或串行执行SQL语句。在11gr2之前的版本中当没有足够的并行进程服务进程满足所请求的并行度(DOP)时可以会出现以下三种情况中的一种:SQL语句将会降低并行度(DOP)来以并行方式执行SQL语句以串行方式来执行如果parallel_min_percent被设置将收到"ORA-12827:insufficient parallel query slaves available" Oracle并行子进程可能使用buffered IO而不是直接IO。例如"in-memory parallel execution" SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string AUTO SQL> select degree,instances from user_tables where table_name = 'T1'; DEGREE INSTANCES -------------------- -------------------- 1 1 Elapsed: 00:00:00.00 SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Elapsed: 00:00:18.50 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 469841 consistent gets 313226 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed parallel_degree_policy设置为limited对某些语句启用自动并行度但statement queuing与in-memory parallel execution被禁用。只会对访问使用parallel子句来设置DEFAULT并行度的表或索引应用自动并行度。 SQL> select degree,instances from user_tables where table_name = 'T1'; DEGREE INSTANCES -------------------- -------------------- 1 1 SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string LIMITED SQL> set autotrace on; SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 84998 (1)| 00:00:06 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 21M| 84998 (1)| 00:00:06 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) Statistics ---------------------------------------------------------- 5 recursive calls 0 db block gets 469898 consistent gets 313399 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed 因为表的并行度是1,而不是default,现在使用parallel子句来修改表t1的并行度 SQL> alter table t1 parallel; Table altered. SQL> select degree,instances from user_tables where table_name = 'T1'; DEGREE INSTANCES -------------------- -------------------- DEFAULT DEFAULT SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=5) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 83 recursive calls 0 db block gets 470167 consistent gets 313413 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 6 sorts (memory) 0 sorts (disk) 1 rows processed 2.parallel_min_time_thresholdparallel_min_time_threshold参数用来指定SQL语句是否并行执行一个阈值也就是当优化器根据统计信息所估算的执行时间如果大于这个参数值就是使用并行如果估算的执行时间小于这个参数值就会串行执行。这个参数值缺省值是10秒。并且自动并行度只要在parallel_degree_policy参数被设置为auto或limited时才会生效。从下面的信息可以看到到语句的执行时间小于10秒时优化器以是串行而不是并行方式来执行的 SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string AUTO SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 2755072 Elapsed: 00:00:02.66 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 10627 (1)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 2569K| 10627 (1)| 00:00:01 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 57150 consistent gets 39162 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed 再次增加表t1的数据记录 SQL> insert into t1 select * from t1; 5510144 rows created. SQL> commit; Commit complete. SQL> alter system flush buffer_cache; System altered. SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 11020288 Elapsed: 00:00:09.05 Execution Plan ---------------------------------------------------------- Plan hash value: 3724264953 ------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 42507 (1)| 00:00:03 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | TABLE ACCESS FULL| T1 | 11M| 42507 (1)| 00:00:03 | ------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 1 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 223549 consistent gets 156619 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed 可以看到执行时间为9.05秒Oracle使用串行执行继续向表t1增加记录 SQL> insert into t1 select * from t1; 11020288 rows created. SQL> commit; Commit complete. SQL> alter system flush buffer_cache; System altered. SQL> show parameter parallel_degree_policy NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_degree_policy string AUTO SQL> select * from V$IO_CALIBRATION_STATUS; STATUS CALIBRATION_TIME ------------- --------------------------------------------------------------------------- READY 13-APR-16 10.12.58.413 PM Elapsed: 00:00:00.08 SQL> set autotrace on SQL> select count(*) from t1; COUNT(*) ---------- 22040576 Elapsed: 00:00:18.50 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47183 (1)| 00:00:04 | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | 2 | PX COORDINATOR | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | | | 5 | PX BLOCK ITERATOR | | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 21M| 47183 (1)| 00:00:04 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: Computed Degree of Parallelism is 2 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 469841 consistent gets 313226 physical reads 0 redo size 425 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed 现在可以看到当parallel_degree_policy=auto,parallel_min_time_threshold=auto时sql执行时间超长10秒时就会使用自动并行。 3.parallel_degree_limit使用自动并行度时Oracle会自动决定是否以并行方式来执行SQL语句以及所使用的并行度。优化根据语句所请求的资源来决定一个语句的并行度。然而优化器所使用的并行度是受限制的以防止并行进程击垮系统。也就是是系统中所能使用的并行度的上限为parallel_degree_limit参数值。它有三个参数值可以选择CPU最大并行度由系统中的CPU数量来限制。其计算公式为parallel_degree_limit=parallel_thread_per_cpu*cpu_count当然你也可以将parallel_degree_limit的值设置为一个具体的值以达到明确控制实际并行度的目的。 IO优化器能使用的最大并行度由系统的I/O能力来限制。这个值等于系统总吞吐量除以每个进程的最大I/O带宽。但在Oracle 11.2中为了将parallel_degree_limit设置为IO必须执行dbms_resource_manager.calibrate_io过程来收集系统的I/O统计信息。这个过程将会计算系统的总吞吐量与每个进程的最大IO带宽。 具体数字当自动并行度被激活时指定一个SQL语句所能使用的最大并行度。这个参数只有当parallel_degree_policy设置为auto或limited时才生效。 4.parallel_force_localparallel_force_local参数控制RAC环境中的并行执行。缺省情况下优化器可以从RAC中的任何节点或所有节点中选择并行执行SQL语句的并行进程。当parallel_force_local设置为true时那么并行进程就只能是与查询协调者(执行sql语句的节点)在同一个RAC节点中也就是说并行进程是不能跨节点的. Oracle 11gr2中的自动并行度 原文地址Oracle 11gr2中的自动并行度 作者eric0435 在Oracle 11.2.0.2中只有I/O统计数据被收集才能使用自动并行度。当parallel_degree_policy被设置为auto时Oracle数据库将会基于执行计划中操作的成本和硬件特性来判断是否使用并行当在语句级别使用parallel或parallel(auto)暗示不管parallel_degree_policy设置为何值都会使用自动并行。 IO Calibration硬件特性包括IO Calibration统计数据因此这些统计数据必须被收集否则Oracle数据库将不会使用自动并行这个功能。下面的执行计划是在没有收集IO Calibration统计数据时生成的在执行计划的note部分可以看到"skipped because of IO calibrate statistics are missing"这样的信息 SQL> set long 900 SQL> set linesize 900 SQL> set autotrace traceonly explain SQL> select /*+ parallel */ * from emp; Execution Plan ---------------------------------------------------------- Plan hash value: 2873591275 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 2 (0)| 00:00:01 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) - automatic DOP: skipped because of IO calibrate statistics are missing Oracle提供了PL/SQL包dbms_resource_manager.calibrate_io来收集IO Calibration的统计数据。收集IO Calibration统计数据的持续时间由num_disks变量与RAC中节点数决定的。 SQL> select * from V$IO_CALIBRATION_STATUS; STATUS CALIBRATION_TIME ------------- --------------------------------------------------------------------------- NOT AVAILABLE SET SERVEROUTPUT ON DECLARE lat INTEGER; iops INTEGER; mbps INTEGER; BEGIN --DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat); DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat); DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops); DBMS_OUTPUT.PUT_LINE ('latency = ' || lat); dbms_output.put_line('max_mbps = ' || mbps); END; / 注意DBMS_RESOURCE_MANAGER.CALIBRATE_IO的前两个参数分别为num_disks,max_latency是输入变量并且有三个输出变量。 num_disks:为了获得最精确的结果最好提供数据库所使用的真实物理磁盘数。如果是使用ASM来管理数据库文件那么就是指存储数据的磁盘组那么只有存储数据的磁盘组中的物理磁盘作为num_disks变量值不包含FRA磁盘组中的物理磁盘。 latency:对数据库块IO操作允许的最大延迟 SQL> set long 900 SQL> set linesize 900 SQL> SET SERVEROUTPUT ON DECLARE SQL> 2 lat INTEGER; 3 iops INTEGER; 4 mbps INTEGER; 5 BEGIN 6 --DBMS_RESOURCE_MANAGER.CALIBRATE_IO(, ,iops, mbps, lat); 7 DBMS_RESOURCE_MANAGER.CALIBRATE_IO (1, 10, iops, mbps, lat); 8 DBMS_OUTPUT.PUT_LINE ('max_iops = ' || iops); 9 DBMS_OUTPUT.PUT_LINE ('latency = ' || lat); 10 dbms_output.put_line('max_mbps = ' || mbps); 11 END; 12 / max_iops = 390 latency = 9 max_mbps = 112 PL/SQL procedure successfully completed. 为了验证是否IO Calibration统计信息收集成功在执行dbms_resource_manager.calibrate_io后查询v$io_calibration_status SQL> select * from V$IO_CALIBRATION_STATUS; STATUS CALIBRATION_TIME ------------- --------------------------------------------------------------------------- READY 13-APR-16 10.12.58.413 PM 再次执行看是否能使用自动并行度 SQL> set autotrace traceonly explain SQL> select /*+ parallel */ * from emp; Execution Plan ---------------------------------------------------------- Plan hash value: 2873591275 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 532 | 2 (0)| 00:00:01 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 14 | 532 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 14 | 532 | 2 (0)| 00:00:01 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP | 14 | 532 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------- Note ----- - automatic DOP: Computed Degree of Parallelism is 2 可以看到在收集IO Calibration统计信息后执行计划使用自动并行度。 当使用自动并行度可以还需要调整一些调整参数。parallel_servers_target参数应该总是比parallel_max_servers参数值小parallel_servers_target总是处于parallel_max_servers的75%到50%。如果开始看到大量并行度下降那么应该使用这两个参灵敏的差距增大。 Oracle 并行相关的初始化参数 Oracle数据库并行操作特别是在RAC环境一定程度上能够提升数据库的性能所以对相关的初始化参数的了解是必要的这篇文章将根据实际的案例讨论Oracle数据库的部分并行参数。Oracle数据库相关的并行参数 SQL> show parameter parallel NAME TYPE VALUE ------------------------------------ ---------------------- -------------------- fast_start_parallel_rollback string LOW parallel_adaptive_multi_user boolean TRUE parallel_automatic_tuning boolean FALSE parallel_degree_limit string CPU parallel_degree_policy string MANUAL parallel_execution_message_size integer 16384 parallel_force_local boolean FALSE parallel_instance_group string parallel_io_cap_enabled boolean FALSE parallel_max_servers integer 135 parallel_min_percent integer 0 NAME TYPE VALUE ------------------------------------ ---------------------- -------------------- parallel_min_servers integer 0 parallel_min_time_threshold string AUTO parallel_server boolean FALSE parallel_server_instances integer 1 parallel_servers_target integer 64 parallel_threads_per_cpu integer 2 recovery_parallelism integer 0下面是实际Oracle RAC环境下Oracle并行参数的设置我们将优先讨论这些参数 *.parallel_adaptive_multi_user=FALSE *.parallel_execution_message_size=16384 *.parallel_max_servers=240 *.parallel_min_servers=0 *.parallel_threads_per_cpu=1 PARALLEL_ADAPTIVE_MULTI_USER Property Description Parameter type Boolean Default value true Modifiable ALTER SYSTEM Range of values true | false PARALLEL_ADAPTIVE_MULTI_USER, when set to true, enables an adaptive algorithm designed to improve performance in multiuser environments that use parallel execution. The algorithm automatically reduces the requested degree of parallelism based on the system load at query startup time. The effective degree of parallelism is based on the default degree of parallelism, or the degree from the table or hints, divided by a reduction factor.当PARALLEL_ADAPTIVE_MULTI_USER参数设置为TRUE启用设计的适当算法在多用户环境下使用并行执行提升性能。这个算法基于查询开始时的系统负载自动减少请求的并行度。有效的并行度是基于默认的并行度或者来自表或HINT的并行度通过减少系数进行分割。 The algorithm assumes that the system has been tuned for optimal performance in a single-user environment.算法假定系统在单用户环境下按照最优性能被调整。 Tables and hints use the default degree of parallelism.表和HINT使用默认的并行度。 PARALLEL_MAX_SERVERS Property Description Parameter type Integer Default value PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5 Modifiable ALTER SYSTEM Range of values 0 to 3600 Oracle RAC Multiple instances can have different values. Note: This parameter applies to parallel execution in exclusive mode as well as in a Real Application Clusters environment. PARALLEL_MAX_SERVERS specifies the maximum number of parallel execution processes and parallel recovery processes for an instance. As demand increases, Oracle Database increases the number of processes from the number created at instance startup up to this value.PARALLEL_MAX_SERVERS指定实例最大并行执行进程和并行恢复进程数。随着增长需求Oracle数据库需要增加进程数从实例启动时创建的数目到增长值。 In the formula, the value assigned to concurrent_parallel_users running at the default degree of parallelism on an instance is dependent on the memory management setting. If automatic memory management is disabled (manual mode), then the value of concurrent_parallel_users is 1. If PGA automatic memory management is enabled, then the value of concurrent_parallel_users is 2. If global memory management or SGA memory target is used in addition to PGA automatic memory management, then the value of concurrent_parallel_users is 4.根据上面的公式分配给concurrent_parallel_users的值运行在实例的默认并行度依赖于内存管理设置。如果禁用自动内存管理手动模式那么concurrent_parallel_user的值是1如果启用PGA自动内存管理那么concurrent_parallel_users的值是2。如果除了PGA自动内存管理外还使用了全局内存管理或者SGA内存target那么concurrent_parallel_users的值是4。 If you set this parameter too low, then some queries may not have a parallel execution process available to them during query processing. If you set it too high, then memory resource shortages may occur during peak periods, which can degrade performance.如果设置这个参数过小那么某些查询在查询过程中可能没有并行执行进程活动。如果设置这个参数过大那么在峰值期间内存资源可能不足导致性能下降。 PARALLEL_MIN_SERVERS Property Description Parameter type Integer Default value 0 Modifiable ALTER SYSTEM Range of values 0 to value of PARALLEL_MAX_SERVERS Oracle RAC Multiple instances can have different values. Note: This parameter applies to parallel execution in exclusive mode as well as in a Real Application Clusters environment. PARALLEL_MIN_SERVERS specifies the minimum number of parallel execution processes for the instance. This value is the number of parallel execution processes Oracle creates when the instance is started.PARALLEL_MIN_SERVERS指定实例并行执行进程数的最小值。这个值是实例在启动时Oracle创建的并行执行进程数。 PARALLEL_THREADS_PER_CPU Property Description Parameter type Integer Default value Operating system-dependent, usually 2 Modifiable ALTER SYSTEM Range of values Any nonzero number Note: This parameter applies to parallel execution in exclusive mode as well as in a Real Application Clusters environment. PARALLEL_THREADS_PER_CPU specifies the default degree of parallelism for the instance and determines the parallel adaptive and load balancing algorithms. The parameter describes the number of parallel execution processes or threads that a CPU can handle during parallel execution.PARALLEL_THREADS_PER_CPU指定实例默认的并行度确定合适的并行和负载均衡算法。这个参数描述并行执行进程数或者在并行执行期间CPU能处理的线程数。 The default is platform-dependent and is adequate in most cases. You should decrease the value of this parameter if the machine appears to be overloaded when a representative parallel query is executed. You should increase the value if the system is I/O bound.默认值依赖于平台在大多数情况下都是合适的。当执行一个典型的并行查询时服务器出现过载的情况应该减少这个参数的值。如果系统在I/O的边界应该增加这个值。 在并行参数方面有以下最佳实践 确保监控活动并行服务器进程的数量并计算要应用于 PARALLEL_MIN_SERVERS 的平均值。可通过以下操作完成 Select * from v$pq_syssstat;Then: Get/save the value for row "Servers Highwater" 根据您的硬件情况优化 PARALLEL_MAX_SERVERS的值。最开始可以使用 (2 * ( 2 个线程 ) *(CPU_COUNT)) = 4 x CPU 计算然后使用测试数据对更高的值重复测试。 考虑设置 FAST_START_PARALLEL_ROLLBACK。此参数可确定将有多少个进程用于事务恢复在 redo 应用后执行。为了确保在出现计划外故障后仍能获得高效的工作负载优化事务恢复显得非常重要。只要系统不大量占用 CPU最佳实践是将此参数设置为值“HIGH”。这会导致 Oracle 使用四倍于 CPU 个数 (4 X cpu_count) 的并行进程进行事务恢复。此参数的默认值是“LOW”或两倍的 CPU 计数 (2 X cpu_count)。 对于 11gR2 之前的版本将 PARALLEL_EXECUTION_MESSAGE_SIZE 从默认值通常为 2048增加到 8192。对于基于数据仓库的系统通过 PQ 传输大量数据可以将其设置的更高。在版本 11gR2 中PARALLEL_EXECUTION_MESSAGE_SIZE 的默认值是 16K经证明该值在大多数情况下都能够满足要求。 参考文章《RAC 和 Oracle Clusterware 最佳实践和初学者指南平台无关部分 [ID 1526083.1]》 告警日志 在某些数据库启动的时候还能从告警日志的最开始位置看到以下的信息 Tue May 07 23:38:27 2013 Adjusting the default value of parameter parallel_max_servers from 1280 to 985 due to the value of parameter processes (1000) Starting ORACLE instance (normal) 出现此告警的原因是默认计算出的parallel_max_server的值1280超过了process的最大值1000动态调整到小于process的值。 oracle parallel 并行执行操作 2009-08-22 17:16:08| 分类 系统管理技术|举报|字号 订阅 引子以前一直没太关注oracle并行这个特性。前几天一个兄弟碰到的一个问题才让我觉得这个东西还是有很多需要注意的地方有必要仔细熟悉下。其实碰到的问题不复杂: 类似如下的一条语句insert into xxxx select /*+parallel(a) */ * from xxx a;数据量大约在75G左右这位兄弟从上午跑到下午还没跑完过来问我咋回事说平常2hrs能跑完的东西跑了好几个小时还撒动静。查看系统性能也比较 正常cpuio都不繁忙平均READ速度在80M/s左右勉强凑合但平均写速度只有10M不到。等待事件里面大量的‘ ‘PX Deq Credit: send blkd’这里能看出并行出了问题从而最后得知是并行用法有问题修改之后20分钟完成了该操作。正确的做法应该是alter session enable dml parallel insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a; 因为oracle默认并不会打开PDML对DML语句必须手工启用。 另外不得不说的是并行不是一个可扩展的特性只有在数据仓库或作为DBA等少数人的工具在批量数据操作时利于充分利用资源而在OLTP环境下使用并行 需要非常谨慎。事实上PDML还是有比较多的限制的例如不支持触发器引用约束高级复制和分布式事务等特性同时也会带来额外的空间占用PDDL同 样是如此。有关Parallel excution可参考官方文档在Thomas Kyte的新书《Expert Oracle Database architecture》也有精辟的讲述。 ……………………………………………………………………………………………………………………………………………………………………………………………………………………………… 我在其中一个SESSION 执行SQL> create table test3 parallel 4 as select * from test1; 表已创建。 SQL> select * from v$mystat where rownum=1; SID STATISTIC# VALUE---------- ---------- ---------- 151 0 1 SQL> 然后立刻在另一SESSION 乘上一个执行没结束看下面这么说是有4个并行的进程在处理了SQL> select * from v$px_session; SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE-------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ----------6D31E434 131 16 151 107 1 1 1 1 4 46D32421C 136 11 151 107 1 1 1 2 4 46D3267AC 138 18 151 107 1 1 1 3 4 46D31F6FC 132 11 151 107 1 1 1 4 4 46D335BD4 151 107 151 SQL> select * from v$mystat where rownum=1; SID STATISTIC# VALUE---------- ---------- ---------- 137 0 1 SQL> 我加大后 SQL> / SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE-------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ----------6D31864C 126 10 151 107 1 1 1 1 7 106D31F6FC 132 17 151 107 1 1 1 2 7 106D32421C 136 15 151 107 1 1 1 3 7 106D3267AC 138 22 151 107 1 1 1 4 7 106D322F54 135 11 151 107 1 1 1 5 7 106D31E434 131 18 151 107 1 1 1 6 7 106D327A74 139 5 151 107 1 1 1 7 7 106D335BD4 151 107 151 已选择8行。 SQL> 奇怪怎么看只有7个我那里可是写成SQL> create table test4 parallel 10 as select * from test1; 表已创建。 怎么少了3个 不过我实际只有一个CPU的机器这些说明什么问题呢 BTW SQL> SHOW Parameter parallel_max NAME TYPE VALUE------------------------------------ ---------------------- -------------------parallel_max_servers integer 20SQL> …………………………………………………………………………………………………………………………………………………………………………………………………………………………………………开多少个parallel server也要看当时系统的负载,并行是很耗系统资源的, 这个并行度和你初始化参数有关。CPU_COUNT 、PARALLEL_THREADS_PER_CPU 等等都有关系。如果你建表的时候没有明确指定并行度那么oracle会自动的根据需要设定并行度。 用Oracle并行查询发挥多CPU的威力 在一个单独的服务器中安装更多的CPU成为目前的一个趋势。使用对称多处理服务器SMP的情况下一个Oracle服务器拥有8个、16个或32个CPU以及几吉比特RAM的SGA都不足为奇。 Oracle跟上了硬件发展的步伐提供了很多面向多CPU的功能。从Oracle8i开始Oracle在每个数据库函数中都实现了并行性包括SQL访问全表检索、并行数据操作和并行恢复。对于Oracle专业版的挑战是为用户的数据库配置尽可能多的CPU。 在Oracle环境中实现并行性最好的方法之一是使用Oracle并行查询OPQ。我将讨论OPQ是如何工作的和怎样用它来提升大的全表检索的响应时间以及调用并行事务回滚等等。 使用OPQ 当在Oracle中进行一次合法的、大型的全表检索时OPQ能够极大地提高响应时间。通过OPQOracle将表划分成如图A所示的逻辑块。 图 A 由OPQ划分的表 一旦表被划分成块Oracle启用并行的子查询有时称为杂务进程每个子查询同时读取一个大型表中的一块。所有子查询完毕以后Oracle将结果会传给并行查询调度器它会重新安排数据如果需要则进行排序并且将结果传递给最终用户。OPQ具有无限的伸缩性因此以前需要花费几分钟的全表检索现在的响应时间却不到1秒。 OPQ严重依赖于处理器的数量通过并行运行之所以可以极大地提升全表检索的性能其前提就是使用了N-1个并行进程N=Oracle服务器上CPU的数量。 必须注意非常重要的一点即Oracle9i能够自动检测外部环境包括服务器上CPU的数量。在安装时Oracle9i会检查服务器上CPU的数量设置一个名为cpu_count的参数并使用cpu_count作为默认的初始化输入参数。这些初始化参数会影响到Oracle对内部查询的处理。 下面就是Orale在安装时根据cpu_count而设置的一些参数 fast_start_parallel_rollback parallel_max_servers log_buffer db_block_lru_latches 参数 让我们进一步看看CPU的数量是如何影响这些参数的。 参数fast_start_parallel_rollback Oracle并行机制中一个令人兴奋之处是在系统崩溃时调用并行回滚得能力。当Oracle数据库发生少有的崩溃时Oracle能自动检测未完成的事务并回滚到起始状态。这被称为并行热启动而Oracle使用基于cpu_count的fast_start_parallel_rollback参数来决定未完成事务的秉性程度。 并行数据操纵语言DML恢复能够在Oracle数据库崩溃后极大地加快其重新启动的速度。此参数的默认值是系统CPU数量的两倍但是一些DBA们认为应该将这个值设置为cpu_count的四倍。 参数parallel_max_servers_parameter Oracle一个显著的加强是自动决定OPQ并行的程度。由于Oracle清楚服务器中CPU的数量它会自动分配合适的子进程的数量来提升并行查询的响应时间。当然会有其它的外部因素比如表的划分以及磁盘输入/输出子系统的布局等但是根据cpu_count来设置parallel_max_servers参数将给Oracle一个合理的依据来选择并行的程度。 由于Oracle的并行操作严重依赖服务器上CPU的数量parallel_max_servers会被设置成服务器上CPU的数量。如果在一台服务器上运行多个实例则默认值太大了会导致过度的页面交换和严重的CPU负担。并行的程度还依赖于目标表中分区的数量因此parallel_max_servers应该设置成足够大以允许Oracle为每个查询选择最佳数量的并行子查询。 参数log_buffer 参数log_buffer定义了供即刻写入redo日志信息的保留RAM的数量这个参数受cpu_count的影响。Oracle推荐log_buffer最大为cpu_count乘以500KB或128KB。CPU的数量对于log_buffer来说非常重要因为Oracle会生成多日志写入LGWR进程来异步释放redo信息。 log_buffer是Oracle中最易误解的的RAM参数之一通常存在下面几个配置错误 log_buffer被设置得太高例如大于1MB这回引起性能问题因为大容量的结果会使得写入同步进行例如日志同步等待事件非常高。 log_buffer不是db_block_size的倍数。在的Oracle9i中log_buffer应该是2048字节的倍数。 参数db_block_lru_latches LRU锁的数量是在Oracle数据库内部用来管理数据库缓冲的这严重依赖于服务器上CPU的数量。 很多聪明的Oracle9i的DBA使用多冲数据缓冲例如db_32k_cache_size他们推荐将这个未公开声明的参数重设置为默认的最大值。db_block_lru_latches参数在Oracle8i中使用得很多但是在Oracle9i中变成了一个未公开声明的参数因为Oracle现在根据数据库拥有的CPU数量设置了一个合理的默认值。 db_block_lru_latches默认被设置为服务器上cpu_count的一半例如服务器上只有一个Oracle数据库。Oracle推荐db_block_lru_latches千万不要超过cpu_count的两倍或三倍或db_block_buffers的五十分之一。 如果使用多缓冲池则这种计算方法有一个问题因为不能控制分配给每个数据缓冲池的锁的数量。如果db_writers参数大于1则默认值或许显得太小。 加强服务器 Oracle数据库总是在提升性能根据外部服务器环境检测cpu_count和基本参数设置的能力对于Oracle软件来说是一个重要的加强。 随着更多的Oracle系统转移到SMP上来当客户要采取增强措施并将众多的数据库转移到拥有32个或64个CPU的巨大服务器上来的时候这些参数显得愈发重要。 关于10G的parallel参数的说明 parallel_adaptive_multi_user boolean TRUE说明: 启用或禁用一个自适应算法, 旨在提高使用并行执行方式的多用户环境的性能。通过按系统负荷自动降低请求的并行度, 在启动查询时实现此功能。当 PARALLEL_AUTOMATIC_TUNING = TRUE 时, 其效果最佳。 值范围: TRUE | FALSE 默认值: 如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 则该值为 TRUE; 否则为 FALSE parallel_automatic_tuning boolean TRUE说明: 如果设置为 TRUE, Oracle 将为控制并行执行的参数确定默认值。除了设置该参数外, 你还必须为系统中的表设置并行性。 值范围: TRUE | FALSE 默认值: FALSE parallel_execution_message_size integer 4096说明: 指定并行执行 (并行查询, PDML, 并行恢复和复制) 消息的大小。如果值大于 2048 或 4096, 就需要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING = TRUE, 将在大存储池之外指定消息缓冲区。 值范围: 2148 - 无穷大。 默认值: 如果 PARALLEL_AUTOMATIC_TUNING 为 FALSE, 通常值为 2148; 如果 PARALLEL_AUTOMATIC_TUNING 为 TRUE, 则值为 4096 (根据操作系统而定)。 parallel_instance_group string说明 : 一个群集数据库参数, 标识用来大量产生并行执行从属的并行例程组。并行操作只对在其 INSTANCE_GROUPS 参数中指定一个匹配组的例程大量产生并行执行从属。值范围: 一个代表组名的字符串。默认值 : 由所有当前活动例程构成的组 parallel_max_servers integer 160说明: 指定一个例程的并行执行服务器或并行恢复进程的最大数量。如果需要, 例程启动时分配的查询服务器的数量将增加到该数量。 值范围: 0 -256 默认值: 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 确定 parallel_min_percent integer 0说明: 指定并行执行要求的线程的最小百分比。设置该参数, 可以确保并行执行在没有可用的恰当查询从属进程时, 会显示一个错误消息, 并且该查询会因此而不予执行。 值范围: 0 -100 默认值: 0, 表示不使用该参数。 parallel_min_servers integer 0说明: 指定为并行执行启动例程后, Oracle 创建的查询服务器进程的最小数量。 值范围: 0 - PARALLEL_MAX_SERVERS。 默认值: 0 parallel_server boolean TRUE说明 : 将 PARALLEL_SERVER 设置为 TRUE, 可以启用群集数据库选项。值范围: TRUE | FALSE 默认值 : FALSE parallel_server_instances integer 2说明: 当前已配置的例程的数量。它用于确定 SGA 结构的大小, 该结构由已配置的例程数量来确定。正确设置该参数将改善 SGA 的内存使用情况。 有几个参数是用该数量计算得到的。 值范围: 任何非零值。 默认值: 1 parallel_threads_per_cpu integer 2说明: 说明一个 CPU 在并行执行过程中可处理的进程或线程的数量, 并优化并行自适应算法和负载均衡算法。如果计算机在执行一个典型查询时有超负荷的迹象, 应减小该数值。 值范围: 任何非零值。 默认值: 根据操作系统而定 (通常为 2) 举例Parallel Execution for a Session并行执行会话,有时候为了加快执行速度,充分利用多CPU资源,进行比如并行创建索引的操作.要使用并行执行某些操作可以使用alter session 语句 ALTER SESSION ENABLE PARALLEL DML|DDL|QUERY关闭用如下语句alter session disable parallel DDL|DML|QUERY强制并行执行: ALTER SESSION FORCE PARALLEL DML|DDL|QUERY About Me ............................................................................................................................................. ● 本文作者小麦苗部分内容整理自网络若有侵权请联系小麦苗删除 ● 本文在itpubhttp://blog.itpub.net/26736162/abstract/1/、博客园http://www.cnblogs.com/lhrbest和个人微信公众号xiaomaimiaolhr上有同步更新 ● 本文itpub地址http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号230161599满、618766405 ● 微信群可加我微信我拉大家进群非诚勿扰 ● 联系我请加QQ好友646634621注明添加缘由 ● 于 2017-12-01 09:00 ~ 2017-12-31 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记部分整理自网络若有侵权或不当之处还请谅解 ● 版权所有欢迎分享本文转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号xiaomaimiaolhr及QQ群DBA宝典学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
Oracle dblink介绍 官网:https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5005.htm 当用户要跨本地数据库访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的DBLINK,通过DBLINK可以像访问本地数据库一样访问远程数据库表中的数据。其实,DBLINK和数据库中的VIEW差不多,创建DBLINK的时候需要知道待读取数据库的IP地址、ORACLE_SID以及数据库用户名和密码。 在创建DBLINK之前,普通用户必须具有相关的权限才能创建DBLINK,以SYS用户登录到本地数据库可以看到相关的权限: SELECT * FROM USER_SYS_PRIVS T WHERE T.PRIVILEGE LIKE UPPER('%LINK%'); SYS@PROD1> SELECT * FROM USER_SYS_PRIVS T WHERE T.PRIVILEGE LIKE UPPER('%LINK%');USERNAME PRIVILEGE ADM------------------------------ ---------------------------------------- ---SYS CREATE DATABASE LINK NOSYS DROP PUBLIC DATABASE LINK NOSYS CREATE PUBLIC DATABASE LINK NO 可以看出,在数据库中DBLINK有3种权限:CREATE DATABASE LINK(所创建的DBLINK只能是创建者自己使用,别的用户不能使用)、CREATE PUBLIC DATABASE LINK(PUBLIC表示所创建的DBLINK所有用户都可以使用)与DROP PUBLIC DATABASE LINK(删除公共的DBLINK)。可以使用如下授权语句给用户SCOTT授予CREATE PUBLIC DATABASE LINK和DROP PUBLIC DATABASE LINK两个权限: GRANT CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK TO SCOTT; 查询数据库的DBLINK可以使用SQL语句:SELECT * FROM DBA_DB_LINKS。 创建DBLINK一般有两种方式,第一种方式是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库的TNS,例如这里配置了TNS_BJLHR,然后创建公共DBLINK: CREATE PUBLIC DATABASE LINK DBL_BJLHR CONNECT TO SCOTT IDENTIFIED BY TIGER USING 'TNS_BJLHR'; 其中,DBL_BJLHR是创建的DBLINK名字,SCOTT/TIGER是登录到远程数据库的用户名/密码,然后在本地数据库中通过DBLINK访问远程数据库“TNS_BJLHR”中SCOTT.TB_TEST表,SQL语句如下所示: SELECT * FROM SCOTT.TB_TEST@DBL_BJLHR; 创建DBLINK的第二种方式,是在本地数据库tnsnames.ora文件中没有配置要访问的远程数据库的时候,而直接将相关的内容写到DBLINK的配置中,如下所示: CREATE DATABASE LINK DBL_BJLHR CONNECT TO SCOTT IDENTIFIED BY TIGER USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.10)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = BJLHR) ) )'; 其中,HOST为数据库的IP地址,SERVICE_NAME为数据库的SID,其实,两种方法配置DBLINK是差不多的,第二种方法不受本地服务的影响。 另外,当数据库参数GLOBAL_NAMES为TRUE时,要求数据库链接名称跟远端数据库名称一样。数据库全局名称可以用以下命令查出: SELECT * FROM GLOBAL_NAME; 用以下语句来修改参数值: ALTER SYSTEM SET GLOBAL_NAMES=FALSE/TRUE; 当数据库参数GLOBAL_NAMES为FALSE时,就不要求数据库链接名称跟远端数据库名称一样。 1、概念:database link是定义一个数据库到另一个数据库的路径的对象,database link 允许你查询远程表及执行远程程序。 2、建立database link之前需要确认的事项: 确认从local database到remote database的网络连接是正常的,tnsping要能成功。 确认在remote database上面有相应的访问权限。 > > > > >> >> > > > > >> > > > > > &
【体系结构】有关Oracle SCN知识点的整理--补充内容 小麦苗自己整理的内容参考:【体系结构】有关Oracle SCN知识点的整理 http://blog.itpub.net/26736162/viewspace-2126407/ DBA入门之认识Oracle SCN(System Change Number) 1. SCN的定义 SCN(System Change Number),也就是通常所说的系统改变号,是数据库中非常重要的一个数据结构。 SCN用以标识数据库在某个确切时刻提交的版本。在事务提交时,它被赋予一个唯一的标识事务的SCN。SCN同时被作为Oracle数据库的内部时钟机制,可被看做逻辑时钟,每个数据库都有一个全局的SCN生成器。 作为数据库内部的逻辑时钟,数据库事务依SCN而排序,Oracle也依据SCN来实现一致性读(Read Consistency)等重要数据库功能。另外对于分布式事务(Distributed Transactions),SCN也极为重要,这里不做更多介绍。 SCN在数据库中是唯一的,并随时间而增加,但是可能并不连贯。除非重建数据库,SCN的值永远不会被重置为0. 一直以来,对于SCN有很多争议,很多人认为SCN是指System Commit Number,而通常SCN在提交时才变化,所以很多时候,这两个名词经常在文档中反复出现。即使在Oracle的官方文档中,SCN也常以System Change/Commit Number两种形式出现。 到底是哪个词其实不是很重要,重要的是需要知道SCN是Oracle内部的时钟机制,Oracle通过SCN来维护数据库的一致性,并通过SCN实施Oracle至关重要的恢复机制。 SCN在数据库中是无处不在,常见的事务表、控制文件、数据文件头、日志文件、数据块头等都记录有SCN值。 冠以不同前缀,SCN也有了不同的名称,如检查点SCN(Checkpint SCN)、Resetlogs SCN等。 2.SCN的获取方式 可以通过如下几种方式获得数据库的当前或近似SCN。 (1) 从Oracle 9i开始。 可以使用dbms_flashback.get_system_change_number来获得: SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 888266 (2) Oracle 9i前。 可以通过查询x$ktuxe获得系统最接近当前值的SCN: X$ktuxe的含义是[k]ernel [T]ransaction [U]ndo Transa[x]tion [E]ntry(table) SQL>select max(ktuxecnw*power(2,32)+ktuxescnb) from x$ktuxe; MAX(KTUXESCNW*POWER(2,32)+KTUXESCNB) ------------------------ 28848232 3.SCN的进一步说明 系统当前SCN并不是在任何的数据库操作时都会改变,SCN通常在事务提交或回滚时改变。在控制文件、数据文件头、数据库、日志文件头、日志文件change vector中都有SCN,但其作用各不相同。 (1) 数据文件头中包含了该数据文件的Checkpoint SCN,表示该数据文件最近一次执行检查点操作时的SCN。 从控制文件的dump文件中,可以得到一下内容: DATA FILE #1: (name #7) /opt/ora10g/oradata/ORCL/system01.dbf creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1 tablespace 0, index=1 krfil=1 prev_file=0 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 Checkpoint cnt:106 scn: 0x0000.000d845f 11/14/2011 15:24:50 Stop scn: 0xffff.ffffffff 11/14/2011 14:31:00 Creation Checkpointed at scn: 0x0000.00000009 06/30/2005 19:10:11 …… 对于每一个数据文件都包含一个这样的条目,记录该文件的检查点SCN的值以及检查点发生的时间,这里的Checkpint SCN、Stop SCN以及Checkpoint CNT都是非常重要的数据结构,我们将会在下面检查点部分详细介绍。 同样可以通过命令转储数据文件头,观察其具体信息及检查点记录等,从跟踪文件中摘取system表空间的记录作为参考: *************************************************************************** DATA FILE RECORDS *************************************************************************** (size = 428, compat size = 428, section max = 100, section in-use = 4, last-recid= 53, old-recno = 0, last-recno = 0) (extent = 1, blkno = 11, numrecs = 100) DATA FILE #1: (name #7) /opt/ora10g/oradata/ORCL/system01.dbf creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1 tablespace 0, index=1 krfil=1 prev_file=0 unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 Checkpoint cnt:106 scn: 0x0000.000d845f 11/14/2011 15:24:50 Stop scn: 0xffff.ffffffff 11/14/2011 14:31:00 Creation Checkpointed at scn: 0x0000.00000009 06/30/2005 19:10:11 thread:0 rba:(0x0.0.0) enabled threads: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 Offline scn: 0x0000.0006ce7a prev_range: 0 Online Checkpointed at scn: 0x0000.0006ce7b 11/10/2011 22:40:23 thread:1 rba:(0x1.2.0) enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000 Hot Backup end marker scn: 0x0000.00000000 aux_file is NOT DEFINED (2) 日志文件头包含了Low SCN 和Next SCN。 Low SCN和 Next SCN这两个SCN表示该日志文件包含介于Low SCN到Next SCN的重做信息,对于Current的日志文件(当前正在被使用的Redo Logfile),其最终SCN不可知,所以Next SCN被置为无穷大,也就是ffffffff。 来看一下日志文件的情况: SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ----------------------------- --------- 1 1 35 52428800 1 NO CURRENT 881890 14-NOV-11 2 1 33 52428800 1 YES INACTIVE 836815 12-NOV-11 3 1 34 52428800 1 YES INACTIVE 858362 12-NOV-11 SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 889346 SQL> alter system switch logfile; System altered. SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ----------------------------- --------- 1 1 35 52428800 1 YES ACTIVE 881890 14-NOV-11 2 1 36 52428800 1 NO CURRENT 889353 14-NOV-11 3 1 34 52428800 1 YES INACTIVE 858362 12-NOV-11 可以看到,SCN 889346显然位于Log Group#为1的日志文件中,该日志文件包含了SCN自881890 至889353 的Redo信息。Oracle在进行恢复时,就需要根据低SCN和高SCN来确定需要的恢复信息位于哪一个日志或归档文件中。 如果通过控制文件转储,可以在控制文件中找到关于日志文件的信息: SQL> alter session set events 'immediate trace name redohdr level 10'; Session altered. LOG FILE #1: (name #3) /opt/ora10g/oradata/ORCL/redo01.log Thread 1 redo log links: forward: 2 backward: 0 siz: 0x19000 seq: 0x00000026 hws: 0x1 bsz: 512 nab: 0xffffffff flg: 0x8 dup: 1 Archive links: fwrd: 0 back: 0 Prev scn: 0x0000.000de15c Low scn: 0x0000.000def9a 11/16/2011 16:06:06 Next scn: 0xffff.ffffffff 01/01/1988 00:00:00 LOG FILE #2: (name #2) /opt/ora10g/oradata/ORCL/redo02.log Thread 1 redo log links: forward: 3 backward: 1 siz: 0x19000 seq: 0x00000024 hws: 0x4 bsz: 512 nab: 0x5c6 flg: 0x1 dup: 1 Archive links: fwrd: 0 back: 0 Prev scn: 0x0000.000d74e2 Low scn: 0x0000.000d9209 11/14/2011 16:57:08 Next scn: 0x0000.000de15c 11/16/2011 15:01:07 LOG FILE #3: (name #1) /opt/ora10g/oradata/ORCL/redo03.log Thread 1 redo log links: forward: 0 backward: 2 siz: 0x19000 seq: 0x00000025 hws: 0x3 bsz: 512 nab: 0x37e3 flg: 0x1 dup: 1 Archive links: fwrd: 0 back: 0 Prev scn: 0x0000.000d9209 Low scn: 0x0000.000de15c 11/16/2011 15:01:07 Next scn: 0x0000.000def9a 11/16/2011 16:06:06 可以注意到,Log File 1是当前的日志文件,该文件拥有的Next SCN是无穷大。 同样,可以通过直接dump日志文件的方式来进行转储; SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- --------------------------------------------------------------------------- 3 ONLINE /opt/ora10g/oradata/ORCL/redo03.log 2 ONLINE /opt/ora10g/oradata/ORCL/redo02.log 1 ONLINE /opt/ora10g/oradata/ORCL/redo01.log SQL> alter system dump logfile '/opt/ora10g/oradata/ORCL/redo01.log'; System altered. DUMP OF REDO FROM FILE '/opt/ora10g/oradata/ORCL/redo01.log' Opcodes *.* RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff Times: creation thru eternity FILE HEADER: Compatibility Vsn = 169869568=0xa200100 Db ID=1294662348=0x4d2afacc, Db Name='ORCL' Activation ID=1294635980=0x4d2a93cc Control Seq=953=0x3b9, File size=102400=0x19000 File Number=1, Blksiz=512, File Type=2 LOG descrip:"Thread 0001, Seq# 0000000038, SCN 0x0000000def9a-0xffffffffffff" thread: 1 nab: 0xffffffff seq: 0x00000026 hws: 0x1 eot: 1 dis: 0 resetlogs count: 0x2db5af57 scn: 0x0000.0006ce7b (446075) resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000 prev resetlogs count: 0x2184ef74 scn: 0x0000.00000001 (1) prev resetlogs terminal rcv count: 0x0 scn: 0x0000.00000000 Low scn: 0x0000.000def9a (913306) 11/16/2011 16:06:06 Next scn: 0xffff.ffffffff 01/01/1988 00:00:00 Enabled scn: 0x0000.0006ce7b (446075) 11/10/2011 22:40:23 Thread closed scn: 0x0000.000def9a (913306) 11/16/2011 16:06:06 Disk cksum: 0x5987 Calc cksum: 0x5987 Terminal recovery stop scn: 0x0000.00000000 Terminal recovery 01/01/1988 00:00:00 Most recent redo scn: 0x0000.00000000 Largest LWN: 0 blocks End-of-redo stream : No Unprotected mode Miscellaneous flags: 0x0 这里不打算详细介绍具体命令的用户及更进一步的内容,有兴趣的朋友可以由此开始进一步的探索。 使用Oradebug修改Oracle SCN Oracle SCN对于数据库运行、维护而言是至关重要的因素。在启动从mount到open过程中,主要是各种文件的SCN进行比较的行为。通常情况下,我们是不需要介入到Oracle SCN的取值和设置,甚至错误的干预可能会引起严重运行事故。 在之前的文章中,笔者介绍过使用隐含参数和跟踪事件来推动Oracle SCN前进的方法。但是,在11.2.0.2之后的版本中,Oracle关闭了这个通道,这种方法不在有效。在高版本情况下,我们是可以通过oradebug工具对SCN进行修改。 注意:这种方法比较危险,请不要在投产环境下进行测试。 1、实验环境说明 笔者使用Oracle 11g进行测试,版本为11.2.0.4。对应操作系统是Linux 6.5 64bit版本。 SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production CORE 11.2.0.4.0 Production TNS for Linux: Version 11.2.0.4.0 - Production NLSRTL Version 11.2.0.4.0 – Production 我们先聊聊Oracle的SCN。在数据库内部,SCN是一个单向递增的数字编号,控制文件、数据文件、在线Redo日志、归档日志和备份集合中,都包括这个数字编号。在内部文件中,SCN是通过Base和Wrap两个部分进行保存。Base是SCN编号的基础位,是通过32位二进制位进行保存。一旦超过这32位长度,系统会自动在Wrap进位。也就是说,Wrap表示的超过4G个数的进位次数。 使用Oracle oradebug修改SCN,可以在两个场景下进行,就是Oracle启动Open状态和Mount状态。下面分别进行说明。 2、Open状态下SCN修改 在Open状态,系统的SCN是在不断的向前推动,即使对外没有事务操作,系统内部SCN编号也在不断的前进。我们先将数据库进入open状态。 SQL> alter database open; Database altered. SQL> select CHECKPOINT_CHANGE#, current_scn from v$database; CHECKPOINT_CHANGE# CURRENT_SCN ------------------ ----------- 1753982 1754355 SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 1754364 此时,从系统中提取出的SCN编号约为1754364,显然没有超过wrap的进位4G,变化为16进制如下: SQL> select to_char(1754364, 'XXXXXXXX') from dual; TO_CHAR(1754364,'XXXXXXXX') --------------------------- 1AC4FC 使用oradebug查看内存中SCN对应的变量。 SQL> oradebug setmypid Statement processed. SQL> oradebug dumpvar sga kcsgscn_ kcslf kcsgscn_ [06001AE70, 06001AEA0) = 001AC52A 00000000 00000000 00000000 00000065 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 其中,0x001AC52A近似SCN的Base部分。注意:Linux系统是Little位的操作系统,Base在前,Wrap在后。 SQL> select to_number('1AC52A','xxxxxx') from dual; TO_NUMBER('1AC52A','XXXXXX') ---------------------------- 1754410 下面计划将Base修改为1800000,查看16进制取值。 SQL> select to_char(1800000, 'XXXXXXXX') from dual; TO_CHAR(1800000,'XXXXXXXX') --------------------------- 1B7740 使用poke命令将计算好的值写入进去。 SQL> oradebug poke 0x06001AE70 4 0x001B7740 BEFORE: [06001AE70, 06001AE74) = 001AC66F AFTER: [06001AE70, 06001AE74) = 001B7740 SQL> oradebug DUMPvar SGA kcsgscn_ kcslf kcsgscn_ [06001AE70, 06001AEA0) = 001B7745 00000000 00000000 00000000 00000164 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 SQL> poke命令中,第一位参数是对应写入的内存位数,第二位参数是写入长度,第三位参数是写入取值。默认写入取值是10进制,我们在这里指定写入16进制。 每一个取值段,用8个16进制对应,对应到数字位数是4位。此时查看Oracle情况。 SQL> select CHECKPOINT_CHANGE#, current_scn from v$database; CHECKPOINT_CHANGE# CURRENT_SCN ------------------ ----------- 1753982 1800400 SQL> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 1800402 SQL> select file#, checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1753982 2 1753982 3 1753982 4 1753982 5 1753982 6 1753982 7 1753982 7 rows selected SQL> select file#, checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1753982 2 1753982 3 1753982 4 1753982 5 1753982 6 1753982 7 1753982 7 rows selected 从上面看,内存和控制文件中新的取值已经写入进去了。但是各个文件的头块和检查点还没有反应过来。此时可以使用checkpoint强制写入。 SQL> alter system checkpoint; System altered. SQL> select file#, checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1800422 2 1800422 3 1800422 4 1800422 5 1800422 6 1800422 7 1800422 7 rows selected SQL> select file#, checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1800422 2 1800422 3 1800422 4 1800422 5 1800422 6 1800422 7 1800422 7 rows selected SQL> select CHECKPOINT_CHANGE#, current_scn from v$database; CHECKPOINT_CHANGE# CURRENT_SCN ------------------ ----------- 1800422 1800433 此时,关闭重启系统也不会有问题。篇幅原因,不进行具体展示。那么,很多时候SCN错误是会影响到开启数据库的,我们可能都不能进入open状态。从mount状态下我们怎么修改SCN编号。 3、Mount状态修改SCN编号 我们测试进入mount状态。 SQL> startup mount ORACLE instance started. Total System Global Area 3540881408 bytes Fixed Size 2258320 bytes Variable Size 855640688 bytes Database Buffers 2667577344 bytes Redo Buffers 15405056 bytes Database mounted. 此时,oradebug命令导出内存取值。 SQL> oradebug setmypid Statement processed. SQL> oradebug DUMPvar SGA kcsgscn_ kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 注意:在mount状态下,内存中的SCN取值都是0,包括base和wrap两部分。我们这次修改wrap从0到1。这个过程中,我们需要写入base和wrap两个部分,如果我们只写入了wrap部分,base部分保持0,那么系统运行的时候,会从base为0开始。 此时,需要查看一下当前文件里面SCN是多少。 SQL> select file#, checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1800920 2 1800920 3 1800920 4 1800920 5 1800920 6 1800920 7 1800920 7 rows selected SQL> select file#, checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 1800920 2 1800920 3 1800920 4 1800920 5 1800920 6 1800920 7 1800920 7 rows selected SQL> select CHECKPOINT_CHANGE#, current_scn from v$database; CHECKPOINT_CHANGE# CURRENT_SCN ------------------ ----------- 1800920 0 计算1800920对应到16进制取值为:0x001B7AD8。下面分别写入base和wrap取值。 SQL> oradebug DUMPvar SGA kcsgscn_ kcslf kcsgscn_ [06001AE70, 06001AEA0) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 SQL> oradebug poke 0x06001AE70 4 0x001B7AD8 BEFORE: [06001AE70, 06001AE74) = 00000000 AFTER: [06001AE70, 06001AE74) = 001B7AD8 SQL> oradebug poke 0x06001AE74 4 0x00000001 BEFORE: [06001AE74, 06001AE78) = 00000000 AFTER: [06001AE74, 06001AE78) = 00000001 SQL> oradebug DUMPvar SGA kcsgscn_ kcslf kcsgscn_ [06001AE70, 06001AEA0) = 001B7AD8 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 启动数据库。 SQL> alter database open; Database altered. SQL> select CHECKPOINT_CHANGE#, current_scn from v$database; CHECKPOINT_CHANGE# CURRENT_SCN ------------------ ----------- 4296768217 4296768485 SQL> select file#, checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 4296768217 2 4296768217 3 4296768217 4 4296768217 5 4296768217 6 4296768217 7 4296768217 7 rows selected SQL> select file#, checkpoint_change# from v$datafile; FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 4296768217 2 4296768217 3 4296768217 4 4296768217 5 4296768217 6 4296768217 7 4296768217 7 rows selected 显然在open的时候,写入的checkpoint在所有文件中。写入的wrap头也比较清晰。 SQL> select 4296768217/(4*1024*1024*1024) from dual; 4296768217/(4*1024*1024*1024) ----------------------------- 1.0004193095956 SQL> oradebug DUMPvar SGA kcsgscn_ kcslf kcsgscn_ [06001AE70, 06001AEA0) = 001B7C1D 00000001 00000000 00000000 00000047 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 4、结论 使用oradebug直接修改内存SCN,是我们在故障修复时候非常快捷的方法。不过,快捷建立在对内部机制清晰理解的前提之下。所以,无论何种场景进行修复,有备份、可恢复是我们工作的基本前提。 Oracle系统表 smon_scn_time 的说明 一.SMON_SCN_TIME 表结构说明 SMON_SCN_TIME表存放的是SCN和Time之前的映射关系。 该表由SMON 进程负责维护。 SQL> desc smon_scn_time Name Null? Type ------------------------------------------------- ---------------------------- THREAD NUMBER TIME_MP NUMBER TIME_DP DATE SCN_WRP NUMBER SCN_BAS NUMBER NUM_MAPPINGS NUMBER TIM_SCN_MAP RAW(1200) SCN NUMBER ORIG_THREAD NUMBER SQL> alter session set nls_date_format='yyyy-mm-ddhh24:mi:ss'; Session altered. SQL> select time_dp,scn from smon_scn_time where rownum<5; TIME_DP SCN ------------------- ---------- 2013-03-15 10:31:04 2092348 2013-03-15 10:35:49 2092452 2013-03-15 10:41:00 2092581 2013-03-15 10:45:46 2092682 在Oracle 11g中,该表的创建SQL在$ORACLE_HOME/rdbms/admin/dtxnspc.bsq 文件中。 create table smon_scn_time ( thread number, /* thread, compatibility */ time_mp number, /* time this recent scn represents */ time_dp date, /* time as date, compatibility */ scn_wrpnumber, /*scn.wrp, compatibility */ scn_bas number, /* scn.bas, compatibility */ num_mappings number, tim_scn_map raw(1200), scnnumber default 0, /* scn*/ orig_thread number default 0 /* for downgrade */ ) cluster smon_scn_to_time_aux (thread) / create unique index smon_scn_time_tim_idxon smon_scn_time(time_mp) tablespace SYSAUX / create unique index smon_scn_time_scn_idxon smon_scn_time(scn) tablespace SYSAUX / 我们可以直接delete掉SMON_SCN_TIME表中的记录: SQL> delete from smon_scn_time; 2120 rows deleted. SQL> commit; Commit complete. SQL> select count(1) from smon_scn_time; COUNT(1) ---------- 0 二.SMON_SCN_TIME表记录保存策略说明 2.1 Oracle 9i 根据MOS文档的说明: How To Map SCN To Timestamp Before 10g? [ID365536.1] SYS.SMON_SCN_TIMEwill have a maximum of 1440 rows and each record will be for a 5 minute period.Oracle maintains this information for a maximum of 5 days after which therecords will be recycled. This means thatdata is stored 12 times per hour * 24 hours * 5 days = 1440 rows. 在Oracle 9i版本中,SMON_SCN_TIME 表中最多存放1440条记录。 SMON 进程每隔5分钟生成一次SCN和TIME 之前的映射,并更新到SMON_SCN_TIME表。该表的维护周期是5天。 因此该表最多存放的记录是:12*24*5=1440条记录。 超过1440条的记录在下次循环中会被删除。 2.2 Oracle 10g以后的版本 在oracle 10g以后的版本,SMON_SCN_TIME表的维护策略发生了变化。 根据MOS文档的说明: High Executions Of Statement "deletefrom smon_scn_time..." [ID 375401.1] The deletestatement deletes the oldest rows from smon_scn_time to clear space for newrows. SMON wakes up every 5 minutes and checks how many on-disk mappingswe have--the max is 144000. --SMON进程每个5分钟唤醒一次来更新SCN和TIME之间的映射关系,并且检查SMON_SCN_TIME表中的记录数,该表的记录数最大是144000条。 The new mappingsare then added for the last period (since SMON last updated), and if this isover 144000, SMON will then issue the delete statement: delete fromsmon_scn_time where thread=0 and time_mp = (select min(time_mp) fromsmon_scn_time where thread=0) --SMON进程会把最新的SCN_TIME映射关系写入SMON_SCN_TIME表,如果该表的记录数超过144000条,那么就会执行上面的delete操作,删除最早的记录。 There will be anexecution of this each time SMON wakes to update smon_scn_time, and if onedeletion does not free enough mappings, then there will be multiple executions. --SMON进程每次被唤醒都会更新SMON_SCN_TIME表,如果一次delete操作不能释放足够的空间映射空间,就会执行多次delete操作。 三.禁用SMON 进程对SMON_SCN_TIME 表的更新 可以设置12500事件停止SMON进程对SMON_SCN_TIME。 具体操作如下: SQL> select count(1) from smon_scn_time; COUNT(1) ---------- 2115 SQL> alter system set events '12500trace name context forever, level 10'; System altered. SQL> select sysdate from dual; SYSDATE ------------------- 2013-03-20 13:06:15 SQL> select count(1) from smon_scn_time; COUNT(1) ---------- 2115 SQL> alter system set events '12500 tracename context off'; System altered. SQL> select sysdate from dual; SYSDATE ------------------- 2013-03-20 13:19:58 SQL> select count(1) from smon_scn_time; COUNT(1) ---------- 2119 四.SMON_SCN_TIME 表相关的2个案例 4.1 Oracle 9i SMON_SCN_TIME 表被锁 LOCK ON SYS.SMON_SCN_TIME [ID 747745.1] 4.1.1 现象 Oracle 9i,SYS.SMON_SCN_TIME 被 SMON 进程已排它锁占用,并且锁不能释放,导致数据库出现性能问题,并且SMON_SCN_TIME表中有大量的记录。 SQL> selectcount(*) from sys.smon_scn_time; COUNT(*) ---------- 137545 1 row selected. --正常情况下,9i最多只能保存1440条记录。 SQL> select object_id from dba_objectswhere object_name = 'SMON_SCN_TIME'; OBJECT_ID ---------- 575 1 row selected. SQL> select * fromv$locked_object where object_id = 575; XIDUSNXIDSLOT XIDSQN OBJECT_ID SESSION_ID ---------- ---------- ---------- ---------- ---------- ORACLE_USERNAME OS_USER_NAME PROCESS ------------------------------ ------------------------------ ------------ LOCKED_MODE ----------- 5 5 1494 575 164 dbadmin 4444350 3 <=Locked in row exclusive mode 4.1.2 处理方法 设置12500事件,停止SMON 进程更新SMON_SCN_TIME表,然后手工删除表中的记录。 SQL> alter system set events '12500 tracename context forever, level 10'; SQL> delete from smon_scn_time; SQL> commit; SQL> alter system set events '12500 tracename context off'; Now restart the instance. 4.2 Oracle 10g SMON_SCN_TIME 表频繁的被delete High Executions Of Statement "deletefrom smon_scn_time..." [ID 375401.1] 4.2.1 现象 AWR报告显示smon_scn_time的删除操作频繁的被执行。 delete fromsmon_scn_time where thread=0 and time_mp = (select min(time_mp) fromsmon_scn_time where thread=0); 导致这种现象的原因是SMON_SCN_TIME表和表上的索引不一致。需要重建SMON_SCN_TIME上的索引。 SQL> analyze table smon_scn_timevalidate structure cascade;analyze table smon_scn_time validate structure cascade*ERROR at line 1 :ORA-01499: table/Index Cross Reference Failure - see trace file 4.2.2 处理方法 connect / as sysdbadrop index smon_scn_time_scn_idx;drop index smon_scn_time_tim_idx;create unique index smon_scn_time_scn_idx on smon_scn_time(scn);create unique index smon_scn_time_tim_idx on smon_scn_time(time_mp);analyze table smon_scn_time validate structure cascade; 由oradebug poke推进scn理解scn base及scn wrap系列一 原文地址:由oradebug poke推进scn理解scn base及scn wrap系列一 作者:wisdomone1 背景 在v$transaction会看到scn,其中又分为scn base及scn wrap,这到底怎么回事呢?而且很多ORA报错与SCN有关,如果多了解一些SCN相关的知识,也便于我们分析解决问题。 结论 1,oradebug poke可以推进SCN,分为在数据库OPEN及MOUNT皆可以oradebug setmypidoradebug DUMPvar SGA kcsgscn_oradebug poke 0x060012658 4 10002,关于kcsgscn_变量我是在BAIDU上面查的,而关于SCN到底是对应内存是哪块区域,我是采用多次运行oradebug DUMPvar SGA kcsgscn_,看哪些内存的值在变化,基本就是哪块3,oradebug poke 0x060012658 4 1000 就是推进SCN的命令,具体含义如下: oradebug poke 内存地址 长度 要修改的内容 ,注意这个要修改的内容必须是十进制,如果是16进制会报上述的错(这里我采用了反向对比思维),且这里长度是前4个字节4,如果是在OPEN状态下推进SCN,oradebug DUMPvar SGA kcsgscn_是有值的,而在MOUNT因为数据库没有打开,所在是空的,全是0,那么如何调整SCN,可以基于每个文件头的BLOCK 1的数据结构kscnbas及kscnwrp进行调整 这个数据结构对应select file#,name,checkpoint_change# from v$datafile; BBED> map File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Dba:0x00000000------------------------------------------------------------ Data File Header struct kcvfh, 676 bytes @0 ub4 tailchk @8188 BBED> p kcvfh struct kcvfhckp, 36 bytes @484 struct kcvcpscn, 8 bytes @484 ub4 kscnbas @484 0x028f5c58 --scn base ub2 kscnwrp @488 0x0000 --scn wrap5,select current_scn from v$database,这个SCN是一直在变化,可以叫作内存SCN6,scn是由scn base及scn wrap构成的,当scn base达到一定程度,scn wrap则会递增,一般情况下scn wrap是0,不会变化7,scn base及scn wrap也是数据块中的数据结构,可见scn base是4个字节,而scn wrap是2个字节 也就是说scn base要用4个字节用完,scn wrap就会递增 依理推理,4个字节为 power(2,32),也就是达到这个数据时,scn base就会归0,scn wrap递增18,基于 select file#,name,checkpoint_change# from v$datafile;和数据结构的scn base及scn wrap可知scn计算公式为scn=scn wrap * power(2,32)+scn base9,进一步引申,也可以计算出为scn最大值,因为scn base及scn wrap是由4个字节及4个字节构成的,而这些字节表示的数据范围是有限的 10,如果过小调整scn远小于checkpoint_change#,会引发ora-600 2662,当然解决也很容易,基于checkpoint_change#调大scn即可 否则2662会引发数据库强制关闭 测试 SQL> select * from v$version where rownum=1;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi---可见事务也有scn base及scn wrap的概念SQL> desc v$transaction; Name Null? Type ----------------- -------- ------------ ADDR RAW(8) XIDUSN NUMBER XIDSLOT NUMBER XIDSQN NUMBER UBAFIL NUMBER UBABLK NUMBER UBASQN NUMBER UBAREC NUMBER STATUS VARCHAR2(16) START_TIME VARCHAR2(20) START_SCNB NUMBER --scn base START_SCNW NUMBER --scn wrap START_UEXT NUMBER START_UBAFIL NUMBER START_UBABLK NUMBER START_UBASQN NUMBER START_UBAREC NUMBER SES_ADDR RAW(8) FLAG NUMBER SPACE VARCHAR2(3) RECURSIVE VARCHAR2(3) NOUNDO VARCHAR2(3) PTX VARCHAR2(3) NAME VARCHAR2(256 ) PRV_XIDUSN NUMBER PRV_XIDSLT NUMBER PRV_XIDSQN NUMBER PTX_XIDUSN NUMBER PTX_XIDSLT NUMBER PTX_XIDSQN NUMBER DSCN-B NUMBER --scn base DSCN-W NUMBER --scn wrap USED_UBLK NUMBER USED_UREC NUMBER LOG_IO NUMBER PHY_IO NUMBER CR_GET NUMBER CR_CHANGE NUMBER START_DATE DATE DSCN_BASE NUMBER --scn base DSCN_WRAP NUMBER --scn wrap START_SCN NUMBER DEPENDENT_SCN NUMBER XID RAW(8) PRV_XID RAW(8) PTX_XID RAW(8)---普通数据块也有scn base及scn wrap的概念,且scn base为4个字节,scn wrap为2个字节BBED> map File: /home/ora10g/asia/asia/users01.dbf (0) Block: 12 Dba:0x00000000------------------------------------------------------------ KTB Data Block (Table/Cluster) struct kcbh, 20 bytes @0 struct ktbbh, 72 bytes @20 struct kdbh, 14 bytes @100 struct kdbt[1], 4 bytes @114 sb2 kdbr[32] @118 ub1 freespace[7814] @182 ub1 rowdata[192] @7996 ub4 tailchk @8188 BBED> p kcbhstruct kcbh, 20 bytes @0 ub1 type_kcbh @0 0x06 ub1 frmt_kcbh @1 0xa2 ub1 spare1_kcbh @2 0x00 ub1 spare2_kcbh @3 0x00 ub4 rdba_kcbh @4 0x0100000c ub4 bas_kcbh @8 0x00048e91 --scn base ub2 wrp_kcbh @12 0x0000 --scn wrap ub1 seq_kcbh @14 0x02 ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV) ub2 chkval_kcbh @16 0x7e45 ub2 spare3_kcbh @18 0x0000BBED> ---数据文件头也有scn base及scn wrap的概念BBED> map File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Dba:0x00000000------------------------------------------------------------ Data File Header struct kcvfh, 676 bytes @0 ub4 tailchk @8188 BBED> p kcvfhstruct kcvfh, 676 bytes @0 struct kcvfhbfh, 20 bytes @0 ub1 type_kcbh @0 0x0b ub1 frmt_kcbh @1 0xa2 ub1 spare1_kcbh @2 0x00 ub1 spare2_kcbh @3 0x00 ub4 rdba_kcbh @4 0x01000001 ub4 bas_kcbh @8 0x00000000 ub2 wrp_kcbh @12 0x0000从上述我们发现基本scn wrap全是0,那么何时scn会变成非0呢,我想到了推进SCN,然后对比DUMP数据块,可以了其原理了SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 311981 296387SQL> alter session set events 'immediate trace name adjust_scn level 1';Session altered.SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 311996 296387可见上述推进SCN太慢了SQL> select 311996-311981 from dual;311996-311981------------- 15 ---且ALERT会报权限不足的错误信息Mon Nov 30 23:46:36 EST 2015Errors in file /home/ora10g/admin/asia/udump/asia_ora_23849.trc:ORA-01031: insufficient privileges---上述推进SCN方法太慢,我们尝试另一种快速推进SCN的方法,不过要重启库到MOUNT状态SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 901775360 bytesFixed Size 2100424 bytesVariable Size 226493240 bytesDatabase Buffers 666894336 bytesRedo Buffers 6287360 bytesDatabase mounted.---可见MOUNT状态下CURRENT_SCN为0,其它SCN列皆有值SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 0 312204SQL> select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE#---------- -------------------------------------------------- ------------------ 1 /home/ora10g/asia/asia/system01.dbf 312204 2 /home/ora10g/asia/asia/undotbs01.dbf 312204 3 /home/ora10g/asia/asia/sysaux01.dbf 312204 4 /home/ora10g/asia/asia/users01.dbf 312204SQL> select file#,checkpoint_change# from v$datafile_header; FILE# CHECKPOINT_CHANGE#---------- ------------------ 1 312204 2 312204 3 312204 4 312204SQL> select to_char('312204','xxxxxxx') from dual;TO_CHAR(-------- 4c38c---bbed查看数据文件的SCN,可知是4c38c struct kcvfhckp, 36 bytes @484 struct kcvcpscn, 8 bytes @484 ub4 kscnbas @484 0x0004c38c ub2 kscnwrp @488 0x0000---用10015事件推进SCN发现没有变化,可见在MOUNT状态下不生效推进SCNSQL> alter session set events '10015 trace name adjust_scn level 1';Session altered.SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 0 312204打开数据库看看有无生效,也是没有效果SQL> alter database open;Database altered. SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 312409 312207SQL> select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE#---------- -------------------------------------------------- ------------------ 1 /home/ora10g/asia/asia/system01.dbf 312207 2 /home/ora10g/asia/asia/undotbs01.dbf 312207 3 /home/ora10g/asia/asia/sysaux01.dbf 312207 4 /home/ora10g/asia/asia/users01.dbf 312207---换另一种方法,用ORADEBUG POKE推进SCNSQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 901775360 bytesFixed Size 2100424 bytesVariable Size 226493240 bytesDatabase Buffers 666894336 bytesRedo Buffers 6287360 bytesDatabase mounted.SQL> oradebug setmypidStatement processed.SQL> oradebug DUMPvar SGA kcsgscn_kcslf kcsgscn_ [060012658, 060012688) = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60012338 00000000SQL> SQL> select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE#---------- -------------------------------------------------- ------------------ 1 /home/ora10g/asia/asia/system01.dbf 312714 2 /home/ora10g/asia/asia/undotbs01.dbf 312714 3 /home/ora10g/asia/asia/sysaux01.dbf 312714 4 /home/ora10g/asia/asia/users01.dbf 312714SQL> select to_char('312714','xxxxxx') from dual;TO_CHAR------- 4c58a SQL> oradebug poke 0x060012658 8 0x0004c58aBEFORE: [060012658, 060012660) = 00000000 00000000AFTER: [060012658, 060012660) = 0004C58A 00000000SQL> oradebug DUMPvar SGA kcsgscnkcslf kcsgscn_ [060012658, 060012688) = 0004C58A 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 60012338 00000000SQL> SQL> alter database open;Database altered.SQL> select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE#---------- -------------------------------------------------- ------------------ 1 /home/ora10g/asia/asia/system01.dbf 312717 2 /home/ora10g/asia/asia/undotbs01.dbf 312717 3 /home/ora10g/asia/asia/sysaux01.dbf 312717 4 /home/ora10g/asia/asia/users01.dbf 312717好像没起作用SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 312891 312717---换个思路,试试在数据库打开时推进SCNSQL> select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE#---------- -------------------------------------------------- ------------------ 1 /home/ora10g/asia/asia/system01.dbf 313429 2 /home/ora10g/asia/asia/undotbs01.dbf 313429 3 /home/ora10g/asia/asia/sysaux01.dbf 313429 4 /home/ora10g/asia/asia/users01.dbf 313429SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 313917 313429SQL> select to_char('313917','xxxxxxxxxx') from dual;TO_CHAR('31----------- 4ca3d---经间隔多次运行如下ORADEBUG命令,我分析CURRENT_SCN就是内存中的第1部分(因为就这部分信息在变化,其它信息是固定的)SQL> oradebug setmypidStatement processed.SQL> oradebug DUMPvar SGA kcsgscn_kcslf kcsgscn_ [060012658, 060012688) = 0004CAD4 00000000 00000000 00000000 00000113 00000000 00000000 00000000 00000000 00000000 60012338 00000000SQL> SQL> SQL> SQL> oradebug DUMPvar SGA kcsgscn_kcslf kcsgscn_ [060012658, 060012688) = 0004CAD6 00000000 00000000 00000000 00000114 00000000 00000000 00000000 00000000 00000000 60012338 00000000SQL> SQL> SQL> oradebug DUMPvar SGA kcsgscn_kcslf kcsgscn_ [060012658, 060012688) = 0004CAD7 00000000 00000000 00000000 00000115 00000000 00000000 00000000 00000000 00000000 60012338 00000000SQL> ---所以我们只要改第1部分信息的内容即可SQL> oradebug poke 0x060012658 4 FFFFA3523ORA-01858: a non-numeric character was found where a numeric was expectedSQL> 可见oradeug poke 的含义是oradebug poke 内存地址 长度 要修改的内容 ,注意这个要修改的内容必须是十进制,如果是16进制会报上述的错(这里我采用了反向对比思维),且这里长度是前4个字节SQL> oradebug poke 0x060012658 4 1000BEFORE: [060012658, 06001265C) = 0004CB41AFTER: [060012658, 06001265C) = 000003E8SQL> select to_number('3E8','xxxxxxxxx') from dual;TO_NUMBER('3E8','XXXXXXXXX')---------------------------- 1000---而且上述由于把SCN改得过小,小于数据文件及控制文件的SCN,会报ORA-600 的2662错误,处理很简单,快速基于checkpoint_change#把SCN变大即可,否则过会数据库就会DOWN机SQL> select current_scn,checkpoint_change# from v$database;select current_scn,checkpoint_change# from v$database *ERROR at line 1:ORA-00600: internal error code, arguments: [2662], [0], [71], [0], [333548],[0], [], []---基于上述分析,因为原来SCN是313917,我们加到19999999999SQL> oradebug setmypidStatement processed.SQL> select power(2,32) from dual;POWER(2,32)----------- 4294967296如果把SCN调整为上述的值,马上ALAERT会报错SQL> oradebug DUMPvar SGA kcsgscn_kcslf kcsgscn_ [060012658, 060012688) = 000565AE 00000000 00000000 00000000 00000075 00000000 00000000 00000000 00000000 00000000 60012338 00000000SQL> oradebug poke 0x060012658 4 4294967296BEFORE: [060012658, 06001265C) = 000565B3AFTER: [060012658, 06001265C) = 00000000Tue Dec 01 01:27:33 EST 2015Errors in file /home/ora10g/admin/asia/bdump/asia_cjq0_27711.trc:ORA-00604: error occurred at recursive SQL level 1ORA-08176: consistent read failure; rollback data not available--所以可见SCN也不能随意去调太大,ORACLE内部肯定有个控制算法的,否则会把库搞DOWN掉SQL> oradebug poke 0x060012658 4 42949670BEFORE: [060012658, 06001265C) = 00000003AFTER: [060012658, 06001265C) = 028F5C26SQL> alter system checkpoint;System altered.SQL> alter system checkpoint;System altered.SQL> select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE#---------- -------------------------------------------------- ------------------ 1 /home/ora10g/asia/asia/system01.dbf 42949720 2 /home/ora10g/asia/asia/undotbs01.dbf 42949720 3 /home/ora10g/asia/asia/sysaux01.dbf 42949720 4 /home/ora10g/asia/asia/users01.dbf 42949720---可见SCN已经调整为指定的SCN了SQL> select current_scn,checkpoint_change# from v$database;CURRENT_SCN CHECKPOINT_CHANGE#----------- ------------------ 42949724 42949720---换个思路继糿研究SCN BASE及SCN WRAP,如果我一直增加SCN BASE,SCN WRAP会有变化呢,我理解肯定是SCN BASE大到一定程度,SCN WRAP就会有变化BBED> map File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Dba:0x00000000------------------------------------------------------------ Data File Header struct kcvfh, 676 bytes @0 ub4 tailchk @8188 BBED> p kcvfh struct kcvfhckp, 36 bytes @484 struct kcvcpscn, 8 bytes @484 ub4 kscnbas @484 0x028f5c58 --scn base ub2 kscnwrp @488 0x0000SQL> select to_number('&x','xxxxxxxx') from dual;Enter value for x: 28f5c58old 1: select to_number('&x','xxxxxxxx') from dualnew 1: select to_number('28f5c58','xxxxxxxx') from dualTO_NUMBER('28F5C58','XXXXXXXX')------------------------------- 42949720BBED> set offset 484 OFFSET 484BBED> dump count 5 File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Offsets: 484 to 488 Dba:0x00000000------------------------------------------------------------------------ 585c8f02 00 <32 bytes="" per="" line=""> SQL> select power(2,31) from dual;POWER(2,31)----------- 2147483648 SQL> select to_char('2147483648','xxxxxxxxx') from dual;TO_CHAR('2---------- 80000000BBED> modify /x 00000080Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Offsets: 484 to 488 Dba:0x00000000------------------------------------------------------------------------ 00000080 00 <32 bytes="" per="" line="">--还要调整tailchk可以看到tailchk校验由ub4 bas_kcbh的低4位+ub1 type_kcbh+ub1 seq_kcbhBBED> p tailchkub4 tailchk @8188 0x00000b01 ub4 bas_kcbh @8 0x00000000 ub1 type_kcbh @0 0x0b ub1 seq_kcbh @14 0x01BBED> sum applyCheck value for File 0, Block 1:current = 0x2dac, required = 0x2dac ---调整后 struct kcvfhckp, 36 bytes @484 struct kcvcpscn, 8 bytes @484 ub4 kscnbas @484 0x80000000 ub2 kscnwrp @488 0x0000BBED> p tailchkub4 tailchk @8188 0x00000b01SQL> conn scott/systemConnected.SQL> create table t_modafter(a int);Table created.SQL> insert into t_modafter values(1);1 row created.SQL> commit;Commit complete.SQL> conn /as sysdbaConnected.SQL> alter system checkpoint;System altered.SQL> alter system flush buffer_cache;System altered.---调整scn base到最大值-1SQL> select power(2,32)-1 from dual;POWER(2,32)-1------------- 4294967295SQL> select to_char('4294967295','xxxxxxxxxx') from dual;TO_CHAR('42----------- ffffffff---报错可以分2步进行,即先2个字节进行,然后再把余下的2个字节修改完BBED> modify /x ffffffffBBED-00209: invalid number (ffffffff)BBED> modify /x ffffWarning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Offsets: 484 to 488 Dba:0x00000000------------------------------------------------------------------------ ffff0080 00 <32 bytes="" per="" line=""> BBED> set offset 486 OFFSET 486BBED> dump File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Offsets: 486 to 488 Dba:0x00000000------------------------------------------------------------------------ 008000 <32 bytes="" per="" line="">BBED> modify /x ffff File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Offsets: 486 to 488 Dba:0x00000000------------------------------------------------------------------------ ffff00 <32 bytes="" per="" line="">BBED> dump File: /home/ora10g/asia/asia/users01.dbf (0) Block: 1 Offsets: 484 to 486 Dba:0x00000000------------------------------------------------------------------------ ffffff <32 bytes="" per="" line="">BBED> p kcvfh struct kcvfhckp, 36 bytes @484 struct kcvcpscn, 8 bytes @484 ub4 kscnbas @484 0xffffffff scn_base已经调整为 power(2,32)-1 ,其中32代表4个字节,每个字节byte即8bit,所以就是32个bit,可以表示的数据即power(2,32) ub2 kscnwrp @488 0x0000SQL> alter system flush buffer_cache;System altered.SQL> alter system checkpoint;System altered.BBED> p kcvfh struct kcvfhckp, 36 bytes @484 struct kcvcpscn, 8 bytes @484 ub4 kscnbas @484 0x00000002 ub2 kscnwrp @488 0x0001 ---看到没,SCN WRAP有值了,哈哈说明,SCN BASE大到一定程度,它就有值了SQL> select file#,name,checkpoint_change# from v$datafile; FILE# NAME CHECKPOINT_CHANGE#---------- -------------------------------------------------- ------------------ 1 /home/ora10g/asia/asia/system01.dbf 4294967298 2 /home/ora10g/asia/asia/undotbs01.dbf 4294967298 3 /home/ora10g/asia/asia/sysaux01.dbf 4294967298 4 /home/ora10g/asia/asia/users01.dbf 4294967298 可见scn=scn wrap * power(2,32)+scn baseSQL> select 1*4294967296+2 from dual;1*4294967296+2-------------- 4294967298也就是说scn wrap有值时,scn又开始从0开始计数,由此可见ORACLE设计的精妙所在,再深入一些,也可以知道SCN最大值是什么,哈哈 了解你所不知道的SMON功能(十):维护SMON_SCN_TIME字典基表 >>&>>>> > >>>>> & & &
Linux上创建和更改硬链接和符号链接(软连接) 对于Linux上的硬链接和软连接而言,使用cp命令,无论覆盖其中的那个文件(源文件,软连接文件,硬链接文件),其它文件的内容都会同步修改。 点击(此处)折叠或打开 [oracle@edsir4p1- ~]$ ll [oracle@edsir4p1- ~]$ touch a.txt [oracle@edsir4p1- ~]$ ln -s a.txt b.txt [oracle@edsir4p1- ~]$ ll -rw-r--r-- 1 oracle oinstall 0 Dec 4 12:32 a.txt lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt [oracle@edsir4p1- ~]$ ln a.txt c.txt [oracle@edsir4p1- ~]$ ll -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 a.txt lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 c.txt [oracle@edsir4p1- ~]$ echo lhr > a.txt [oracle@edsir4p1- ~]$ more a.txt lhr [oracle@edsir4p1- ~]$ [oracle@edsir4p1- ~]$ more a.txt lhr [oracle@edsir4p1- ~]$ more b.txt lhr [oracle@edsir4p1- ~]$ more c.txt lhr [oracle@edsir4p1- ~]$ echo lihuarong > b.txt [oracle@edsir4p1- ~]$ more a.txt lihuarong [oracle@edsir4p1- ~]$ more b.txt lihuarong [oracle@edsir4p1- ~]$ more c.txt lihuarong [oracle@edsir4p1- ~]$ echo best > d.txt [oracle@edsir4p1- ~]$ [oracle@edsir4p1- ~]$ [oracle@edsir4p1- ~]$ cp d.txt b.txt [oracle@edsir4p1- ~]$ ll *.txt -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt [oracle@edsir4p1- ~]$ more a.txt best [oracle@edsir4p1- ~]$ more b.txt best [oracle@edsir4p1- ~]$ more c.txt best [oracle@edsir4p1- ~]$ more d.txt best [oracle@edsir4p1- ~]$ ls -i a.txt 46236787 a.txt [oracle@edsir4p1- ~]$ ls -li *.txt 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt [oracle@edsir4p1- ~]$ echo xxxoooo > e.txt [oracle@edsir4p1- ~]$ ls -li *.txt 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt 46236799 -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt [oracle@edsir4p1- ~]$ cp b.txt b.txt_bk [oracle@edsir4p1- ~]$ [oracle@edsir4p1- ~]$ [oracle@edsir4p1- ~]$ cp e.txt b.txt [oracle@edsir4p1- ~]$ [oracle@edsir4p1- ~]$ more b.txt xxxoooo [oracle@edsir4p1- ~]$ more a.txt xxxoooo [oracle@edsir4p1- ~]$ more c.txt xxxoooo [oracle@edsir4p1- ~]$ more b.txt_bk best [oracle@edsir4p1- ~]$ cp b.txt_bk a.txt [oracle@edsir4p1- ~]$ more a.txt best [oracle@edsir4p1- ~]$ more b.txt best [oracle@edsir4p1- ~]$ more c.txt best [oracle@edsir4p1- ~]$ ll *.txt -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt [oracle@edsir4p1- ~]$ rm -rf b.txt [oracle@edsir4p1- ~]$ ll *.txt -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt [oracle@edsir4p1- ~]$ 概述 在本篇中,学习创建和管理硬链接和符号链接。学习: 创建硬或软链接 识别链接并知道它们的类型 理解复制与链接文件之间的区别 使用链接执行系统管理任务 链接简介 在存储设备上,文件或目录包含在一些数据块中。有关某个文件的信息包含在一个 inode 中,它记录了所有者、最后访问该文件的时间、文件的大小、它是否是目录,以及谁可以读取或写入它等信息。inode 编号也称为文件序列号 ,该编号在特定文件系统内是唯一的。一个 目录条目 包含一个文件或目录的名称,以及用来存储该文件或目录的信息的 inode 的指针。 创建链接 硬链接 是指向 inode 的目录条目,而 软链接 或 符号链接 是指向提供另一个目录条目的名称的 inode 的目录条目。存储第二个名称的准确机制可能依赖于文件系统和名称的长度。符号链接也称为symlink 。 您可以只为文件创建硬链接,而不为目录创建硬链接。一个例外是一个包含该目录和它的父目录(. 和 ..)的目录中的特殊目录条目,它们是维护子目录数量的硬链接。因为硬链接指向 inode,而且 inode 仅在特定的文件系统内是唯一的,所以硬链接不能跨文件系统使用。如果一个文件有多个硬链接,那么只在指向该 inode 的最后一个链接被删除,而且链接数量变为 0 时,才会删除该文件。 软链接或 symlink 仅按名称指向另一个文件或目录,而不是按 inode。软链接可以跨越文件系统边界进行使用。删除软链接不会删除目标文件或目录,删除目标文件或目录也不会自动删除任何软链接。 首先让我们看看如何创建硬和软链接。在本教程后面,我们将介绍识别和使用我们在这里创建的链接的方式。 硬链接 使用 ln 命令创建现有文件的额外的硬链接(但不能是目录,即使系统将 . 和 .. as 设置为硬链接)。 清单 1 展示了如何创建一个包含两个文件和一个子目录的目录,其中包含 file1 的两个硬链接,一个位于同一个目录中,另一个位于子目录中。我们向 file1 添加一个词,然后向 file3 添加另一个词,并在子目录中显示该链接的内容,以表明所有链接确实都指向相同的数据。 清单 1. 创建硬链接 [plain] view plain copy [ian@atticf22 ~]$ mkdir -p lpi104-6/subdir [ian@atticf22 ~]$ touch lpi104-6/file1 [ian@atticf22 ~]$ touch lpi104-6/file2 [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/file3 [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/subdir/file3sub [ian@atticf22 ~]$ echo "something" > lpi104-6/file1 [ian@atticf22 ~]$ echo "else" >> lpi104-6/file3 [ian@atticf22 ~]$ cat lpi104-6/subdir/file3sub something else 如果尝试创建跨文件系统或针对目录的硬链接,则会获得错误。清单 2 显示我的主目录和 research 目录在不同的文件系统上,而且跨这些文件系统创建硬链接的尝试失败了,与创建 lpi104-6 目录的硬链接的尝试一样。 清单 2. 硬链接创建失败 [plain] view plain copy [ian@atticf22 ~]$ df . research Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda5 71168700 31642752 35887712 47% / /dev/sdb3 60326992 30677592 26578276 54% /home/ian/research [ian@atticf22 ~]$ mkdir -p research/lpi104-6/ [ian@atticf22 ~]$ ln lpi104-6/file1 research/lpi104-6/file3 ln: failed to create hard link ‘ research/lpi104-6/file3 ’ => ‘ lpi104-6/file1 ’ : Invalid cross-device link [ian@atticf22 ~]$ ln lpi104-6 lpidir104-6 ln: ‘ lpi104-6 ’ : hard link not allowed for directory 软链接 使用 ln 命令和 -s 选项来创建软链接。软链接使用文件或目录名称,这些名称可能是相对或绝对的。如果使用相对名称,您可能希望当前工作目录是您创建链接的目录。否则,您创建的链接将是文件系统中的另一个位置相对的链接。 清单 3 展示了为我们刚创建的 file1 创建软链接的两种方式,以及如何创建软链接,而不是创建在 清单 2中失败的两个硬链接。 清单 3. 创建软链接 [plain] view plain copy [ian@atticf22 ~]$ # Create symlink using absolute paths [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~/lpi104-6/file4 [ian@atticf22 ~]$ # Create symlink using relative paths [ian@atticf22 ~]$ cd lpi104-6/ [ian@atticf22 lpi104-6]$ ln -s file1 file5 [ian@atticf22 lpi104-6]$ cd .. [ian@atticf22 ~]$ # Create symlink across file systems [ian@atticf22 ~]$ mkdir -p ~ian/research/lpi104-6 [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~ian/research/lpi104-6/file4 [ian@atticf22 ~]$ # Create symlink for directory [ian@atticf22 ~]$ ln -s lpi104-6 lpidir104-6 与之前一样,您可以使用任何链接或目标文件名来引用该文件或目录。清单 4 显示了一些例子。 清单 4. 使用软链接 [plain] view plain copy [ian@atticf22 ~]$ echo "another line" >> ~ian/research/lpi104-6/file [ian@atticf22 ~]$ # cat a symlink [ian@atticf22 ~]$ cat lpi104-6/file5 something else [ian@atticf22 ~]$ # cat a hard link [ian@atticf22 ~]$ cat lpi104-6/file1 something else [ian@atticf22 ~]$ # display directory contents using symlink [ian@atticf22 ~]$ ls lpidir104-6 file1 file2 file3 file4 file5 subdir 在创建链接时,让我们在工作目录 不是我们想要存放链接的目录时使用相对路径创建一个链接。下一节将介绍如何实现此目的。 清单 5. 创建不良的软链接 [plain] view plain copy [ian@atticf22 ~]$ ln -s lpi104-6/file1 lpi104-6/file6 识别链接 在上一节中,您了解了如何创建链接,但不知道如何区分您创建的链接。现在让我们讨论一下这个主题。 查找信息 在许多系统上,ls 命令等同于 ls --color=auto ,它以不同颜色打印不同类型的文件系统对象。如果使用此选项,可能使用蓝绿色文本来显示 symlink,如 图 1中所示。 图 1. 使用 ls 的 --colors 选项来识别链接 在旧配置上,可能使用深蓝色背景来显示硬链接。这些颜色可使用 dircolors 程序来配置。如果要自定义您的终端外观,您可能希望更改ls 的一些输出的颜色。清单 6显示了一种在 Fedora 22 系统上获得硬链接的蓝色背景的方式,而 图 2 则显示了结果。使用手册页进一步理解该示例。 清单 6. 使用 dircolors 为硬链接设置一种蓝色背景 [plain] view plain copy [ian@atticf22 ~]$ # Save a copy of dircolors defaults [ian@atticf22 ~]$ dircolors -p > dircolors-defaults [ian@atticf22 ~]$ grep MULTI dircolors-defaults MULTIHARDLINK 00 # regular file with more than one link [ian@atticf22 ~]$ # Change MULTIHARDLINK to blue background [ian@atticf22 ~]$ sed -e'/MULTI/s/00/00;44/' dircolors-defaults > dircolors-new [ian@atticf22 ~]$ grep MULTI dircolors-new MULTIHARDLINK 00;44 # regular file with more than one link [ian@atticf22 ~]$ # Set the new colors for the current terminal session [ian@atticf22 ~]$ eval $(dircolors dircolors-new ) 图 2. 使用蓝色背景来标识硬链接 对于能够区分颜色的视力正常的人而言,颜色可能很方便,但它们对其他人没多大用处,对 shell 脚本或程序肯定也没多大用处。没有颜色,就需要更多的信息,比如使用ls -l 通过一个长清单所提供的信息。在 清单 7中,我们为第一个示例显式禁用了颜色输出,但您也可以像我们对另外两个示例所做的一样显式调用/bin/ls 命令。 清单 7. 识别链接 [plain] view plain copy [ian@atticf22 ~]$ ls --color=none -lR lpi104-6 lpi104-6: total 12 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1 -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3 lrwxrwxrwx. 1 ian ian 24 Aug 9 14:26 file4 -> /home/ian/lpi104-6/file1 lrwxrwxrwx. 1 ian ian 5 Aug 9 14:26 file5 -> file1 lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 file6 -> lpi104-6/file1 drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir lpi104-6/subdir: total 4 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3sub [ian@atticf22 ~]$ /bin/ls -l ~ian/research/lpi104-6/file4 lrwxrwxrwx. 1 ian ian 24 Aug 9 14:27 /home/ian/research/lpi104-6/file4 -> /home/ian/lpi104-6/file1 [ian@atticf22 ~]$ /bin/ls -l lpidir104-6 lrwxrwxrwx. 1 ian ian 8 Aug 9 14:27 lpidir104-6 -> lpi104-6 输出的第二列是一个链接计数,显示了此文件的硬链接数,所以我们知道 file1、file3 和 file3sub 都拥有多个指向它们表示的对象的硬链接。我们仍没有足够的信息来知道它们都表示同一个对象。如果您删除一个链接数大于 1 的文件,inode 中的链接数会减 1,但该文件只在链接数变为 0 时才会删除。同一个文件的其他所有硬链接将显示一个现在减去了 1 的链接数。 在输出的第一列中,您会看到第一个字符是表示符号链接的 “l”(L 的小写形式)。您还会看到在 -> 字符后显示了链接的目标。例如,file4 -> /home/ian/lpi104-6/file1。另一个提示是,该大小是链接目标的名称中的字符数。请注意,对于符号链接,目录清单中的链接数没有更新。删除该链接不会影响目标文件。Symlink 不会阻止文件被删除。如果目标文件被移动或删除,那么 symlink 将被破坏。出于这个原因,许多系统在目录清单中使用了颜色,通常使用淡蓝色表示正常链接,使用红色表示被破坏的链接。 您可以使用 ls 命令的 -i 选项来显示文件和目录条目的 inode 数量。清单 8同时给出了我们的 lpi104-6 目录的短和长输出。 清单 8. 显示 inode 信息 [plain] view plain copy [ian@atticf22 ~]$ ls -i lpi104-6 1988884 file1 1988884 file3 1988892 file5 1988605 subdir 1988886 file2 1988885 file4 1988891 file6 [ian@atticf22 ~]$ ls -il lpi104-6 total 12 1988884 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1 1988886 -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2 1988884 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3 1988885 lrwxrwxrwx. 1 ian ian 24 Aug 9 14:26 file4 -> /home/ian/lpi104-6/file1 1988892 lrwxrwxrwx. 1 ian ian 5 Aug 9 14:26 file5 -> file1 1988891 lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 file6 -> lpi104-6/file1 1988605 drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir 您还可以使用 find 命令,使用 -type l 查找表达式来搜索符号链接,如 清单 9中所示。 清单 9. 使用 find 查找 symlink [plain] view plain copy [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -type l lpi104-6/file4 lpi104-6/file6 lpi104-6/file5 research/lpi104-6/file4 破坏的 symlink 在 清单 5 中,我们声明要创建一个不良的软链接。这是破坏的 symlink 的一个示例。因为硬链接始终指向一个表示文件的 inode,所以它们始终有效。但是,symlink 可能出于许多原因而遭到破坏,包括: 在创建链接时,链接的原始文件或目标不存在(就像 清单 5 中一样)。 链接的目标被删除或重命名。 目标的路径中的某个元素被删除或重命名。 所有这些条件都不会抛出错误,所以您需要仔细考虑您在创建 symlink 时可能发生了什么情况。具体地讲,对于绝对或相对路径的选择,可能受到您希望链接的对象在链接生存期中发生什么的影响。 如果您使用颜色输出,破坏的 symlink 可能在黑色背景上显示为红色文本,就像 图 1 中的 file6 的情况一样。否则,您需要使用 ls 的 -H 或 -L 选项来取消引用该链接,并提供有关目标的信息。-H 选项在命令行上取消引用链接,-L 选项取消引用显示中包含的附加链接。清单 10演示了来自这两个选项的输出中的区别。 清单 10. 使用 ls -H 和 ls -L 取消引用链接 [plain] view plain copy [ian@atticf22 ~]$ /bin/ls -lH lpidir104-6 total 12 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1 -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3 lrwxrwxrwx. 1 ian ian 24 Aug 9 14:26 file4 -> /home/ian/lpi104-6/file1 lrwxrwxrwx. 1 ian ian 5 Aug 9 14:26 file5 -> file1 lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 file6 -> lpi104-6/file1 drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir [ian@atticf22 ~]$ /bin/ls -lL lpidir104-6 /bin/ls: cannot access lpidir104-6/file6: No such file or directory total 20 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1 -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file4 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file5 l?????????? ? ? ? ? ? file6 drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir 请注意,错误消息表明 file6 不存在,另请注意针对它的包含所有 “?” 字符的输出,它们同样表明该文件不存在。 关于破坏的符号链接,还要说明最后一点。读取该文件的尝试将失败,因为它不存在。但是,如果您拥有目标文件的合适权限,写入它的尝试将有效,如 清单 11中所示。请注意,我们需要在写入该文件之前创建 lpi104-6/lpi104-6。 清单 11. 读取和写入一个破坏的 symlink [plain] view plain copy [ian@atticf22 ~]$ cat lpi104-6/file6 cat: lpi104-6/file6: No such file or directory [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6 bash: lpi104-6/file6: No such file or directory [ian@atticf22 ~]$ mkdir lpi104-6/lpi104-6 [ian@atticf22 ~]$ cat lpi104-6/file6 cat: lpi104-6/file6: No such file or directory [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6 [ian@atticf22 ~]$ cat lpi104-6/file6 Testing file6 [ian@atticf22 ~]$ ls lpi104-6/lpi104-6 file1 [ian@atticf22 ~]$ ls -l lpi104-6/file6 lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 lpi104-6/file6 -> lpi104-6/file1 谁链接到我? 要确定哪些文件是一个特定 inode 的硬链接,可以使用 find 命令和 -samefile 选项及一个文件名,或者-inum 选项及一个 inode 编号,如 清单 12 中所示。 清单 12. 查找同一个文件的硬链接 [plain] view plain copy [ian@atticf22 ~]$ find lpi104-6 -samefile lpi104-6/file1 lpi104-6/file1 lpi104-6/file3 lpi104-6/subdir/file3sub [ian@atticf22 ~]$ ls -i lpi104-6/file1 1988884 lpi104-6/file1 [ian@atticf22 ~]$ find lpi104-6 -inum 1988884 lpi104-6/file1 lpi104-6/file3 lpi104-6/subdir/file3sub 要查找哪些文件通过符号链接而链接到一个特定文件,可以使用 find 命令和 -lname 选项及一个文件名,如 清单 13 所示。链接可以使用相对或绝对路径,所以您可能希望在名称中放入一个前导的星号来找到所有匹配结果。 清单 13. 查找一个文件或目录的符号链接 [plain] view plain copy [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -lname "*file1" lpi104-6/file4 lpi104-6/file6 lpi104-6/file5 research/lpi104-6/file4 复制还是链接 根据您想要完成的任务,有时会使用链接,有时复制一个文件可能会更好一些。主要区别在于,链接提供了一个文件的多个名称,而副本会在两个不同的名称下创建两组相同的数据。对于备份和测试用途,肯定会使用副本,您希望试验一个新程序而不让您的操作数据处于风险之中。在需要某个文件(或目录)的别名时(可能用于提供更方面或更短的路径),可以使用链接。在下一节中,我们将介绍链接的其他一些用法。 您已经看到,在更新一个文件时,它所有的链接都会看到更新信息,而复制文件不会这样。您还看到,符号链接可以破坏,后续写入操作可以创建新的文件。请小心使用链接。 链接和系统管理 链接(尤其是符号链接)通常用在 Linux 系统管理中。命令通常具有别名,所以用户不需要知道当前命令的版本号,但在必要的时候,可以使用更长的名称来访问其他版本。如 清单 14所示,python 命令是python2 的 symlink,python2 本身是 2.7 版的 python2.7 的 symlink。 清单 14. 将命令别名化为一个特定版本 [plain] view plain copy [ian@atticf22 ~]$ which python /usr/bin/python [ian@atticf22 ~]$ ls -l /usr/bin/python lrwxrwxrwx. 1 root root 7 May 27 14:12 /usr/bin/python -> python2 [ian@atticf22 ~]$ ls -l /usr/bin/python2 lrwxrwxrwx. 1 root root 9 May 27 14:12 /usr/bin/python2 -> python2.7 [ian@atticf22 ~]$ ls -l /usr/bin/python2.7 -rwxr-xr-x. 1 root root 7120 May 27 14:12 /usr/bin/python2.7 在多个命令名称使用相同的基础代码时,比如存储和重新启动系统的各种命令,其他用途就可以派上用场。有时,一个新命令名称(比如 genisoimage )将取代旧命令名称,但旧名称 (mkisofs) 保持为新命令的链接。一些替代性 工具会广泛使用链接,所以您可以在多个替代性工具中选择一个来用于某条命令,比如java 。清单 15显示了一些示例。 清单 15. 命令别名的示例 [plain] view plain copy [ian@atticf22 ~]$ which halt /usr/sbin/halt [ian@atticf22 ~]$ ls -l /usr/sbin/halt lrwxrwxrwx. 1 root root 16 Jun 9 09:16 /usr/sbin/halt -> ../bin/systemctl [ian@atticf22 ~]$ find /usr/sbin /usr/bin -lname "*/systemctl" /usr/sbin/halt /usr/sbin/telinit /usr/sbin/shutdown /usr/sbin/runlevel /usr/sbin/poweroff /usr/sbin/reboot [ian@atticf22 ~]$ which mkisofs /usr/bin/mkisofs [ian@atticf22 ~]$ ls -l /usr/bin/mkisofs lrwxrwxrwx. 1 root root 25 Jun 15 08:02 /usr/bin/mkisofs -> /etc/alternatives/mkisofs [ian@atticf22 ~]$ alternatives --display mkisofs mkisofs - status is auto. link currently points to /usr/bin/genisoimage /usr/bin/genisoimage - priority 50 slave mkisofs-mkhybrid: /usr/bin/genisoimage slave mkisofs-mkhybridman: /usr/share/man/man1/genisoimage.1.gz slave mkisofs-mkisofsman: /usr/share/man/man1/genisoimage.1.gz Current `best' version is /usr/bin/genisoimage. 库名称通常也使用 symlink 来管理,无论是允许程序在获取当前版本时链接到一般名称,还是管理系统,比如能够运行 32 位程序的 64 位系统。清单 16显示了一些示例。请注意,一些情况会使用绝对路径,而另一些情况会使用相对路径。 清单 16. 库链接 [plain] view plain copy [ian@atticf22 ~]$ ls -l /usr/lib*/libm.so* lrwxrwxrwx. 1 root root 21 Feb 23 10:31 /usr/lib64/libm.so -> ../../lib64/libm.so.6 lrwxrwxrwx. 1 root root 12 Feb 23 10:33 /usr/lib64/libm.so.6 -> libm-2.21.so lrwxrwxrwx. 1 root root 12 Feb 23 10:35 /usr/lib/libm.so.6 -> libm-2.21.so [ian@atticf22 ~]$ find /usr/lib/ /usr/lib64/ -lname "*libstdc++*" /usr/lib/gcc/x86_64-redhat-linux/5.1.1/libstdc++.so /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.so /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.a /usr/lib64/libstdc++.so.6 [ian@atticf22 ~]$ ls -l /usr/lib64/libstdc++.so.6 lrwxrwxrwx. 1 root root 19 Jun 18 06:52 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21 [ian@atticf22 ~]$ ls -l /usr/lib64/libwbclient* lrwxrwxrwx. 1 root root 19 Jul 1 10:37 /usr/lib64/libwbclient.so.0 -> libwbclient.so.0.12 lrwxrwxrwx. 1 root root 40 Jul 1 10:37 /usr/lib64/libwbclient.so.0.12 -> /etc/alternatives/libwbclient.so.0.12-64 原文地址: > >> > > > &
optimizer_index_caching和optimizer_index_cost_adj两个参数说明 OPTIMIZER_INDEX_COST_ADJ Property Description Parameter type Integer Default value 100 Modifiable ALTER SESSION, ALTER SYSTEM Range of values 1 to 10000 OPTIMIZER_INDEX_COST_ADJ lets you tune optimizer behavior for access path selection to be more or less index friendly—that is, to make the optimizer more or less prone to selecting an index access path over a full table scan. The default for this parameter is 100 percent, at which the optimizer evaluates index access paths at the regular cost. Any other value makes the optimizer evaluate the access path at that percentage of the regular cost. For example, a setting of 50 makes the index access path look half as expensive as normal. Note: The adjustment does not apply to user-defined cost functions for domain indexes. See Also: Oracle Database Performance Tuning Guide for more information on setting this parameter, and on its relationship to "OPTIMIZER_INDEX_CACHING" OPTIMIZER_INDEX_CACHING Property Description Parameter type Integer Default value 0 Modifiable ALTER SESSION, ALTER SYSTEM Range of values 0 to 100 OPTIMIZER_INDEX_CACHING lets you adjust the behavior of cost-based optimization to favor nested loops joins and IN-list iterators. The cost of executing an index using an IN-list iterator or of executing a nested loops join when an index is used to access the inner table depends on the caching of that index in the buffer cache. The amount of caching depends on factors that the optimizer cannot predict, such as the load on the system and the block access patterns of different users. You can modify the optimizer's assumptions about index caching for nested loops joins and IN-list iterators by setting this parameter to a value between 0 and 100 to indicate the percentage of the index blocks the optimizer should assume are in the cache. Setting this parameter to a higher value makes nested loops joins and IN-list iterators look less expensive to the optimizer. As a result, it will be more likely to pick nested loops joins over hash or sort-merge joins and to pick indexes using IN-list iterators over other indexes or full table scans. The default for this parameter is 0, which results in default optimizer behavior. See Also: Oracle Database Performance Tuning Guide for more information on setting this parameter 一、optimizer_index_cost_adj参数 优化器计算通过索引扫描访问表数据的cost开销,可以通过这个参数进行调整。参数可用值的范围为1到10000。默认值为100,超过100后越大则越会使索引扫描的COST开销越高(计算的),从而导致查询优化器更加倾向于使用全表扫描。相反,值越小于100,计算出来的索引扫描的开销就越低。 注意: 1、这里描述的开销,仅仅为优化器评估出来的而已,而非实际执行的开销;例如同样的SQL语句,同样的执行路径,修改这个参数以后,计算出来的cost不同,但是,SQL语句执行的实际物理路径、时间、逻辑读都是一样的。 2、这个参数影响优化器评估索引访问的IO开销 3、可以参见后面的示例进一步理解这个参数 二、optimizer_index_caching参数 用于在执行in-list遍历和嵌套循环连接时,优化器评估已经存在于buffer cache中的索引块的数量(以百分比的方式)。参数的取值范围是0到100,默认值为0,取值越大就越减少优化器在评估In-list和嵌套循环连接的索引扫描的开销COST。 1、这里的描述仅仅为优化器的评估结果。换句话说,它不是用来指定数据库实际缓存的每个索引块的数量 2、可以参见后面的示例进一步理解这个参数 三、索引范围扫描的成本计算公式(与两个参数相结合) cost = { (blevel+leaf_blocks * effective index selectivity)*(1-optimizer_index_caching/100)+ cluster_factor * effective table selectivity)*(optimizer_index_cost_adj/100) } 说明 1、blevel=索引的层数,即dba_indexes视图中的blevel列值 2、leaf_blocks为索引的叶子块数量,即dba_indexes视图中的leaf_blocks列值 3、effective index selectivity指的是SQL语句中用于索引扫描的谓词驱动条件的列字段的选择率(where条件中) 4、cluster_factor为索引的聚簇因子(表示索引数据与表数据排序后的相近程度) 5、effective table selectivity指的是SQL where条件中能够在索引上进行过滤的所有谓词列字段的选择率(可以理解为通过索引扫描后(包含驱动和过滤),最后通过rowid定位表的数量) 6、一般是4、5两个部分往往是整个计算公式中权重最大的因素。 注意 1、从上面的成本计算公式和说明,我们知道,optimizer_index_cost_adj参数对优化器的影响要远远大于optimizer_index_caching参数 2、随着优化器越来越智能这两个参数的作用已经慢慢被 系统统计信息 给替换了。 3、10gR2开始,这两个参数的值尽量保持为默认值。如果实在需要调整,请严格测试! 四、optimizer_index_cost_adj参数示例 SQL> create table t as select rownum rn ,object_name name from dba_objects a where rownum<5000;Table created.SQL> create index t_idx on t(rn);Index created.SQL> BEGIN 2 3 DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SYS', 4 TABNAME=>'T', 5 ESTIMATE_PERCENT=>30, 6 METHOD_OPT=>'FOR ALL COLUMNS SIZE 1', 7 NO_INVALIDATE=>FALSE, 8 CASCADE=>TRUE, 9 DEGREE => 4); 10 END; 11 /PL/SQL procedure successfully completed.SQL> explain plan for select * from t where rn<200;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 470836197-------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 199 | 4179 | 3 (0)| 00:00:35 || 1 | TABLE ACCESS BY INDEX ROWID| T | 199 | 4179 | 3 (0)| 00:00:35 ||* 2 | INDEX RANGE SCAN | T_IDX | 199 | | 2 (0)| 00:00:24 |-------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access("RN"<200)14 rows selected.SQL> alter session set optimizer_index_cost_adj=50;Session altered.SQL> explain plan for select * from t where rn<200;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 470836197-------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 199 | 4179 | 2 (0)| 00:00:18 || 1 | TABLE ACCESS BY INDEX ROWID| T | 199 | 4179 | 2 (0)| 00:00:18 ||* 2 | INDEX RANGE SCAN | T_IDX | 199 | | 1 (0)| 00:00:12 |-------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access("RN"<200)14 rows selected.SQL> alter session set optimizer_index_cost_adj=500;Session altered.SQL> explain plan for select * from t where rn<200;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 1601196873-------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 199 | 4179 | 6 (0)| 00:01:10 ||* 1 | TABLE ACCESS FULL| T | 199 | 4179 | 6 (0)| 00:01:10 |--------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 1 - filter("RN"<200)13 rows selected. 五、optimizer_index_caching参数示例 IN-LIST示例 SQL> set linesize 200 pagesize 9999SQL> explain plan for select * from t where rn in (1,2,3,4,5,6,7,100,130,200,240,2000);Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 3506647781--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 12 | 252 | 4 (0)| 00:00:43 || 1 | INLIST ITERATOR | | | | | || 2 | TABLE ACCESS BY INDEX ROWID| T | 12 | 252 | 4 (0)| 00:00:43 ||* 3 | INDEX RANGE SCAN | T_IDX | 12 | | 3 (0)| 00:00:31 |--------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 3 - access("RN"=1 OR "RN"=2 OR "RN"=3 OR "RN"=4 OR "RN"=5 OR "RN"=6 OR "RN"=7 OR "RN"=100 OR "RN"=130 OR "RN"=200 OR "RN"=240 OR "RN"=2000)16 rows selected.SQL> alter session set optimizer_index_caching=10;Session altered.SQL> explain plan for select * from t where rn in (1,2,3,4,5,6,7,100,130,200,240,2000);Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 3506647781--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 12 | 252 | 3 (0)| 00:00:31 || 1 | INLIST ITERATOR | | | | | || 2 | TABLE ACCESS BY INDEX ROWID| T | 12 | 252 | 3 (0)| 00:00:31 ||* 3 | INDEX RANGE SCAN | T_IDX | 12 | | 2 (0)| 00:00:19 | --可以看到cost确实降低了--------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 3 - access("RN"=1 OR "RN"=2 OR "RN"=3 OR "RN"=4 OR "RN"=5 OR "RN"=6 OR "RN"=7 OR "RN"=100 OR "RN"=130 OR "RN"=200 OR "RN"=240 OR "RN"=2000)16 rows selected 嵌套循环连接示例: SQL> explain plan for select /*+ use_nl(a b) */ * from t a,t b where a.rn=b.rn and b.name='sss';Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 752965310--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 42 | 8 (0)| 00:01:34 || 1 | NESTED LOOPS | | | | | || 2 | NESTED LOOPS | | 1 | 42 | 8 (0)| 00:01:34 ||* 3 | TABLE ACCESS FULL | T | 1 | 21 | 6 (0)| 00:01:10 ||* 4 | INDEX RANGE SCAN | T_IDX | 1 | | 1 (0)| 00:00:12 || 5 | TABLE ACCESS BY INDEX ROWID| T | 1 | 21 | 2 (0)| 00:00:24 |--------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 3 - filter("B"."NAME"='sss') 4 - access("A"."RN"="B"."RN")18 rows selected.SQL> alter session set optimizer_index_caching=10;Session altered.SQL> explain plan for select /*+ use_nl(a b) */ * from t a,t b where a.rn=b.rn and b.name='sss';Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 752965310--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 42 | 7 (0)| 00:01:22 || 1 | NESTED LOOPS | | | | | || 2 | NESTED LOOPS | | 1 | 42 | 7 (0)| 00:01:22 | --可以看到cost确实降低了|* 3 | TABLE ACCESS FULL | T | 1 | 21 | 6 (0)| 00:01:10 ||* 4 | INDEX RANGE SCAN | T_IDX | 1 | | 0 (0)| 00:00:01 || 5 | TABLE ACCESS BY INDEX ROWID| T | 1 | 21 | 1 (0)| 00:00:12 |--------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 3 - filter("B"."NAME"='sss') 4 - access("A"."RN"="B"."RN")18 rows selected.非in-list和嵌套循环操作,调整这个参数时,不会影响oracle优化器成本的运算,如下SQL> set linesize 200 pagesize 999SQL> explain plan for select * from t where rn<200;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 470836197-------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 199 | 4179 | 3 (0)| 00:00:35 || 1 | TABLE ACCESS BY INDEX ROWID| T | 199 | 4179 | 3 (0)| 00:00:35 ||* 2 | INDEX RANGE SCAN | T_IDX | 199 | | 2 (0)| 00:00:24 |-------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access("RN"<200)14 rows selected.SQL> alter session set optimizer_index_caching=1;Session altered.SQL> explain plan for select * from t where rn<200;Explained.SQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Plan hash value: 470836197-------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 199 | 4179 | 3 (0)| 00:00:35 || 1 | TABLE ACCESS BY INDEX ROWID| T | 199 | 4179 | 3 (0)| 00:00:35 ||* 2 | INDEX RANGE SCAN | T_IDX | 199 | | 2 (0)| 00:00:24 | --可以看到cost确实没有改变-------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access("RN"<200)14 rows selected. OPTIMIZER_INDEX_COST_ADJ这个初始化参数代表一个百分比,取值范围在1到10000之间.该参数表示索引扫描和全表扫描成本的比较。缺省值100表示索引扫描成本等价转换与全表扫描成本。 这些参数对于CBO的执行具有重大影响,其缺省值对于数据库来说通常需要调整。一般来说对于OPTIMIZER_INDEX_CACHING可以设置为90左右对于大多数OLTP系统,OPTIMIZER_INDEX_COST_ADJ可以设置在10到50之间。对于数据仓库和DSS系统,可能不能简单的把OPTIMIZER_INDEX_COST_ADJ设置为50,通常我们需要反复调整取得一个合理值.更为具体的可以根据统计信息,db file scattered reads/db file sequential reads来计算. 本文通过实验对该参数的使用作出探讨和说明. 我们看到optimizer_index_cost_adj的缺省值为100. [oracle@jumper udump]$ sqlplus eygle/eygle SQL*Plus: Release 9.2.0.3.0 - Production on Mon Jun 28 17:11:15 2004 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. Connected to:Oracle9i Enterprise Edition Release 9.2.0.3.0 - ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.3.0 - Production SQL> show parameter optimizer_index_cost_adj NAME TYPE VALUE------------------------------------ ----------- ------------------------------optimizer_index_cost_adj integer 100SQL> 创建测试表: SQL> create table t as select * from dba_objects; Table created. SQL> create index ind_owner on t(owner); Index created. SQL> analyze table t compute statistics; Table analyzed. 我们分别观察一下全表扫描和索引访问的成本: SQL> set autotrace traceonlySQL> select * from t where owner='EYGLE';Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=476 Bytes=36652)1 0 TABLE ACCESS (FULL) OF 'T' (Cost=14 Card=476 Bytes=36652)SQL> select /*+ index(t ind_owner) */ * from t where owner='EYGLE';Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=16 Card=476 Bytes=36652)1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=16 Card=476 Bytes=36652)2 1 INDEX (RANGE SCAN) OF 'IND_OWNER' (NON-UNIQUE) (Cost=2 Card=476) Oracle在选择不同的访问路径时,会对全表扫描和索引扫描进行比较评估. 在比较的时候,Oracle会把索引扫描的成本转换为全表扫描的成本,和全表扫描的COST进行比较.这个转换需要一个转换因子.就是optimizer_index_cost_adj: optimizer_index_cost_adj * (Index Scan Cost) = 等价的 Full Scan Cost 这个 等价的 Full Scan Cost 就是来和全表扫描成本进行比较的. 而这个转换因子的临界值实际上就是Full Scan Cost 和 Index Scan Cost的比值. 即: optimizer_index_cost_adj = Full Scan Cost / Index Scan Cost SQL> set autotrace offSQL> select (14/16)*100 from dual; (14/16)*100-----------87.5 1 row selected. 我们通过调整optimizer_index_cost_adj来看一下执行计划的变化: SQL> set autotrace traceonly SQL> alter session set optimizer_index_cost_adj = 87; Session altered. SQL> select * from t where owner='EYGLE'; Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=476 Bytes=36652)1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=14 Card=476 Bytes=36652)2 1 INDEX (RANGE SCAN) OF 'IND_OWNER' (NON-UNIQUE) (Cost=2 Card=476) 此时使用索引成本较低.等价全表扫描成本为: 87% * (Index Scan Cost) < Full Scan Cost 此时Oracle选择了索引. SQL> alter session set optimizer_index_cost_adj = 88; Session altered. SQL> select * from t where owner='EYGLE'; Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=476 Bytes=36652)1 0 TABLE ACCESS (FULL) OF 'T' (Cost=14 Card=476 Bytes=36652) 此时使用索引成本较高.等价全表扫描成本为: 88% * (Index Scan Cost) > Full Scan Cost 所以Oracle选择了全表扫描. 参考文档: http://www.evdbt.com/SearchIntelligenceCBO.doc About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2017-11-01 09:00 ~ 2017-11-30 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
【OCP|OCM】Oracle考证系列 &
Oracle 11g 新特性 -- Online Patching (Hot Patching 热补丁)说明 一.官网说明 MOS 的文档:RDBMSOnline Patching Aka Hot Patching [ID 761111.1] 有说明。这里取部分内容。 A regular RDBMSpatch is comprised of one or more object (.o) files and/or libraries (.afiles). Installing a regular patch requires shuttingdown the RDBMS instance, re-linking the oracle binary, and restarting theinstance; uninstalling a regular patch requires the same steps. On the otherhand, an online patch is a special kind of patch that can be applied to a live,running RDBMS instance. An online patch contains a single shared library; installing an online patch does not require shutting downthe instance or relinking the oracle binary. An online patch can beinstalled/un-installed using Opatch (which uses oradebug commands toinstall/uninstall the patch). 1.1 How does Online Patching differ than traditionalpatches? --online patching 与传统patch 的区别: 1. Online patches are applied and removedfrom a running instance where traditional patches require the instances to beshutdown.2. Online patches utilize the oradebug interface toinstall and enable the patches where traditional diagnostic patches arelinked into the "oracle" binary. --online patch 使用oradebug 接口来install和 enable patches。3. Online patches do not require the "oracle" binary to be relinkedwhere traditional diagnostic patches do.4. There is additional memory consumption and processstart time penalty for online patches. --online patch 需要消耗一些额外的内存和时间。 1.2 How Does the Online PatchMechanism Work ? --online Patch 的工作机制 We firstconstruct a shared library that contains the relevant fixes and/or diagnostics.When we need to install the online patch, we use oradebug commands to tell eachoracle process to perform several steps: --首先构造一个包含相关的fix或者diagnostics的shared library,当安装online patch时,使用oradebug 命令来通知每个oracle 进程按如下步骤进行切换: 1. Map the shared library into theiraddress space.2. For each modified function in the patch, change theoriginal function in the text segment so that it performs a jump/branch to the"new" version in the shared library.3. If the patched code references static variables inthe binary, have these references resolve to the right memory location.4. If the patched code references static functions inthe binary, have these references resolve to the right memory location.Uninstalling an online patch is the undoing of step 2: weremove the jumps/branches from the text segment and restore the originalinstructions. 1.3 Required Support from the OS OnlinePatching requires two major items of support from an OS: --Online Patching 主要需要OS 2方面的支持: 1. Ability to change protections on text segment pages andmodify these pages - For example, Linux x86 32-bit and Solaris 64-bitprovide COW (copy-on-write) semantics for text pages: once a text page is modifiedby a process, that process now has a private copy of that page. Note that theimplementation currently assumes COW-like semantics: it is not designed to workon an OS which provides the ability for one process to modify a text page suchthat this change affects all other processes which are sharing the sameimage/binary. 2. Support for shared libraries or DLLs - Online patchingrequires the ability to "bundle" modified code into a shared libraryor DLL such that it can be dynamically loaded by oracle processes. Ideally, theoracle binary should also be linked in such a way that shared libraries canrefer to global functions and variables in the binary; for example, on Linux,the oracle binary is linked with the "--export-dynamic" flag. (Currently,the mkpatch utility assumes that nothing special needs to be done when apatch's shared library has references to global functions/variables in thebinary; it is assumed that the dynamic loader will handle this when the sharedlibrary is loaded.) Currently SupportedPlatforms: Online patching iscurrently supported on these platforms/systems: 01 HP-UX Itanium.............................. ( requries OS Patch HPUX 11iv3 (11.31) + [March2008 Quality Pack + PHKL_38038] )02 IBM AIX on POWER Systems (64-bit) .. ( requires AIX 6.1 + TL-02 +SP-01 onwards )03 IBM: Linux on POWER Systems04 IBM: Linux on System z05 Linux x8606 Linux x86-6407 Microsoft Windows x86 (32-bit) .......... ( requires Opatch toolversion 11.2.0.1.1 )08 Microsoft Windows x86-64 (64-bit)09 Oracle Solaris on SPARC (64-bit) ........ ( requires SunOS kernelpatch 137111-04 )10 Oracle Solaris on x86-64 (64-bit) ........ ( requires kernel patch137112-04 )11 HP-PARISC Notsupported12 Windows/Itanium Not supported 1.4 OPatch - How are Online Patches Installed? OPatch is the recommended (Oracle-supplied)tool that customers are supposed to use in order to apply or rollback patches.It maintains an inventory of patches, and ensures that two conflicting patchesare not simultaneously installed. OPatch was recently modified to supportonline patches, which means that it can apply/rollback online patches, as wellas detect conflicts between any two kinds of patches. As such, it is notnecessary for customers to execute the "oradebug patch" commands;OPatch does this. --Oracle 推荐使用OPatch来安装。 All OPatch versions after 11.1.0.6 areOnline Patch aware.The syntax to install an Online Patch is: opatch apply online-connectString <SID>:<USERNAME>:<PASSWORD>:<NODE> example: $ opatch apply online -connectStringdb11202:sys:oracle -invPtrLoc/u01/app/oracle/product/11.2.0/dbhome_1/oraInst.loc For RAC you can list allof the instances: opatch apply online -connectString<SID>:<USERNAME>:<PASSWORD>:<NODE1>,<SID2>:<USERNAME>:<PASSWORD>:<NODE2>,... The USERNAME and PASSWORD are those of a user that hasSYSDBA privileges. The USERNAME and PASSWORD can be left blank if the OSuser applying the patch has the SYSDBA privilege. Also the NODE is optional ifthe patch is being applied locally. --USERNAME 和PASSWORD 需要SYSDBA 权限,或者留空,使用OS 认证。 1.5 How to disable or remove the fix from some SIDs If you want disable or remove the fix forsome SIDs, You need to use the opatch util DisableOnlinePatch as following : opatch utilDisableOnlinePatch -connectString<SID>:<USERNAME>:<PASSWORD>:<NODE> -ph Patch location -ph 参数:Specify the valid patch directory area. This utility will disable the givenpatch in the database instances. for details, see: opatch util DisableOnlinePatch -help example: opatch util DisableOnlinePatch -connectString OP1:sys:manager: -ph/home/oracle/10188727/online(...)Invoking utility "disableonlinepatch"Disabling and removing online patch 'bug10188727.pch', on database 'OP2'OPatch succeeded. Note:the presence of "/online" at the end of "valid patch directoryarea" from the alert.log Wed Nov 09 12:47:51 2011Patch bug10188727.pch Disabled - Update #3Patch bug10188727.pch Removed - Update #4Wed Nov 09 12:47:53 2011Online patch bug10188727.pch has been disabledOnline patch bug10188727.pch has been removed from oradebug: SQL> oradebug patchlistPatch File Name State================ =========bug10188727.pch REMOVED 1.6 How do I know which patches are eligible to be appliedonline? --如何判断patch 是online patchIf the fix is online patchable there will be directory online that is created.Also the readme will contain the information regarding this, always read thereadme file when applying a patch for any new information or informationrelated to that specific patch. --如果是online patch,那么patch里会包含一个目录,叫online,并且也可以查看readme 文件。 Example: $ cd <PATCH_TOP>/10188727$ lsetc/ files/ online/ README.txt$ tree onlineonline|-- [embde 4096] etc| |-- [embde 4096] config| | |-- [embde 290] actions.xml| | |-- [embde 22] deploy.xml| | `-- [embde 1326] inventory.xml| `-- [embde 4096] xml| |-- [embde 5376] GenericActions.xml| `-- [embde 1663] ShiphomeDirectoryStructure.xml`-- [embde 4096] files`-- [embde 4096] hpatch`-- [embde 177874] bug10188727.pch The better way to check if a patch is online is to use the following command --最好的方法是使用如下命令来检查是否是online patch: $ cd <PATCH_TOP>/10188727$ opatch query -all online(...)--------------------------------------------------------------------------------Patch created on 2 Dec 2010, 01:44:15 hrs PST8PDTNeed to shutdown Oracle instances: falsePatch is roll-backable: truePatch is a "Patchset Update": falsePatch is a rolling patch: truePatch has sql related actions: falsePatch is anonline patch: truePatch is a portal patch: falsePatch is an "auto-enabled" patch: falseList of platforms supported:226: Linux x86-64List of bugs to be fixed:10188727: AFTER UPGRADING TO 11.2.0.2 SOME SQLS FAIL WITH ORA-7445[KKEIDC()+180] ERRORThis patch is a "singleton" patch.This patch belongs to the "db" product family List of executables affected:ORACLE_HOME/bin/oracleList of optional components:oracle.rdbms: 11.2.0.2.0List of optional actions:Patch the Database instances with Online Patch hpatch/bug10188727.pchPossible XML representation of the patch:<ONEOFF REF_ID="10188727" ROLLBACK="T"XML_INV_LOC="oneoffs/10188727/" ACT_INST_VER="11.2.0.2.0"INSTALL_TIME="2011.Nov.09 16:42:02 CET"><DESC></DESC><REF_LIST><REF NAME="oracle.rdbms" VER="11.2.0.2.0"HOME_IDX="0"/></REF_LIST><BUG_LIST><BUGS>10188727</BUGS></BUG_LIST><FILE_LIST/></ONEOFF>-------------------------------------------------------------------------------- 1.7 How are Online Patches rollback'ed? --如何回滚onlinePatch: Using "opatch" you can rollbackthe patch: --使用如下命令: opatch rollback -id <patchID> -connectString<SID>:<USERNAME>:<PASSWORD>:<NODE1>,<SID2>:<USERNAME>:<PASSWORD>:<NODE2>,... The USERNAME and PASSWORD are those of a user that has SYSDBA privileges. TheUSERNAME and PASSWORD can be left blank if the OS user applying the patch hasthe SYSDBA privilege. Also the NODE is optional if the patch is being appliedlocally. Using opatch does not remove the patch, it simply disables it (rolls it back)and removes the patch entry from the inventory. This behavior may change in thefuture. --使用opatch命令不会remove 这个patch,它是简单的disable online patch并从inventory中移除patch entry。 在以后的版本中可能会改变这种方式。 Example: $ opatch rollback -id10188727 -connectString db11202:sys:oracle -invPtrLoc/u01/app/oracle/product/11.2.0/dbhome_1/oraInst.locInvoking OPatch 11.2.0.1.4Oracle Interim Patch Installer version 11.2.0.1.4Copyright (c) 2010, Oracle Corporation. All rights reserved.Oracle Home :/u01/app/oracle/product/11.2.0/dbhome_1Central Inventory : /u01/app/oraInventory from :/u01/app/oracle/product/11.2.0/dbhome_1/oraInst.locOPatch version : 11.2.0.1.4OUI version : 11.2.0.2.0OUI location :/u01/app/oracle/product/11.2.0/dbhome_1/ouiLog file location :/u01/app/oracle/product/11.2.0/dbhome_1/cfgtoollogs/opatch/opatch2011-01-27_16-21-59PM.logPatch history file:/u01/app/oracle/product/11.2.0/dbhome_1/cfgtoollogs/opatch/opatch_history.txtRollbackSession rolling back interim patch '10188727' from OH'/u01/app/oracle/product/11.2.0/dbhome_1'The patch should be applied/rolled back in '-all_nodes' mode only.Converting the RAC mode to '-all_nodes' mode.Running prerequisite checks...OPatch detected non-cluster Oracle Home from the inventory and will patch thelocal system only.Backing up files affected by the patch '10188727' for restore. This might takea while...Patching component oracle.rdbms, 11.2.0.2.0...The patch will be removed from active database instances.Disabling and removing online patch 'bug10188727.pch', on database 'db11202'RollbackSession removing interim patch '10188727' from inventoryOPatch succeeded.------------------------------On the Alert.log:(...)Thu Jan 27 16:22:07 2011Patch bug10188727.pch Disabled - Update #3Patch bug10188727.pch Removed - Update #4Thu Jan 27 16:22:08 2011Online patch bug10188727.pch has been disabledOnline patch bug10188727.pch has been removed Others not recommended way are: --还有2种不推荐的方法: 1. Using "oradebug" to disablethe patch SQL> oradebugpatch disable <patch_id>.pch 2. Shutting theinstance down and removing the orapatch*.cfg file. After stopping theinstance do the following: cd $ORACLE_HOME/hpatchrm orapatch$ORACLE_SID.cfg Removing the orapatch*.cfg removes all of the online patches currentlyinstalled for the instance. Note:its recommended to rollback only when the online patch is not required for anydatabases in the same ORACLE_HOME.In case you have done a rollback the online patch can be disabled only by -phoption for the other SID's (see How to disable or remove the fix from someSIDs) 二.Online Patching 说明 说明:该部分内容摘自OCP 050 教材。 在Oracle 11g中提出了online patch(也叫hot patch)的特性;Hot patching允许我们在实例始终在线的情况下安装,启用或禁用一个修复补丁(fix)或者诊断补丁(diagnostic patches)。 使用热补丁可以安装、启用和禁用正在运行的活动Oracle 实例上的bug 修复或诊断补丁程序。使用热补丁是可在应用热补丁程序时避免停机的建议解决方案。Oracle 提供了使用opatch 命令行实用程序对任何Oracle 数据库进行热补丁的功能。如果代码的更改范围和复杂性都较小(例如,诊断补丁程序或小型bug 修复),则可提供热补丁程序。 2.1 安装热补丁程序 (1) 应用热补丁程序不需要关闭实例、重新链接Oracle二进制文件或重新启动实例。 (2) OPatch 可用于安装或卸载热补丁程序。 (3) OPatch 可以检测两个热补丁程序之间以及热补丁程序与常规补丁程序之间的冲突。 可以使用以下命令来确定某个补丁程序是否为热补丁程序: opatch query -is_online_patch <patchlocation> or opatch query <patch location> -all 注: 打过补丁的代码将作为动态/共享库提供,该库随后会被每个Oracle 进程映射至内存中。 (关于热补丁的机制可以参考1.2 节的内容。) 2.2 热补丁的优点 (1) 无停机时间,不中断业务 (2) 安装和卸载速度极快 (3) 与OPatch 集成: 检测冲突 在补丁程序清单中列出 在RAC 环境中工作 (4) 虽然不改变磁盘上的Oracle二进制文件,但热补丁程序在实例关闭和启动时都保持有效。 2.3 常规补丁和热补丁 常规补丁基本上要求关闭数据库实例。 热补丁不需要任何停机时间。在安装热补丁时,应用程序可以继续运行。 同样的,无需停机便可卸载已安装的热补丁程序。 常规补丁和热补丁的对比,如下图: 2.4 热补丁注意事项 (1)可能不是所有平台上都有热补丁程序。当前在以下平台上有热补丁程序: – Linux x86 – Linux x86-64 – Solaris SPARC64 --这个具体可以参考:1.3 小节。 (2)要消耗一些额外的内存。 – 确切的内存数取决于: — 补丁程序的大小 — 当前运行的Oracle 进程数 – 最小内存数:每个Oracle 进程大约占一个OS 页面 如:一个操作系统(OS) 页面在Linux x86 上一般为4 KB,在和Solaris SPARC64 上为8 KB。 在平均大约一千个Oracle 进程同时运行的情况下,这意味着一个小型的热补丁程序大约额外占用4 MB 内存。 (3) 在每个Oracle 进程安装或卸载热补丁程序之前,可能会有一段极短的延迟(几秒)。 (4) 并非所有bug 修复和诊断补丁程序都可用作热补丁程序。 极大部分诊断补丁程序可作为热补丁程序提供。对于bug 修复,则具体取决于其性质。并非每个bug 修复或诊断补丁程序都可用作热补丁程序。但热补丁工具的长期目标是为关键补丁程序更新提供热补丁功能。 (5) 不能在停机时间使用热补丁程序。 (6) 如果可能有停机时间,则应以常规补丁程序方式安装所有相关的bug 修复。 三. Online Patch 操作示例 测试环境是11.2.0.3: SQL> select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 -Production NLSRTL Version 11.2.0.3.0 – Production Google了一下,找了一个对应版本的onlinepatch: Oracle online patching for bug 13817131(backport for ORA-7445 near ksfqfcrx()+X during RMAN backups) http://jakub.wartak.pl/blog/?p=624 这里用online patch:13817131的相关操作为例。 3.1 解压缩: [oracle@dave u01]$ unzipp13817131_112030_Linux-x86-64.zip Archive: p13817131_112030_Linux-x86-64.zip creating: 13817131/ creating: 13817131/etc/ creating: 13817131/etc/xml/ inflating: 13817131/etc/xml/ShiphomeDirectoryStructure.xml inflating: 13817131/etc/xml/GenericActions.xml creating: 13817131/etc/config/ inflating: 13817131/etc/config/inventory.xml inflating: 13817131/etc/config/actions.xml inflating: 13817131/etc/config/deploy.xml creating: 13817131/online/ creating: 13817131/online/files/ creating: 13817131/online/files/hpatch/ inflating: 13817131/online/files/hpatch/bug13817131.pch creating: 13817131/online/etc/ creating: 13817131/online/etc/xml/ inflating: 13817131/online/etc/xml/GenericActions.xml inflating: 13817131/online/etc/xml/ShiphomeDirectoryStructure.xml creating: 13817131/online/etc/config/ inflating: 13817131/online/etc/config/actions.xml inflating: 13817131/online/etc/config/deploy.xml inflating: 13817131/online/etc/config/inventory.xml creating: 13817131/files/ creating: 13817131/files/lib/ creating: 13817131/files/lib/libserver11.a/ inflating: 13817131/files/lib/libserver11.a/ksfq.o inflating: 13817131/README.txt 3.2 查看Patch 类型 3.2.1 用树形结构看一下:如果是online patch,会有online 的目录: [oracle@dave u01]$ ls 13817131 dave dave2.trc p13817131_112030_Linux-x86-64.zip rcopy.sh rename.sh app dave1.trc nohup.out rcopy.out rcopy.sh.out [oracle@dave u01]$ tree 13817131 13817131 |-- etc | |-- config | | |-- actions.xml | | |-- deploy.xml | | `-- inventory.xml | `-- xml | |-- GenericActions.xml | `-- ShiphomeDirectoryStructure.xml |-- files | `-- lib | `-- libserver11.a | `-- ksfq.o |-- online | |-- etc | | |-- config | | | |-- actions.xml | | | |-- deploy.xml | | | `-- inventory.xml | | `-- xml | | |-- GenericActions.xml | | `--ShiphomeDirectoryStructure.xml | `-- files | `-- hpatch | `-- bug13817131.pch `-- README.txt 12 directories, 13 files 3.2.2 使用opatch 查看patch 类型: [oracle@dave u01]$ mv 13817131/u01/app/oracle/product/11.2.0/db_1/OPatch [oracle@dave u01]$ cd/u01/app/oracle/product/11.2.0/db_1/OPatch [oracle@dave OPatch]$ ls 13817131 emdpatch.pl jlib opatch opatch.ini opatchprereqs docs fmw ocm opatch.bat opatch.pl [oracle@dave OPatch]$ ./opatch query 13817131 -all Invoking OPatch 11.2.0.1.7 Oracle Home : /u01/app/oracle/product/11.2.0/db_1 Central Inventory : /u01/app/oraInventory from : /etc/oraInst.loc OPatch version : 11.2.0.1.7 OUI version : 11.2.0.3.0 Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-00-40????.log -------------------------------------------------------------------------------- Patch created on 25 Sep 2012, 08:46:37 hrsPST8PDT Needto shutdown Oracle instances: true Patch is roll-backable: true Patch is a "Patchset Update": false Patch is a rolling patch: true Patch has sql related actions: false Patch is an online patch: false Patch is a portal patch: false Patch is an "auto-enabled" patch:false Listof platforms supported: 226: Linux x86-64 Listof bugs to be fixed: 13817131: OAM ORA-7445-[KSFQFCRX()+812] [SIGSEGV] [ADDR 0X8 ] Thispatch is a "singleton" patch. Thispatch belongs to the "db" product family Listof executables affected: ORACLE_HOME/bin/oracle Listof optional components: oracle.rdbms: 11.2.0.3.0 Listof optional actions: Update /u01/app/oracle/product/11.2.0/db_1/lib/libserver11.a with/ksfq.o cd/u01/app/oracle/product/11.2.0/db_1/rdbms/lib ; make -f ins_rdbms.mk ioracleORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1 Possible XML representation of the patch: <ONEOFF REF_ID="13817131"ROLLBACK="T" XML_INV_LOC="oneoffs/13817131/"ACT_INST_VER="11.2.0.3.0" INSTALL_TIME="2012.Oct.09 19:00:40CST"> <DESC></DESC> <REF_LIST> <REF NAME="oracle.rdbms" VER="11.2.0.3.0"HOME_IDX="0"/> </REF_LIST> <BUG_LIST> <BUG>13817131</BUG> </BUG_LIST> <FILE_LIST/> </ONEOFF> -------------------------------------------------------------------------------- OPatch succeeded. 这里显示为False。 用opatch is_online_patch 查看: [oracle@dave OPatch]$ ./opatch query -is_online_patch 13817131 Invoking OPatch 11.2.0.1.7 Oracle Home : /u01/app/oracle/product/11.2.0/db_1 Central Inventory : /u01/app/oraInventory from : /etc/oraInst.loc OPatch version : 11.2.0.1.7 OUI version : 11.2.0.3.0 Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-02-47????.log -------------------------------------------------------------------------------- Patch is an online patch: false OPatch succeeded. 这里显示的还是为False,但实际上,我们的Patch 确实是online 的patch。 3.3 应用Patch并确认Online Patch 对内存的消耗: 安装online patch需要额外的消耗一些内存资源,所以这里我们验证一下: --查看pmon 进程的内存消耗: [oracle@dave 13817131]$ ps -ef|grep pmon|grep-v grep oracle 2118 1 0 15:15 ? 00:00:13 ora_pmon_dave [oracle@dave 13817131]$ pmap -d 2118 |tail -20 00007fb4ef13a000 1020 ----- 0000000000289000 008:00003libnnz11.so 00007fb4ef239000 264 rwx-- 0000000000288000 008:00003libnnz11.so 00007fb4ef27b000 12 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef28d000 4 rwxs- 0000000000000000 008:00003hc_dave.dat 00007fb4ef28e000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef290000 864 r-x-- 0000000000000000 008:00003libskgxp11.so 00007fb4ef368000 1024 ----- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef468000 8 rwx-- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef46a000 392r-x-- 0000000000000000 008:00003 libcell11.so 00007fb4ef4cc000 1024 ----- 0000000000062000 008:00003libcell11.so 00007fb4ef5cc000 40 rwx-- 0000000000062000 008:00003libcell11.so 00007fb4ef5d6000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef5d8000 4 r-x-- 0000000000000000 008:00003libodmd11.so 00007fb4ef5d9000 1024 ----- 0000000000001000 008:00003libodmd11.so 00007fb4ef6d9000 4 rwx-- 0000000000001000 008:00003libodmd11.so 00007fb4ef6da000 4 rwx-- 0000000000000000 000:00000 [ anon ] 00007ffff0261000 132 rwx-- 0000000000000000 000:00000 [ stack ] 00007ffff03f6000 4 r-x-- 0000000000000000 000:00000 [ anon ] ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ] mapped: 958080K writeable/private: 8056K shared: 720900K --安装Patch: oracle@dave 13817131]$ opatch apply online -connectString dave:sys:oracle Invoking OPatch 11.2.0.1.7 Oracle 中间补丁程序安装程序版本11.2.0.1.7 版权所有 (c) 2011, Oracle Corporation。保留所有权利。 Oracle Home : /u01/app/oracle/product/11.2.0/db_1 Central Inventory : /u01/app/oraInventory from : /etc/oraInst.loc OPatch version : 11.2.0.1.7 OUI version : 11.2.0.3.0 Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-10-51下午.log 补丁程序只应在 '-all_nodes' 模式下应用/回退。 将 RAC 模式转换为'-all_nodes' 模式。 Applying interim patch '13817131' to OH'/u01/app/oracle/product/11.2.0/db_1' Verifying environment and performingprerequisite checks... 是否继续? [y|n] y User Responded with: Y All checks passed. Backing up files... 正在为组件 oracle.rdbms, 11.2.0.3.0 打补丁... The patch will be installed on activedatabase instances. 正在数据库 'dave' 上安装和启用联机补丁程序 'bug13817131.pch'。 Patch 13817131 successfully applied Log file location:/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-10-51下午.log OPatch succeeded. --查看alert log: Tue Oct 09 19:11:05 2012 Patch file bug13817131.pch is out of syncwith oracle binary; performing fixup Patch file bug13817131.pch has been syncedwith oracle binary Patch bug13817131.pchInstalled - Update #1 Patch bug13817131.pchEnabled - Update #2 Tue Oct 09 19:11:07 2012 Online patch bug13817131.pch has beeninstalled Online patch bug13817131.pch has beenenabled --再次查看pmon 进程的内存: [oracle@dave trace]$ ps -ef|grep pmon|grep-v grep oracle 2118 1 0 15:15 ? 00:00:14 ora_pmon_dave [oracle@dave trace]$ pmap -d 2118|tail -20 00007fb4ef239000 264 rwx-- 0000000000288000 008:00003libnnz11.so 00007fb4ef27b000 12 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef28c000 4 r-x-- 000000000c955000 008:00003oracle 00007fb4ef28d000 4 rwxs- 0000000000000000 008:00003hc_dave.dat 00007fb4ef28e000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef290000 864 r-x-- 0000000000000000 008:00003libskgxp11.so 00007fb4ef368000 1024 ----- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef468000 8 rwx-- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef46a000 392r-x-- 0000000000000000 008:00003 libcell11.so 00007fb4ef4cc000 1024 ----- 0000000000062000 008:00003libcell11.so 00007fb4ef5cc000 40 rwx-- 0000000000062000 008:00003libcell11.so 00007fb4ef5d6000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef5d8000 4 r-x-- 0000000000000000 008:00003libodmd11.so 00007fb4ef5d9000 1024 ----- 0000000000001000 008:00003libodmd11.so 00007fb4ef6d9000 4 rwx-- 0000000000001000 008:00003libodmd11.so 00007fb4ef6da000 4 rwx-- 0000000000000000 000:00000 [ anon ] 00007ffff0261000 132 rwx-- 0000000000000000 000:00000 [ stack ] 00007ffff03f6000 4 r-x-- 0000000000000000 000:00000 [ anon ] ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ] mapped: 964344K writeable/private: 8068K shared: 720900K --安装Patch 之前是: mapped: 958080K writeable/private: 8056K shared: 720900K。 private 内存增加了 8k。 --并且安装之后,从pmon 进程的内存中,可以看到多出如下3个库文件: [oracle@davetrace]$ pmap -d 2118|grep 13817131 00007fb4ecf66000 168 r-x-- 0000000000000000 008:00003bug13817131.so 00007fb4ecf90000 1020 ----- 000000000002a000 008:00003bug13817131.so 00007fb4ed08f000 12 rwx-- 0000000000029000 008:00003bug13817131.so 3.4 使用oradebug 来禁用patch 在1.7 小节提到了2种Oracle 不推荐的,使用oradebug 来禁用online patch的方法。 我们这里测试一下。 (1)使用Oradebug SQL> oradebug patch list Patch File Name State ================ ========= bug13817131.pch ENABLED SQL> oradebugpatch disable bug13817131.pch Statement processed. SQL> oradebug patch list Patch File Name State ================ ========= bug13817131.pch DISABLED 注意,这种方法不会释放安装onlinepatch 时消耗的额外内存。 [oracle@dave trace]$ pmap -d 2118|tail-20 00007fb4ef239000 264 rwx-- 0000000000288000 008:00003libnnz11.so 00007fb4ef27b000 12 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef28c000 4 r-x-- 000000000c955000 008:00003oracle 00007fb4ef28d000 4 rwxs- 0000000000000000 008:00003hc_dave.dat 00007fb4ef28e000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef290000 864 r-x-- 0000000000000000 008:00003libskgxp11.so 00007fb4ef368000 1024 ----- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef468000 8 rwx-- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef46a000 392 r-x-- 0000000000000000 008:00003libcell11.so 00007fb4ef4cc000 1024 ----- 0000000000062000 008:00003libcell11.so 00007fb4ef5cc000 40 rwx-- 0000000000062000 008:00003libcell11.so 00007fb4ef5d6000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef5d8000 4 r-x-- 0000000000000000 008:00003libodmd11.so 00007fb4ef5d9000 1024 ----- 0000000000001000 008:00003libodmd11.so 00007fb4ef6d9000 4 rwx-- 0000000000001000 008:00003libodmd11.so 00007fb4ef6da000 4 rwx-- 0000000000000000 000:00000 [ anon ] 00007ffff0261000 132 rwx-- 0000000000000000 000:00000 [ stack ] 00007ffff03f6000 4 r-x-- 0000000000000000 000:00000 [ anon ] ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ] mapped: 964344K writeable/private: 8068K shared: 720900K --使用oradebug enable patch: SQL> oradebug patch enablebug13817131.pch Statement processed. SQL> oradebug patch list Patch File Name State ================ ========= bug13817131.pch ENABLED (2)关闭实例并移除配置文件 Shutting the instancedown and removing the orapatch*.cfg file. Afterstopping the instance do the following: cd $ORACLE_HOME/hpatchrm orapatch$ORACLE_SID.cfg --这里强调是关闭实例在操作,否则可能会出现其他意外情况。 Removing the orapatch*.cfg removes all of the online patches currentlyinstalled for the instance. --该方法会移除所有online patch: [oracle@dave db_1]$ cd hpatch/ [oracle@dave hpatch]$ pwd /u01/app/oracle/product/11.2.0/db_1/hpatch [oracle@dave hpatch]$ ls bug13817131.pch bug13817131.pchdave.fixup bug13817131.so orapatchdave.cfg 3.5 rollback patch 语法参考1.7 小节。 [oracle@dave db_1]$ opatch rollback -id 13817131 -connectString dave:sys:oracle Invoking OPatch 11.2.0.1.7 Oracle 中间补丁程序安装程序版本11.2.0.1.7 版权所有 (c) 2011, Oracle Corporation。保留所有权利。 Oracle Home : /u01/app/oracle/product/11.2.0/db_1 Central Inventory : /u01/app/oraInventory from : /etc/oraInst.loc OPatch version : 11.2.0.1.7 OUI version : 11.2.0.3.0 Log file location :/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-32-31下午.log RollbackSession 从OH '/u01/app/oracle/product/11.2.0/db_1' 回退中间补丁程序'13817131' 补丁程序只应在 '-all_nodes' 模式下应用/回退。 将 RAC 模式转换为'-all_nodes' 模式。 正在为组件 oracle.rdbms, 11.2.0.3.0 打补丁... The patch will be removed from activedatabase instances. 正在数据库 'dave' 上禁用和删除联机补丁程序 'bug13817131.pch' RollbackSession 从产品清单中删除中间补丁程序 '13817131' Log file location:/u01/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2012-10-09_19-32-31下午.log OPatch succeeded. --alert log信息: Tue Oct 09 19:32:41 2012 Patch bug13817131.pch Disabled - Update #5 Patch bug13817131.pch Removed - Update #6 Tue Oct 09 19:32:44 2012 Online patchbug13817131.pch has been disabled Online patchbug13817131.pch has been removed --查看PMON进程对内存的消耗: [oracle@dave trace]$ pmap -d 2118|tail-20 00007fb4ef239000 264 rwx-- 0000000000288000 008:00003libnnz11.so 00007fb4ef27b000 12 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef28c000 4 r-x-- 000000000c955000 008:00003oracle 00007fb4ef28d000 4rwxs- 0000000000000000 008:00003 hc_dave.dat 00007fb4ef28e000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef290000 864 r-x-- 0000000000000000 008:00003libskgxp11.so 00007fb4ef368000 1024 ----- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef468000 8 rwx-- 00000000000d8000 008:00003libskgxp11.so 00007fb4ef46a000 392 r-x-- 0000000000000000 008:00003libcell11.so 00007fb4ef4cc000 1024 ----- 0000000000062000 008:00003libcell11.so 00007fb4ef5cc000 40 rwx-- 0000000000062000 008:00003libcell11.so 00007fb4ef5d6000 8 rwx-- 0000000000000000 000:00000 [ anon ] 00007fb4ef5d8000 4 r-x-- 0000000000000000 008:00003libodmd11.so 00007fb4ef5d9000 1024 ----- 0000000000001000 008:00003libodmd11.so 00007fb4ef6d9000 4 rwx-- 0000000000001000 008:00003libodmd11.so 00007fb4ef6da000 4 rwx-- 0000000000000000 000:00000 [ anon ] 00007ffff0261000 132 rwx-- 0000000000000000 000:00000 [ stack ] 00007ffff03f6000 4 r-x-- 0000000000000000 000:00000 [ anon ] ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ] mapped: 964344K writeable/private: 8068K shared: 720900K 这里我们使用oradebugdisable 和opatch rollback 都不会释放安装online patch 消耗的额外内存。当然重启实例之后,这些内存自会释放。 About Me ............................................................................................................................................. ● 本文转载自:http://blog.csdn.net/tianlesoftware/article/details/8214412 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2017-11-01 09:00 ~ 2017-11-30 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
Listings of System and Object Privileges--系统和对象权限列表 https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9013.htm#i2077938 Listings of System and Object Privileges &
truncate后恢复包---FY_Recover_Data.pck 包的内容 > > < < < < < < < < < < < > > < > > > < < > > < > > > > > < < <> < < < < < << << << << << < > > > << > < < < < > < &
DBA,SYSDBA,SYSOPER三者的区别 真题1、下面哪个选项不是Oracle的用户() A、SYSDBA B、SYSTEM C、SCOTT D、SYS 答案:A。 SYSDBA和SYSOPER属于特殊系统权限(system privilege),也称为管理权限(administrative privilege),拥有例如数据库开启、关闭等一些系统管理级别的权限。SYSDBA拥有最高的系统权限,SYS用户必须以SYSDBA或SYSOPER的权限来登录,而任何用户以SYSOPER身份登陆后用户是PUBLIC。 [oracle@edsir4p1-PROD1 ~]$ sqlplus sys/oracle SQL*Plus: Release 11.2.0.1.0 Production on Wed Nov 29 02:40:40 2017 Copyright (c) 1982, 2009, Oracle. All rights reserved. ERROR: ORA-28009: connection as SYS should be as SYSDBA or SYSOPER [oracle@orcltest ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Tue Dec 6 14:39:19 2016 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SYS@lhrdb> show user USER is "SYS" SYS@lhrdb> grant sysoper to lhr; Grant succeeded. SYS@lhrdb> conn lhr/lhr as sysoper Connected. PUBLIC@lhrdb> show user USER is "PUBLIC" PUBLIC@lhrdb> conn lhr/lhr Connected. LHR@lhrdb> show user USER is "LHR" 如何查找拥有SYSDBA或是SYSOPER权限的用户呢?可以使用视图V$PWFILE_USERS,结果集中的SYSDBA和SYSOPER分别代表是否含有SYSDBA和SYSOPER权限,如下所示: SYS@PROD1> DESC V$PWFILE_USERS Name Null? Type ----------------------------------------- -------- ---------------------------- USERNAME VARCHAR2(30) SYSDBA VARCHAR2(5) SYSOPER VARCHAR2(5) SYSASM VARCHAR2(5) SYS@PROD1> SELECT * FROM V$PWFILE_USERS ; USERNAME SYSDB SYSOP SYSAS ------------------------------ ----- ----- ----- SYS TRUE TRUE FALSE SYS@PROD1> SELECT * FROM SYSTEM_PRIVILEGE_MAP WHERE NAME LIKE '%SYS%'; PRIVILEGE NAME PROPERTY ---------- ---------------------------------------- ---------- -3 ALTER SYSTEM 0 -4 AUDIT SYSTEM 0 -83 SYSDBA 0 -84 SYSOPER 0 SYSDBA和SYSOPER具体的权限如下表所示: 系统权限 SYSDBA SYSOPER 区别 STARTUP(启动数据库) STARTUP SHUTDOWN(关闭数据库) SHUTDOWN ALTER DATABASE OPEN/MOUNT/BACKUP ALTER DATABASE OPEN/MOUNT/BACKUP 改变字符集 NONE CREATE DATABASE(创建数据库) NONE不能创建数据库 DROP DATABASE(删除数据库) NONE CREATE SPFILE CREATE SPFILE ALTER DATABASE ARCHIVELOG(归档日志) ALTER DATABASE ARCHIVELOG ALTER DATABASE RECOVER(恢复数据库) 只能完全恢复,不能执行不完全恢复 拥有RESTRICTED SESSION(会话限制)权限 拥有RESTRICTED SESSION权限 可以让用户作为SYS用户连接 可以进行一些基本的操作,但不能查看用户数据 登录之后用户是SYS 登录之后用户是PUBLIC 本题中,对于选项A,SYSDBA属于系统特殊权限,不属于用户,选项A的描述错误。所以,选项A正确。 对于选项B,SYSTEM是系统默认用户,拥有DBA角色。所以,选项B错误。 对于选项C,SCOTT用户属于测试用户。所以,选项C错误。 对于选项D,SYS用户具有管理系统的最高权限,必须以SYSDBA或SYSOPER来登录。所以,选项D错误。 所以,本题的答案为A。 什么是DBA?什么是SYSDBA,什么又是SYSOPER?三者究竟有何联系呢? 在Oracle数据库领域里,很多Oracle初学者(Me 2)很容易被这三个术语迷惑,就其原因还是基础概念没有弄清楚。记得自己刚开始接触Oracle的时候,也是云里雾里,现在基本弄明白,故写出来和大家分享: DBA:在Oracle数据库里面其实只是一个角色(role)。那么什么是角色呢?可以简单的认为一个角色就是某些个权限的集合体,也就是说把多个系统权限(system privilege),对象权限(object privilege)以及角色(role)揉和在一起,然后赋给一个角色。说白了,Oracle引入角色的概念,其实是为了避免相关的系统权限和对象权限的赋予和回收的复杂性。把一堆系统权限和对象权限以及角色打包之后赋给某个新角色,然后再对这个新角色进行必要的操作就显得相当便捷和方便了。当然,在Oracle里面一个角色是可以赋给另外一个角色的,但是角色的赋给是不能够构成循环回路的。eg:先把role1给role2,然后把role2给role3,那么你就不可以再把role3给role1了。这是Oracle不允许的,其实你也不可以成功执行这样的包含回路角色的授权的! 只有数据库打开了,或者说整个数据库完全启动后,dba角色才有了存在的基础 SYSDBA:拥有最高的系统权限,sysdba,是管理oracle实例的,它的存在不依赖于整个数据库完全启动,只要实例启动了,他就已经存在,以sysdba身份登陆,装载数据库、打开数据库 SQL>conn / as sysdba;这时候,其实我们是以SYSDBA这个身份去登陆数据库的,我们当前的default schema是SYS。 以SYSDBA登陆Oracle数据库时,上述几种操作是允许执行的。SYSDBA可以访问V$对象视图 SYSOPER:也是一种系统权限,只不过跟SYSOPER略有区别而已。SQL>conn /as sysoper 这种连接下,我们的default schema是PUBLIC. 简单区别如下: SQL> conn sys/oracle as sysdba; Connected to an idle instance. SQL> show user; USER is “SYS” SQL> conn sys/oracle as sysoper; Connected to an idle instance. SQL> show user; USER is “PUBLIC” sys SQL> Note:The SYSDBA and SYSOPER system privileges allow access to a database instance even when the database is not open. Control of these privileges is totally outside of the database itself. SYSOPER不能访问V$对象视图 sysdba和sysoper具体的权限可以看下表: 系统权限 sysdba sysoper 区别 Startup(启动数据库) startup Shutdown(关闭数据库) shutdown alter database open/mount/backup alter database open/mount/backup 改变字符集 none create database(创建数据库) None不能创建数据库 drop database(删除数据库) none create spfile create spfile alter database archivelog(归档日志) alter database archivelog alter database recover(恢复数据库) 只能完全恢复,不能执行不完全恢复 拥有restricted session(会话限制)权限 拥有restricted session权限 可以让用户作为sys用户连接 可以进行一些基本的操作,但不能查看用户数据 登录之后用户是sys 登录之后用户是public SYSDBA和SYSOPER系统权限允许我们在数据库打开之前以这两种身份去访问实例。SYSOPER没有权限访问V$对象视图 当然,DBA还可以理解成另外两个术语的简写;Database Administrator,Data Block Address。 一句话总结三者之间的关系: Note: The DBA role does not include the SYSDBA or SYSOPER system privileges. These are special administrative privileges that allow an administrator to perform basic database administration tasks, such as creating the database and instance startup and shutdown. DBA 角色并未包含SYSDBA,SYSOPER这两个系统权限。他们是一类特殊的系统管理权限,允许管理员以这两种身份对数据库进行特殊的管理工作。 还有就是,不要轻易将SYSDBA,SYSOPER这两种系统权限授权给数据库的普通用户。也不要轻易将DBA角色赋给普通用户。在对数据库进行普通操作的时候,也不要以SYSDBA,SYSOPER登录 About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2017-11-01 09:00 ~ 2017-11-30 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
STS导入或导出错误处理 环境模拟: create directory d1 as '/home/oracle/scripts'; grant read,write on directory d1 to public; create user apps identified by Apps1234; grant dba ,ADMINISTER ANY SQL TUNING SET to apps; conn apps/Apps1234 create table apps.ta_lhr as select * from dba_objects; create table apps.tb_lhr as select * from dba_objects; select * from apps.ta_lhr where object_id=100; select * from apps.tb_lhr where object_name='TA_LHR'; 使用EM创建system用户的PS_STS的调优集,然后导出使用system进行导出,否则报错: Tue Nov 28 09:43:53 2017 Errors in file /u01/app/oracle/diag/rdbms/prod1/PROD1/trace/PROD1_j001_10289.trc: ORA-12012: error on auto execute of job 78165 ORA-19381: cannot create staging table in SYS schema ORA-06512: at "SYS.DBMS_SQLTUNE", line 3170 ORA-06512: at "SYS.DBMS_SQLTUNE", line 6397 ORA-06512: at line 1 MOS解释: Error ORA-19381 When DBMS_SQLTUNE.UNPACK_STGTAB_SQLPROF IS EXECUTED as SYS (文档 ID 2131916.1) This is expected behavior. STS staging tables cannot be created in SYS schema by design. Any other user (with the right privileges) should be able to create the staging table and pack STS in it. 导入如果报错: Errors in file /u01/app/oracle/diag/rdbms/prod1/PROD1/trace/PROD1_j000_20653.trc: ORA-12012: error on auto execute of job 78166 ORA-19377: no "SQL Tuning Set" with name like "%" exists for owner like "SYS" ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.DBMS_SQLTUNE", line 6868 ORA-06512: at line 1 Errors in file /u01/app/oracle/diag/rdbms/prod1/PROD1/trace/PROD1_j000_9955.trc: ORA-12012: error on auto execute of job 78689 ORA-00942: table or view does not exist ORA-06512: at line 1 解决: 使用SYSTEM进行导入,或执行以下SQL后再导入: impdp system/oracle directory=d1 dumpfile=appsstg.dmp exec dbms_sqltune.remap_stgtab_sqlset(old_sqlset_name =>'STS_PS',old_sqlset_owner => 'SYSTEM', new_sqlset_name => 'STS_PS',new_sqlset_owner => 'SYS', staging_table_name => 'STS_PS_STGTAB',staging_schema_owner => 'SYSTEM'); ----删除STS,staging table为STS_PS_STGTAB SELECT * FROM Dba_Objects d WHERE d.object_name='STS_PS_STGTAB'; SELECT * FROM Dba_Sqlset; SELECT * FROM dba_sqlset_statements WHERE sqlset_name = 'STS_PS'; DELETE FROM WRI$_SQLSET_DEFINITIONS; DELETE FROM WRI$_SQLSET_STATEMENTS; DELETE FROM WRI$_SQLSET_MASK; DELETE FROM WRI$_SQLSET_STATISTICS; COMMIT; SELECT * FROM WRI$_SQLSET_STATEMENTS; SELECT * FROM WRI$_SQLSET_MASK; SELECT * FROM WRI$_SQLSET_STATISTICS; SELECT * FROM WRI$_SQLSET_STATEMENTS; How to Move a SQL Tuning Set from One Database to Another (文档 ID 751068.1) In this Document Goal Solution Actions to Perform the Transfer: Preliminary Setup: Actions to Perform the Transfer: Detail Create/load STS test_set owned by SYS Create stgtab sqlset_tab table in TEST schema: Pack test_set into the stgtab Transfer the table containing the SQL SET (SQLSET_TAB) table to the TEST system Export/import into test system, connect as scott Attempt to unpack an STS named 'testtarget_test_set' MAPPING UNPACK THE SQLSET_TAB TABLE IN THE TEST SYSTEM References APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.1 and laterInformation in this document applies to any platform.***Checked for relevance on 26-MAR-2013*** GOAL This document explains how to transfer the SQL Tuning Set (STS) from one database to another and demonstrates some issues regarding the transfer of STS and their resolution. SOLUTION Actions to Perform the Transfer: Create/load STS test_set owned by SYS Create stgtab SQLSET_TAB Pack test_set into the stgtab Export/import into test system, conn as scott Attempt to unpack an STS named 'testtarget_test_set' Preliminary Setup: Create User, Create and Populate the table and collect statistics > < > >< > > >> <>> >> > > > > > > > > > > > > > > >> >> > >>>>>> > > > > > >>>> >> &
Oracle之函数索引 在Oracle中,有一类特殊的索引,称为函数索引(Function-Based Indexes,FBI),它基于对表中列进行计算后的结果创建索引。函数索引在不修改应用程序的逻辑基础上提高了查询性能。如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引。当在查询中包含该函数时,数据库才会使用该函数索引。函数索引可以是一个B-Tree索引或位图索引。 用于生成索引的函数可以是算术表达式,也可以是一个包含SQL函数、用户定义PL/SQL函数、包函数,或C调用的表达式。当数据库处理INSERT和UPDATE语句时,它仍然必须计算函数才能完成对语句的处理。 对于函数索引的索引列的函数查询可以通过视图DBA_IND_EXPRESSIONS来实现,通过如下的SQL语句可以查询所有的函数索引: SELECT * FROM DBA_INDEXES D WHERE D.INDEX_TYPE LIKE 'FUNCTION-BASED%'; 函数索引必须遵守下面的规则: ① 必须使用基于成本的优化器,而且创建后必须对索引进行分析。 ② 如果被函数索引所引用的用户自定义PL/SQL函数失效了或该函数索引的属主没有了在函数索引里面使用的函数的执行权限,那么对这张表上的执行的所有的操作(例如SELECT查询、DML等)也将失败(会报错:ORA-06575: Package or function F_R1_LHR is in an invalid state或ORA-00904: : invalid identifier)。这时,可以重新修改自定义函数并在编译无报错通过后,该表上所有的DML和查询操作将恢复正常。 ③ 创建函数索引的函数必须是确定性的。即,对于指定的输入,总是会返回确定的结果。 ④ 在创建索引的函数里面不能使用SUM、COUNT等聚合函数。 ⑤ 不能在LOB类型的列、NESTED TABLE列上创建函数索引。 ⑥ 不能使用SYSDATE、USER等非确定性函数。 ⑦ 对于任何用户自定义函数必须显式的声明DETERMINISTIC关键字,否则会报错:“ora-30553: the function is not deterministic”。 需要注意的是,使用函数索引有几个先决条件: (1)必须拥有CREATE INDEX和QUERY REWRITE(本模式下)或CREATE ANY INDEX和GLOBAL QUERY REWRITE(其它模式下)权限。其赋权语句分别为“GRANT QUERY REWRITE TO LHR;”和“GRANT GLOBAL QUERY REWRITE TO LHR;”。 (2)必须使用基于成本的优化器,基于规则的优化器将被忽略。 (3)参数QUERY_REWRITE_INTEGRITY和QUERY_REWRITE_ENABLED可以保持默认值。 QUERY_REWRITE_INTEGRITY = ENFORCED QUERY_REWRITE_ENABLED = TRUE(从Oracle 10g开始默认为TRUE) 这里举一个基于函数的索引的例子。 首先为函数索引的建立及数据做准备: SYS@lhrdb> CREATE TABLE TESTFINDEX_LHR(ID NUMBER,SCHR VARCHAR2(10)); Table created. SYS@lhrdb> CREATE INDEX IND_FUN ON TESTFINDEX_LHR(UPPER(SCHR)); Index created. SYS@lhrdb> INSERT INTO TESTFINDEX_LHR VALUES(1,'a'); 1 row created. SYS@lhrdb> COMMIT; Commit complete. 因为强制使用基于规则的优化器,所以,不会使用函数索引: SYS@lhrdb> SELECT /*+ RULE*/ * FROM TESTFINDEX_LHR WHERE UPPER(SCHR)='A'; ID SCHR ---------- ---------- 1 a Execution Plan ---------------------------------------------------------- Plan hash value: 940247041 -------------------------------------------- | Id | Operation | Name | -------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | TABLE ACCESS FULL| TESTFINDEX_LHR | -------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(UPPER("SCHR")='A') Note ----- - rule based optimizer used (consider using cbo) 这里优化器选择了全表扫描,若在不使用基于规则的优化器的情况下,则该查询会选择函数索引IND_FUN: SYS@lhrdb> SELECT * FROM TESTFINDEX_LHR WHERE UPPER(SCHR)='A'; ID SCHR ---------- ---------- 1 a Execution Plan ---------------------------------------------------------- Plan hash value: 967513602 ---------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 27 | 1 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TESTFINDEX_LHR | 1 | 27 | 1 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IND_FUN | 1 | | 1 (0)| 00:00:01 | ---------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access(UPPER("SCHR")='A') Note ----- - dynamic sampling used for this statement (level=2) SYS@lhrdb> SELECT D.TABLE_NAME,D.COLUMN_EXPRESSION FROM DBA_IND_EXPRESSIONS D WHERE D.INDEX_NAME='IND_FUN'; TABLE_NAME COLUMN_EXPRESSION ------------------------------ ---------------------- TESTFINDEX_LHR UPPER("SCHR") 可见,例子中使用了IND_FUN函数索引,且函数可以通过视图DBA_IND_EXPRESSIONS来查询。 原文地址:说说函数索引 作者:realkid4 我们进行数据库检索优化的方法,通常是对特定条件列加索引,减少由于全表扫描带来的逻辑物理IO消耗。索引的种类很多,我们经常使用的B*树索引,由于结构简单、适应性强,可以应对大多数数据访问优化需求。除B*树索引外,其他一些索引类型,也在一些场合中扮演着独特的地位。本篇来介绍其中的函数索引。 1、从B*树索引的失效谈起 和通常一样,我们准备实验环境。 SQL> select * from v$version where rownum<2; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production SQL> create table t as select * from dba_objects; Table created //构建两个索引用作实验对象 SQL> create index idx_t_owner on t(owner); Index created SQL> create index idx_t_ddlt on t(last_ddl_time); Index created SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true); PL/SQL procedure successfully completed 环境中,我们在数据表T上建立了一般意义的索引。当我们进行检索的时候,CBO会适时选择合适的索引执行计划。 SQL> explain plan for select * from t where owner='SCOTT'; Explained SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 1516787156 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2419 | 229K| 71 (0)| | 1 | TABLE ACCESS BY INDEX ROWID| T | 2419 | 229K| 71 (0)| |* 2 | INDEX RANGE SCAN | IDX_T_OWNER | 2419 | | 6 (0)| -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OWNER"='SCOTT') 14 rows selected 但是,很多时候,我们可能会遇到在where条件里对索引列进行函数处理的情况。比如,选择owner列取值第二个字母是“c”的数据列,或者选取在特定天进行ddl操作的对象信息。这样的情况下,直接的想法就是在where条件列中加入列函数处理,但是这样做,会带来B*树索引的失效问题。 SQL> explain plan for select * from t where substr(owner,2,1)='C'; Explained SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 1601196873 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 726 | 70422 | 283 (1)| 00:00:04 | |* 1 | TABLE ACCESS FULL| T | 726 | 70422 | 283 (1)| 00:00:04 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(SUBSTR("OWNER",2,1)='C') 13 rows selected 在对条件列owner进行substr操作之后,生成的执行计划就不会带有索引路径,出现全表扫描。如果列上的B*树普通索引就是为该查询对应的用例服务的,那么这个索引的存在就失去了意义。 那么,这种时候应该如何处理呢?答案是:在SQL语句本身不存在重构优化的空间时(此种情况通常出现在系统的运维阶段),可以考虑使用函数索引来解决问题。 2、函数索引 函数索引与通常B*树索引的结构,存在很大相似性。区别就在于形成树结构的叶子节点上,保存的不是索引列的取值,而是经过特定的函数处理过的索引列值。 这样的结构,进行搜索的时候,就可以直接使用到函数索引的叶子节点,获取到对应的rowid集合。要求是出现于构建函数索引完全相同的函数条件。 首先,我们来构建函数索引。 SQL> create index idx_t_ownerf on t(substr(owner,2,1)); Index created SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true); PL/SQL procedure successfully completed 构建函数索引的语法和一般索引的语法没有过多的区别,最大的差异就是在声明索引列的位置上,写清楚应用的函数语句。此时,数据字典视图系列中,已经反映出函数索引的不同。 SQL> select index_type from dba_indexes where index_name='IDX_T_OWNERF'; INDEX_TYPE --------------------------- FUNCTION-BASED NORMAL 此时,我们再进行查询,执行计划会发生变化。 SQL> explain plan for select * from t where substr(owner,2,1)='C'; Explained SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 2485331276 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU) -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4839 | 467K| 135 (0) | 1 | TABLE ACCESS BY INDEX ROWID| T | 4839 | 467K| 135 (0) |* 2 | INDEX RANGE SCAN | IDX_T_OWNERF | 4839 | | 9 (0) -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access(SUBSTR("OWNER",2,1)='C') 14 rows selected 加入函数索引之后,我们可以发现同样的SQL语句,执行计划发生变化。函数索引开始起效。 那么,函数索引的本质是什么呢?我们检查数据字典视图,就可以发现函数索引的本质。 SQL> col table_name for a20; SQL> col table_owner for a20; SQL> col column_name for a30; SQL> select table_owner, table_name, column_name from dba_ind_columns where index_name='IDX_T_OWNERF'; TABLE_OWNER TABLE_NAME COLUMN_NAME -------------------- -------------------- ------------------------------ SYS T SYS_NC00016$ SQL> select column_expression from dba_ind_expressions where index_name = 'IDX_T_OWNERF'; COLUMN_EXPRESSION ------------------------------------- SUBSTR("OWNER",2,1) SQL> select column_name,data_type,data_default from dba_tab_cols where wner='SYS' and table_name='T' and column_name='SYS_NC00016$'; COLUMN_NAME DATA_TYPE DATA_DEFAULT -------------------- ------- SYS_NC00016$ VARCHAR2 SUBSTR("OWNER",2,1) 检查了三个视图的情况,我们可以清楚的看出Oracle函数索引的本质。Oracle建立函数索引之后,就会先建立出一个不可见的内部列(SYS_NC00016$)。之后,对这个列建立普通的B*树索引。为了保证该列在不受影响的情况下进行数据生成,使用默认值技术,在数据插入或者变化的时候,进行同步。 3、函数索引使用 函数索引是一种很特殊的索引类型,可以应对开发阶段出现的对数据列加函数处理SQL优化。但是,笔者以为,函数索引的使用还是应当注意一些细节的,在大部分场合下,函数索引可以作为一种应急或者是不得为之的策略。 首先,函数索引的综合消耗要大于普通的B*树索引。相对于传统索引,函数索引要保证创造的函数列数据一致性和多次进行函数计算。这样的消耗要远大于普通B*树索引; 其次,函数索引的适应范围较小。函数索引其效果的最大要素就是函数的使用和定义是100%相同。如第二部分的例子中,取字符串的第二位字串。如果有一个变更的需求,要求取第三位,这样原来的那个函数索引就不能发挥效应了。而相对来说,普通的B*树索引参与各种SQL的能力要很多。应该说,函数索引的针对性很强,如果这个需求不属于关键需求,这样性价比略差。 最后,函数索引通常是一种事后补救措施。笔者认为,一个良好设计的应用,一个划分合理的数据库逻辑结构,应该是可以避免函数操作数据列的SQL大量出现的。只有在系统上线之后,开发团队开发的问题暴露出来,但是也没有精力进行修改时,运维人员才开始使用函数索引,保证系统功能能够实现。 对开发人员和开发DBA而言,函数索引通常是不得已为之的方案,要保证在SQL和数据表结构权衡无效的情况下,再考虑使用函数索引。 首先,考虑SQL结构的优化。这个方法可以消灭掉很多看似不得不使用函数索引的场合。如字符串类型比较、日期匹配等等,都可以通过代码检查和SQL改写来避免进入函数索引的状况。下面一个例子: //获取前一天进行ddl操作的对象列表 SQL> select count(*) from t where trunc(last_ddl_time)=trunc(sysdate)-1; COUNT(*) ---------- 9 日期型操作最大的问题就是时分秒结构的处理。Date类型本身是带有时分秒信息的,而进行查询的时候,常常是使用特定的年月日。这样,就会带来一些检索条件的问题。很多开发人员,就是直接使用trunc函数,将数据列上的时分秒信息进行裁剪。这样的确简单,而且满足需求。但是也留下了列索引失效的隐患。 正确的解决方式,应该将SQL进行改写,变等于条件为范围条件。如下: SQL> explain plan for select count(*) from t where last_ddl_time between to_date('2011-5-20 00:00:00','yyyy-mm-dd hh24:mi:ss') 2 and to_date('2011-5-20 23:59:59','yyyy-mm-dd hh24:mi:ss'); Explained SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3824876144 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 8 | 2 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 8 | | | |* 2 | INDEX RANGE SCAN| IDX_T_DDLT | 91 | 728 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("LAST_DDL_TIME">=TO_DATE(' 2011-05-20 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "LAST_DDL_TIME"<=TO_DATE(' 2011-05-2 23:59:59', 'syyyy-mm-dd hh24:mi:ss')) 16 rows selected 经过改写,没有使用函数索引,原有的B*树索引起效。很多时候,经过SQL的重新思考,是可以避免函数索引使用场合出现的。特别是在项目的开发阶段,这个尤为重要。 其次,就是对设计表的改进。我们常说一范式:列不可分。如果出现很多的对数据列的函数处理,我们就需要重新审视我们的设计表方案。是不是存在设计不合理、没有考虑到实际业务技术需求的方面。当SQL没有优化空间时,设计表的重构,冗余字段的加入可能是比较好的思路方法。 4、结论 本篇从一般的函数索引,谈到了SQL的改写和设计表优化。核心要义就是一点,慎用函数索引。而且,在绝大多数的情况下,我们是不需要使用函数索引的。只要能够理智冷静的分析实际需求和SQL结构,通常都可以获取到一个折中的方案。 Oracle中利用函数索引处理数据倾斜案例 首先声明:本方法是受到dbsnake的指导,再次感谢指点。 通常来说,索引选取的数据列最好为分散度高、选择性好。从索引树结构的角度看,列值都是分布在叶节点位置。这样,通过树结构搜索得到的叶节点数量效率比较高。 实际中,我们常常遇到数据列值倾斜的情况。就是说,整个列数据取值有限。但是大部分数据值都集中在少数一两个取值里,其他取值比例极少。比如:一个数据列值有“N”、“B”、“M”、“P”、“Q”几个取值,其中55%数据行取值为“N”,40%数据行取值为“B”,剩下的取值分布在5%的数据行中。对于这种结构的数据列加索引,是存在一些问题的。 首先,默认数据库是会为所有的列值(非空)建立索引结构。也就意味着无论是高频度取值,还是低频度取值,都会在索引结构的叶节点上出现。当然,这样的大部分叶节点都是这些重复值。 其次,在CBO(基于成本优化器)的作用下,对高频度取值的搜索一般都不会选择索引作为搜索路径,因为进行全表扫描可能效率更高。我们为数据列建立了索引,但高频词的查询永远不会走到索引路径。 最后,建立的索引空间和时间消耗比较大。建立的索引涵盖所有取值,对海量数据表而言,占有的空间势必较大。同时,在进行小频度数据查询的时候,虽然会去走索引路径,但是引起的逻辑物理读也是有一些损耗。 引入一个解决方法,思路:既然高频度值在查询的时候不会走到索引路径,可以考虑将其剔出构建索引的过程,只为那些低频度数据值建立索引结构。这样,建立的索引树结构相对较小,而且索引查询的效率也能提升。 具体的方法是使用decode函数。decode(a,b,c,d,e…f)含义:如果a=b,则返回c,等于d,返回e,最后没有匹配的情况下,返回f。针对上面的例子,可以使用decode(列名,‘N’, null, ‘B’, null, 列名),含义是,如果该列取值为N或者B,直接设置为null,否则才返回列值。并且以此建立函数索引。 这样做借助了Oracle两个功能:1、对null值不生成索引;2、函数索引; 下面的实验证明了该方法: 1、 构建数据环境 //数据准备 SQL> create table t as select * from dba_objects where 1=0; Table created //构造大数据环境,使用脚本 declare i number; begin for i in 1..40 loop insert /*+ append */ into t select * from dba_objects; commit; end loop; end; / SQL> select count(*) from t; COUNT(*) ---------- 4759209 Executed in 15.522 seconds 整理后的数据环境如下: //投入实验的数据状态 SQL> select secondary, count(*) from t group by secondary; SECONDARY COUNT(*) --------- ---------- W 273 Q 9 D 273 T 421230 J 1866592 E 99 S 2470733 7 rows selected Executed in 18.002 seconds 可以看到,近五百万数据两种,绝大部分数据集中到了S、T、J上,其他数据取值频数较小。数据倾斜趋势明显。 2、 建索引 分别对secondary列建立常规、函数索引。 SQL>create index IND_SEC_NORMAL on t(secondary); Index created SQL> create index ind_t_fun on t(decode (secondary, 'S', null, 'J', null, 'T', null, secondary )); Index created Executed in 28.049 seconds 索引ind_t_fun将S、T、J值转化为null,剔出了建立索引的过程。从索引段信息看,两个索引所占的空间差异比较大,也证明了这点。 SQL> select * from dba_segments where segment_name='IND_SEC_NORMAL'; OWNER SEGMENT_NAME SEGMENT_TYPE BYTES BLOCKS EXTENTS ------- ------------- ------------------ ---------- ---------- ---------- SYS IND_T_FUN INDEX 75497472 9216 80 Executed in 0.733 seconds SQL> select * from dba_segments where segment_name=upper('ind_t_fun'); OWNER SEGMENT_NAME SEGMENT_TYPE BYTES BLOCKS EXTENTS ------ ------------- -------------- ---------- ---------- ---------- SYS IND_T_FUN INDEX 65536 8 1 Executed in 0.156 seconds 注:本结果经过额外处理,用于方便显示; 可以看出,同样是对一个数据列加索引。普通索引类型Ind_sec_normal占据80个区,9216个数据块,空间约占75.5M。而函数索引ind_t_fun的空间只用了初始分配的1个区,8个数据块,空间约占65K。由此,空间优势立现! 收集统计数据,由于是实验性质,而且数据量大,采用高采样率收集统计信息。 SQL> exec dbms_stats.gather_table_stats(user, 'T', cascade => true, estimate_percent => 100,method_opt => 'for all indexed columns'); PL/SQL procedure successfully completed Executed in 60.403 seconds 3、 检索效率分析 针对数据量273的W取值进行分析。 直接索引搜索: SQL> select * from t where secondary='W'; 已选择273行。 已用时间: 00: 00: 00.37 执行计划 ---------------------------------------------------------- Plan hash value: 1573525374 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 273 | 25935 | 11 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T | 273 | 25935 | 11 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IND_SEC_NORMAL | 273 | | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("SECONDARY"='W') 统计信息 ---------------------------------------------------------- 775 recursive calls 0 db block gets 272 consistent gets 21 physical reads 0 redo size 28339 bytes sent via SQL*Net to client 583 bytes received via SQL*Net from client 20 SQL*Net roundtrips to/from client 16 sorts (memory) 0 sorts (disk) 273 rows processed 发现采用W作为搜索值时,是进行了索引搜索。下面是用函数索引搜索进行对比。 SQL> select * from t where decode(secondary,'S',null,'J',null,'T',null,secondary)='W'; 已选择273行。 已用时间: 00: 00: 00.04 执行计划 ---------------------------------------------------------- Plan hash value: 3192598969 ----------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 273 | 25935 | 116 (0)| 00:00:02 | | 1 | TABLE ACCESS BY INDEX ROWID| T | 273 | 25935 | 116 (0)| 00:00:02 | |* 2 | INDEX RANGE SCAN | IND_T_FUN | 273 | | 1 (0)| 00:00:01 | ----------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access(DECODE("SECONDARY",'S',NULL,'J',NULL,'T',NULL,"SECONDARY")='W') 统计信息 ---------------------------------------------------------- 45 recursive calls 0 db block gets 140 consistent gets 0 physical reads 0 redo size 13225 bytes sent via SQL*Net to client 583 bytes received via SQL*Net from client 20 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 273 rows processed 对比后,我们可以发现,使用函数索引的方法,在执行时间、物理逻辑读、CPU使用上有一定差异。 普通索引 函数索引 执行时间 00: 00: 00.37 00: 00: 00.04 CPU使用 11 116 consistent gets 272 140 physical reads 21 0 结论:使用函数索引处理偏值方法,在一定长度上优化查询效率和索引结构。上表的数据表明,会使逻辑物理读的消耗很大程度的减少(索引结构简化),同时连带影响执行时间的缩小。因为使用函数要进行计算,CPU使用率相对较高,在可以接受的范围内。 但是,这种方法是存在一些限制的,应用前一定要仔细规划。 首先,数据表数据要保证较大。因为毕竟函数索引的建立和搜索较普通索引消耗大,如果数据表小,带来的优化程度不能弥补消耗的成本,结果可能得不偿失。笔者进行的一系列实验中,也发现在数据量中等偏小时,这种性能优势不能凸显。 其次,列值倾斜趋势明显。通过开篇的讨论我们不难发现,列值倾斜的程度越高,使用函数索引剔出的数据量也就越大,生成的索引树结构也就越小越优化。这一点是本方法的核心! 最后,使用函数索引搜索时,搜索的取值频数越高,优化效果越好。在本例中,取值W的列有273行,可以看出明显的性能优化。当我们选择值有9条数据的Q值时,这种优化趋势可以看到,但是明显程度降低(实验结果略)。这里的原因可能是数据量小时,两种方法逻辑物理读的差异度缩小。 About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2017-11-01 09:00 ~ 2017-11-30 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
【密码文件】Oracle OS认证与密码文件(口令文件)认证 1.1 密码文件 1.1.1 密码文件简介 作用:主要进行SYSDBA和SYSOPER权限的身份认证。密码文件存放着被授予SYSDBA或SYSOPER权限的用户的用户名和密码。它是一个加密的文件,用户不能修改这个文件,但是可以使用strings命令看到密码的HASH值。 在Linux系统中,密码文件一般保存在$ORACLE_HOME/dbs目录下,文件名为orapw$SID;在Windows系统中,密码文件一般保存在%ORACLE_HOME%\database目录下,文件名为PWD$SID.ora。 [oracle@edsir4p1-PROD1 dbs]$ strings orapwPROD1 ]\[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 o5&W 8A8F025737A9097A [oracle@edsir4p1-PROD1 dbs]$ SYS@PROD1> SELECT D.PASSWORD FROM USER$ D WHERE D.NAME='SYS'; PASSWORD ------------------------------ 8A8F025737A9097A 使用密码文件认证的基本步骤是: 使用orapwd工具生成密码文件 设置REMOTE_LOGIN_PASSWORDFILE为EXCLUSIVE或是SHARED 使用SYS登陆数据库,创建新的数据库用户 使用GRANT命令授予新创建的用户SYSDBA/SYSOPER权限 1.1.2 密码文件的位置 Linux下的存放位置:$ORACLE_HOME/dbs/orapw$ORACLE_SID 即:ORACLE_HOME/dbs/orapw<sid> Windows下的存放位置:$ORACLE_HOME/database/PWD%ORACLE_SID%.ora 密码文件查找的顺序 --->orapw<sid>--->orapw--->Failure 1.1.3 Oracle的两种认证方式 在Oracle中有两类特殊的权限SYSDBA和SYSOPER,当DBA需要对数据库进行维护管理操作的时候必须具有这两类特殊权限之中的一种。在数据库没有打开的时候,使用数据库内建的账号是无法登陆数据库的,但是拥有SYSDBA或是SYSOPER权限的用户是可以登陆的。认证用户是否拥有这两类特殊权限的方法有两种:OS认证和密码文件认证。 1.使用与操作系统集成的身份验证,例如:sqlplus / as sysdba、sqlplus "/ as sysdba" 、sqlplus sys/lhrsasa as sysdba、sqlplus xx/xx as sysdba、sqlplus xx/xx as sysoper、sqlplus / as sysoper等,只要是在本机上使用as sysdba或as sysoper身份且不含TNS的方式登录,都是首先进行OS验证,若不支持OS验证,则进行密码文件验证登录。需要注意的是,命令“sqlplus / as sysdba”永远是以OS验证方式进行登录的。 2.使用Oracle数据库的密码文件进行身份认证,例如:sqlplus lhr/lhr@orcl,只要是使用TNS的方式以sysdba或sysoper身份登录数据库,都是密码文件验证方式。另外,只要是输入了密码,则都有可能是使用密码文件方式进行登录认证,例如:sqlplus sys/lhrsasa as sysdba。 Oracle数据库究竟使用OS认证还是密码文件认证来进行管理取决于下面三个因素: ① $ORACLE_HOME/network/admin/sqlnet.ora参数文件中的参数SQLNET.AUTHENTICATION_SERVICES的设置 ② PFILE(SPFILE)参数文件中的参数REMOTE_LOGIN_PASSWORDFILE设置 ③ 密码文件:$ORACLE_HOME/dbs/orapw$ORACLE_SID(在Linux中) | %ORACLE_HOME%\database\PWD%ORACLE_SID%.ora(在Windows中) Oracle权限认证的基本顺序是这样的,先由SQLNET.AUTHENTICATION_SERVICES的设置值来决定是使用OS认证还是密码文件认证,如果使用密码文件认证的话就要看后面两个条件了:如果REMOTE_LOGIN_PASSWORDFILE参数设置为非NONE而且密码文件存在的话就能正常使用密码文件认证,否则将会失败。 两种认证方式类似于SQL server中的windows认证和SQL server认证 1.1.3.1 SQLNET.AUTHENTICATION_SERVICES参数 在SQLNET.ORA(位于$ORACLE_HOME/NETWORK/ADMIN目录中)文件中,需要修改时直接用文本编辑器打开修改就行了,对于不同的操作系统SQLNET.AUTHENTICATION_SERVICES的取值会有些不一样,通常我们会用到下面的一些设置值: (1) SQLNET.AUTHENTICATION_SERVICES = (ALL) 对Linux系统,支持OS认证和密码文件认证。 对Windows系统,实际实验是不支持此参数,验证失败。报错:ORA-12641: 验证服务无法初始化(Authentication service failed to initialize) (2) SQLNET.AUTHENTICATION_SERVICES = (NTS) 此设置值仅用于Windows NT系统,此设置同时支持OS认证和密码文件认证,只有在设置了(NTS)值之后运行在Windows系统上的Oracle才支持OS认证。若Linux系统上设置了此参数,则指定Oracle只使用密码文件认证。 (3) SQLNET.AUTHENTICATION_SERVICES = (NONE) 此设置值在Windows和Linux是作用一样的,指定Oracle只使用密码文件认证。 (4) 不设置此参数或sqlnet.ora文件不存在或SQLNET.AUTHENTICATION_SERVICES = 对Linux系统,默认支持OS认证和密码文件认证。 对Windows系统,默认只支持密码文件认证,不支持OS认证。 一、 SQLNET.AUTHENTICATION_SERVICES参数实验 Oracle的两种认证方式 一、官方文档说明 作用 Use the parameter SQLNET.AUTHENTICATION_SERVICES to enable one or more authentication services. If authentication has been installed, it is recommended that this parameter be set to either none or to one of the authentication methods. 默认值 None 一般可选值 NONE for no authentication methods. A valid username and password can be used to access the database. ALL for all authentication methods NTS for Windows NT native authentication(An authentication method that enables a client single login access to a Windows NT server and a database running on the server) 为了加深对这几个参数的理解,通过实验证明,这几个参数在不同的系统中的作用 二、win系统 Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Windows\system32>e: E:\>cd E:\oracle\11_2_0\NETWORK\ADMIN #sqlnet.ora文件不存在情况 E:\oracle\11_2_0\NETWORK\ADMIN>dir sqlnet.ora 驱动器 E 中的卷没有标签。 卷的序列号是 38D0-2A35 E:\oracle\11_2_0\NETWORK\ADMIN 的目录 找不到文件 E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:13:57 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. ERROR: ORA-01031: 权限不足 请输入用户名: #NTS情况 E:\oracle\11_2_0\NETWORK\ADMIN>more sqlnet.ora SQLNET.AUTHENTICATION_SERVICES=(NTS) E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:16:20 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining, Oracle Database Vault and Real Application Testing options #NONE情况 E:\oracle\11_2_0\NETWORK\ADMIN>more sqlnet.ora SQLNET.AUTHENTICATION_SERVICES=(NONE) E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:17:18 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. ERROR: ORA-01031: 权限不足 请输入用户名: #ALL情况 E:\oracle\11_2_0\NETWORK\ADMIN>more sqlnet.ora SQLNET.AUTHENTICATION_SERVICES=(ALL) E:\oracle\11_2_0\NETWORK\ADMIN>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 星期五 11月 11 22:18:02 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. ERROR: ORA-12641: 验证服务无法初始化 请输入用户名: 三、linux系统 [oracle@report ~]$cd/opt/oracle/product/10.2.0/db_1/network/admin/ #NTS情况 [oracle@report admin]$more sqlnet.ora SQLNET.AUTHENTICATION_SERVICES = (NTS) [oracle@report admin]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:03:51 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. ERROR: ORA-01031: insufficient privileges Enter user-name: #NONE情况 [oracle@report admin]$more sqlnet.ora SQLNET.AUTHENTICATION_SERVICES = (NONE) [oracle@report admin]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:04:31 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. ERROR: ORA-01031: insufficient privileges Enter user-name: #ALL情况 [oracle@report admin]$more sqlnet.ora SQLNET.AUTHENTICATION_SERVICES = (ALL) [oracle@report admin]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:05:07 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options #不存在sqlnet.ora文件情况 [oracle@report admin]$ ll sqlnet.ora ls: sqlnet.ora: No suchfileor directory [oracle@report admin]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Fri Nov 11 22:05:41 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 四、补充说明 1、在win系统中使用all,提示ORA-12641,不是很清楚原因 2、在nts只有在win系统中有用,linux中无用 3、当不存在sqlnet.ora文件时,linux中可以正常登录,win中不能 1.1.3.2 OS认证实现 Oracle使用操作系统中的两个用户组来控制OS认证,在不同的操作系统中这两个用户组的名称是不一样的,一般来说他们是OSDBA 和 OSOPER,这两个用户组都是在Oracle安装的时候创建的。下面列出不同系统中这两个用户组的名字: Operating System Group UNIX User Group UNIX User Group OSDBA dba ORA_DBA OSOPER oper ORA_OPER OSDBA用户组的用户可以使用SYSDBA权限登陆数据库,OSOPER用户组的的用户可以使用SYSOPER权限来登陆数据库。使用sqlplus可以用下面方法登陆 CONNECT / AS SYSDBA CONNECT / AS SYSOPER 拥有OS权限的用户登陆数据库时不再需要输入用户名和密码,因此使用下面的命令也是可以正常登陆的: CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSDBA CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSOPER 因此要创建一个新的OS认证帐号步骤是: 1. 建立一个OS用户 2. 将用户加入到OSDBA或是OSOPER用户组 3. 用新增加的用户登陆系统,然后输入sqlplus / AS SYSDBA进行登陆 一、 REMOTE_LOGIN_PASSWORDFILE参数 REMOTE_LOGIN_PASSWORDFILE参数的设置制定了数据库使用密码文件的方法,此参数可以设置的值有三个: l REMOTE_LOGIN_PASSWORDFILE = NONE #不使用密码文件 l REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE #使用密码文件,但只有一个数据库实例可以使用 l REMOTE_LOGIN_PASSWORDFILE = SHARED #多个数据库实例共用一个密码文件,这种设置下是不能增加其他数据库用户作为特殊权限用户到密码文件中的。 REMOTE_LOGIN_PASSWORDFILE参数属于初始化参数,只能在init.ora/pfile中指定或是在数据库打开状态下使用下面语句修改,然后重新启动数据库。 ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE ; 要检查当前REMOTE_LOGIN_PASSWORDFILE的设定值在登陆Oracle后输入下面的命令 SYS@PROD1> show parameter remote_login_passwordfile NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string EXCLUSIVE 二、设置初始化参数REMOTE_LOGIN_PASSWORDFILE: 在Oracle数据库实例的初始化参数文件中,此参数控制着密码文件的使用及其状态。它可以有以下几个选项: NONE:指示Oracle系统不使用密码文件,特权用户的登录通过操作系统进行身份验证; EXCLUSIVE:指示只有一个数据库实例可以使用此密码文件。只有在此设置下的密码文件可以包含有除INTERNAL/SYS以外的用户信息,即答应将系统权限SYSOPER/SYSDBA授予除INTERNAL/SYS以外的其他用户。 SHARED:指示可有多个数据库实例可以使用此密码文件。在此设置下只有INTERNAL/SYS帐号能被密码文件识别,即使文件中存有其他用户的信息,也不答应他们以SYSOPER/SYSDBA的权限登录。此设置为缺省值。 在REMOTE_LOGIN_PASSWORDFILE参数设置为EXCLUSIVE、SHARED情况下,Oracle系统搜索密码文件的次序为:在系统注册库中查找ORA_SID_PWFILE参数值(它为密码文件的全路径名);若未找到,则查找ORA_PWFILE参数值;若仍未找到,则使用缺省值ORACLE_HOME\DATABASE\PWDSID.ORA;其中的SID代表相应的Oracle数据库系统标识符。 1.1.3.3 验证方式演示 1.在sqlnet.ora中追加SQLNET.AUTHENTICATION_SERVICES = none */ [oracle@robinson ~]$ sqlplus / as sysdba /*登陆失败*/ SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:41:28 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges Enter user-name: -------------------------------------------------------------------------------- [oracle@robinson ~]$ sqlplus sys/redhat as sysdba /*使用密码文件认证,登陆成功*/ SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:42:35 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0- Production With the Partitioning, OLAPand Data Mining options SQL> --================================================================================= 2.将SQLNET.AUTHENTICATION_SERVICES的值改为all [oracle@robinson admin]$ sqlplus / as sysdba /*采用本机认证可以登陆*/ SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:46:55 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0- Production With the Partitioning, OLAPand Data Mining options SQL> -------------------------------------------------------------------------------------- [oracle@robinson admin]$ sqlplus sys/redhat@orcl as sysdba /*使用密码文件登陆认证失败*/ SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 10:48:35 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. ERROR: ORA-12641: Authenticationservice failed to initialize Enter user-name: --注:此时可以使用远程登陆。 --使用#符号将新增的SQLNET.AUTHENTICATION_SERVICES行注释掉恢复到缺省值 1.1.4 密码文件的建立 [oracle@edsir4p1-PROD1 dbs]$ orapwd Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n> where file - name of password file (required), password - password for SYS will be prompted if not specified at command line, entries - maximum number of distinct DBA (optional), force - whether to overwrite existing file (optional), ignorecase - passwords are case-insensitive (optional), nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only). There must be no spaces around the equal-to (=) character. [oracle@robinson ~]$ orapwd Usage: orapwd file=<fname> password=<password> entries=<users> force=<y/n> where file - name of password file (mand), /*密码文件的名字orapw<sid>*/ password - password for SYS (mand), /*sys用户的密码*/ entries - maximum number of distinct DBA and /*可以有多少个sysdba,sysoper权限用户放到密码文件中去,去掉重复记录,注意entries中存放的个数但不是实际个数,这个是二进制数据*/ force - whether to overwrite existingfile (opt),/*10g新增的参数,默认值为n ,y表示允许覆盖*/ OPERs (opt), There are no spaces around the equal-to(=) character. 注意:使用orapwd重新生成密码文件之后以前保存的授予的其他用户的SYSDBA或是SYSOPER权限将会丢失,需要重新的GRANT。 设定的entries值是不能修改的,如果要修改entries的话需要重新生成密码文件,在生成密码文件之前可以先通过V$PWFILE_USERS视图查询出当前被授予SYSDBA/SYSOPER权限的用户,然后在重新生成密码文件以后重新对这些用户授予SYSDBA/SYSOPER权限 --修改密码: [oracle@robinson ~]$ cd $ORACLE_HOME/dbs [oracle@robinson dbs]$ ll orapworcl -rw-r----- 1 oracle oinstall 1536 Apr 7 15:50 orapworcl [oracle@robinson dbs]$ orapwd file=orapworcl password=oracle force=y [oracle@robinson dbs]$ sqlplus sys/oracle@orclas sysdba SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 11:34:09 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0- Production With the Partitioning, OLAPand Data Mining options SQL> --将密码改回原来的密码 [oracle@robinson dbs]$ orapwd file=orapworcl password=redhat OPW-00005:File with same name exists - pleasedelete or rename [oracle@robinson dbs]$ orapwd file=orapworcl password=redhat force=y [oracle@robinson dbs]$ rm orapworcl /*删除密码文件*/ [oracle@robinson dbs]$ orapwd file=orapworcl password=redhat/*重建密码文件*/ --演示将entries改为,然后将多个用户设置为sysdba或sysoper [oracle@robinson dbs]$ orapwd file=orapworcl password=redhat entries=1 [oracle@robinson dbs]$ strings orapworcl ]/[Z ORACLE Remote Password file INTERNAL F7AC0C5E9C3C37AB E100B964899CDDDF --创建PL/SQL增加个新用户 SQL> begin 2 for iin 1..20 loop 3 execute immediate'create user u'||i||' identified by u'||i||''; 4 end loop; 5 end; 6 / --将新用户赋予sysdba角色 PL/SQL procedure successfully completed. SQL> begin 2 for iin 1..20 loop 3 execute immediate'grant sysdba to u'||i||''; 4 end loop; 5 end; 6 / begin /*得到和密码文件相关的错误提示*/ * ERROR at line 1: ORA-01996:GRANT failed: passwordfile '' is full ORA-06512: at line 3 --再次查看orapworcl发现多出了行,即当设置为的时候多出了个用户。原因是该密码文件是二进制文件,按矩阵计算可存放多少 [oracle@robinson dbs]$ strings orapworcl ]/[Z ORACLE Remote Password file INTERNAL F7AC0C5E9C3C37AB E100B964899CDDDF 3E81B724A296E296 668509DF9DD36B43 9CE6AF1E3F609FFC 7E19965085C9ED47 --注意不要轻易删掉密码文件,这样会将其他账户的信息也删除 创建Oracle密码文件的命令 orapwd file=<> password=<> entries=最大数目 这里的file命名规则在unix/linux下orapw<ORACLE_SID>,在windows下为 pwd<SID>.ora 具体资料看下面的描述 1. unix 环境: Administrator's Reference 10g Release 2 (10.2) for UNIX-Based Operating Systems. 1. Log in as the Oracle software owner. (以Oracle管理员身份登入) 2. Use the orapwd utility to create the password file as follows(使用orapwd功能创建密码文件): $ $ORACLE_HOME/bin/orapwd file=filename password=password entries=max_users filename The name of the file in which password information is written(filename指密码信息保存文件的文件名) The name of the file must be orapwsid, and you must supply the full path name. Its contents are encrypted. Typically,the password file is created in the $ORACLE_HOME/dbs directory.(文件名必须为orapwsid,并需要提供完整路径,内容是加密的,通常情况下,密码文件被创建在$ORACLE_HOME/dbs路径下。) 请注意,unix环境中,password file一定是要用 orapw<SID>,没有例外。 2. windows 环境: Platform. Guide 10g Release 2 (10.2) for Microsoft Windows (32-Bit) To create and populate a password file: (1). Create a password file with the Password Utility: C:> orapwd FILE=pwdsid.ora PASSWORD=password ENTRIES=max_users where | FILE specifies the password filename. | SID identifies the database instance. | PASSWORD sets the password for account SYS. | ENTRIES sets maximum number of entries in password file. This corresponds to maximum number of distinct users allowed to connect to the database simultaneously with either the SYSDBA or the SYSOPER DBA privilege. (2). Set initialization parameter file parameter REMOTE_LOGIN_PASSWORDFILE to exclusive,shared,or none. In search of the password file,Oracle Database looks in the registry for the value of parameter ORA_SID_PWFILE. If no value is specified, then it looks in the registry for the value of parameter ORA_PWFILE, which points to a file containing usernames, passwords, and privileges. If that is not set, then it uses the default: ORACLE_BASEORACLE_HOMEDATABASEPWDsid.ORA. The default value is shared. 请注意,windows环境中,很大的部分是基于registry中变量ora_sid_pwfile 或者 ora_pwfile的设置, 缺省的值是 pwd<SID>.ora (unix中是没有这个.ora后缀的)。 在windows下对于connect /as sysdba及其它用户可以不用密码就能登录的问题 1.这是因为oracle采用了OS认证的方式,具体的可以查看 sqlnet.ora具体同容如下 SQLNET.AUTHENTICATION_SERVICES=(NTS) 将其改成SQLNET.AUTHENTICATION_SERVICES=(NONE) 这样就是oracle认证方式了 2.因为用的OS认证方式,可以在操作系统->控制面版->计算机管理->用户将当前用户的属性组 ORA_DBA去掉,这时如果没有用户名及密码则不可以。 如下: SQL> connect /as sysdba ERROR:ORA-01031: insufficient privileges SQL> connect sys/oracle as sysdba 已连接。 利用alter user identified by来修改密码alter user sys identified by abc一下,就连数据库中的密码和密码文件中的密码一起改成abc了; 如果Oracle密码文件丢失了如何办? 利用 orapwd重新创建一个就可以 在Oracle数据库系统中,用户假如要以特权用户身份(INTERNAL/SYSDBA/SYSOPER)登录Oracle数据库可以有两种身份验证的方法:即使用与操作系统集成的身份验证或使用Oracle数据库的密码文件进行身份验证。因此,治理好密码文件,对于控制授权用户从远端或本机登录Oracle数据库系统,执行数据库治理工作,具有重要的意义。 Oracle数据库的密码文件存放有超级用户INTERNAL/SYS的密码及其他特权用户的用户名/密码,它一般存放在ORACLE_HOME\DATABASE目录下。 一、密码文件的创建: 在使用Oracle Instance Manager创建一数据库实例的时侯,在ORACLE_HOME\DATABASE目录下还自动创建了一个与之对应的密码文件,文件名为PWDSID.ORA,其中SID代表相应的Oracle数据库系统标识符。此密码文件是进行初始数据库治理工作的基础。在此之后,治理员也可以根据需要,使用工具ORAPWD.EXE手工创建密码文件,命令格式如下: C:\ >ORAPWD FILE=< FILENAME > PASSWord =< PASSWORD > ENTRIES=< MAX_USERS > 各命令参数的含义为: FILENAME:密码文件名; PASSWORD:设置INTERNAL/SYS帐号的密码; MAX_USERS:密码文件中可以存放的最大用户数,对应于答应以SYSDBA/SYSOPER权限登录数据库的最大用户数。由于在以后的维护中,若用户数超出了此限制,则需要重建密码文件,所以此参数可以根据需要设置得大一些。 有了密码文件之后,需要设置初始化参数REMOTE_LOGIN_PASSWORDFILE来控制密码文件的使用状态。 1.1.5 导致密码文件内容修改的几种方式 1.使用orapwd建立,修改密码文件,不建议使用 2.使用alter user sys identified by <> 3.使用grant sysdba to <>或grant sysoper to <>或revoke sysdba |sysoper from <> 每次在Oracle系统里面使用GRANT SYSDBA/SYSOPER授予新用户特殊权限或是ALTER USER命令修改拥有SYSDBA/SYSOPER权限的用户密码的时候,Oracle都会自动的修改密码文件,增加或是修改相应的项目,这样保证在数据没有打开的情况拥有特殊权限的用户能正常的登陆数据库以进行管理操作。 在使用ALTER USER 修改SYS密码时,会同时修改密码文件中的密码,保持一致;如果是手工创建的密码文件,密码文件中的密码可以与SYS密码相同也可以不同,都不影响密码文件验证登录。不过还是建议数据库中SYS密码与密码文件中的密码一致,以免需要急用远程登录时密码反而不对,造成维护上的问题。 查询MOS上也有相关的文档:Password or SYS Doesn't Match the Hash Value in USER$ (文档 ID 2139304.1) [oracle@edsir4p1-PROD1 dbs]$ strings orapwPROD1 ]\[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 o5&W 8A8F025737A9097A [oracle@edsir4p1-PROD1 dbs]$ SYS@PROD1> SELECT D.PASSWORD FROM USER$ D WHERE D.NAME='SYS'; PASSWORD ------------------------------ 8A8F025737A9097A SYS@PROD1> ! ls -l /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 -rw-r----- 1 oracle oinstall 1536 Nov 29 05:36 /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 SYS@PROD1> alter user sys identified by lhr; User altered. SYS@PROD1> SELECT D.PASSWORD FROM USER$ D WHERE D.NAME='SYS'; PASSWORD ------------------------------ B1BDB30F0899B88F SYS@PROD1> ! ls -l /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 -rw-r----- 1 oracle oinstall 1536 Nov 29 05:54 /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 SYS@PROD1> ! strings /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 ]\[Z ORACLE Remote Password file INTERNAL 0575A0C032EB97DC B1BDB30F0899B88F SYS@PROD1> ! orapwd file=/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 password=oracle force=y SYS@PROD1> ! strings /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwPROD1 ]\[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 #O!c3 I~&) 8A8F025737A9097A SYS@PROD1> SELECT D.PASSWORD FROM USER$ D WHERE D.NAME='SYS'; PASSWORD ------------------------------ B1BDB30F0899B88F 可以看到,重建密码文件后,数据库中存储的密码没有改变。 1.1.6 查看密码文件内容 [oracle@robinson dbs]$ strings orapworcl ]/[Z ORACLE Remote Password file INTERNAL F7AC0C5E9C3C37AB E100B964899CDDDF --当sys密码不记得可以使用OS系统身份认证登陆到sqlplus,再使用alter user修改密码 SQL> alteruser sys identified by oracle; User altered --再次查看密码文件与上一次对比,已经发生变化 SQL> ho strings orapworcl ]/[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A --通过授予权限来修改密码,密码文件中多出了scott的信息 SQL> grant sysdbato scott; Grant succeeded. SQL> ho strings orapworcl ]/[Z ORACLE Remote Password file INTERNAL AB27B53EDC5FEF41 8A8F025737A9097A SCOTT F894844C34402B67 --注意此处中登陆后,显示的账户信息还是sys,而不是scott,但此时的scott已经具备了sys权限 [oracle@robinson dbs]$ sqlplus scott/tiger@orclas sysdba SQL*Plus: Release 10.2.0.1.0- Production on Fri Apr 9 11:56:09 2010 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0- Production With the Partitioning, OLAPand Data Mining options SQL> show user USER is "SYS" 1.1.7 sysdba与sysoper的区别 & 说明: 有关DBA、SYSDBA和SYSOPER三者的区别的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2147919/ SQL> select* from system_privilege_map where name like '%SYS%'; PRIVILEGE NAME PROPERTY ---------- ---------------------------------------- ---------- -3 ALTER SYSTEM 0 -4 AUDIT SYSTEM 0 -83 SYSDBA 0 -84 SYSOPER 0 --下面的链接是两者不同的权限说明 http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dba.htm#sthref137 The manner in which you are authorized to use these privileges depends upon the methodof authentication that you use. When you connect with SYSDBA or SYSOPER privileges, you connectwith a default schema, not with the schema that is generally associatedwith your username. For SYSDBA this schemais SYS; for SYSOPER the schema is PUBLIC. --两者的schema不同 SQL> show user USER is "SYS" SQL> conn /as sysoper Connected. SQL> show user USER is "PUBLIC" --查看密码文件视图,可以得到哪些用户为sysdba,哪些用户为sysoper SQL> select* from v$pwfile_users; USERNAME SYSDB SYSOP ------------------------------ ----- ----- SYS TRUE TRUE SCOTT TRUE FALSE USER1 FALSE TRUE --下面演示了使用不同的角色来登陆 SQL> conn scott/tiger@orclas sysdba Connected. SQL> conn scott/tiger@orclas sysoper /*scott的sysop列为false*/ ERROR: ORA-01031: insufficient privileges Warning: You are no longer connected to ORACLE. SQL> conn user1/user1@orclas sysdba ERROR: ORA-01031: insufficient privileges SQL> conn user1/user1as sysoper Connected. 1.1.8 其它 常见问题说明 1、如何查找拥有SYSDBA或是SYSOPER权限的用户 使用视图V$PWFILE_USERS,结果集中的SYSDB和SYSOP分别代表是否有SYSDBA和SYSOPER权限。 SQL > select * from v $ pwfile_users ; /** USERNAME SYSDB SYSOP ------------------------------ ----- ----- SYS TRUE TRUE TEST TRUE FALSE */ 2、授予权限时出现”ORA-01994: GRANT failed: password file missing or disabled” 出现这种情况是因为没有创建密码文件,或者是密码文件放置的目录不正确,Oracle找不到。只要重建或将密码文件置于$ORACLE_HOME/dbs/目录中就可以了。 3、忘记了SYS帐号的密码怎么办? 如果数据库启用的OS认证登陆,则可以用OS认证登陆数据库,然后使用下面的命令进行修改 alter user SYS identified by pwd ; 如果没有启用OS认证登陆,则需要用orapwd重建密码文件 orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y 其中的password项所指定的就是SYS的密码 1.1.9 OPW-00001: 无法打开密码文件 C:\Documents and Settings\testuser>orapwd file='D:\oracle\ora92\DATABASE\PW Dtestdb.ORA' password='testdb' OPW-00001: 无法打开密码文件 去掉单引号,或者修改单引号为双引号: orapwd file="E:\oracle\ora8i\DATABASE\PWDortest.ORA" password=lhr Oracle OS认证与口令文件认证详解 作者: lansz | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明 链接: http://www.lansz.com/html/2008/06/oracle_os_pwfile_authentication.html 本文概述与实验环境 概述:本文只讨论OS认证和口令文件认证方式的配置方法,如何配置以及使用OS认证和口令文件认证方式验证SYSDBA/SYSOPER权限。 实验环境:Oracle 10.1 + Windows 2003 和 Oracle 10.2 + RHEL 4 特殊权限与Oracle登陆认证管理 在开始学Oracle的时候有件事一直让我感觉很奇怪,就是为什么在数据没有起来的时候只要登录到安装Oracle的操作系统中直接用sqlplus / as sysdba就能登陆到数据库中然后对数据库进行启动停止之类的操作。后来看到关于Oracle口令文件相关资料的时候才豁然开朗:数据库认证信息并不一定存在数据库中的,这点和SQL Server很是不一样。 在Oracle中有两类特殊的权限SYSDBA和SYSOPER,当DBA需要对数据库进行维护管理操作的时候必须具有这两类特殊权限之中的一种。在数据库没有打开的时候,使用数据库内建的账号是无法登陆数据库的,但是拥有SYSDBA或是SYSOPER权限的用户是可以登陆的。认证用户是否拥有两类特殊权限的方法有两种:OS认证和口令文件认证。 OS认证和口令文件认证方法 Oracle特殊权限认证方法 (来源:Oracle? Database Administrator’s Guide 10g Release 2) Oracle数据库究竟使用OS认证还是口令文件认证来进行管理取决于下面三个因素: SQLNET.ORA参数文件中的参数SQLNET.AUTHENTICATION_SERVICES设置 PFILE(SPFILE)参数文件中的参数REMOTE_LOGIN_PASSWORDFILE设置 口令文件orapw$SID(Linux) | PWD$SID.ora(Windows) Oracle权限认证的基本顺序是这样的,先由SQLNET.AUTHENTICATION_SERVICES的设置值来决定是使用OS认证还是口令文件认证,如果使用口令文件认证的话就要看后面两个条件了:如果REMOTE_LOGIN_PASSWORDFILE参数设置为非NONE而且口令文件存在的话就能正常使用口令文件认证,否则将会失败。 SQLNET.AUTHENTICATION_SERVICES参数 在SQLNET.ORA(位于$ORACLE_HOME/NETWORK/ADMIN目录中)文件中,需要修改时直接用文本编辑器打开修改就行了,对于不同的操作系统SQLNET.AUTHENTICATION_SERVICES的取值会有些不一样,通常我们会用到下面的一些设置值: SQLNET.AUTHENTICATION_SERVICES = (ALL) 对Linux系统,支持OS认证和口令文件认证。 对Windows系统,实际实验是不支持此参数,验证失败。 SQLNET.AUTHENTICATION_SERVICES = (NTS) 此设置值仅用于Windows NT系统,此设置同时支持OS认证和口令文件认证,只有在设置了(NTS)值之后运行在Windows系统上的Oracle才支持OS认证。 SQLNET.AUTHENTICATION_SERVICES = (NONE) 此设置值在Windows和Linux是作用一样的,指定Oracle只使用口令文件认证。 不设置此参数或SQLNET.AUTHENTICATION_SERVICES = 对Linux系统,默认支持OS认证和口令文件认证。 对Windows系统,默认只支持口令文件认证,不支持OS认证。 OS认证实现 Oracle使用操作系统中的两个用户组来控制OS认证,在不同的操作系统中这两个用户组的名称是不一样的,一般来说他们是OSDBA 和 OSOPER,这两个用户组都是在Oracle安装的时候创建的。下面列出不同系统中这两个用户组的名字: Operating System Group UNIX User Group UNIX User Group OSDBA dba ORA_DBA OSOPER oper ORA_OPER OSDBA用户组的用户可以使用SYSDBA权限登陆数据库,OSOPER用户组的的用户可以使用SYSOPER权限来登陆数据库。使用sqlplus可以用下面方法登陆 CONNECT / AS SYSDBA CONNECT / AS SYSOPER 拥有OS权限的用户登陆数据库时不再需要输入用户名和密码,因此使用下面的命令也是可以正常登陆的: CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSDBA CONNECT ANY_USER_NAME / ANY_PASSWORD AS SYSOPER 因此要创建一个新的OS认证帐号步骤是: 建立一个OS用户 将用户加入到OSDBA或是OSOPER用户组 用新增加的用户登陆系统,然后输入sqlplus / AS SYSDBA进行登陆 REMOTE_LOGIN_PASSWORDFILE参数 REMOTE_LOGIN_PASSWORDFILE系统参数的设置制定了数据库使用口令文件的方法,此参数可以设置的值有三个: REMOTE_LOGIN_PASSWORDFILE = NONE 不使用口令文件 REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE 使用口令文件,但只有一个数据库实例可用使用 REMOTE_LOGIN_PASSWORDFILE = SHARED 多个数据库实例共用一个口令文件,这种设置下是不能增加其他数据库用户作为特殊权限用户到口令文件中的。 REMOTE_LOGIN_PASSWORDFILE参数属于初始化参数,只能在init.ora/pfile中指定或是在数据库打开状态下使用下面语句修改,然后重新启动数据库。 ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE ; 要检查当前REMOTE_LOGIN_PASSWORDFILE的设定值在登陆Oracle后输入下面的命令 SQL > show parameter remote /** 这是输出结果,看remote_login_passwordfile一行 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_archive_enable string true remote_dependencies_mode string TIMESTAMP remote_listener string remote_login_passwordfile string EXCLUSIVE remote_os_authent boolean FALSE remote_os_roles boolean FALSE SQL> */ 口令文件和口令文件认证 口令文件存放着被授予SYSDBA或SYSOPER权限的用户的用户名和密码。它是一个加密的文件,用户不能修改这个文件, 在Linux系统中口令文件一般保存在$ORACLE_HOME/dbs目录下,文件名为orapw$SID;在Windows系统中口令文件一般保存在$ORACLE_HOME/database目录下,文件名为PWD$SID.ora。 使用口令文件认证的基本步骤是: 使用orapwd工具生成口令文件 设置REMOTE_LOGIN_PASSWORDFILE为EXCLUSIVE或是SHARED 使用SYS登陆数据库,创建新的数据库用户 使用GRANT命令授予新创建的用户SYSDBA/SYSOPER权限 1、使用orapwd工具生成口令文件 我们可以使用Oracle提供的工具orapwd来创建或者重新初始化一个口令文件: [oracle@RHEL4 dbs]$ orapwd Usage: orapwd file= password= entries= force= where file - name of password file (mand), password - password for SYS (mand), entries - maximum number of distinct DBA and force - whether to overwrite existing file (opt), OPERs (opt), There are no spaces around the equal-to (=) character. [oracle@RHEL4 ~]$ orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y [oracle@RHEL4 ~]$ 注意:使用orapwd重新生成口令文件之后以保存的授予的其他用户的SYSDBA或是SYSOPER权限将会丢失,需要重新的GRANT。 设定的entries值是不能修改的,如果要修改entries的话需要重新生成口令文件,在生成口令文件之前可以先通过V$PWFILE_USERS视图查询出当前被授予SYSDBA/SYSOPER权限的用户,然后在重新生成口令文件以后重新对这些用户授予SYSDBA/SYSOPER权限 2、设置REMOTE_LOGIN_PASSWORDFILE为EXCLUSIVE或是SHARED ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE SCOPE = SPFILE ; 3、使用SYS登陆数据库,创建新的数据库用户 CREATE USER test IDENTIFIED BY test ; 4、使用GRANT命令授予新创建的用户SYSDBA/SYSOPER权限 GRANT SYSDBA TO test . 每次在Oracle系统里面使用GRANT SYSDBA/SYSOPER授予新用户特殊权限或是ALTER USER命令修改拥有SYSDBA/SYSOPER权限的用户密码的时候,Oracle都会自动的修改口令文件,增加或是修改相应的项目,这样保证在数据没有打开的情况拥有特殊权限的用户能正常的登陆数据库以进行管理操作。 实验 上面长篇大论的说了那么多,下面我们来做实验验证一下。实验都是基于Linux系统来做的,做实验之前先使用下面的命令创建一个口令文件: [oracle@RHEL4 ~]$ orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y 1、验证OS认证 设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (ALL)或是不设置,REMOTE_LOGIN_PASSWORDFILE = NONE,然后进行下面的操作。 本地使用下面两种方式登陆,都能成功 [oracle@RHEL4 dbs]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jun 7 15:06:55 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> [oracle@RHEL4 dbs]$ sqlplus aaa/bbb as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jun 7 15:16:25 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> 远程使用口令文件方式登陆,失败 D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:06:55 2008 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. ERROR: ORA-01017: invalid username/password; logon denied Enter user-name: 2、两种认证都失效 设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (NONE),REMOTE_LOGIN_PASSWORDFILE = NONE,然后进行下面的操作。 本地使用下面两种方式登陆,都失败 [oracle@RHEL4 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:22:05 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges Enter user-name: [oracle@RHEL4 ~]$ sqlplus sys/pwd as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:22:46 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied Enter user-name: 远程使用口令文件方式登陆,失败 D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:06:55 2008 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. ERROR: ORA-01017: invalid username/password; logon denied Enter user-name: 3、验证口令文件认证 设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (NONE)不设置,REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE或SHARED,然后进行下面的操作。 本地使用验证OS认证,失败 [oracle@RHEL4 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:16:56 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges Enter user-name: 本地验证口令文件认证,成功 [oracle@RHEL4 ~]$ sqlplus sys/pwd as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:26:48 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> 远程使用口令文件认证,成功 D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:21:18 2008 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SYS@192.168.0.201/orcl> 4、两种认证都成功 设置SQLNET.ORA中参数SQLNET.AUTHENTICATION_SERVICES = (ALL),REMOTE_LOGIN_PASSWORDFILE = EXCLUSIVE,然后进行下面的操作。 本地使用验证OS认证,成功 [oracle@RHEL4 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 19:30:33 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> 远程使用口令文件认证,成功 D:\Oracle\SQLPlus10.2> sqlplus sys/pwd@192.168.0.201/orcl as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 19:27:11 2008 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SYS@192.168.0.201/orcl> 5、将SYSDBA/SYSOPER权限授权给其它数据库帐户 先查看口令文件的修改时间 [oracle@RHEL4 dbs]$ ll orapworcl -rw-r----- 1 oracle oinstall 2560 Jun 7 19:04 orapworcl 用SYS登陆数据库,创建新用户test,并赋予SYSDBA权限 [oracle@RHEL4 dbs]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jun 7 21:41:36 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> SQL > create user test identified by test ; User created . SQL > grant sysdba to test ; Grant succeeded . SQL>exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options 再看口令文件,已经修改了 [oracle@RHEL4 dbs]$ ll orapworcl -rw-r----- 1 oracle oinstall 2560 Jun 7 21:42 orapworcl 再用新的test帐号登陆,能成功的登陆 D:\Oracle\SQLPlus10.2>sqlplus test/test@192.168.0.201/orcl as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Sat Jun 7 21:32:37 2008 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SYS@192.168.0.201/orcl> 说明:如果要取消SYSDBA权限只需要运行下面的语句就可以了 SQL > revoke sysdba from test ; 常见问题说明 1、如何查找拥有SYSDBA或是SYSOPER权限的用户 使用视图V$PWFILE_USERS,结果集中的SYSDB和SYSOP分别代表是否有SYSDBA和SYSOPER权限。 SQL > select * from v $ pwfile_users ; /** USERNAME SYSDB SYSOP ------------------------------ ----- ----- SYS TRUE TRUE TEST TRUE FALSE */ 2、授予权限时出现”ORA-01994: GRANT failed: password file missing or disabled” 出现这种情况是因为没有创建口令文件,或者是口令文件放置的目录不正确,Oracle找不到。只要重建或将口令文件置于$ORACLE_HOME/dbs/目录中就可以了。 3、忘记了SYS帐号的密码怎么办? 如果数据库启用的OS认证登陆,则可以用OS认证登陆数据库,然后使用下面的命令进行修改 alter user SYS identified by pwd ; 如果没有启用OS认证登陆,则需要用orapwd重建口令文件 orapwd file='$ORACLE_HOME/dbs/orapw$ORACLE_SID' password=pwd entries=10 force=y 其中的password项所指定的就是SYS的密码 参考文档 Oracle? Database Administrator’s Guide 10g Release 2 (10.2) 小议SQLNET.AUTHENTICATION_SERVICES by space6212 Oracle中password file的作用及说明 by eygle 谢谢作者: ITPUB warehousehttp://www.itpub.net/viewthread.php?tid=906008&extra=&page=11、os认证 oracle安装之后默认情况下是启用了os认证的,这里提到的os认证是指服务器端os认证。os认证的意思把登录数据库的用户和口令校验放在了操作系统一级。如果以安装oracle时的用户登录os,那么此时在登录oracle数据库时不需要任何验证,如: SQL> connect /as sysdba 已连接。 SQL> connect sys/aaa@dmt as sysdba 已连接。 SQL> connect sys/bbb as sysdba 已连接。 SQL> connect aaa/bbb as sysdba 已连接。 SQL> show user USER 为 "SYS" SQL> 不论输入什么用户(哪怕这个用户如aaa在数据库中根本不存在),只要以sysdba权限连接数据库,都可以连接上,并且连接用户是sys,这样很方便, 有时候,如果忘记了数据库的密码,而又想登录数据库,可以通过这种方式,前提是在数据库服务器上;但是方便的同时也带来了一些安全隐患,于是很多人想屏蔽 os认证,在win下只要把oracle_home/NETWORK/admin/sqlnet.ora中的 SQLNET.AUTHENTICATION_SERVICES= (nts)nts改成none或者注释掉这句话(在前面加上#),就可以屏蔽os功能,要想以sys用户连上数据库必须输入正确的sys口令,如: SQL> connect /as sysdba ERROR: ORA-01031: 权限不足 SQL> connect sys/aaa as sysdba ERROR: ORA-01017: 用户名/口令无效; 登录被拒绝 SQL> connect aaa/bbb as sysdba ERROR: ORA-01031: 权限不足 SQL> connect sys/system as sysdba 已连接。 SQL> 或者可以把oracle的安装用户从组ora_dba中删除掉,当然也可以直接把ora_dba这个组也删除,都可以屏蔽os功能。在 unix/linux下也可以在文件sqlnet.ora中增加SQLNET.AUTHENTICATION_SERVICES=(none)以及删除 dba(groupdel dba)组或者把oracle用户从dba组中删除都可以屏蔽os认证。利用这两种方法屏蔽os功能似乎总有些让人不放心,或者说不能让人完全信服,因为 毕竟系统管理员还是可以创建ora_dba or dba组以及修改sqlnet.ora文件,如何彻底屏蔽os功能?让它"永世不得翻身"呢?我没有这方面的经验, 大家可以补充! 2、口令文件 oracle的口令文件的作用是存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使 用口令文件,否则不能连上,由于sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说sys用户要想连接数据库必须使用口令文件,因此我认为在数据库中存放sys用户的口令其实没有任何意义!使用口令文件的好 处是即使数据库不处于open状态,依然可以通过口令文件验证来连接数据库。开始安装完oracle,没有给普通用户授予sysdba权限,口令文件中只 存放了sys的口令,如果之后把sysdba权限授予了普通用户,那么此时会把普通用户的口令从数据库中读到口令文件中保存下来,当然这时必须要求数据库 处于open状态。如: SQL> grant sysdba to test; 授权成功。 SQL> connect test/aaa@orcl as sysdba ERROR: ORA-01017: 用户名/口令无效; 登录被拒绝 警告: 您不再连接到 ORACLE。 SQL> connect test/test@orcl as sysdba 已连接。 SQL> alter database close; 数据库已更改。 SQL> grant sysdba, sysoper to test; grant sysdba, sysoper to test * 第 1 行出现错误: ORA-01109: 数据库未打开 到底有几个用户被授予了sysdba或者sysoper权限,可以通过查询如下v$pwfile_users获得,v$pwfile_users的信息就 是源于口令文件的(This view lists users who have been granted SYSDBA and SYSOPER privileges as derived from the password file.) SQL> select * from v$pwfile_users; USERNAME SYSDB SYSOP ------------------------------ ----- ----- SYS TRUE TRUE TEST TRUE FALSE 到底可以有几个用户被授予sysdba或者sysoper权限,是由创建口令文件时指定的entries数决定的,准确的说还不完全是,最终还和os block的大小有关,如果entries指定了5,一个os block可以存放8个用户的口令,那么可以由8个用户被授予sysdba或者sysoper。 下面看一个简单的测试: SQL> declare 2 v_string varchar2(100); 3 begin 4 for i in 1..100 loop 5 v_string := 'create user test'||i||' identified by test'||i; 6 execute immediate v_string ; 7 end loop; 8 end; 9 / PL/SQL 过程已成功完成。 SQL> select count(*) from dba_users where username like '%TEST%'; COUNT(*) ---------- 101 这里之所以是101,是因为之前已经创建过test用户 SQL> declare 2 v_string varchar2(100); 3 begin 4 for i in 1..100 loop 5 v_string := 'grant sysdba to test'||i; 6 execute immediate v_string ; 7 end loop ; 8 end ; 9 / declare * 第 1 行出现错误: ORA-01996: GRANT 失败: 口令文件 '' 已满 ORA-06512: 在 line 6 SQL> select * from v$pwfile_users; USERNAME SYSDB SYSOP ------------------------------ ----- ----- SYS TRUE TRUE TEST1 TRUE FALSE TEST2 TRUE FALSE TEST3 TRUE FALSE TEST4 TRUE FALSE TEST5 TRUE FALSE TEST6 TRUE FALSE TEST7 TRUE FALSE TEST8 TRUE FALSE 已选择9行。 SQL> 可以清楚的看到v$pwfile_users里面并不是创建口令文件时指定的entries=5而是9条记录,意味着9个用户的口令占用了一个os block,其实也可能是多个os block,总之这些block都是满的,但是观察口令文件,还是占了2k,这是我解释不清的地方。通过os命令发现;每个簇字节数4096;这里其实就 是os block 大小实际上是4k,但是口令文件占用了2k,根本没有用满一个os block,不知道何故,也是我的疑惑 ( This parameter specifies the number of entries that you require the password file to accept. This number corresponds to the number of distinct users allowed to connect to the database as SYSDBA or SYSOPER. The actual number of allowable entries can be higher than the number of users, because the ORAPWD utility continues to assign password entries until an operating system block is filled. For example, if your operating system block size is 512 bytes, it holds four password entries. The number of password entries allocated is always a multiple of four. ) win下查看os block大小 C:\WINDOWS\system32>fsutil fsinfo ntfsinfo e: NTFS 卷序列号 : 0x12afb454f6e54b31 版本 : 3.1 区数量 : 0x00000000040270d0 簇总数 : 0x0000000000804e1a 可用簇 : 0x00000000000b8d41 保留总数 : 0x0000000000000000 每个扇区字节数 : 512 每个簇字节数 : 4096 每个 FileRecord 段的字节数 : 1024 每个 FileRecord 段的簇数 : 0 Mft 有效数据长度 : 0x00000000058d0000 Mft 起始 Lcn : 0x0000000000000004 Mft2 起始 Lcn : 0x0000000000080000 Mft 区域起始 : 0x0000000000483740 Mft 区域结尾 : 0x000000000049c760 C:WINDOWS\system32> 还有一个问题修改了口令,口令长度增加了,按说占用的空间多了,但是查询v$pwfile_users发现还是9条记录?不过这个问题突然想到了答案,那 就是不论我们的口令多长,加密之后的长度几乎都是相同的,也就是说口令文件占用的大小和口令指定的长度几乎关系不大! SQL> edit 已写入 file afiedt.buf 1 declare 2 v_string varchar2(100); 3 begin 4 for i in 1..100 loop 5 v_string := 'alter user test'||i||' identified by aaaaaaaaaaaaaaaaaaaaaa'||i; 6 execute immediate v_string ; 7 end loop ; 8* end ; SQL> / PL/SQL 过程已成功完成。 SQL> declare 2 v_string varchar2(100); 3 begin 4 for i in 1..100 loop 5 v_string := 'grant sysdba to test'||i; 6 execute immediate v_string ; 7 end loop ; 8 end ; 9 / declare * 第 1 行出现错误: ORA-01996: GRANT 失败: 口令文件 '' 已满 ORA-06512: 在 line 6 SQL> select * from v$pwfile_users; USERNAME SYSDB SYSOP ------------------------------ ----- ----- SYS TRUE TRUE TEST1 TRUE FALSE TEST2 TRUE FALSE TEST3 TRUE FALSE TEST4 TRUE FALSE TEST5 TRUE FALSE TEST6 TRUE FALSE TEST7 TRUE FALSE TEST8 TRUE FALSE 已选择9行。 SQL> E:\oracle\product\10.2.0\db_1\data\base>orapwd file=E:\oracle\product\10.2.0\db_1 databasepwd.ora password=system entries=5 OPW-00005: 存在相同名称的文件 - 请删除或重命名 E:\oracle\product\10.2.0\db_1\data\base>orapwd file=E:oracleproduct10.2.0db_1 databasepwd.ora password=system entries=5 force=y 创建口令文件需要注意的是=前后没有空格!另外值得一提的是10g增加了一个新的参数force default值n,它的作用类似于创建表空间时的reuse功能,当同名文件存在时是否覆盖。 是否使用口令文件,是通过oracle提供的一个参数remote_login_passwordfile来控制的, remote_login_passwordfile有none,shared,exclusive3个值,none表示不使用口令文件, exclusive表示实例独占使用口令文件,也就是各自实例使用单独的口令文件,shared表示多个实例共享一个口令文件,缺省情况下,win下口令 文件的格式是pwdsid.ora,unix下的格式是orapwSID(大小写敏感),unix下寻找口令文件的顺序是oracle_home\dbs \orapwSID,如果找不到,会在dbs目录想寻找orapw文件,如果找不到9i下会报错,数据库可以启动到mount状态,当然再次alter database open之后还是可以打开数据库。10g下open数据库时不在检查口令文件。win下如果在oracle_home/database/下找不到 pwdsid.ora文件,不会寻找任何文件。这里所说的win下如果找不到PWDsid.ora文件之后不会寻找任何文件其实是相对unix下如果找不 到orapwSID文件之后会寻找orapw文件而言的。其实win下寻找口令文件也是有顺序的。寻找顺序是这样的:首先寻找注册表中 ora_sid_pwfile环境变量所指向的口令文件,其次寻找ora_pwfile执行的口令文件,最后才寻找$ ORACLE_HOME/database/PWDsid.ora,下面做一个简单的测试: 开始存在一个口令文件PWDtsid.ora,之后又创建了两个口令文件pwd.ora和orapwd.ora C:>orapwd file=E:\oracle\product\10.2.0\db_1\databasepwd.ora password=manager entries=5 force=y C:>orapwd file=E:\oracle\product\10.2.0\db_1\databaseorapwd.ora password=manager_system entries=5 C:>e: E:>cd E:\oracle\product\10.2.0\db_1\database E:\oracle\product\10.2.0\db_1\database>dir *pwd* 驱动器 E 中的卷没有标签。 卷的序列号是 F6E5-4B31 E:\oracle\product\10.2.0\db_1\database 的目录 2007-12-07 21:30 2,048 orapwd.ora 2007-12-07 21:29 2,048 pwd.ora 2007-12-06 21:44 2,048 PWDtsid.ora 3个口令文件的口令分别是system, manager, system_manager没有什么特别的意义,都是随意指定的,其中在注册表中ora_tsid_pwfile指向了文件E:\oracle\ product\10.2.0\db_1\databasepwd.ora,ora_pwfile指向了E:\oracle\product \10.2.0\db_1\databaseorapwd.ora,然后通过远程client端进行测试: SQL> connect sys/system@testdb as sysdba ERROR: ORA-01017: 用户名/口令无效; 登录被拒绝 警告: 您不再连接到 ORACLE。 SQL> connect sys/manager@testdb as sysdba 已连接。 SQL> connect sys/manager_system@testdb as sysdba ERROR: ORA-01017: 用户名/口令无效; 登录被拒绝 警告: 您不再连接到 ORACLE。 SQL> 测试结果显示要求输入的口令是manager,而manager对应的口令文件是环境变量ora_tsid_pwfile所指向的pwd.ora,之后删除环境变量ora_tsid_pwfile再次连接: SQL> connect sys/system@testdb as sysdba ERROR: ORA-01017: 用户名/口令无效; 登录被拒绝 警告: 您不再连接到 ORACLE。 SQL> connect sys/manager_system@testdb as sysdba 已连接。 SQL> 这次要求输入的口令是manager_system,而manager_system对应的口令文件是环境变量ora_pwfile所指向的orapwd.ora,之后删除环境变量ora_pwfile进行连接测试: SQL> connect sys/system@testdb as sysdba 已连接。 SQL> 连接成功,system对应的口令文件正是$ORACLE_HOME/database/PWDtsid.ora 接着上面介绍共享口令文件,由于在unix下会寻找orapw文件(该文件不含sid的信息),因此各个实例可以shared口令文件,前提是需要把参数 remote_login_passwordfile设置为shared,该参数是静态参数,修改之后需要重启实例,当然也可以通过连接的方式(unix 下ls)实现口令文件共享,不过没感觉到共享口令文件有什么好处;win下可以通过在注册表中指定环境变量ora_sid_pwfile或者 ora_pwfile来改变口令文件的位置和名称,从而也可以实现口令文件共享。 共享口令文件会有很多问题: 首先要求所有的sys口令相同,其次orcl库上的用户xys被授予了sysdba,结果在test1库上通过v$pwfile_users也可以看到xys用户。 SQL> connect sys/system as sysdba ERROR: ORA-01017: invalid username/password; logon denied SQL> connect sys/manager as sysdba 已连接到空闲例程。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1247900 bytes Variable Size 62915940 bytes Database Buffers 100663296 bytes Redo Buffers 2945024 bytes 数据库装载完毕。 数据库已经打开。 SQL> alter user sys identified by system; 用户已更改。 SQL> show user USER 为 SYS; SQL> show parameter db_name NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_name string test1 SQL> select * from v$pwfile_users; USERNAME SYSDB SYSOP ------------------------------ ----- ----- SYS TRUE TRUE XYS TRUE FALSE SQL> select username from dba_users; USERNAME ------------------------------ OUTLN SYS SYSTEM TEST DBSNMP TSMSYS DIP 已选择7行。 从上面查询结果看到数据库orcl和test1,准确的说是实例共享了口令文件之后,test1中根本不存在用户xys,但是通过v$pwfile_users还是查询出来了 还有一个问题是如果remote_login_passwordfile=shared则sys的口令通过 alter user...不能修改! SQL> show parameter remote_log NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ remote_login_passwordfile string SHARED SQL> alter user sys identified by manager; alter user sys identified by manager * 第 1 行出现错误: ORA-28046: 不允许更改 SYS 口令 提到alter user...这个系统权限,我觉得oracle做的不是很安全,只要有了alter user权限,sys用户的口令可以随意修改 ,另外凡是修改具有sysdba or sysoper权限的用户,如果通过alter user来修改口令,那么同时修改了口令文件和数据库中的口令。 简单的测试如下: SQL> create user test11 identified by test11; 用户已创建。 SQL> grant connect , alter user to test11; 授权成功。 SQL> connect test11/test11 已连接。 SQL> CONNECT / as sysdba 已连接。 SQL> grant select on dba_users to test11; 授权成功。 SQL> connect test11/test11 已连接。 SQL> col username format a10 SQL> col password format a30 SQL> select password , username from dba_users where username ='SYS'; PASSWORD USERNAME ------------------------------ ---------- 75800913E1B66343 SYS SQL> show user USER 为 TEST11; SQL> alter user sys identified by manager; 用户已更改。 SQL> select password , username from dba_users where username ='SYS'; PASSWORD USERNAME ------------------------------ ---------- 5638228DAF52805F SYS SQL> remote_login_passwordfile=shared时,也不能把sysdba or sysoper授予普通用户! SQL> grant sysdba to test; grant sysdba to test * 第 1 行出现错误: ORA-01999: 口令文件不能在 SHARED 模式下更新 SQL> grant sysoper to test; grant sysoper to test * 第 1 行出现错误: ORA-01999: 口令文件不能在 SHARED 模式下更新 通过上面两部分内容的解释,了解了os认证和口令文件之后,如果为了安全不想让用户以sysdba or sysoper权限连接数据库,可以通过上面的方法屏蔽os认证的同时静止使用口令文件。 3、sysdba 和 sysoper 很多人可能不了解sysdba and sysoper到底是什么,其实他们是oracle的system privilege,通过查询系统权限表system_privilege_map可以清楚的知道: SQL> select name from system_privilege_map where name like 'SYS%'; NAME ---------------------------------------------------------------------------- SYSOPER SYSDBA 只不过这两个权限就是以这种方式发挥作用的! 两种权限的比较在oracle doc上给出了明确的交代: The following operations are authorized by the SYSDBA and SYSOPER system privileges: System Privilege Operations Authorized SYSDBA Perform. STARTUP and SHUTDOWN operations ALTER DATABASE: open, mount, back up, or change character set CREATE DATABASE DROP DATABASE CREATE SPFILE ALTER DATABASE ARCHIVELOG ALTER DATABASE RECOVER Includes the RESTRICTED SESSION privilege Effectively, this system privilege allows a user to connect as user SYS. SYSOPER Perform. STARTUP and SHUTDOWN operations CREATE SPFILE ALTER DATABASE OPEN/MOUNT/BACKUP ALTER DATABASE ARCHIVELOG ALTER DATABASE RECOVER (Complete recovery only. Any form. of incomplete recovery, such as UNTIL TIME|CHANGE|CANCEL|CONTROLFILE requires connecting as SYSDBA.) Includes the RESTRICTED SESSION privilege This privilege allows a user to perform. basic operational tasks, but without the ability to look at user data. 值的一提的是win下尤其是home版的xp控制面板中没有组的可操作界面,而oracle默认安装之后也没有为我们创建ora_oper 这个组,因此在以sysoper权限连接数据库时提示没有权限: SQL> connect / as sysoper ERROR: ORA-01031: 权限不足 为了能够以sysoper方式连接数据库,于是可以通过dos命令方式创建ora_oper组,同时把os用户加入到这个组中: E:>net localgroup ora_oper /add 命令成功完成。 E:>net localgroup ora_oper wch /add 命令成功完成。 有关localgroup的详细说明可以通过命令net help localgroup获得更多的帮助,注意和group的区别,group用在domain中 再次尝试接连,连接成功: SQL> connect / as sysoper 已连接。 SQL> show user USER 为 PUBLIC; SQL> 但是需要注意的是以sysoper权限连接数据库时显示的schema是public,而以sysdba连接时显示的schema是我们众所周知的sys,这也是sysdba和sysoper的区别之一。 同时需要注意的是在linux下默认是可以以sysoper 连接数据库的: [oracle@xys oracle]$ sqlplus /nolog SQL*Plus: Release 11.1.0.6.0 - Production on Fri Dec 7 23:52:49 2007 Copyright (c) 1982, 2007, Oracle. All rights reserved. SQL> connect / as sysoper Connected to an idle instance. SQL> create user wch identified externally; 用户已创建。 SQL> grant create session to wch; 授权成功。 SQL> show parameter auth NAME TYPE VALUE ------------------------------------ ----------- ------------------------- os_authent_prefix string OPS$ remote_os_authent boolean FALSE SQL> col username format a10 SQL> col password format a30 SQL> select username , password from dba_users where username='WCH'; USERNAME PASSWORD ---------- ------------------------------ WCH EXTERNAL SQL> connect / ERROR: ORA-01017: 用户名/口令无效; 登录被拒绝 警告: 您不再连接到 ORACLE。 SQL>使用普通用户os认证的好处是可以在执行一些批处理脚本时屏蔽数据库连接用户的口令,如exp ,expdp . sqlldr等 © >>>>>>>>>> &
在Oracle中,如何判断一个字符串是否为数字? 可以有2种办法来判断,第一种办法为REPLACE加TRANSLATE函数,在程序中可以直接使用“TRANSLATE(REPLACE('入参','.',''),'/1234567890','/') IS NULL”来判断入参为数字,缺点是,若入参有2个小数点或含有加减号则不能判断。第二种办法为使用TO_NUMBER或REGEXP_LIKE来自定义函数进行判断。 第一种办法示例: SYS@PROD1> SELECT 2 NVL2(TRANSLATE(REPLACE('12','.',''),'/1234567890','/'),'CHAR','NUMBER') IN_TYPE, 3 NVL2(TRANSLATE(REPLACE('12.34','.',''),'/1234567890','/'),'CHAR','NUMBER') IN_TYPE2, 4 NVL2(TRANSLATE(REPLACE('12.Mabcd','.',''),'/1234567890','/'),'CHAR','NUMBER') IN_TYPE3 5 FROM DUAL; IN_TYP IN_TYP IN_T ------ ------ ---- NUMBER NUMBER CHAR 第二种办法示例: 1. 利用 to_number CREATE OR REPLACE FUNCTION ISNUMERIC(STR IN VARCHAR2) RETURN NUMBER IS V_STR FLOAT; BEGIN IF STR IS NULL THEN RETURN 0; ELSE BEGIN SELECT TO_NUMBER(STR) INTO V_STR FROM DUAL; EXCEPTION WHEN INVALID_NUMBER THEN RETURN 0; END; RETURN 1; END IF; END ISNUMERIC; 2. 利用 ISNUMERIC CREATE OR REPLACE FUNCTION ISNUMERIC(STR IN VARCHAR2) RETURN NUMBER IS BEGIN IF STR IS NULL THEN RETURN 0; ELSE IF REGEXP_LIKE(STR, '(^[+-]?\d{0,}\.?\d{0,}$)') THEN RETURN 1; ELSE RETURN 0; END IF; END IF; END ISNUMERIC; 3. 利用 TRANSLATE CREATE OR REPLACE FUNCTION ISNUMERIC(STR IN VARCHAR2) RETURN NUMBER IS V_STR VARCHAR2(1000); BEGIN IF STR IS NULL THEN RETURN 0; ELSE V_STR := TRANSLATE(STR, '.0123456789', '.'); IF V_STR = '.' OR V_STR = '+.' OR V_STR = '-.' OR V_STR IS NULL THEN RETURN 1; ELSE RETURN 0; END IF; END IF; END ISNUMERIC; About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2017-11-01 09:00 ~ 2017-11-30 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
利用闪回数据库(flashback)修复Failover后的DG环境 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Failover后DG环境的恢复方法(重点) ② DG的基本维护操作 ③ GC客户端软件的安装 ④ 利用GC快速搭建一套DG环境 ⑤ Failover和Switchover的区别 ⑥ 其它维护操作 Tips: ① 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)上有同步更新。 ② 文章中用到的所有代码、相关软件、相关资料及本文的pdf版本都请前往小麦苗的云盘下载,小麦苗的云盘地址见:http://blog.itpub.net/26736162/viewspace-1624453/。 ③ 若网页文章代码格式有错乱,请下载pdf格式的文档来阅读。 ④ 在本篇BLOG中,代码输出部分一般放在一行一列的表格中。 ⑤ 本文适合于初中级人员阅读,数据库大师请略过本文。 ⑥ 不喜勿喷。 本文若有错误或不完善的地方请大家多多指正,您的批评指正是我写作的最大动力。 1.3 本文简介 10月23和24日考完了OCM,感觉过关的法则就是“真题+多练”,练习过10来遍,基本就可以考过了。OCM的考试内容除了GC这块小麦苗没有接触过,其它内容基本都算熟。基本命令熟记于心,不熟的命令可以立马找到官方文档,善用OEM和SQL Developer工具。所以,想快速通过OCM考试的朋友可以私下联系小麦苗,小麦苗会把自己的经验全都教给大家。 好了,废话不多说了。最近小麦苗的DBA宝典微信群里,有朋会友问到了Failover操作后,如何恢复到最初的DG环境。这个问题,小麦苗大概知道利用闪回可以实现,只是没有做过实验,或者曾经做过实验,只是没有记录文档,反正就是年纪大了,想不起来了。好吧,最近就抽个时间把这个实验做一遍。有不对的地方,依然请大家指出。 1.4 相关知识点扫盲 ① 物理DG的Switchover切换:http://blog.itpub.net/26736162/viewspace-1753111/ ② 物理DG的Failover切换:http://blog.itpub.net/26736162/viewspace-1753130/ ③ 利用闪回数据库(flashback)修复Failover后的DG环境:http://blog.itpub.net/26736162/viewspace-2146883/ ④ Switchover和Failover的区别:http://blog.itpub.net/26736162/viewspace-2141207/ ------------------------------------------------------------------------- 第二章 实验准备 2.1 实验环境介绍 实验环境为练习OCM的虚拟机环境: 项目 Source DB Target DB DB 类型 单机 单机 DB VERSION 11.2.0.3.0 11.2.0.3.0 DB 存储 FS FS OS版本及kernel版本 OEL linux 5.4 32 OEL linux 5.4 32 DB_NAME PROD1 PROD1 ORACLE_SID PROD1 SBDB1 ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1 /u01/app/oracle/product/11.2.0/db_1 hosts文件 10.190.104.111 edsir4p1.us.oracle.com edsir4p1 10.190.104.28 edsir1p8.us.oracle.com edsir1p8 2.2 实验目标 备库执行FAILOVER后,通过闪回数据库技术重新恢复DG环境,而不用重新搭建DG。 2.3 实验过程 2.4 利用GC快速搭建DG环境 小麦苗手头的DG环境是在一个主机上,测试多有不便,刚好,最近练习OCM的环境还在,就用练习OCM的环境来做这个实验吧。若已经有DG环境的朋友可以略过该小节内容。 2.4.1 安装GC客户端软件 1、起动GC服务器,首先确保EMREP数据库处于OPEN状态,监听也已经启动,GC服务器启动日志为:/u01/app/gc_inst/em/EMGC_OMS1/sysman/log/emctl.log cd /u01/app/oracle/Middleware/oms11g/bin ./emctl start oms [oracle@edsir1p8- ~]$ ps -ef|grep pmon oracle 4763 1 0 00:53 ? 00:00:00 ora_pmon_EMREP oracle 11802 11633 0 01:39 pts/2 00:00:00 grep pmon [oracle@edsir1p8- ~]$ cd /u01/app/ gc_inst/ Middleware/ oracle/ oraInventory/ [oracle@edsir1p8- ~]$ cd /u01/app/Middleware/oms11g/bin [oracle@edsir1p8- bin]$ ./emctl start oms Oracle Enterprise Manager 11g Release 1 Grid Control Copyright (c) 1996, 2010 Oracle Corporation. All rights reserved. Starting WebTier... WebTier Successfully Started Starting Oracle Management Server... Oracle Management Server Successfully Started AdminServer Could Not Be Started Oracle Management Server is Up [oracle@edsir1p8- bin]$ more /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost 10.190.104.28 edsir1p8.us.oracle.com edsir1p8 10.190.104.111 edsir4p1.us.oracle.com edsir4p1 [oracle@edsir1p8- bin]$ ./emctl status oms -details Oracle Enterprise Manager 11g Release 1 Grid Control Copyright (c) 1996, 2010 Oracle Corporation. All rights reserved. Enter Enterprise Manager Root (SYSMAN) Password : Console Server Host : edsir1p8.us.oracle.com HTTP Console Port : 7788 HTTPS Console Port : 7799 HTTP Upload Port : 4889 HTTPS Upload Port : 4900 OMS is not configured with SLB or virtual hostname Agent Upload is locked. OMS Console is locked. Active CA ID: 1 2、安装agent https://10.190.104.28:4900/agent_download/ 从这里下载 右键保存到桌面。 a、在需要安装agent的机器上mkdir /u01/app/agentbase 创建目录,并将agentDownload.linux文件cp到/u01/app/agentbase目录下,并且赋予可执行权限。 b、在服务端OMS启动的情况下,在客户端执行: ./agentDownload.linux -b /u01/app/agentbase -m edsir1p8.us.oracle.com -r 7799 -y 安装过程中要输入偶数机上OMS的密码 c、安装完成要用root执行: [root@edsir4p1 ~]# sudo /u01/app/agentbase/agent11g/root.sh 没有root密码要使用sudo执行,注意:一定要执行该脚本,它会设置一些文件的权限(该脚本会把$AGENT_HOME/bin/nm*的几个文件的所有者修改为root。)。如果不执行,那么搭建DG可能会报错:“ERROR: NMO not setuid-root (Unix-only)” d、进入/u01/app/agentbase/agent11g/bin ./emctl status agent 检查同步状态 ./emctl upload agent 上传同步 ./emctl secure agent 重新注册agent,用于安装时密码输错 过程如下所示: [oracle@edsir4p1-PROD2 ~]$ mkdir -p /u01/app/agentbase [oracle@edsir4p1-PROD2 ~]$ cd /u01/app/agentbase [oracle@edsir4p1-PROD2 agentbase]$ cp /home/oracle/Desktop/agentDownload.linux . [oracle@edsir4p1-PROD2 agentbase]$ chmod +x agentDownload.linux [oracle@edsir4p1-PROD2 agentbase]$ ll total 40 -rwxr-xr-x 1 oracle oinstall 38525 Nov 6 01:46 agentDownload.linux [oracle@edsir4p1-PROD2 agentbase]$ ./agentDownload.linux agentDownload.linux invoked on Mon Nov 6 01:46:55 UTC 2017 with Arguments "" agentDownload.linux: Invalid Invocation Usage: agentDownload.linux -b[cdhimnoprtuvxyNR] b - Base installation location for Agent Oracle home d - Do NOT initiate automatic target discovery h - Usage (this message) i - Inventory pointer location file l - To specify as local host (pass -local to runInstaller) m - Management Service host name for downloading the Management Agent software n - Cluster name o - Old Oracle Home location during Upgrade p - Static port list file r - Port for connecting to the Management Service host t - Do NOT start the Agent u - Upgrade v - Inventory directory location x - Debug output c - CLUSTER_NODES N - Do NOT prompt for Agent Registration Password R - To use virtual hostname(ORACLE_HOSTNAME) for this installation. If this is being used along with more than one cluster nodes through -c option, then -l option also needs to be passed. y - Decline Security Updates. [oracle@edsir4p1-PROD2 agentbase]$ ./agentDownload.linux -b /u01/app/agentbase -m edsir1p8.us.oracle.com -r 7799 -y agentDownload.linux invoked on Mon Nov 6 01:49:01 UTC 2017 with Arguments "-b /u01/app/agentbase -m edsir1p8.us.oracle.com -r 7799 -y" Platform=Linux.i686, OS=linux GetPlatform:returned=0, and os is set to: linux, platform=Linux.i686 Creating /u01/app/agentbase/agentDownload11.1.0.1.0Oui ... LogFile for this Download can be found at: "/u01/app/agentbase/agentDownload11.1.0.1.0Oui/agentDownload.linux110617014901.log" Running on Selected Platform: Linux.i686 Installer location: /u01/app/agentbase/agentDownload11.1.0.1.0Oui Downloading Agent install response file ... Downloading Agent install response file ... Executing wget_get_file 。。。。。。。。。。省略部分。。。。。。 Finished Downloading agent_download.rsp with Status=0 Response file check Complete - Success Checking the writable permission for baseDir - passed Provide the Agent Registration password so that the Management Agent can communicate with Secure Management Service. Note: You may proceed with the installation without supplying the password; however, Management Agent can be secured manually after the installation. If Oracle Management Service is not secured, agent will not be secured, so continue by pressing Enter Key. Enter Agent Registration Password: <<<<=输入密码 Downloading Oracle Installer ... Executing wget_get_file https://edsir1p8.us.oracle.com:7799/agent_download/11.1.0.1.0/linux/oui/oui_linux.jar using the url https://edsir1p8.us.oracle.com:7799/agent_download/11.1.0.1.0/ to access OMS 。。。。。。。。。。省略部分。。。。。。 Configuration assistant "Agent Configuration Assistant" Succeeded AgentPlugIn:agent configuration finished with status = true Running Configuration assistant "Agent Add-on Plug-in" Configuration assistant "Agent Add-on Plug-in" Succeeded Querying Agent status: Agent is running Removing the copied stuff..... Removed: /u01/app/agentbase/agentDownload11.1.0.1.0Oui/oui_linux.jar Removed: /u01/app/agentbase/agentDownload11.1.0.1.0Oui/agent_download.rsp Removed:/u01/app/agentbase/agentDownload11.1.0.1.0Oui/Disk1 Log name of installation can be found at: "/u01/app/agentbase/agentDownload.linux110617014901.log" /u01/app/agentbase/agent11g/root.sh needs to be executed by root to complete this installation. [oracle@edsir4p1-PROD2 agentbase]$ sudo /u01/app/agentbase/agent11g/root.sh [oracle@edsir4p1-PROD2 agentbase]$ ll total 80 drwxr-xr-x 40 oracle oinstall 4096 Nov 6 01:53 agent11g drwxr-xr-x 2 oracle oinstall 4096 Nov 6 01:53 agentDownload11.1.0.1.0Oui -rwxr-xr-x 1 oracle oinstall 38525 Nov 6 01:46 agentDownload.linux -rw-r--r-- 1 oracle oinstall 78 Nov 6 01:46 agentDownload.linux110617014655.log -rw-r--r-- 1 oracle oinstall 24908 Nov 6 01:53 agentDownload.linux110617014901.log [oracle@edsir4p1-PROD2 agentbase]$ cd agent11g/bin/ [oracle@edsir4p1-PROD2 bin]$ ./emctl status agent Oracle Enterprise Manager 11g Release 1 Grid Control 11.1.0.1.0 Copyright (c) 1996, 2010 Oracle Corporation. All rights reserved. --------------------------------------------------------------- Agent Version : 11.1.0.1.0 OMS Version : 11.1.0.1.0 Protocol Version : 11.1.0.0.0 Agent Home : /u01/app/agentbase/agent11g Agent binaries : /u01/app/agentbase/agent11g Agent Process ID : 26954 Parent Process ID : 26914 Agent URL : https://edsir4p1.us.oracle.com:3872/emd/main/ Repository URL : https://edsir1p8.us.oracle.com:4900/em/upload Started at : 2017-11-06 01:53:15 Started by user : oracle Last Reload : 2017-11-06 01:53:15 Last successful upload : 2017-11-06 01:55:13 Total Megabytes of XML files uploaded so far : 17.86 Number of XML files pending upload : 0 Size of XML files pending upload(MB) : 0.00 Available disk space on upload filesystem : 83.54% Last successful heartbeat to OMS : 2017-11-06 01:57:20 --------------------------------------------------------------- Agent is Running and Ready [oracle@edsir4p1-PROD2 bin]$ 2.4.2 使用GC快速搭建物理备库 从浏览器打开https://10.190.104.28:7799/em/,使用sysman用户进行登录。 使用sys用户登录PROD1数据库。 等待大约10分钟即可自动完成DG的搭建和配置工作。期间,可以查看主库和备库的告警日志以及数据文件夹的大小来预估搭建完成时间。 创建完成后: 2.4.3 启用实时应用 2.5 开启主备库闪回 主库: SQL> select name, open_mode, database_role, flashback_on from v$database; NAME OPEN_MODE DATABASE_ROLE FLASHBACK_ON --------- -------------------- ---------------- ------------------ PROD1 READ WRITE PRIMARY NO SQL> select INSTANCE_NAME,INSTANCE_ROLE from v$instance; INSTANCE_NAME INSTANCE_ROLE ---------------- ------------------ PROD1 PRIMARY_INSTANCE 备库: SQL> select name, open_mode, database_role, flashback_on from v$database; NAME OPEN_MODE DATABASE_ROLE FLASHBACK_ON --------- -------------------- ---------------- ------------------ PROD1 READ ONLY WITH APPLY PHYSICAL STANDBY NO SQL> select INSTANCE_NAME,INSTANCE_ROLE from v$instance; INSTANCE_NAME INSTANCE_ROLE ---------------- ------------------ SBDB1 PRIMARY_INSTANCE 主库开启闪回: SQL> alter database flashback on; Database altered. SQL> select name, open_mode, database_role, flashback_on from v$database; NAME OPEN_MODE DATABASE_ROLE FLASHBACK_ON --------- -------------------- ---------------- ------------------ PROD1 READ WRITE PRIMARY YES SQL> select oldest_flashback_scn, to_char(oldest_flashback_time,'yyyy-mm-dd HH24:mi:ss') oldest_flashback_time from v$flashback_database_log; OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI -------------------- ------------------- 867005 2017-11-06 02:55:59 SQL> show parameter flashback NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_flashback_retention_target integer 1440 ====>参数db_flashback_retention_target控制闪回时间范围,数字单位是分钟,默认为1天。这个数字决定了闪回的时间范围,如果设置更长的时间,对应的闪回日志文件大小就会比较大一些。 告警日志: Mon Nov 06 02:55:55 2017 alter database flashback on Starting background process RVWR Mon Nov 06 02:55:56 2017 RVWR started with pid=37, OS id=1096 Allocated 3981204 bytes in shared pool for flashback generation buffer Flashback Database Enabled at SCN 867006 Completed: alter database flashback on 此时,备库并没有开启闪回,需要在备库上手动开启闪回: SQL> alter database flashback on; alter database flashback on * ERROR at line 1: ORA-01153: an incompatible media recovery is active SQL> recover managed standby database cancel; Media recovery complete. SQL> alter database flashback on; Database altered. SQL> select name, open_mode, database_role, flashback_on from v$database; NAME OPEN_MODE DATABASE_ROLE FLASHBACK_ON --------- -------------------- ---------------- ------------------ PROD1 READ ONLY PHYSICAL STANDBY YES SQL> alter database recover managed standby database using current logfile disconnect from session; Database altered. 第三章 实验1 实验1、PROD1意外宕机,SBDB1执行Failover操作变为主库;然后将PROD1利用闪回数据库功能闪回到SBDB1变为主库的SCN时间点,然后将PROD1转换为备库,最后利用switchover转换为最初的环境。<===PROD1需要开启闪回 3.1 Failover操作 切换之前确保监听使用静态监听、fal_client、fal_server、log_archive_dest_1和log_archive_dest_2参数已正确配置。 主库操作: SYS@PROD1> select dbid,name,current_scn,protection_mode,protection_level,database_role,force_logging,open_mode,switchover_status from v$database; DBID NAME CURRENT_SCN PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE FOR OPEN_MODE SWITCHOVER_STATUS ---------- ---------- ----------- -------------------- -------------------- ---------------- --- -------------------- -------------------- 2177200393 PROD1 868787 MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PRIMARY YES READ WRITE TO STANDBY SYS@PROD1> create table test_bylhr as select * from dba_objects; Table created. SYS@PROD1> insert into test_bylhr select * from test_bylhr; 72459 rows created. SYS@PROD1> commit; Commit complete. SYS@PROD1> select count(1) from test_bylhr; COUNT(1) ---------- 144918 SYS@PROD1> shutdown abort ORACLE instance shut down. 备库操作: SYS@SBDB1> select count(1) from test_bylhr; COUNT(1) ---------- 144918 SYS@SBDB1> alter database recover managed standby database cancel; Database altered. SYS@SBDB1> alter database recover managed standby database finish; Database altered. SYS@SBDB1> set line 9999 SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG READ ONLY PHYSICAL STANDBY SESSIONS ACTIVE SBDB1 SYS@SBDB1> alter database commit to switchover to primary with session shutdown; Database altered. SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG MOUNTED PRIMARY NOT ALLOWED SBDB1 SYS@SBDB1> alter database open; Database altered. 3.2 Primary重新加入 Failover后的Primary数据库,实际上已经失去了和DG的关联,如果Primary故障严重,是难以保障对应的归档数据可以顺利传输的。如果希望Primary重新回到DG环境,关键就是恢复的时间点。要求Primary回到Standby切换角色的那个时间点,理论上就可以“延续”操作。 3.2.1 查询原备库变为新主库的SCN 在原备库端,查看v$database视图,可以看到这个库成为primary的具体时间。 SYS@SBDB1> select STANDBY_BECAME_PRIMARY_SCN from v$database; STANDBY_BECAME_PRIMARY_SCN -------------------------- 869428 SYS@SBDB1> create table test_bylhr2 as select * from dba_objects where rownum<=1000; Table created. SYS@SBDB1> alter system switch logfile; System altered. SYS@SBDB1> select count(1) from test_bylhr2; COUNT(1) ---------- 1000 SYS@SBDB1> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 869833 3.2.2 原主库执行闪回操作 SYS@PROD1> startup mount ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 247467096 bytes Database Buffers 58720256 bytes Redo Buffers 6336512 bytes Database mounted. SYS@PROD1> flashback database to scn 869428; Flashback complete. SYS@PROD1> select dbid,name,current_scn,protection_mode,protection_level,database_role,force_logging,open_mode,switchover_status from v$database; DBID NAME CURRENT_SCN PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE FOR OPEN_MODE SWITCHOVER_STATUS ---------- ---------- ----------- -------------------- -------------------- ---------------- --- -------------------- -------------------- 2177200393 PROD1 0 MAXIMUM PERFORMANCE UNPROTECTED PRIMARY YES MOUNTED NOT ALLOWED 注意:重新加入的原Primary是不能恢复角色的,而是只能先成为Standby角色。应用后续的日志达到同步。 SYS@PROD1> alter database convert to physical standby; Database altered. SYS@PROD1> startup force; ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 247467096 bytes Database Buffers 58720256 bytes Redo Buffers 6336512 bytes Database mounted. Database opened. SYS@PROD1> select dbid,name,current_scn,protection_mode,protection_level,database_role,force_logging,open_mode,switchover_status from v$database; DBID NAME CURRENT_SCN PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE FOR OPEN_MODE SWITCHOVER_STATUS ---------- ---------- ----------- -------------------- -------------------- ---------------- --- -------------------- -------------------- 2177200393 PROD1 869428 MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PHYSICAL STANDBY YES READ ONLY TO PRIMARY SYS@PROD1> alter database recover managed standby database using current logfile disconnect from session; Database altered. SYS@PROD1> select count(1) from test_bylhr2; COUNT(1) ---------- 1000 Oracle DG在发生Failover之后,当主库解决问题,是不可以直接回到DG环境的。这个过程往往需要一些辅助组建的配合。如RMAN、Flashback,都可以简化重回DG的过程时间。 注意:如果原主库查询不到test_bylhr2表的数据,则需要仔细检查监听使用静态监听、fal_client、fal_server、log_archive_dest_1和log_archive_dest_2参数已正确配置。 3.3 执行switchover切换成初始环境 新主库: SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG READ WRITE PRIMARY TO STANDBY SBDB1 SYS@SBDB1> alter database commit to switchover to physical standby with session shutdown; Database altered. SYS@SBDB1> shutdown immediate ORA-01507: database not mounted ORACLE instance shut down. SYS@SBDB1> startup mount ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 239078488 bytes Database Buffers 67108864 bytes Redo Buffers 6336512 bytes Database mounted. SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG MOUNTED PHYSICAL STANDBY TO PRIMARY SBDB1 新备库执行: SYS@PROD1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME ------ ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG READ ONLY PHYSICAL STANDBY TO PRIMARY PROD1 SYS@PROD1> alter database commit to switchover to primary with session shutdown; Database altered. SYS@PROD1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME ------ ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG MOUNTED PRIMARY NOT ALLOWED PROD1 SYS@PROD1> alter database open; Database altered. SYS@PROD1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME ------ ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG READ WRITE PRIMARY RESOLVABLE GAP PROD1 SYS@PROD1> create table test_bylhr3 as select * from dual; Table created. 备库查询: SYS@SBDB1> select * from test_bylhr3; select * from test_bylhr3 * ERROR at line 1: ORA-01219: database not open: queries allowed on fixed tables/views only SYS@SBDB1> alter database open; Database altered. SYS@SBDB1> select * from test_bylhr3; D - X 至此,该实验完毕。即主备库执行Failover后,通过闪回重新恢复最初的DG环境。 第四章 实验2 实验2、PROD1意外宕机,SBDB1执行Failover操作变为主库;然后将SBDB1利用闪回数据库功能闪回到SBDB1变为主库的SCN时间点,此时SBDB1仍然是主库的角色,然后将SBDB1转换为备库。<===SBDB1需要开启闪回,会丢失部分数据。 4.1 Failover操作 主库操作: SYS@PROD1> select dbid,name,current_scn,protection_mode,protection_level,database_role,force_logging,open_mode,switchover_status from v$database; DBID NAME CURRENT_SCN PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE FOR OPEN_MODE SWITCHOVER_STATUS ---------- ------ ----------- -------------------- -------------------- ---------------- --- -------------------- -------------------- 2177200393 PROD1 901700 MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PRIMARY YES READ WRITE TO STANDBY SYS@PROD1> create table test_bylhr4 as select * from dual; Table created. SYS@PROD1> select * from test_bylhr4; D - X SYS@PROD1> shutdown abort ORACLE instance shut down. 备库操作: SYS@SBDB1> select * from test_bylhr4; D - X SYS@SBDB1> alter database recover managed standby database finish force; Database altered. SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG MOUNTED PHYSICAL STANDBY TO PRIMARY SBDB1 SYS@SBDB1> alter database commit to switchover to primary with session shutdown; Database altered. SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG MOUNTED PRIMARY NOT ALLOWED SBDB1 SYS@SBDB1> select * from test_bylhr4; select * from test_bylhr4 * ERROR at line 1: ORA-01219: database not open: queries allowed on fixed tables/views only SYS@SBDB1> alter database open; Database altered. SYS@SBDB1> select * from test_bylhr4; D - X SYS@SBDB1> create table test_bylhr5 as select * from dual; Table created. SYS@SBDB1> select * from test_bylhr5; D - X 4.2 新主库闪回 SYS@SBDB1> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SYS@SBDB1> startup mount ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 243272792 bytes Database Buffers 62914560 bytes Redo Buffers 6336512 bytes Database mounted. SYS@SBDB1> select STANDBY_BECAME_PRIMARY_SCN from v$database; STANDBY_BECAME_PRIMARY_SCN -------------------------- 901723 SYS@SBDB1> flashback database to scn 901723; Flashback complete. SYS@SBDB1> select * from test_bylhr5; select * from test_bylhr5 * ERROR at line 1: ORA-01219: database not open: queries allowed on fixed tables/views only SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG MOUNTED PRIMARY NOT ALLOWED SBDB1 SYS@SBDB1> alter database convert to physical standby; Database altered. SYS@SBDB1> shutdown immediate ORA-01507: database not mounted ORACLE instance shut down. SYS@SBDB1> startup mount ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 243272792 bytes Database Buffers 62914560 bytes Redo Buffers 6336512 bytes Database mounted. SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG MOUNTED PHYSICAL STANDBY TO PRIMARY SBDB1 SYS@SBDB1> alter database open; Database altered. SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG READ ONLY PHYSICAL STANDBY TO PRIMARY SBDB1 SYS@SBDB1> SYS@SBDB1> alter database recover managed standby database using current logfile disconnect from session; Database altered. SYS@SBDB1> select * from test_bylhr5; select * from test_bylhr5 * ERROR at line 1: ORA-00942: table or view does not exist SYS@SBDB1> select name, LOG_MODE, OPEN_MODE, database_role, SWITCHOVER_STATUS, db_unique_name from v$database; NAME LOG_MODE OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DB_UNIQUE_NAME --------- ------------ -------------------- ---------------- -------------------- ------------------------------ PROD1 ARCHIVELOG READ ONLY WITH APPLY PHYSICAL STANDBY SESSIONS ACTIVE SBDB1 4.3 原主库打开 SYS@PROD1> startup force ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 251661400 bytes Database Buffers 54525952 bytes Redo Buffers 6336512 bytes Database mounted. Database opened. SYS@PROD1> create table test_bylhr6 as select * from dual; Table created. SYS@PROD1> select * from test_bylhr6; D - X 备库查询: SYS@SBDB1> select * from test_bylhr6; D - X DGMGRL中查看配置: DGMGRL> show CONFIGURATION VERBOSE; Configuration - PROD1.us.oracle.com Protection Mode: MaxPerformance Databases: PROD1 - Primary database SBDB1 - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS 说明直接在原备库上执行闪回操作也可以让Failover后的环境重新恢复最初的环境。不过这也意味着部分数据的丢失。 第五章 实验总结 1、主库在开启闪回数据库功能后,备库并不会开启闪回数据库的功能。 2、PROD1为主库,SBDB1为备库;若PROD1意外宕机,则SBDB1执行Failover操作变为主库;此时若想恢复DG环境,则有3种处理办法: ① 将PROD1利用闪回数据库功能闪回到SBDB1变为主库的SCN时间点,然后将PROD1转换为备库,最后利用switchover转换为最初的环境。<===PROD1需要开启闪回 ② 将SBDB1利用闪回数据库功能闪回到SBDB1变为主库的SCN时间点,此时SBDB1仍然是主库的角色,然后将SBDB1转换为备库。<===SBDB1需要开启闪回,会丢失部分数据。 ③ 利用RMAN重新搭建DG环境。详情请参考:http://blog.itpub.net/26736162/viewspace-1753130/ 第六章 参考文章 6.1 MOS或官网 https://docs.oracle.com/cd/E11882_01/server.112/e41134/scenarios.htm#SBYDB4889 https://docs.oracle.com/cd/E11882_01/server.112/e41134/scenarios.htm#SBYDB00900 This chapter describes scenarios you might encounter while administering your Data Guard configuration. Each scenario can be adapted to your specific environment.聽Table 13-1lists the scenarios presented in this chapter. Table 13-1 Data Guard Scenarios Reference Scenario Section 13.1 Configuring Logical Standby Databases After a Failover Section 13.2 Converting a Failed Primary Into a Standby Database Using Flashback Database Section 13.3 Using Flashback Database After Issuing an Open Resetlogs Statement Section 13.4 Recovering After the NOLOGGING Clause Is Specified Section 13.5 Creating a Standby Database That Uses OMF or Oracle ASM Section 13.6 Recovering From Lost-Write Errors on a Primary Database Section 13.7 Converting a Failed Primary into a Standby Database Using RMAN Backups Section 13.8 Changing the Character Set of a Primary Without Re-Creating Physical Standbys 这8个实验,建议有兴趣的朋友都做一遍。 http://blog.itpub.net/24500180/viewspace-1068495/ http://blog.itpub.net/24500180/viewspace-1068141/ http://blog.itpub.net/24500180/viewspace-1069602/ 13.2 Converting a Failed Primary Into a Standby Database Using Flashback Database After a failover occurs, the original primary database can no longer participate in the Data Guard configuration until it is repaired and established as a standby database in the new configuration. To do this, you can use the Flashback Database feature to recover the failed primary database to a point in time before the failover occurred, and then convert it into a physical or logical standby database in the new configuration. The following sections describe: Flashing Back a Failed Primary Database into a Physical Standby Database Flashing Back a Failed Primary Database into a Logical Standby Database Note: You must have already enabled Flashback Database on the original primary database before the failover. See Oracle Database Backup and Recovery User's Guide for more information. Flashing Back a Logical Standby Database to a Specific Applied SCN See Also: Oracle Data Guard Broker for automatic reinstatement of the failed primary database as a new standby database (as an alternative to using Flashback Database) 13.2.1 Flashing Back a Failed Primary Database into a Physical Standby Database The following steps assume that a failover has been performed to a physical standby database and that Flashback Database was enabled on the old primary database at the time of the failover. This procedure brings the old primary database back into the Data Guard configuration as a physical standby database. Step 1 Determine the SCN at which the old standby database became the primary database. On the new primary database, issue the following query to determine the SCN at which the old standby database became the new primary database: SQL> SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE; Step 2 Flash back the failed primary database. Shut down the old primary database (if necessary), mount it, and flash it back to the value for STANDBY_BECAME_PRIMARY_SCN that was determined in Step 1. SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; SQL> FLASHBACK DATABASE TO SCN standby_became_primary_scn; Step 3 Convert the database to a physical standby database. Perform the following steps on the old primary database: Issue the following statement on the old primary database: SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY; This statement will dismount the database after successfully converting the control file to a standby control file. Shut down and restart the database: SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; Step 4 Start transporting redo to the new physical standby database. Perform the following steps on the new primary database: Issue the following query to see the current state of the archive destinations: SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION, - > ERROR,SRL FROM V$ARCHIVE_DEST_STATUS; If necessary, enable the destination: SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_n=ENABLE; Perform a log switch to ensure the standby database begins receiving redo data from the new primary database, and verify it was sent successfully. Issue the following SQL statements on the new primary database: SQL> ALTER SYSTEM SWITCH LOGFILE; SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION,- > ERROR,SRL FROM V$ARCHIVE_DEST_STATUS; On the new standby database, you may also need to change the LOG_ARCHIVE_DEST_n initialization parameters so that redo transport services do not transmit redo data to other databases. Step 5 Start Redo Apply on the new physical standby database. Issue the following SQL statement on the new physical standby database: SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE - > USING CURRENT LOGFILE DISCONNECT; Redo Apply automatically stops each time it encounters a redo record that is generated as the result of a role transition, so Redo Apply will need to be restarted one or more times until it has applied beyond the SCN at which the new primary database became the primary database. Once the failed primary database is restored and is running in the standby role, you can optionally perform a switchover to transition the databases to their original (pre-failure) roles. See Section 8.2.1, "Performing a Switchover to a Physical Standby Database" for more information. 6.2 博客 Data Guard高级玩法:通过闪回恢复failover备库:http://blog.itpub.net/23718752/viewspace-2124234/ 使用Flashback让Failover数据库重新加入DG环境:http://blog.itpub.net/17203031/viewspace-1184082 http://blog.itpub.net/24500180/viewspace-1068495/ http://blog.itpub.net/24500180/viewspace-1068141/ http://blog.itpub.net/24500180/viewspace-1069602/ ------------------------------------------------------------------------ About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/viewspace-2146883/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest/p/7793934.html ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2017-11-01 09:00 ~ 2017-11-30 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。 小麦苗的微信公众号 小麦苗的DBA宝典QQ群2 《DBA笔试面宝典》读者群 小麦苗的微店 .............................................................................................................................................
Oracle工具之sqlldr的使用 有多种方式可以将文本文件的数据导入到数据库中,例如,利用PLSQL Developer软件进行复制粘贴,利用外部表,利用SQL*Loader等方式。至于EXCEL中的数据可以另存为csv文件(csv文件其实是逗号分隔的文本文件),然后导入到数据库中。 下面简单介绍一下SQL*Loader的使用方式。 SQL*Loader是一个Oracle工具,能够将数据从外部数据文件装载到数据库中。SQL*Loader必须包含一个控制文件,该控制文件是SQL*Loader的中枢核心,控制文件能够控制外部数据文件中的数据如何映射到Oracle的表和列。通常与SPOOL导出文本数据方法配合使用。SQL*Loader能够接收多种不同格式的数据文件。文件可以存储在磁盘或磁带上,或记录本身可以被嵌套到控制文件中。记录格式可以是定长的或变长的,定长记录是指这样的记录:每条记录具有相同的固定长度,并且每条记录中的数据域也具有相同的固定长度、数据类型和位置。 SQL*Loader的数据导入比较专业,有各种参数及选项可供选择,经常是作为数据仓库中大型数据的导入方法选择。 SQL*Loader的优点: 1、可将导入命令写入BAT文件直接批量处理 2、导入处理比较专业,提供各种参数选择 3、无需操作Oracle所在服务器 SQL*Loader也有缺点,例如,Excel文件需要另存为txt或csv格式才能导入到数据库中。 总得来说这种方法是最值得采用的,可以自动建立操作系统的批处理文件执行SQL*Loader命令,将数据导入原始接收表,并在数据库中设置触发器进行精细操作。 SQL*Loader有两种使用方法: 1、只使用一个控制文件,在这个控制文件中包含数据 2、使用一个控制文件和一个数据文件 下面给出SQL*Loader控制文件的一个示例: options(SKIP=1,errors=1000) --options(SKIP=1,ROWS=1000,errors=1000) UNRECOVERABLE --不产生日志 load data --CHARACTERSET utf8 --ZHS16GBK LENGTH CHARACTER infile 'E:\sql\sqlldr\test.csv' APPEND into table zh_lhr --insert/APPEND/replace fields terminated by ',' optionally enclosed by '"' ---②terminated by x'09' 一个制表符(TAB) trailing nullcols ( position(*:16) "TRIM(:COL_5)" "SEQ.NEXTVAL" date 'YYYY/MM/DD HH24:MI:SS', rn , IMIX_TAG char(4000) "trim(:IMIX_TAG)" ) 其中,CHARACTERSET指定文件的编码格式,infile指定导入的文件。 接下来就是执行导入命令了,如下所示: sqlldr 用户名/用户名密码@数据库名称 control= 控制文件名.ctl parallel=y log='log.txt' bad='bad.bad' direct=true readsize=4194304 当要加载的数据文件比较大的时候该如何提高SQL*Loader的性能呢?可以从以下几个方面考虑: ① ROWS的默认值为64,可以根据需要指定更合适的ROWS参数来指定每次提交记录数。 ② 采用DIRECT=TRUE导入可以跳过数据库的相关逻辑,直接将数据导入到数据文件中,可以提高导入数据的性能。 ③ 通过指定UNRECOVERABLE选项,可以写少量的日志,而从提高数据加载的性能。不过,推荐在加载完成后立即对数据库或至少对表空间备份。 当加载大量数据时,最好抑制日志的产生: ALTER TABLE RESULTXT NOLOGGING; 将表修改为NOLOGGING,可以只产生少量的Redo日志,从而提高导入效率。在CONTROL文件中的load data前边加一行:UNRECOVERABLE,此选项必须要与DIRECT共同使用。对于超大数据文件的导入就要用并发操作了,即同时运行多个导入任务: sqlldr userid=/ control=result1.ctl direct=true parallel=true 下表给出在使用SQL*Loader的过程中,一些常用的需求实现方法: 下表给出了在使用SQL*Loader的过程中,经常会遇到的一些错误及其解决方法: 关于SQL*Loader还有很多参数本书不再详述,具体可以参考官方文档。有关如何导出数据到EXCEL中,本书也不再详述。读者若有需要可以关注作者的微信公众号来阅读。 真题1、Which two statements are true regarding the usage of the SQL*Loader utility? (Choose two.) A、You can load data into multiple tables during the same load session. B、You can load data from multiple files to a table during the same load session. C、You cannot perform selective data loading based on the values available in the records. D、You can use an export file generated by the EXPDP utility as an input data file to load the data. 答案:A、B。 题目中要求选出关于SQL*Loader工具的描述中正确的两个选项。 本题中,对于选项A,可以在一个SQL*Loader会话中导入多个表的数据,根据前面的分析,该功能可以实现。所以,选项A正确。 对于选项B,可以在一个SQL*Loader会话中将多个数据文件导入到1个表中,根据前面的分析,该功能可以实现。所以,选项B正确。 对于选项C,在导入数据的时候可以使用WHEN关键词实现选择性的导入。所以,选项C错误。 对于选项D,SQL*Loader是文本导入工具,只能导入文本数据,而exp导出的文件属于二进制文件,所以不能导入。所以,选项D错误。 所以,本题的答案为A、B。 真题2、Which statement is true about loading data using the conventional path of SQL*Loader? A、Redo is not generated while performing conventional path loads. B、Only PRIMARY KEY, UNIQUE KEY, and NOT NULL constraints are checked. C、The SQL*Loader control file is a text file that contains data definition language (DDL) instructions. D、Instead of performing transactions, SQL*Loader directly writes data blocks to the data files. E、INSERT triggers are disabled before the conventional path load and reenabled at the end of the load. 答案:C。 题目要求选出关于SQL*Loader工具的常规路径加载说法正确的选项。 本题中,对于选项A,常规路径加载的时候会产生Redo日志,选项A错误。 对于选项B,所有的约束均有效,而不止PRIMARY KEY、UNIQUE KEY和NOT NULL这3项约束。所以,选项B错误。 对于选项C,SQL*Loader的控制文件是一个文本文件,其中包含了一些DDL结构。所以,选项C正确。 对于选项D,SQL*Loader的常规路径加载是经过内存的,而不是直接写入数据文件。所以,选项D错误。 对于选项E,SQL*Loader加载的时候,表上的相关触发器是会执行的。所以,选项E错误。 所以,本题的答案为C。 1、 使用CONCATENATE合并多行记录 点击(此处)折叠或打开 create table scott.tb_manager(mgrno number,mname varchar2(30),job varchar2(300),remark varchar2(4000)); #a.ctl LOAD DATA INFILE 'a.dat' CONCATENATE 2 INTO TABLE tb_manager truncate ( MGRNO POSITION(1:2), MNAME POSITION(*+1:10), JOB POSITION(*+1:24), REMARK POSITION(*+1:65) "REPLACE(upper(:REMARK),'HE',chr(10)||'HE')" ) #a.dat 10 SMITH SALES MANAGER THIS IS SMITH. HE IS A SALES MANAGER. 11 ALLEN.W TECH MANAGER THIS IS ALLEN.W. HE IS A TECH MANAGER. 16 BLAKE HR MANAGER THIS IS BLAKE. HE IS A HR MANAGER. sqlldr scott/tiger control=a.ctl data=a.dat sqlplus / as sysdba set linesize 9999 col job format a30 col REMARK format a50 select * from scott.tb_manager; sqlldr userid=lgone/tiger control=a.ctl 其中,a.ctl为控制文件,内容: LOAD DATA --控制文件标识 INFILE 't.dat' -- 要导入的文件 INFILE 'tt.dat' -- 导入多个文件 INFILE * -- "*" 代表要导入的内容就在control文件里,下面的BEGINDATA后面就是导入的内容 INSERT --数据载入方式,有四种INTO TABLE table_name -- 指定装入的表 BADFILE 'c:bad.txt' --指定坏文件地址LOGFILE 'c:log.txt' --log文件DISCARD 'c:discard.txt' --包含丢弃数据的文件ERRORS=1000 --指定错误的数目 可以使用sqlldr查看帮助。 [@more@] 以下是4种装入表的方式: APPEND 原先的表有数据,就加在后面 INSERT 装载空表 如果原先的表有数据 sqlloader会停止,默认值 REPLACE 原先的表有数据,原先的数据会全部删除 TRUNCATE 指定的内容和replace的相同 会用truncate语句删除现存数据 指定的TERMINATED可以在表的开头,也可在表的内部字段部分: FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' --OPTIONALLY ENCLOSED BY是指字段值用什么括起来,平时我们都是用单引号,如'value' 装载这种数据: 10,lg,"""lg""","lg,lg" 在表中结果: 10 lg "lg" lg,lg TERMINATED BY X'09' -- 表示字段之间通过制表符tab键(以十六进制格式 '09' 表示 )分割,也可以把FIELDS TERMINATED BY ';'分号表示成ascii编码 TERMINATED BY WRITESPACE -- 以空白分割,装载这种数据: 10 lg lg (col_1 [interger external] TERMINATED BY ',' , col_2 [date "dd-mon-yyy"] TERMINATED BY ',' , col_3 [char] TERMINATED BY ',' OPTIONALLY ENCLOSED BY 'lg' ) 当某列为空,不存在对应值: TRAILING NULLCOLS --如果某个字段没有对应的值时(空格、空白、或null),被当作null列,向表中插入null 不导入某列: ( col_1 , col_2 ,col_filler FILLER --FILLER 关键字(不是filter)指定此列(第三列)的数值不会被装载,如: lg,lg,not,结果 lg lg) 也可以写成这样:( col_1 , col_2 ) --数据文件中存在超过两列数据,但是只导入前两列 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (DEPTNO, DNAME, LOC ) BEGINDATA 10,Sales,"""USA""" 20,Accounting,"Virginia,USA" 30,Consulting,Virginia 40,Finance,Virginia 50,"Finance","",Virginia --loc 列将为空 60,"Finance",,Virginia --loc 列将为空 跳过数据行,可以用 "SKIP n" 关键字来指定导入时可以跳过多少行数据。如:INTO TABLE load_positional_data SKIP 5 当没声明FIELDS TERMINATED BY ','用位置告诉字段装载数据: ( col_1 position(1:2), --1到2,(01) 代表第一个字符 col_2 position(3:10), --3到10 col_3 position(*:16), -- 这个字段的开始位置在前一字段的结束位置 col_4 position(1:16), col_5 position(3:10) char(8) -- 指定字段的类型 ) BEGINDATA -- 对应开始的 INFILE * 要导入的内容就在control文件里,注意begindata后的数值前面不能有空格 10,Sql,what 20,lg,show 使用函数(包括自定义函数)、日期的某种表达方式: FIELDS TERMINATED BY ',' (DEPTNO, DNAME "upper(:dname)", -- 使用函数 LOC "upper(:loc)", LAST_UPDATED date 'dd/mm/yyyy', --或'dd-month-yyyy'等,也可以使用自定义函数LAST_UPDATED "my_to_date( :last_updated )" , my_to_date()为自定义函数 ENTIRE_LINE ":deptno||:dname||:loc||:last_updated" ) 载入有换行符的数据: 注意: unix 和 windows换行符不同 n & /n (...... COMMENTS "replace(:comments,'n',chr(10))" --replace 的使用帮助转换换行符 ......) 载入每行的行号: ...... ( seqno RECNUM --载入每行的行号 text Position(1:20)) BEGINDATA fsdfasj --自动分配一行号给载入 表t 的seqno字段, 此行行号为1 fasdjfasdfl --此行行号为2 合并多行记录为一行记录: CONCATENATE: - use when SQL*Loader should combine the same number of physical records together to form one logical record. CONTINUEIF - use if a condition indicates that multiple records should be treated as one. Eg. by having a '#' character in column 1. LOAD DATA INFILE * concatenate 3 --通过关键字concatenate 把几行的记录看成一行记录 INTO TABLE DEPT ...... (DEPTNO, DNAME "upper(:dname)", LOC "upper(:loc)", LAST_UPDATED date 'dd/mm/yyyy' ) BEGINDATA 10,Sales, --其实这3行看成一行 10,Sales,Virginia,1/5/2000 Virginia, 1/5/2000 这列子用 continueif list="," 也可以,告诉sqlldr在每行的末尾找逗号 找到逗号就把下一行附加到上一行. LOAD DATA INFILE * continueif this(1:1) = '-' -- 找每行的开始是否有连接字符'-',有就把下一行连接为一行: 如 -10,Sales,Virginia, 1/5/2000 就是一行 10,Sales,Virginia,1/5/2000 其中1:1 表示从第一行开始 并在第一行结束 还有continueif next, 但continueif list最理想 将数据导入多个表: LOAD DATA INFILE * REPLACE INTO TABLE emp WHEN empno != ' ' ( empno POSITION(1:4) INTEGER EXTERNAL, ename POSITION(6:15) CHAR, deptno POSITION(17:18) CHAR, mgr POSITION(20:23) INTEGER EXTERNAL ) INTO TABLE proj WHEN projno != ' ' ( projno POSITION(25:27) INTEGER EXTERNAL, empno POSITION(1:4) INTEGER EXTERNAL ) 导入数据时修改数据: 在导入数据到数据库时,可以修改数据。注意,这仅适合于常规导入,并不适合 direct导入方式. LOAD DATA INFILE * INTO TABLE modified_data ( rec_no "my_db_sequence.nextval", region CONSTANT '31', time_loaded "to_char(SYSDATE, 'HH24:MI')", data1 POSITION(1:5) ":data1/100", data2 POSITION(6:15) "upper(:data2)", data3 POSITION(16:22)"to_date(:data3, 'YYMMDD')" ) BEGINDATA 11111AAAAAAAAAA991201 22222BBBBBBBBBB990112 LOAD DATA INFILE 'mail_orders.txt' BADFILE 'bad_orders.txt' APPEND INTO TABLE mailing_list FIELDS TERMINATED BY "," ( addr, city, state, zipcode, mailing_addr "decode(:mailing_addr, null, :addr, :mailing_addr)", mailing_city "decode(:mailing_city, null, :city, :mailing_city)", mailing_state ) SQL*Loader 数据的提交:一般情况下是在导入数据文件数据后提交的。也可以通过指定 ROWS= 参数来指定每次提交记录数。 提高 SQL*Loader 的性能: 1) 一个简单而容易忽略的问题是,没有对导入的表使用任何索引和/或约束(主键)。如果这样做,甚至在使用ROWS=参数时,会很明显降低数据库导入性能。 2) 可以添加 DIRECT=TRUE来提高导入数据的性能。当然,在很多情况下,不能使用此参数。 3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志。这个选项只能和 direct 一起使用。 4) 可以同时运行多个导入任务. 常规导入与direct导入方式的区别: 常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中。 Oracle SQL*Loader 使用指南(转载) 如何使用 SQL*Loader 工具 我们可以用Oracle的sqlldr工具来导入数据。例如:sqlldr scott/tiger control=loader.ctl 控制文件(loader.ctl)将加载一个外部数据文件(含分隔符) loader.ctl如下: <><> > > >> >> >> < >> > > & <> <> <> <> <><> > > > > > > > > > > > > > > > > > > > > &
如何安装DBMS_NETWORK_ACL_ADMIN包? 若安装了 XDB组件,则DBMS_NETWORK_ACL_ADMIN会自动安装。若安装了XDB组件,但是DBMS_NETWORK_ACL_ADMIN不可用,则可以单独执行如下的脚本进行安装: 点击(此处)折叠或打开 sqlplus / as sysdba run ?/rdbms/admin/catnacl.sql run ?/rdbms/admin/dbmsnacl.sql run ?/rdbms/admin/prvtnacl.plb 执行如下脚本可以判断是否已经安装了XDB组件: SELECT SCHEMA,COMP_NAME, VERSION, STATUS FROM DBA_REGISTRY WHERE COMP_NAME LIKE '%Oracle XML Database%'; 官网: https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_networkacl_adm.htm#CHDJFJFFWhen you create access control lists for network connections, you should create one access control list dedicated to a group of common users, for example, users who need access to a particular application that resides on a specific host computer. For ease of administration and for good system performance, do not create too many access control lists. Network hosts accessible to the same group of users should share the same access control list.简单点说:Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务。需要进行权限授权才可以,比如需要通过oracle发送邮件。下面是几个常用的定义acl的相关方法:1. 创建访问控制列表 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'www.xml', description => 'WWW ACL', principal => 'HR', -- 赋予权限给哪个用户 is_grant => true, -- true表示授予权限 false表示取消权限 privilege => 'connect'); 2. 使用ADD_PRIVILEGE存储过程将其他的用户或角色添加到访问控制列表中,它的参数与CREATE_ACL存储过程的参数类似,省略了DESCRIPTION参数,同时增加了POSITION参数,它用于设置优先顺序。 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'www.xml', principal => 'HR', is_grant => true, privilege => 'resolve'); 3.使用ASSIGN_ACL存储过程给网络分配访问控制列表 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl => 'www.xml', host => '*.qq.com'); --主机名,域名,ip地址或分配的子网,主机名大小写敏感,ip地址和域名允许使用通配符 4.UNASSIGN_ACL存储过程允许你手动删除访问控制列表,它使用的参数与ASSIGN_ACL存储过程相同,使用NULL参数作为通配符。DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL(host => 'www.qq.com');5.删除上面的控制列表DBMS_NETWORK_ACL_ADMIN.drop_acl ( acl => 'www.xml');6. 查询创建的ACL信息SELECT host, lower_port, upper_port, acl, DECODE( DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE_ACLID(aclid, 'HR', 'connect'), 1, 'GRANTED', 0, 'DENIED', NULL) privilege FROM dba_network_acls ORA-24247: network access denied by access control list (ACL) 错误处理 及DBMS_NETWORK_ACL_ADMIN用法汇总 通过oracle的存储过程发邮件,出现问题,具体过程如下: 发邮件的存储过程PROC_SENDMAIL_SIMPLE在A用户,而B用户要调用A用的PROC_SENDMAIL_SIMPLE来发邮件。 其中,A用户已经把PROC_SENDMAIL_SIMPLE的执行权限给了B用户 grant execute on PROC_SENDMAIL_SIMPLE to B; 但是在B用户的存储过程中调用PROC_SENDMAIL_SIMPLE依然报错 ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝 ORA-24247: network access denied by access control list (ACL) 发生这个错误是因为网络访问控制列表管理着用户访问网络的权限。 ======== 解决办法: ======== 拥有DBA权限的用户执行下面的SQL,分3部分 BEGIN --1.创建访问控制列表sendmail.xml,sendmail.xml控制列表拥有connect权限,并把这个权限给了B用户, DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl=> 'sendmail.xml', -- ACL的名字,自己定义 description => 'sendmail ACL', -- ACL的描述 principal => 'B', -- 这里是用户名,大写,表示把这个ACL的权限赋给B用户 is_grant => true, --true:授权 ;false:禁止 privilege => 'connect'); --授予或者禁止的网络权限 --2.为sendmail.xml控制列表添加resolve权限,且赋给B用户 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE( acl=> 'sendmail.xml', principal => 'B', is_grant => true, privilege => 'resolve'); --3.为控制列表ACL sendmail.xml分配可以connect和resolve的host DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'sendmail.xml', host => 'smtp.163.com'); --smtp.163.com是邮箱服务器主机名 END; / COMMIT; 再次在用户B调用A的PROC_SENDMAIL_SIMPLE发邮件过程,成功发送邮件。 ======================联想到其他情况====================== 情况1:同一个ACL给多个用户使用 用户B调用A的发邮件存储过程PROC_SENDMAIL_SIMPLE,那么C用户很可能也要这么做。 这时,不必创建一个新的ACL,用原有的ACL sendmail.xml即可,也就是把sendmail.xml给用户C使用。 这样C用户自然可以访问网络发送邮件。 BEGIN --给C用户resolve权限 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'sendmail.xml', principal => 'C', is_grant => true, privilege => 'resolve'); --给C用户 conenct权限 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl => 'sendmail.xml', principal => 'C', is_grant => true, privilege => 'connect'); END; / COMMIT; 情况2:取消给ACL sendmail.xml 指派的主机smtp.163.com ,也就是所有使用sendmail.xml 的用户都不能connect和resolve主机smtp.163.com <1>查看一下 select * from dba_network_acls; HOST LOWER_PORT UPPER_PORT ACL ACLID ----------------- ------------------ ----------------- --------------------- -------------------------- smtp.163.com /sys/acls/sendmail.xml D07B6F4707E7EFFDE040007F01005C7F <2>收回sendmail.xml控制列表中访问smtp.163.com的权限 BEGIN DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL(host => 'smtp.163.com'); END; / COMMIT; <3> select * from dba_network_acls; 空 不过这时ACL sendmail.xml依然存在,只不过sendmail.xml中没有任何主机信息 <4>那么怎么让sendmail.xml重新能访问smtp.163.com呢? BEGIN DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'sendmail.xml', host => 'smtp.163.com'); END; / COMMIT; <5>再次看,sendmail.xml中含有主机smtp.163.com了 select * from dba_network_acls; HOST LOWER_PORT UPPER_PORT ACL ACLID -------------------- ---------- ---------- ------------------------------ -------------------------------- smtp.163.com /sys/acls/sendmail.xml D07B6F4707xFFDExx007F01005C7F 情况3:取消B用户使用sendmail.xml ACL,B用户不能访问smtp.163.com 主机了 BEGIN DBMS_NETWORK_ACL_ADMIN.DELETE_PRIVILEGE( acl => 'sendmail.xml', principal => 'B') END; ========================================================================= ================DBMS_NETWORK_ACL_ADMIN知识汇总================== ========================================================================= 说了这么多,其实都是对DBMS_NETWORK_ACL_ADMIN过程的使用。 下面是DBMS_NETWORK_ACL_ADMIN的相关只是汇总。 1.创建ACL DBMS_NETWORK_ACL_ADMIN.CREATE_ACL ( acl IN VARCHAR2, description IN VARCHAR2, principal IN VARCHAR2, is_grant IN BOOLEAN, privilege IN VARCHAR2, start_date IN TIMESTAMP WITH TIMEZONE DEFAULT NULL, end_date IN TIMESTAMP WITH TIMEZONE DEFAULT NULL ); 例子: BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl => 'www.xml', description => 'WWW ACL', principal => 'SCOTT', is_grant => true, privilege => 'connect'); END; / COMMIT; 2.为ACL添加权限 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE ( acl IN VARCHAR2, principal IN VARCHAR2, is_grant IN BOOLEAN, privilege IN VARCHAR2, position IN PLS_INTEGER DEFAULT NULL, start_date IN TIMESTAMP WITH TIMESTAMP DEFAULT NULL, end_date IN TIMESTAMP WITH TIMESTAMP DEFAULT NULL ); 例子: BEGIN DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE( acl => 'www.xml', principal => 'SCOTT', is_grant => true, privilege => 'resolve'); END; / COMMIT; 3.指派ACL可以访问的host DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL ( acl IN VARCHAR2, host IN VARCHAR2, lower_port IN PLS_INTEGER DEFAULT NULL, upper_port IN PLS_INTEGER DEFAULT NULL); 注意:host这个参数可以写作 一个网址:www.us.oracle.com 也可以是一个网段:*.us.oracle.com或者*.oracle.com或者*.com 当然也可以是所有host:* 例子: BEGIN DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'us-oracle-com-permissions.xml', host => '*.us.oracle.com', lower_port => 80); END; 4.检测用户是否拥有某个ACL中的某个权限 DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE ( acl IN VARCHAR2, user IN VARCHAR2, privilege IN VARCHAR2) RETURN NUMBER; Returns 1 when the privilege is granted; 0 when the privilege is denied; NULL when the privilege is neither granted or denied. 例子: 如scott拥有sendmail.xml中的resolve权限 SELECT DECODE( DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE( 'sendmail.xml', 'SCOTT', 'resolve'), 1, 'GRANTED', 0, 'DENIED', NULL) PRIVILEGE FROM DUAL; PRIVILE ------- GRANTED 5.删除acl中的connect或者resolve权限 DBMS_NETWORK_ACL_ADMIN.DELETE_PRIVILEGE ( acl IN VARCHAR2, principal IN VARCHAR2, is_grant IN BOOLEAN DEFAULT NULL, privilege IN VARCHAR2 DEFAULT NULL); 例子: BEGIN DBMS_NETWORK_ACL_ADMIN.DELETE_PRIVILEGE( acl => 'us-oracle-com-permissions.xml', principal => 'ST_USERS') END; 6.删除ACL DBMS_NETWORK_ACL_ADMIN.DROP_ACL ( acl IN VARCHAR2); 例子: BEGIN DBMS_NETWORK_ACL_ADMIN.DROP_ACL( acl => 'us-oracle-com-permissions.xml'); END; 7.取消ACL已分配的host DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL ( acl IN VARCHAR2 DEFAULT NULL, host IN VARCHAR2 DEFAULT NULL, lower_port IN PLS_INTEGER DEFAULT NULL, upper_port IN PLS_INTEGER DEFAULT NULL); 例子: BEGIN DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL( host => '*.us.oracle.com', lower_port => 80); END; 8.查看语句 --ACL的信息,包括host,ACL名字等。 select * from dba_network_acls; --各用户对应的ACL,用户拥有的权限 select acl,principal,privilege,is_grant,to_char(start_date, 'dd-mon-yyyy') as start_date,to_char(end_date, 'dd-mon-yyyy') as end_date from dba_network_acl_privileges; 参考 http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_networkacl_adm.htm How To Install Package DBMS_NETWORK_ACL_ADMIN (文档 ID 1118447.1) In this Document Goal Fix References APPLIES TO: Oracle Server - Enterprise Edition - Version 11.2.0.1 and laterInformation in this document applies to any platform.***Checked for relevance on 24-Oct-2012*** GOAL How to install the dbms_network_acl_admin package? FIX The DBMS_NETWORK_ACL_ADMIN package is installed when the XDB component is being installed. To install XDB follow the procedure outlined in Note 1292089.1 - Master Note for Oracle XML Database (XDB) Installation. If XDB is already installed but the ACL package is not available and a reinstall of XDB is not possible then the only way to install the DBMS_NETWORK_ACL_ADMIN package is to run the *nacl scripts: sqlplus / as sysdba run ?/rdbms/admin/catnacl.sql run ?/rdbms/admin/dbmsnacl.sql run ?/rdbms/admin/prvtnacl.plb REFERENCES NOTE:207959.1 - All About Security: User, Privilege, Role, SYSDBA, O/S Authentication, Audit, Encryption, OLS, Database Vault, Audit VaultNOTE:1292089.1 - Master Note for Oracle XML Database (XDB) Install / Deinstall Master Note for Oracle XML Database (XDB) Install / Deinstall (文档 ID 1292089.1) In this Document Details Actions Best Practices Reloading XDB Oracle 9i - XDB Reload Oracle 10.1 and above - XDB Reload Deinstalling and Reinstalling XDB 9.2 - XDB Removal and Reinstall 10g - XDB Removal and Reinstall 11g - XDB Removal and Reinstall 11.1 - XDB Removal and Reinstall 11.2 - XDB Removal and Reinstall Verify XDB Installation Known Issues Contacts References APPLIES TO: Oracle Database - Enterprise Edition - Version 9.2.0.3 to 12.1.0.1 [Release 9.2 to 12.1]Oracle Multimedia - Version 11.2.0.3 to 11.2.0.3 [Release 11.2]Information in this document applies to any platform.***Checked for relevance on 13-Oct-2014*** DETAILS This master note provides information for DBA's on removing and installing XML Database (XDB). This note covers releases 9.2.0.3 through 11.2. If XDB must be reinstalled in a database supporting Ebusiness Suite there are some actions to do on the database before removing XDB and that needs to be defined with the EBS team. For example if iSetup exists, iSetup dependency with Deinstall and Reinstall of XMLDB (Doc ID 402785.1) should be followed before and after the XDB reinstallation. For an EBS database please consult with the EBS team before reinstalling XDB. Ask Questions, Get Help, And Share Your Experiences With This Article Would you like to explore this topic further with other Oracle Customers, Oracle Employees, and Industry Experts? (Click here to join the discussion where you can ask questions, get help from others, and share your experiences with this specific article.) Discover discussions about other articles and helpful subjects by clicking here to access the main My Oracle Support Community page for Oracle XDB. ACTIONS Best Practices Please note that 9.2.0.3 is a mandatory minimum patch level for XDB. Customers using XDB must be on Oracle database version 9.2.0.3 or higher. If the XML DB features are currently being utilized and you have experienced an invalid XML DB repository or installation, point-in-time recovery to a point prior to when the problem occurred is recommended. If XDB is removed and reinstalled, and the feature is being used, data loss can occur. Removing XDB by running catnoqm.sql does the following: Deletes all information stored in the oracle XML DB repository and XDB database schema. Permanently invalidates any xmltype tables or columns that are associated with a registered XML schema. If the XDB user is dropped, there is no way to recover the data in these xmltype tables or columns. Please confirm whether XDB is being used in your environment prior to attempting removal and reinstall. To accomplish this, refer to the following documents: (Doc ID 742156.1) 9iR2: How to Determine if XDB is Being Used in the Database? (Doc ID 742113.1) 10g: How to Determine if XDB is Being Used in the Database? (Doc ID 733667.1) 11g: How to Determine if XDB is Being Used in the Database? Please note, later versions of RDA provides some details on the current status of the XDB component. Please see the following document for more information on RDA: (Doc ID 314422.1) Remote Diagnostic Agent (RDA) 4 - Getting Started The following database components / features also use XDB: Oracle Application Express (APEX) Oracle Expression Filter Oracle interMedia / Multimedia DICOM Oracle Multimedia Image metadata extraction of EXIF, ORDIMAGE, IPTC and XMP metadata Spatial (including Oracle Locator) OLAP Oracle Applications such as iRecruitment Any procedure using UTL_TCP, UTL_HTTP, UTL_SMTP XMLTYPE operations XBRL (Extensible Business Reporting Language) from 11.2.0.2 onwards It is recommended to take a full backup of the database before removing / reinstalling XDB. This is a good precautionary measure for situations where it is needed to go back to the original state of the database. Please see the following document for more information: (Doc ID 858321.1) How To Backup XML Database (XDB) Be sure to follow the exact steps listed whenever reloading the XDB component or reinstalling XDB. This includes a startup/shutdown of the database, as failure to do so can cause the XDB installation to fail with an internal error similar to the following: ORA-7445 [qmr_hdl_copy()+48]. AL32UTF8 is the recommended characterset for XML Database (XDB). AL32UTF8 supports all valid characters for XDB. You should only use a non-AL32UTF8 characterset if you can guarantee that all your XDB data is part of the characterset. If you aren't using AL32UTF8, it is typically recommended to convert to the database character set AL32UTF8. If you are not using AL32UTF8, there could be possible character losses or characterset conversion errors. RAC procedures. If you are reloading XDB on an RAC cluster, all nodes must be shutdown and restarted to avoid inconsistent memory structures. Please note, if running xdbrelod.sql for a RAC environment to avoid errors ORA-1092 and ORA-39701: Shutdown database database cleanly The "cluster_database" parameter should be set to value "false" so for init.ora parameter file set cluster_database=false Start only one instance and execute script for XDB reload Revert cluster_database=true and restart database Always review the compatibility parameter to ensure that it is set to the same version as the database so that all XDB functionality associated with that database version is available. Before installing or upgrading XDB, make sure the LD_LIBRARY_PATH / LIBPATH / SHLIB_PATH environment variable is set correctly. That is, the first directory referenced should be $ORACLE_HOME/lib. This environment variable is used to resolve the location of the shared library "libxdb.so (libxdb.sl on HP)". XDB must have execute permissions on the DBMS_LOB, UTL_FILE, DBMS_JOB, UTL_RAW and DBMS_SQL packages. XDB automatically has these privileges because they are granted to PUBLIC by default. If these privileges have been revoked from PUBLIC for security reasons, errors will be reported during the installation / upgrade of XDB and some XDB objects will become invalid, making the component itself invalid. Therefore, it is recommended to grant these privileges back to PUBLIC before installing /upgrading XDB. Then after the install/upgrade, grant execute permissions on these packages directly to XDB and revoke the privileges from PUBLIC. After a successful installation of XDB, execute the following: connect / as sysdba grant execute on DBMS_LOB to XDB; grant execute on UTL_FILE to XDB; grant execute on DBMS_SQL to XDB; grant execute on DBMS_JOB to XDB; grant execute on DBMS_STATS to XDB; grant execute on UTL_RAW to XDB; revoke execute on DBMS_LOB from PUBLIC; revoke execute on UTL_FILE from PUBLIC; revoke execute on DBMS_SQL from PUBLIC; revoke execute on DBMS_JOB from PUBLIC; revoke execute on UTL_RAW from PUBLIC; Please be sure to review the note listed below whenever revoking execute permissions from PUBLIC: (Doc ID 247093.1) Be Cautious When Revoking Privileges Granted to PUBLIC Make sure you do not have a table named XDB or any synonyms pointing to XDB objects. Otherwise, this will lead to errors such as ORA-01422: exact fetch returns more than requested number of rows. Please see the following documents for more information: (Doc ID 1332182.1) ORA-01422 from DBMS_XS_PRINCIPAL_EVENTS_INT DBA|ALL|USER_XSC_* and DBA|ALL|USER_XDS_* (Doc ID 1574173.1) Selecting from SYS.RESOURCE_VIEW Fails with ORA-01422 and selecting from SYS.DBA_NETWORK_ACLS Fails with ORA-600 [qmxqtmChkXQAtomMapSQL:2] XDB is included with the Oracle RDBMS. It is not licensed separately. Reloading XDB The reload procedure recreates all of the PL/SQL packages and types. It can be helpful in addressing an INVALID status of XDB in DBA_REGISTRY, invalid XDB-specific objects, etc. An XDB reload is always preferred over an XDB removal and reinstall. Since xdbrelod.sql is called in xdbpatch.sql, you can alternatively run xdbpatch.sql to recreate all of the XDB related packages. Oracle 9i - XDB Reload spool xdbreload.log connect / as sysdba set echo on; shutdown immediate; startup migrate; @?/rdbms/admin/xdbrelod.sql shutdown immediate; startup; @?/rdbms/admin/utlrp.sql spool off Oracle 10.1 and above - XDB Reload spool xdbreload.log connect / as sysdba set echo on; shutdown immediate; startup upgrade; @?/rdbms/admin/xdbrelod.sql shutdown immediate; startup; @?/rdbms/admin/utlrp.sql spool off Deinstalling and Reinstalling XDB Prior to upgrading a database with XML Database (XDB) installed or installing XDB, be sure to run the following code listed below to determine if any objects need to be dropped. Please note, failure to run the code listed below could result in data loss of user objects like tables, indexes. This is fully documented in: (Doc ID 1573175.1) Upgrading or Installing XDB could result in data loss if XDB_INSTALLATION_TRIGGER exists connect / as sysdba set serveroutput on DECLARE v_xdb_installation_trigger number; v_dropped_xdb_instll_trigger number; v_dropped_xdb_instll_tab number; BEGIN select count(*) into v_xdb_installation_trigger from dba_triggers where trigger_name = 'XDB_INSTALLATION_TRIGGER' and owner = 'SYS'; select count(*) into v_dropped_xdb_instll_trigger from dba_triggers where trigger_name = 'DROPPED_XDB_TRIGGER' and owner = 'SYS'; select count(*) into V_dropped_xdb_instll_tab from dba_tables where table_name = 'DROPPED_XDB_INSTLL_TAB' and owner = 'SYS'; IF v_xdb_installation_trigger > 0 OR v_dropped_xdb_instll_trigger > 0 OR v_dropped_xdb_instll_tab > 0 then IF v_xdb_installation_trigger > 0 THEN dbms_output.put_line('Please proceed to run the command SQL> drop trigger sys.xdb_installation_trigger'); -- drop trigger sys.xdb_installation_trigger; END IF; IF v_dropped_xdb_instll_trigger > 0 THEN dbms_output.put_line('Please proceed to run the command SQL> drop trigger sys.dropped_xdb_instll_trigger'); -- drop trigger sys.dropped_xdb_instll_trigger; END IF; IF v_dropped_xdb_instll_tab > 0 THEN dbms_output.put_line('Please proceed to run the command SQL> drop table sys.dropped_xdb_instll_tab'); -- drop table sys.dropped_xdb_instll_tab; END IF; ELSE dbms_output.put_line('Please proceed to run the XDB install or upgrade'); END IF; END; / Use XDB removal and reinstall only if not using this feature or under the direction of Oracle Support after it has been verified which objects will need to be recreated. For database releases 10.1.x and above, XDB is mandatory in order to use any of the XMLTYPE functions. This is true even if the XDB repository is not being used and/or there are no registered schemas. Prior to Oracle 11.1, a valid installation of JAVA Virtual Machine (JVM) is required. Prior to Oracle 10.2, a valid installation of XDK is also required. Allocate at least 350 MB or enable the autoextend on the datafile for the XDB repository tablespace datafile. To determine if the XDB tablespace has the necessary space to run the XDB installation, execute the following PL/SQL procedure: > > >> >> >> >> > &
对数据库的脱机包括数据文件的脱机和对表空间的脱机,表空间脱机实际就是表空间对应的所有数据文件脱机。 1. 数据文件OFFLINE 数据文件添加到表空间之后不能够被删除的,没有语法支持这么做,如果想不使用该数据文件,唯一是将数据文件设置为OFFLINE状态。执行以下步骤将数据文件设置为OFFLINE状态: 1) 如果是归档模式可以执行如下SQL设置数据文件的状态为OFFLINE: ALTER DATABASE DATAFILE 'XXXX.DBF' OFFLINE; 2) 如果是非归档模式执行以下SQL将数据文件状态设置为OFFLINE: ALTER DATABASE DATAFILE 'XXXX.DBF' OFFLINE DROP; 数据文件脱机,数据文件相关的数据字典信息、元数据信息都依然存在,当表空间被删除后,相关数据文件的信息才会被清除。DROP TABLESPACE只是清空Oracle数据字典信息,即使数据文件不存在都可以正常的DROP表空间。对于数据文件的脱机,在设置该数据文件ONLINE的时候都需要对该数据文件执行介质恢复。 如果在非归档模式下使用OFFLINE DROP使数据文件脱机,这就意味着该数据文件可能无法再恢复到ONLINE状态,原因就在于在非归档模式可能没有足够的日志执行ONLINE的介质恢复。如果日志未发生切换,还依然存在的话,依然可以执行介质恢复后使数据文件ONLINE。 2. 表空间OFFLINE 表空间脱机分为正常脱机、临时脱机和立即脱机,下面讨论这三种脱机方式。 1) OFFLINE NORMAL 这是默认的选项,正常情况表空间的脱机,当重新执行ONLINE时,Oracle会用相应的SCN来更新表空间数据文件头SCN即可正常的ONLINE表空间,不需要执行介质恢复。 ALTER TABLESPACE XXX OFFLINE [NORMAL]; 2) OFFLINE TEMPORARY 如果指定TEMPORARY,Oracle数据库为表空间中所有在线数据文件执行一个检查点,但是不能确保所有文件能被同步。当执行这个语句数据文件已经脱机,那么在使表空间重新ONLINE之前需要执行介质恢复。 ALTER TABLESPACE XXX OFFLINE TEMPORARY; 3) OFFLINE IMMEDIATE 执行这个操作表示立即使表空间脱机,在下次使表空间ONLINE的时候必须执行介质恢复,介质恢复成功才能使表空间ONLINE: ALTER TABLESPACE XXX OFFLINE IMMEDIATE; 对于数据文件的脱机来说,在下次ONLINE的时候一定要执行介质恢复过程,如果介质恢复成功,那么就可以成功ONLINE。对于正常的表空间脱机,下次使表空间ONLINE的时候不需要执行介质恢复。对于OFFLINE TEMPORARY的表空间,如果脱机前已经有数据文件是脱机的,那么在表空间上线前也需要执行部分数据文件的介质恢复。对于IMMEDIATE OFFLINE的表空间,在表空间上线前需要对表空间的所有数据文件执行介质恢复。脱机后的数据文件和表空间,在实例重启的时候都不会对数据文件的SCN号进行验证。
ERROR: NMO not setuid-root (Unix-only)错误的解决方法 小麦苗在使用GC搭建DG的时候报错“NMO not setuid-root (Unix-only)”,网上搜索了半天,最后想起来是,安装agent后忘记执行root.sh脚本了,再执行该脚本后,问题解决。该脚本会把$AGENT_HOME/bin/nm*的几个文件的权限修改为root。执行完毕后重启agent即可。 1、在服务端OMS启动的情况下,在客户端执行: ./agentDownload.linux -b /u01/app/agentbase -m edsir1p8.us.oracle.com -r 7799 -y 安装过程中要输入server端的密码:Oracle123 2、安装完成要用root执行:[root@edsir4p1 ~]# sudo /u01/app/agentbase/agent11g/root.sh &
Oracle优化器:星型转换(Star Query Transformation ) Star query是一个事实表(fact table)和一些维度表(dimension)的join。每个维度表都跟事实表通过主外键join,且每个维度表之间不join。 星型模式设计的好处: 1) 提供了直接、直观的业务实体与终端用户schema设计的映射。 2) 对典型的star query提供了高性能的优化。 3) 通过大量的商业智能工具的广泛支持,可能会期望甚至要求数据仓库架构包含维度表。 星型模式是用于简单的数据集市和大型数据仓库。 雪花状模式(snowflake schema): Snowflake schema是star schema的一种,但更复杂。它的维度数据被分到多个表而不是一个大表。更多的维度表,更多的外键joins,使查询更复杂,查询性能下降。 Oracle建议使用star schema替代snowflake schema,除非你有别的原因。 优化Star Query: 1) 在fact table的每个外键列上建立bitmap index。 2) 初始化参数STAR_TRANSFORMATION_ENABLED 应被设为TRUE,默认false。 星型转换(Star transformation)能为star query提供高效的查询性能。 合适的情况下,Oracle会自动选择star transformation技术,隐视重写star query SQL,提高star query效率。 星型查询2个基本步骤: 1) 从fact table中检索出必要的结果集。(bitmap index会提高效率) 2) 结果集与维度表joins。 星型转换(bitmap index) 通过bitmap AND操作将3个维度表bitmaps为一个单独的bitmap,然后与fact table通过bitmap indexes逻辑JOIN。 SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc, SUM(s.amount_sold) sales_amount FROM sales s, times t, customers c, channels ch WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id AND s.channel_id = ch.channel_id AND c.cust_state_province = 'CA' AND ch.channel_desc in ('Internet', 'Catalog') AND t.calendar_quarter_desc IN ('1999-01', '1999-02') GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc; 星型转换(a Bitmap Join Index) --建一个bitmap join index CREATE BITMAP INDEX sales_c_state_bjix ON sales(customers.cust_state_province) FROM sales, customers WHERE sales.cust_id = customers.cust_id LOCAL NOLOGGING COMPUTE STATISTICS; 即使用bitmap join index代替与表customer的bitmap join。 星型转换的限制 1、 下面的情况不支持星型转换 ? 查询中使用hint ? 查询包含绑定变量 ? Fact table上的bitmap indexes太少 ? 远程fact tables ? Anti-joined tables ? Fact table是一个unmerged view ? Fact table是一个partitioned view 2、 优化器不选择star transformation的情况 ? 表有一个好的单表访问路径 ? 表太小不值得转换 3、临时表在下面情况下不适用star transformation ? 数据库read-only模式 ? Star query是串行事务的一部分 优化星型查询 当你使用星型查询时,你需要考虑以下两点: 调整星型查询 使用星型转换 调整星型查询为了获得星型查询的最佳性能,遵循一些基本准则是非常重要的: 应该为事实表的每一个外键列都创建位图索引。 初始化参数STAR_TRANSFORMATION_ENABLED应设置为TRUE。这将开启对星型查询的 重要优化功能。为了向下兼容,它在默认情况下设置为FALSE。 当一个数据仓库满足这些条件,在数据仓库中运行的大多数星型查询将会使用被称为星形转换的查询执行策略。星型转换为星型查询提供了非常高效的查询性能。使用星型转换星型转换是依靠隐式重写(或转换)原始星型查询SQL的强大优化技术。最终用户不需要知道任何关于星形转换的细节。 Oracle数据库的查询优化器会在合适的地方自动选择星型转换。星型转换是一个查询转换,旨在高效执行星型查询。 Oracle数据库使用两个基本阶段来处理星型查询。第一阶段是从事实表(结果集)精确地检索出必要的行。由于这种检索使用了位图索引,因此是非常高效的。第二阶段是将一阶段查到的结果集与维度表相结合。最终用户查询的一个例子是:“在西部和西南部地区的销售门店的最后三个季度,食品部门的销售额和利润是多少?”这是一个简单的星型查询。使用位图索引的星型转换星型转换的一个前提条件,即在事实表的每一个连接列上都有一个单列位图索引。这些连接列包括所有的外键列。例如,sh示例模式下的sales表,分别在TIME_ID,CHANNEL_ID,CUST_ID,PROD_ID和promo_id列上建有位图索引。考虑下面的星型查询: 点击(此处)折叠或打开 SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc, SUM(s.amount_sold) sales_amount FROM sales s, times t, customers c, channels ch WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id AND s.channel_id = ch.channel_id AND c.cust_state_province = \'CA\' AND ch.channel_desc in (\'Internet\',\'Catalog\') AND t.calendar_quarter_desc IN (\'1999-Q1\',\'1999-Q2\') GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc; 该查询分两个阶段进行处理。在第一阶段,Oracle数据库使用事实表外键列的位图索引从事实表中找出并检索出必要的行。也就是说,Oracle数据库从事实表中检索结果集,从本质上是使用下面的查询: 点击(此处)折叠或打开 SELECT ... FROM sales WHERE time_id IN (SELECT time_id FROM times WHERE calendar_quarter_desc IN(\'1999-Q1\',\'1999-Q2\')) AND cust_id IN (SELECT cust_id FROM customers WHERE cust_state_province=\'CA\') AND channel_id IN (SELECT channel_id FROM channels WHERE channel_desc IN(\'Internet\',\'Catalog\')); 这是该算法的转换步骤,因为原始星型查询已被改造成子查询表示方式。访问事实表的这种方法利用了位图索引的优势。直观地说,在关系数据库中位图索引提供了基于集合的处理方案。 Oracle实现了非常快速的方法去处理集合操作,如AND(交集),OR(并集),MINUS和COUNT。在这个星形查询中,TIME_ID位图索引用于标识事实表中销售时间在1999年-Q1所有行的集合。这个集合被表示为位图(一个由1和0组成的字符串,用来表示事实表中的哪些行属于该集合)。一个类似的位图检索对应sales事实表中1999年第二季度的的所有行。该位图的或操作用于合并Q1销售结果集与Q2销售结果集。另外还将在客户维度,产品维度来完成集合操作。在星型查询处理的这一点上,有三个位图。每个位图对应于一个单独的维度表,并且每个位图代表了事实表中满足单独维度约束的行的集合。这三个位图通过AND操作被合并成一个单独的位图。这个最终的位图表示了事实表中满足所有维度约束的行集合。这就是结果集,从评估查询所需的事实表行的确切集合。请注意,没有任何事实表中的实际数据被访问。所有这些操作完全依赖位图索引和维度表。因为位图索引的压缩数据表示,位图集合操作是非常高效的。一旦确认了结果集,可以通过位图来访问sales表的实际数据。从事实表中仅仅检索需要的数据。在这一点上,Oracle数据库,有效地将所有维度表和事实表结合了起来。这种技术提供了优异的性能,因为Oracle数据库使用了一个逻辑的连接操作将所有维度表和事实表连接恰里,而不是将每个维度表与事实表分别进行连接。。该查询的第二阶段是将事实表中的行(结果集)与维度表连接在一起。 Oracle使用最有效的方法来访问和连接维度表。许多维度表非常小,并且全表扫描通常是针对这些维度表的最有效的访问方法。对于大尺寸的表,全表扫描可能不是最有效的访问方法。在前面的例子中, product.department列的位图索引可以用来快速识别在食品部门的所有产品。基于优化程序对每个维度表的大小和数据分布的判断,Oracle数据库的优化器会针对给定的维度表来自动确定哪种访问方法是最适合的。对于每个维度表而言,具体连接方法(以及索引方法)同样将被优化器智能地确定。哈希连接往往是连接维度表最有效的算法。一旦连接了所有的维度表,最终的结果将返回到用户。从一个表中检索出匹配行,然后连接到另一个表的查询技术通常被称为半连接。使用位图索引星型转换的执行计划下面这个典型的执行计划是由带位图索引的星型转换生成的: 点击(此处)折叠或打开 SELECT STATEMENT SORT GROUP BY HASH JOIN TABLE ACCESS FULL CHANNELS HASH JOIN TABLE ACCESS FULL CUSTOMERS HASH JOIN TABLE ACCESS FULL TIMES PARTITION RANGE ITERATOR TABLE ACCESS BY LOCAL INDEX ROWID SALES BITMAP CONVERSION TO ROWIDS BITMAP AND BITMAP MERGE BITMAP KEY ITERATION BUFFER SORT TABLE ACCESS FULL CUSTOMERS BITMAP INDEX RANGE SCAN SALES_CUST_BIX BITMAP MERGE BITMAP KEY ITERATION BUFFER SORT TABLE ACCESS FULL CHANNELS BITMAP INDEX RANGE SCAN SALES_CHANNEL_BIX BITMAP MERGE BITMAP KEY ITERATION BUFFER SORT TABLE ACCESS FULL TIMES BITMAP INDEX RANGE SCAN SALES_TIME_BIX 在这个计划中,是通过一个由三个位图合并而来的位图访问路径来访问事实表。这三个位图是BITMAP MERGE根据行资源树的位图生成的。每个这样的行资源树是从子查询行资源树的位图键迭代行源组成,在这个例子是一个全表扫描。对于每一个这样的值,位图键迭代行源从位图索引中检索位图。在相应的事实表行通过这种访问路径被检索到以后,它们与维度表及临时表合并产生的查询结果。 使用位图连接索引的星型转换 除了位图索引,您可以在星型转换中使用位图连接索引。假设你有以下附加索引结构: 点击(此处)折叠或打开 CREATE BITMAP INDEX sales_c_state_bjix ON sales(customers.cust_state_province) FROM sales, customers WHERE sales.cust_id = customers.cust_id LOCAL NOLOGGING COMPUTE STATISTICS; 使用位图连接索引的星型查询和之前的例子非常相似,唯一的区别是在星型查询的第一阶段,Oracle利用连接索引,而不是一个单表位图索引,去访问顾客数据。 使用位连接图索引星型转换的执行计划下面这个典型的执行计划是由带位连接图索引的星型转换生成的: 点击(此处)折叠或打开 SELECT STATEMENT SORT GROUP BY HASH JOIN TABLE ACCESS FULL CHANNELS HASH JOIN TABLE ACCESS FULL CUSTOMERS HASH JOIN TABLE ACCESS FULL TIMES PARTITION RANGE ALL TABLE ACCESS BY LOCAL INDEX ROWID SALES BITMAP CONVERSION TO ROWIDS BITMAP AND BITMAP INDEX SINGLE VALUE SALES_C_STATE_BJIX BITMAP MERGE BITMAP KEY ITERATION BUFFER SORT TABLE ACCESS FULL CHANNELS BITMAP INDEX RANGE SCAN SALES_CHANNEL_BIX BITMAP MERGE BITMAP KEY ITERATION BUFFER SORT TABLE ACCESS FULL TIMES BITMAP INDEX RANGE SCAN SALES_TIME_BIX 这个执行计划和前面相比,区别在于使用位图索引扫描顾客维度的那一部分没有子查询。这是因为在customer.cust_state_province的连接述语信息已经满足了位图连接索引sales_c_state_bjix。 Oracle如何选择使用星型转换 优化器可以生成并保存一个未经转换的最优执行计划。如果星型转换被启用,优化器将尝试将其应用到查询;如果适用,则产生一个使用转换查询的最优执行计划。基于这两个版本的执行计划,优化器通过比较二者的成本估算,然后决定使用经过转换的最优执行计划或者是未经转换的版本。 如果查询需要访问事实表中的大部分行,最好使用全表扫描,而不是使用星型转换查询。但是,如果维度表的约束谓词具有充分的可选性,也就是说只会从事实表中检索很小一部分数据,那么基于转换的执行计划很有可能会更好。 需要注意的是,优化器会根据许多标准判断,在它任务合理的情况下才会根据维度表生成子查询。Oracle优化器并不保证为所有维度表生成子查询。基于表和查询的特性,优化器还可以决定该转换是否值得被应用到特定查询中。在这种情况下,优化器将会使用最优计划。 使用星型转换的限制条件 具有任何以下特征的表均不支持星型转换: ?查询使用了与位图访问路径不兼容的表提示(hint) ?查询包含绑定变量 ?表没有位图索引。事实表的列必须有位图索引,优化器才能创建子查询。 ?远程事实表。然而,子查询中允许使用远程维度表。 ?反连接的表 ?已经在子查询中用作维度表的表 ?表是unmerged视图,并且不是分区视图 ?事实表是unmerged视图 ?事实表是分区视图 在以下场景优化器可能不会选择星型转换: ?表具有良好的单表访问路径 ?表太小,不值得进行转换 此外,在下列条件下星型转换不使用临时表: ?数据库处于只读模式 ?星型查询是串行化事务的一部分 Oracle优化器:星型转换 2010/12/27 BY MACLEAN LIU 1 COMMENT >>>> >>>>>> >> >> > > > > > > > > > &
如何重建encrytion wallet in ORA-28374 > > > > >> > >>>>> >> >> > > <><>
< > < > > > < >> > < > < > < > < > < < < < < > < > < > < > > &
【DG】DG备库报ORA-28000: the account is locked的解决办法 测试用户为lhr现象:主备库的lhr用户的状态都是OPEN,但是,备库连接的时候报ORA-28000: the account is locked错误。在主库执行“alter user lhr identified by lhr account unlock;”同步到备库也不能解决,在备库该命令不能执行。 解决:重启DG环境的备库实例即可 参考:ORA-28000 On Active Data Guard (文档 ID 1922621.1) 用户密码请参考:http://blog.itpub.net/26736162/viewspace-2129595/ 主库 SYS@oradg11g > alter user lhr identified by lhr account unlock;User altered.SYS@oradg11g > SYS@oradg11g > SYS@oradg11g > SYS@oradg11g > conn lhr/lhrConnected.LHR@oradg11g > alter user lhr identified by lhr account unlock;User altered.LHR@oradg11g > conn lhr/lhrConnected.LHR@oradg11g > select * from dba_users where USERNAME='LHR';USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED PROFILE INITIAL_RSRC_CONSUMER_GROUP EXTERNAL_NAME PASSWORD E AUTHENTI------------------------------ ---------- ------------------------------ -------------------------------- ------------------- ------------------- ------------------------------ ------------------------------ ------------------- ------------------------------ ------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- - --------LHR 95 OPEN 2018-03-24 11:49:18 USERS TEMP 2017-04-03 21:01:18 DEFAULT DEFAULT_CONSUMER_GROUP 10G 11G N PASSWORD 备库: LHR@oradgphy > conn lhr/aaERROR:ORA-01017: invalid username/password; logon deniedWarning: You are no longer connected to ORACLE.@ > conn lhr/aaERROR:ORA-01017: invalid username/password; logon denied@ > conn lhr/aaERROR:ORA-01017: invalid username/password; logon denied@ > conn lhr/aa conn lhr/aaERROR:ORA-01017: invalid username/password; logon denied@ > conn lhr/aaERROR:ORA-01017: invalid username/password; logon denied@ > @ > conn lhr/aa conn lhr/aa conn lhr/aaERROR:ORA-01017: invalid username/password; logon denied@ > @ > @ > conn lhr/aa conn lhr/aa conn lhr/aaERROR:ORA-01017: invalid username/password; logon denied@ > @ > @ > ERROR:ORA-01017: invalid username/password; logon denied@ > @ > @ > ERROR:ORA-01017: invalid username/password; logon denied@ > @ > @ > conn lhr/aaERROR:ORA-28000: the account is locked@ > @ > ERROR:ORA-28000: the account is locked@ > @ > @ > ERROR:ORA-28000: the account is locked@ > @ > @ > ERROR:ORA-28000: the account is locked@ > @ > @ > @ > conn lhr/aaERROR:ORA-28000: the account is locked@ > @ > @ > conn lhr/lhrERROR:ORA-28000: the account is locked@ > conn lhr/lhrERROR:ORA-28000: the account is locked@ > select * from dba_users where USERNAME='LHR';SP2-0640: Not connected@ > @ > conn / as sysdbaConnected.SYS@oradgphy > select * from dba_users where USERNAME='LHR';USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED PROFILE INITIAL_RSRC_CONSUMER_GROUP EXTERNAL_NAME PASSWORD E AUTHENTI------------------------------ ---------- ------------------------------ -------------------------------- ------------------- ------------------- ------------------------------ ------------------------------ ------------------- ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------