暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle用户与对象管理

浅谈Oracle 2021-04-28
854


1. 说明

本文档主要是有关oracle用户、对象、表空间相关的内容,希望对大家有所帮助。

2. 用户

2.1.用户的创建和删除

1、创建用户

create user 用户名identified by “密码”default tablespace 表空间名temporary tablespace 临时表空间名profile DEFAULTquota unlimited on 表空间名;

2、删除用户

drop user 用户名 cascade (删除用户和级联关系);

显示当前数据库下所有用户

    SQL> select username from dba_users;


    USERNAME
    ------------------------------------------------------------
    LIQI
    RMAN
    TARGET1
    GGS
    SPATIAL_WFS_ADMIN_USR
    SPATIAL_CSW_ADMIN_USR
    HR
    APEX_PUBLIC_USER
    OE
    DIP
    SH
    IX
    MDDATA
    PM
    BI
    复制


    2.2. 权限的授予和回收

     1、授予权限

       语法:

        GRANT CONNECT, RESOURCE TO 用户名;

        GRANT SELECT ON 表名 TO 用户名;

        GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2;

    (1)创建session的权限给ggs(create session就是允许使用这个用户在服务器上创建session。通俗的说,就是允许这个用户登录。)

      SQL> grant create session to ggs;
      复制

      复制

      (2)创建表权限;

       
        SQL> grant create table to ggs;
        复制

        复制

        (3)没有限制的表空间;

         
          SQL> grant unlimited tablespace to ggs;
          复制

          复制

           (4)如果对权限要求不是很严格的话,直接赋予管理员权限;

           
            SQL> grant dba to ggs;
            复制

            复制

            2、收回权限

               语法如下:

               


               REVOKE CONNECT, RESOURCE FROM 用户名;    
              REVOKE SELECT ON 表名 FROM 用户名;
              REVOKE SELECT, INSERT, DELETE ON表名 FROM 用户名1, 用户名2
              复制
              --收回查询表的权限
              复制
              复制
                revoke select on demo from ggs;
                revoke all on demo from ggs;
                复制

                复制
                --查询一个用户拥有的对象权限
                复制
                  select table_name,privilege from dba_tab_privs where grantee='ggs';
                  复制

                  复制
                  --查询一个用户拥有的系统权限
                  复制
                    select * from dba_sys_privs where grantee='ggs';
                    复制

                    复制
                    --当前会话有效的系统权限
                    复制
                      SQL> select * from session_privs;


                      PRIVILEGE
                      --------------------------------------------------------------------------------
                      ALTER SYSTEM
                      AUDIT SYSTEM
                      CREATE SESSION
                      ALTER SESSION
                      RESTRICTED SESSION
                      CREATE TABLESPACE
                      ALTER TABLESPACE
                      MANAGE TABLESPACE
                      DROP TABLESPACE
                      UNLIMITED TABLESPACE
                      CREATE USER
                      BECOME USER
                      ALTER USER
                      DROP USER
                      CREATE ROLLBACK SEGMENT
                      ALTER ROLLBACK SEGMENT
                      DROP ROLLBACK SEGMENT
                      CREATE TABLE
                      CREATE ANY TABLE
                      ALTER ANY TABLE
                      BACKUP ANY TABLE
                      DROP ANY TABLE
                      LOCK ANY TABLE
                      COMMENT ANY TABLE
                      SELECT ANY TABLE
                      INSERT ANY TABLE
                      UPDATE ANY TABLE
                      DELETE ANY TABLE
                      CREATE CLUSTER
                      CREATE ANY CLUSTER
                      ALTER ANY CLUSTER
                      DROP ANY CLUSTER
                      CREATE ANY INDEX
                      ALTER ANY INDEX
                      DROP ANY INDEX
                      CREATE SYNONYM
                      CREATE ANY SYNONYM
                      DROP ANY SYNONYM
                      CREATE PUBLIC SYNONYM
                      DROP PUBLIC SYNONYM
                      CREATE VIEW
                      CREATE ANY VIEW
                      DROP ANY VIEW
                      CREATE SEQUENCE
                      CREATE ANY SEQUENCE
                      ALTER ANY SEQUENCE
                      DROP ANY SEQUENCE
                      SELECT ANY SEQUENCE
                      CREATE DATABASE LINK
                      CREATE PUBLIC DATABASE LINK
                      DROP PUBLIC DATABASE LINK
                      CREATE ROLE
                      DROP ANY ROLE
                      GRANT ANY ROLE
                      ALTER ANY ROLE
                      AUDIT ANY
                      ALTER DATABASE
                      FORCE TRANSACTION
                      FORCE ANY TRANSACTION
                      CREATE PROCEDURE
                      CREATE ANY PROCEDURE
                      ALTER ANY PROCEDURE
                      DROP ANY PROCEDURE
                      EXECUTE ANY PROCEDURE
                      CREATE TRIGGER
                      CREATE ANY TRIGGER
                      ALTER ANY TRIGGER
                      DROP ANY TRIGGER
                      CREATE PROFILE
                      ALTER PROFILE
                      DROP PROFILE
                      ALTER RESOURCE COST
                      ANALYZE ANY
                      GRANT ANY PRIVILEGE
                      CREATE MATERIALIZED VIEW
                      CREATE ANY MATERIALIZED VIEW
                      ALTER ANY MATERIALIZED VIEW
                      DROP ANY MATERIALIZED VIEW
                      CREATE ANY DIRECTORY
                      DROP ANY DIRECTORY
                      CREATE TYPE
                      CREATE ANY TYPE
                      ALTER ANY TYPE
                      DROP ANY TYPE
                      EXECUTE ANY TYPE
                      UNDER ANY TYPE
                      CREATE LIBRARY
                      CREATE ANY LIBRARY
                      ALTER ANY LIBRARY
                      DROP ANY LIBRARY
                      EXECUTE ANY LIBRARY
                      CREATE OPERATOR
                      CREATE ANY OPERATOR
                      ALTER ANY OPERATOR
                      DROP ANY OPERATOR
                      EXECUTE ANY OPERATOR
                      CREATE INDEXTYPE
                      CREATE ANY INDEXTYPE
                      ALTER ANY INDEXTYPE
                      DROP ANY INDEXTYPE
                      UNDER ANY VIEW
                      QUERY REWRITE
                      GLOBAL QUERY REWRITE
                      EXECUTE ANY INDEXTYPE
                      UNDER ANY TABLE
                      CREATE DIMENSION
                      CREATE ANY DIMENSION
                      ALTER ANY DIMENSION
                      DROP ANY DIMENSION
                      MANAGE ANY QUEUE
                      ENQUEUE ANY QUEUE
                      DEQUEUE ANY QUEUE
                      CREATE ANY CONTEXT
                      DROP ANY CONTEXT
                      CREATE ANY OUTLINE
                      ALTER ANY OUTLINE
                      DROP ANY OUTLINE
                      ADMINISTER RESOURCE MANAGER
                      ADMINISTER DATABASE TRIGGER
                      MERGE ANY VIEW
                      ON COMMIT REFRESH
                      RESUMABLE
                      SELECT ANY DICTIONARY
                      DEBUG CONNECT SESSION
                      DEBUG ANY PROCEDURE
                      FLASHBACK ANY TABLE
                      GRANT ANY OBJECT PRIVILEGE
                      CREATE EVALUATION CONTEXT
                      CREATE ANY EVALUATION CONTEXT
                      ALTER ANY EVALUATION CONTEXT
                      DROP ANY EVALUATION CONTEXT
                      EXECUTE ANY EVALUATION CONTEXT
                      CREATE RULE SET
                      CREATE ANY RULE SET
                      ALTER ANY RULE SET
                      DROP ANY RULE SET
                      EXECUTE ANY RULE SET
                      EXPORT FULL DATABASE
                      IMPORT FULL DATABASE
                      CREATE RULE
                      CREATE ANY RULE
                      ALTER ANY RULE
                      DROP ANY RULE
                      EXECUTE ANY RULE
                      ANALYZE ANY DICTIONARY
                      ADVISOR
                      CREATE JOB
                      CREATE ANY JOB
                      EXECUTE ANY PROGRAM
                      EXECUTE ANY CLASS
                      MANAGE SCHEDULER
                      SELECT ANY TRANSACTION
                      DROP ANY SQL PROFILE
                      ALTER ANY SQL PROFILE
                      ADMINISTER SQL TUNING SET
                      ADMINISTER ANY SQL TUNING SET
                      CREATE ANY SQL PROFILE
                      MANAGE FILE GROUP
                      MANAGE ANY FILE GROUP
                      READ ANY FILE GROUP
                      CHANGE NOTIFICATION
                      CREATE EXTERNAL JOB
                      CREATE ANY EDITION
                      DROP ANY EDITION
                      ALTER ANY EDITION
                      CREATE ASSEMBLY
                      CREATE ANY ASSEMBLY
                      ALTER ANY ASSEMBLY
                      DROP ANY ASSEMBLY
                      EXECUTE ANY ASSEMBLY
                      EXECUTE ASSEMBLY
                      CREATE MINING MODEL
                      CREATE ANY MINING MODEL
                      DROP ANY MINING MODEL
                      SELECT ANY MINING MODEL
                      ALTER ANY MINING MODEL
                      COMMENT ANY MINING MODEL


                      CREATE ANY CUBE


                      FLASHBACK ARCHIVE ADMINISTE
                      复制
                      复制


                      2.3. 密码验证函数

                      密码函数的作用就是要将用户密码进行限制,比如申请一个网站的账号的时候,密码会要求你不少于8位,必须要有一个大小写,字符,或者英文加上数字才可以,这些都是可以对create user的密码进行限制的,首先要接触一个profile的参数,之前没接触过这个,profile的作用就是对一些CPU的资源,或者用户密码进行限制的。

                      oracle 用户管理 :profile + tablespace + role + user

                      Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对数据库资源的限制使用,如果把该profile分配给用户,则该用户所能使用的数据库资源都在该profile的限制之内。

                      profile文件可以控制:CPU的时间 、I/O的使用 、IDLE TIME(空闲时间) 、CONNECT TIME(连接时间) 、并发会话数量 、口令机制。 

                       1.查看oracle提供的密码函数脚本

                        [oracle@wyj admin]$ cat utlpwdmg.sql      可以查看oracle提供的密码函数脚本




                        -- This script alters the default parameters for Password Management
                        -- This means that all the users on the system have Password Management
                        -- enabled and set to the following values unless another profile is
                        -- created with parameter values set to different value or UNLIMITED
                        -- is created and assigned to the user.


                        -- Enable this if you want older version of the Password Profile parameters
                        -- ALTER PROFILE DEFAULT LIMIT
                        -- PASSWORD_LIFE_TIME 60
                        -- PASSWORD_GRACE_TIME 10
                        -- PASSWORD_REUSE_TIME 1800
                        -- PASSWORD_REUSE_MAX UNLIMITED
                        -- FAILED_LOGIN_ATTEMPTS 3
                        -- PASSWORD_LOCK_TIME 1/1440
                        复制


                        2、执行脚本



                        2.4. 用户profile

                        创建profile脚本

                        复制
                          DROP PROFILE PROFILEUSER CASCADE;
                          CREATE PROFILE PROFILEUSER LIMIT
                          SESSIONS_PER_USER UNLIMITED
                          CPU_PER_SESSION UNLIMITED
                          CPU_PER_CALL UNLIMITED
                          CONNECT_TIME UNLIMITED
                          IDLE_TIME UNLIMITED
                          LOGICAL_READS_PER_SESSION UNLIMITED
                          LOGICAL_READS_PER_CALL UNLIMITED
                          COMPOSITE_LIMIT UNLIMITED
                          PRIVATE_SGA UNLIMITED
                          FAILED_LOGIN_ATTEMPTS UNLIMITED
                          PASSWORD_LIFE_TIME UNLIMITED
                          PASSWORD_REUSE_TIME UNLIMITED
                          PASSWORD_REUSE_MAX UNLIMITED
                          PASSWORD_LOCK_TIME UNLIMITED
                          PASSWORD_GRACE_TIME UNLIMITED
                          PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION_11G;
                          复制
                          复制

                          profile常见参数如下图:


                          2.5. 11G中关于用户密码的新特性

                           1、密码大小写敏感

                           从oracle 11gR1开始,数据库中的密码是大小写敏感的。密码大小写敏感是由sec_case_sensitive_logon参数控制的。

                          复制
                            SQL> show parameter sec_case_sensitive_logon
                            NAME TYPE VALUE
                            ------------------------------------ ---------- -------
                            sec_case_sensitive_logon boolean TRUE
                            复制
                            复制

                            可见当前数据库是启用该新特性的。建议启用该新特性,以增强密码的安全性。

                            2、密码延迟验证

                            (1)等待用户输入密码的时间,随着输入错误密码的次数而不断延长。以此缓解暴力破解Oracle用户密码。
                            (2)密码延迟验证潜在风险

                            • 修改用户密码引发大量Library Cache Lock 数据库密码应该是定时修改,以提高数据库安全性,防止黑客攻击。但是, 大部署大量程序的业务 系统里,难免会有遗漏的情况。在修改完密码后,数据库会出现大量的Library Cache Lock等待事件。在MOS 上有说明:High 'library cache lock' Wait Time Due to Invalid Login Attempts(1309738.1)

                            • BUG 用户登录数据库,哪怕正常登录,每次登录的时间都在延长。

                            (3)该特性编号: 28401 . 如果遇到这里描述的问题,将该特性关闭(临时或者永久)。 

                              ALTER SYSTEM SET EVENT = '28401 TRACE NAME CONTEXT FOREVER, LEVEL 1' SCOPE = SPFILE;
                              复制

                              复制

                              2.6. 11G中默认角色权限的差异



                              10g

                              11g

                              12c

                              CONNECT

                              ALTER SESSION, CREATE CLUSTER, 
                              CREATE DATABASE LINK, 
                              CREATE SEQUENCE, CREATE SESSION, 
                              CREATE SYNONYM, CREATE TABLE,
                               CREATE VIEW

                              CREATE SESSION 

                              CREATE SESSION 

                              resource

                               CREATE CLUSTERCREATE INDEXTYPE,
                               
                              CREATE OPERATOR
                              CREATE PROCEDURECREATE SEQUENCE
                              CREATE TABLECREATE TRIGGER
                              CREATE TYPE

                              CREATE CLUSTERCREATE INDEXTYPE,
                              CREATE OPERATORCREATE PROCEDURE,
                              CREATE SEQUENCECREATE TABLE,
                              CREATE TRIGGERCREATE TYPE.

                              CREATE CLUSTERCREATE INDEXTYPE
                              CREATE OPERATORCREATE PROCEDURE,
                               
                              CREATE SEQUENCECREATE TABLE
                              CREATE TRIGGERCREATE TYPE.
                              Be aware that RESOURCE no longer provides
                              the UNLIMITED TABLESPACE system privilege.

                              DBA

                              All system privileges WITH ADMIN OPTION

                               all system privileges that were created with the ADMIN option.

                              Provides a large number of system privileges,
                              including the 
                              ANY privileges
                              (such as 
                              DELETE ANY TABLE)
                              and the 
                              GRANT ANY PRIVILEGE privilege.

                              EXP_FULL
                              _DATABASE

                              Provides the privileges required to
                              perform full and incremental database exports.
                              Includes:
                               
                              SELECT ANY TABLEBACKUP ANY TABLE,
                               
                              EXECUTE ANY PROCEDUREEXECUTE ANY TYPE
                              ADMINISTER RESOURCE MANAGER,
                              and 
                              INSERTDELETE,
                              and 
                              UPDATE on the tables SYS.INCVIDSYS.INCFIL, and SYS.INCEXP.
                              Also the following roles: 
                              EXECUTE_CATALOG_ROLE 
                              and 
                              SELECT_CATALOG_ROLE.

                              Provides the privileges required to
                              perform full and incremental database exports
                              using the Export utility
                              (later replaced with Oracle Data Pump).
                              It includes these privileges: 
                              SELECT ANY TABLEBACKUP ANY TABLE,
                              EXECUTE ANY PROCEDURE,
                              EXECUTE ANY TYPE,
                              ADMINISTER RESOURCE MANAGER,
                              and 
                              INSERT,DELETE,
                              and 
                              UPDATE 
                              on the tables SYS.INCVIDSYS.INCFIL,
                              and 
                              SYS.INCEXP. Also the following roles: EXECUTE_CATALOG_ROLE
                              and SELECT_CATALOG_ROLE.

                              SELECT ANY TABLEBACKUP ANY TABLE,
                               
                              EXECUTE ANY PROCEDURE
                              EXECUTE ANY TYPE
                              ADMINISTER RESOURCE MANAGER,
                              and 
                              INSERTDELETE,
                              and 
                              UPDATE 
                              on the tables 
                              SYS.INCVIDSYS.INCFIL,
                              and 
                              SYS.INCEXP.
                              Also includes the following roles: 
                              EXECUTE_CATALOG_ROLE 
                              and 
                              SELECT_CATALOG_ROLE.

                              IMP_FULL
                              _DATABASE

                              Provides the privileges required to
                              perform full database imports.
                              Includes an extensive list of system privileges
                              (use view 
                              DBA_SYS_PRIVSto view privileges)
                              and the following roles: 
                              EXECUTE_CATALOG_ROLE 
                              and 
                              SELECT_CATALOG_ROLE.

                              Provides the privileges required to
                              perform full database imports using
                              the Import utility
                              (later replaced with Oracle Data Pump)
                              and the following roles:
                              EXECUTE_CATALOG_ROLE and
                              SELECT_CATALOG_ROLE.
                              Includes an extensive list of system privileges 

                              Provides the privileges required
                              to perform full database imports
                              using the Import utility
                              (later replaced with Oracle Data Pump).
                              Includes an extensive list
                              of system privileges
                              (use view
                              DBA_SYS_PRIVS to view privileges)
                              and the following roles: 
                              EXECUTE_CATALOG_ROLE 
                              and
                              SELECT_CATALOG_ROLE.

                              DELETE_
                              CATALOG_ROLE

                              Provides DELETE privilege on the system audit table (AUD$)

                              Provides the DELETE privilege
                              on the system audit table (
                              AUD$).

                              Provides the DELETE privilege
                              on the system audit table (
                              AUD$),
                              in a non-unified auditing environment.

                              EXECUTE_
                              CATALOG_ROLE

                              Provides EXECUTE privilege on objects in the data dictionary. Also, HS_ADMIN_ROLE.

                              Provides EXECUTE privileges
                              on objects in the data dictionary.

                              Provides EXECUTE privileges
                              on objects in the data dictionary.

                              SELECT_
                              CATALOG_ROLE

                              Provides SELECT privilege on objects in the data dictionary. Also, HS_ADMIN_ROLE.

                              Provides SELECT privilege
                              on objects in the data dictionary.

                              Provides SELECT privilege
                              on objects in the data dictionary.

                              RECOVERY_
                              CATALOG_OWNER

                              CREATE SESSION, ALTER SESSION, CREATE SYNONYM, CREATE VIEW, CREATE DATABASE LINK,CREATE TABLE, CREATE CLUSTER, CREATE SEQUENCE, CREATE TRIGGER, and CREATE PROCEDURE

                              CREATE SESSIONALTER SESSION
                              CREATE SYNONYMCREATE VIEW
                              CREATE DATABASE LINKCREATE TABLE
                              CREATE CLUSTERCREATE SEQUENCE
                              CREATE TRIGGER,
                              and 
                              CREATE PROCEDURE

                               CREATE SESSIONALTER SESSION,
                               
                              CREATE SYNONYM
                              CREATE ANY SYNONYM
                              DROP ANY SYNONYMCREATE VIEW
                              CREATE DATABASE LINKCREATE TABLE,
                               
                              CREATE CLUSTERCREATE SEQUENCE
                              CREATE TRIGGER,CREATE ANY TRIGGER,
                               
                              QUERY REWRITECREATE ANY CONTEXT
                              EXECUTE ON DBMS_RLS,
                              ADMINISTER DATABASE,
                              and 
                              CREATE PROCEDURE

                              SCHEDULER
                              _ADMIN


                               execute the procedures
                              of the 
                              DBMS_SCHEDULERpackage

                               execute the procedures of the DBMS_SCHEDULERpackage

                              GATHER_SYSTEM
                              _STATISTICS


                              Provides privileges to
                              update system statistics,
                              which are collected using the 
                              DBMS_STATS.GATHER_SYSTEM_STATISTICS
                               procedure

                              Provides privileges
                              to update system statistics,
                              which are collected using the
                              DBMS_STATS.GATHER_SYSTEM_STATISTICS 
                              procedure

                              LOGSTDBY_
                              ADMINISTRATOR


                              Provides administrative privileges to manage the SQL Apply (logical standby database) environment.

                              Provides administrative privileges
                              to manage the SQL Apply (logical standby database) environment.



                              2.7. 与用户、权限、角色相关的动态性能视图和数据字典

                              1、dba_users,描述了数据库中所有的用户信息。

                              复制
                                SQL> desc dba_users;
                                Name Null? Type
                                名称 是否为空 类型
                                ----------------------------------------- -------- ----------------------------
                                USERNAME NOT NULL VARCHAR2(30)
                                USER_ID NOT NULL NUMBER
                                PASSWORD VARCHAR2(30)
                                ACCOUNT_STATUS NOT NULL VARCHAR2(32)
                                LOCK_DATE DATE
                                EXPIRY_DATE DATE
                                DEFAULT_TABLESPACE NOT NULL VARCHAR2(30)
                                TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30)
                                CREATED NOT NULL DATE
                                PROFILE NOT NULL VARCHAR2(30)
                                INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(30)
                                EXTERNAL_NAME VARCHAR2(4000)
                                PASSWORD_VERSIONS VARCHAR2(8)
                                EDITIONS_ENABLED VARCHAR2(1)
                                AUTHENTICATION_TYPE VARCHAR2(8)
                                复制

                                复制

                                2、查看所有用户;

                                 
                                复制
                                  SQL> select username from dba_users;


                                  USERNAME
                                  ------------------------------------------------------------
                                  MGMT_VIEW
                                  SYS
                                  SYSTEM
                                  DBSNMP
                                  SYSMAN
                                  GGS
                                  OUTLN
                                  FLOWS_FILES
                                  MDSYS
                                  ORDSYS
                                  EXFSYS
                                  WMSYS
                                  APPQOSSYS
                                  APEX_030200
                                  OWBSYS_AUDIT
                                  ORDDATA
                                  CTXSYS
                                  ANONYMOUS
                                  XDB
                                  ORDPLUGINS
                                  OWBSYS
                                  SI_INFORMTN_SCHEMA
                                  OLAPSYS
                                  SCOTT
                                  ORACLE_OCM
                                  XS$NULL
                                  BI
                                  PM
                                  MDDATA
                                  IX
                                  SH
                                  DIP
                                  OE
                                  APEX_PUBLIC_USER
                                  HR
                                  SPATIAL_CSW_ADMIN_USR
                                  SPATIAL_WFS_ADMIN_USR
                                  37 rows selected.
                                  复制
                                  复制

                                  注意:权限有两种:A、系统权限(dba_sys_privs )

                                                                B、对象权限。(dba_tab_privs ) 

                                  3、查看权限: desc dba_sys_privs;desc dba_tab_privs; 

                                  复制
                                    SQL> desc dba_sys_privs;
                                    Name Null? Type
                                    ----------------- -------- ------------
                                    GRANTEE NOT NULL VARCHAR2(30)
                                    PRIVILEGE NOT NULL VARCHAR2(40)
                                    ADMIN_OPTION VARCHAR2(3)
                                    复制


                                    复制
                                      SQL> desc dba_tab_privs;
                                      Name Null? Type
                                      ----------------- -------- ------------
                                      GRANTEE NOT NULL VARCHAR2(30)
                                      OWNER NOT NULL VARCHAR2(30)
                                      TABLE_NAME NOT NULL VARCHAR2(30)
                                      GRANTOR NOT NULL VARCHAR2(30)
                                      PRIVILEGE NOT NULL VARCHAR2(40)
                                      GRANTABLE VARCHAR2(3)
                                      HIERARCHY VARCHAR2(3)
                                      复制

                                      复制

                                      4、通过查询数据库字典视图 dba_role_privs 可以显示用户所具有的角色。

                                       
                                      复制
                                        SQL> desc dba_role_privs;
                                        Name Null? Type
                                        ----------------- -------- ------------
                                        GRANTEE VARCHAR2(30)
                                        GRANTED_ROLE NOT NULL VARCHAR2(30)
                                        ADMIN_OPTION VARCHAR2(3)
                                        DEFAULT_ROLE VARCHAR2(3)
                                        复制

                                        复制
                                        ##查看GGS用户所具有的的角色
                                        复制
                                        复制
                                          SQL>  select * from dba_role_privs where GRANTEE='GGS';


                                          GRANTEE GRANTED_ROLE ADMIN_ DEFAUL
                                          ------------------------------------------------------------ ---------------------------------- ------ ------
                                          GGS DBA NO YES
                                          GGS RESOURCE NO YES
                                          GGS CONNECT NO YES
                                          复制

                                          5、role_role_privs ,描述授予角色的系统权限。只提供关于用户有权访问的角色的信息。

                                           
                                          复制
                                            SQL> desc role_role_privs;
                                            Name Null? Type
                                            ----------------------------------------------------- -------- ------------------------------------
                                            ROLE NOT NULL VARCHAR2(30)
                                            GRANTED_ROLE NOT NULL VARCHAR2(30)
                                            ADMIN_OPTION VARCHAR2(3)
                                            复制

                                            复制

                                            6、V$PWFILE_USERS,列出密码文件中的所有用户,并表明该用户是否被授予SYSDBA、SYSOPER和syasm权限。

                                             
                                            复制
                                              SQL> desc V$PWFILE_USERS;
                                              Name Null? Type
                                              ----------------------------------------------------- -------- ------------------------------------
                                              USERNAME VARCHAR2(30)
                                              SYSDBA VARCHAR2(5)
                                              SYSOPER VARCHAR2(5)
                                              SYSASM VARCHAR2(5)
                                              复制

                                              7、DBA_COL_PRIVS,描述数据库中所有列对象授予的权限。

                                              复制
                                                SQL> desc DBA_COL_PRIVS;
                                                Name Null? Type
                                                ----------------------------------------------------- -------- ------------------------------------
                                                GRANTEE NOT NULL VARCHAR2(30)
                                                OWNER NOT NULL VARCHAR2(30)
                                                TABLE_NAME NOT NULL VARCHAR2(30)
                                                COLUMN_NAME NOT NULL VARCHAR2(30)
                                                GRANTOR NOT NULL VARCHAR2(30)
                                                PRIVILEGE NOT NULL VARCHAR2(40)
                                                GRANTABLE VARCHAR2(3)
                                                复制

                                                复制

                                                3. 对象相关

                                                3.1. 表相关

                                                数据库开发步骤:

                                                1) 创建表空间:默认使用的表空间: users,  表空间需要映射一个/多个数据文件

                                                2) 创建用户: 绑定一个默认的表空间,  相当于这个用户创建的数据库对象(表...)都存在在绑定的这个表空间

                                                3) 对用户进行授权, 撤销权限都必须使用系统管理员进行操作  --> DBA(数据库工程师)去执行的

                                                4) 创建表:  存放数据

                                                5) 进行数据添加;

                                                6) 对数据查询,修改,删除 ;      

                                                3.1.1. 表的类型、创建方式

                                                 1、表的类型;

                                                (1)堆表:heap table :数据存储时,行是无序的,对它的访问采用全表扫描。

                                                复制
                                                  SQL> create table t_heap (object_id int primary key,object_name varchar2(60));


                                                  Table created.
                                                  ##插数据
                                                  SQL> insert into t_heap select object_id,object_name from dba_objects;


                                                  86977 rows created.


                                                  SQL> select * from t_heap where object_id<100;


                                                  OBJECT_ID OBJECT_NAME
                                                  ---------- ------------------------------------------------------------------------------------------------------------------------
                                                  2 C_OBJ#
                                                  3 I_OBJ#
                                                  4 TAB$
                                                  5 CLU$
                                                  6 C_TS#
                                                  7 I_TS#
                                                  8 C_FILE#_BLOCK#
                                                  9 I_FILE#_BLOCK#
                                                  10 C_USER#
                                                  11 I_USER#
                                                  12 FET$
                                                  复制
                                                  复制

                                                  (2)分区表 (表>2G);

                                                  A、分区的目的

                                                  • 一般一张表超过2G的大小,ORACLE是推荐使用分区表的。

                                                  • 这张表主要是查询,而且可以按分区查询,只会修改当前最新分区的数据,对以前的不怎么做删除和修改。

                                                  • 数据量大时查询慢。

                                                  • 便于维护,可扩展:11g 中的分区表新特性:Partition(分区)一直是 Oracle 数据库引以为傲的一项技术,正是分区的存在让 Oracle 高效的处理海量数据成为可能,在 Oracle 11g 中,分区技术在易用性和可扩展性上再次得到了增强。

                                                  • 与普通表的 sql 一致,不需要因为普通表变分区表而修改我们的代码。

                                                  复制
                                                    --按年创建分区表
                                                    SQL> create table test_part
                                                    2 (
                                                    3 ID NUMBER(20) not null,
                                                    4 REMARK VARCHAR2(1000),
                                                    5 create_time DATE
                                                    6 )
                                                    7 PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'year'))
                                                    8 (partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));


                                                    Table created.


                                                    --创建主键
                                                    SQL> alter table test_part add constraint test_part_pk primary key (ID) using INDEX;


                                                    Table altered.


                                                    -- Create/Recreate indexes
                                                    SQL> create index test_part_create_time on TEST_PART (create_time);
                                                    Index created.
                                                    复制

                                                    (3)索引组织表(IOT);

                                                    复制
                                                      ##创建索引组织表
                                                      SQL> create table t_iot (object_id int primary key,object_name varchar2(60)) organization index;


                                                      Table created.
                                                      ##插入数据
                                                      SQL> insert into t_iot select object_id,object_name from dba_objects;


                                                      86975 rows created.
                                                      ##查看
                                                      SQL> select * from t_iot where object_id<100;


                                                      OBJECT_ID OBJECT_NAME
                                                      ---------- ------------------------------------------------------------------------------------------------------------------------
                                                      2 C_OBJ#
                                                      3 I_OBJ#
                                                      4 TAB$
                                                      5 CLU$
                                                      6 C_TS#
                                                      7 I_TS#
                                                      8 C_FILE#_BLOCK#
                                                      9 I_FILE#_BLOCK#
                                                      10 C_USER#
                                                      11 I_USER#
                                                      12 FET$
                                                      13 UET$
                                                      14 SEG$
                                                      复制
                                                      复制

                                                      (4)簇表;

                                                      A、簇表的一些属性

                                                      • 簇键 cluster key

                                                            簇键是列或多列的组合,为簇表所共有。在创建簇表时指定簇键的列,以后在创建增加簇表中的每个表示,指定相同的列则可。每个簇键值在簇和簇索引中只存储1次,与不同表中有多少这样的行无关。

                                                      • 使用簇键的好处

                                                            减少磁盘I/O, 减少了因使用连接表所带来系统开销
                                                            节省了磁盘存储空间,因为原来要单独存放多张表,现在可以将连接的部分作为共享列存储。

                                                      • 什么情况下创建簇表?

                                                             对于经常查询,DML操作比较少的表
                                                              表中的记录经常被连接到其他表查询

                                                      • 创建簇表的步骤

                                                            创建簇表;
                                                            创建簇索引;
                                                            创建簇表的子表;

                                                      • 创建簇表时应考虑的问题

                                                            哪些表适用于创建簇表;
                                                            对于创建簇的表那些列用作簇列;
                                                            创建簇时Data Blocks的空间如何使用(pctfree, pctused);
                                                            平均簇键及所需相关行所需的空间大小;
                                                            簇索引的位置(比如存放到不同表空间);
                                                            预估簇的大小等。

                                                      复制
                                                        创建步骤为先建簇之后建簇索引,最后才建簇表
                                                        ##创建簇
                                                        SQL> create cluster e_d_cluster
                                                        2 (deptid number(2))
                                                        3 size 1024
                                                        4 /
                                                        Cluster created.
                                                        这里首先创建了一个index cluster。
                                                        这个cluster的key为 deptid,在table中这个列可以不命名为deptid,
                                                        但数据类型number(2)必须匹配。Size选项是用来告诉oracle预计有1024
                                                        字节数据和每个cluser key相关。Oracle将使用这个信息来计算每个block
                                                        能容纳的最大cluster key数目。
                                                        因此size太高,在每一block将得到很少的key,并且将使用比需要的更多的空间;
                                                        设置容量太低,将得到过多的数据连接,这将偏离使用cluster的目的。Size是cluster的重要参数。
                                                        #建cluster index
                                                        SQL> Cluster created.
                                                        SP2-0734: unknown command beginning "Cluster cr..." - rest of line ignored.
                                                        SQL> create index e_d_cluster_idx
                                                        2 on cluster e_d_cluster
                                                        3 /
                                                        Index created.
                                                        ##建簇表
                                                        SQL> create table department_cluster
                                                        2 (deptid number(2) primary key,
                                                        3 dname varchar2(14),
                                                        4 loc varchar2(13))
                                                        5 cluster e_d_cluster(deptid);
                                                        Table created.
                                                        ##查看簇表
                                                        desc SYS.department_cluster
                                                        Name Null? Type
                                                        ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                        DEPTID NOT NULL NUMBER(2)
                                                        DNAME VARCHAR2(14)
                                                         LOC                                                                                                                                                                  VARCHAR2(13)
                                                        复制

                                                        (5)临时表;临时表包含两种:

                                                        A、会话级临时表;

                                                        会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION登陆的时候是看不到另外一个SESSION中插入到临时表中的数据的。即两个不同的SESSION所插入的数据是互不相干的。当某一个SESSION退出之后临时表中的数据就被截断(truncate table,即数据清空)了。会话级的临时表创建方法:

                                                        复制
                                                          ##创建方法
                                                          Create Global Temporary Table Table_Name


                                                          (Col1 Type1,Col2 Type2...) On Commit Preserve Rows;
                                                          ##例如
                                                          SQL> create global temporary table Student
                                                          2 (Stu_id Number(5),
                                                          3 class_id Number(4),
                                                          4 Stu_name Varchar(8))
                                                          5 on Commit Preserve Rows;


                                                          Table created.
                                                          ##查看
                                                          SQL> desc ggs.student
                                                          Name Null? Type
                                                          ----------------------------------------------------- -------- ------------------------------------
                                                          STU_ID NUMBER(5)
                                                          CLASS_ID NUMBER(4)
                                                          STU_NAME VARCHAR2(8)
                                                          复制


                                                          B、事务级临时表,事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:

                                                          复制
                                                            SQL>  create global temporary table Student1
                                                            2 (Stu_id Number(5), class_id Number(4),Stu_name Varchar(8))
                                                            3 on Commit Delete Rows;


                                                            Table created.


                                                            SQL> desc ggs.student1
                                                            Name Null? Type
                                                            ----------------------------------------------------- -------- ------------------------------------
                                                            STU_ID NUMBER(5)
                                                            CLASS_ID NUMBER(4)
                                                             STU_NAME                                                       VARCHAR2(8)
                                                            复制


                                                            (6)压缩表,压缩表是用CPU来减少IO。(创建表的时候进行压缩,可以对创建完的表进行压缩)

                                                              SQL> create table t3 (tno number,tname varchar2(20),tsal varchar2(20)) compress;




                                                              Table created.


                                                              SQL> desc ggs.t3
                                                              Name Null? Type
                                                              ----------------------------------------------------- -------- ------------------------------------
                                                              TNO NUMBER
                                                              TNAME VARCHAR2(20)
                                                              TSAL VARCHAR2(20)
                                                              复制

                                                              (7)嵌套表

                                                                      嵌套表是表中之表。一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。在某种意义上,它是在一个表中存储一对多关系的一种方法。考查一个包含部门信息的表,在任何时间内每个部门会有很多项目正在实施。在一个严格的关系模型中,将需要建立两个独立的表department和project.

                                                                     嵌套表允许在department表中存放关于项目的信息。勿需执行联合操作,就可以通过department表直接访问项目表中的记录。这种不经联合而直接选择数据的能力使得用户对数据访问更加容易。甚至在并没有定义方法来访问嵌套表的情况下,也能够很清楚地把部门和项目中的数据联系在一起。在严格的关系模型中,department和project两个表的联系需要通过外部关键字(外键)关系才能实现。

                                                              复制
                                                                ##创建测试表
                                                                SQL> create table dept
                                                                2 (deptno NUMBER(2) PRIMARY KEY,
                                                                3 dname VARCHAR2(14),
                                                                4 loc VARCHAR2(13));


                                                                Table created.


                                                                SQL> CREATE TABLE emp
                                                                2 (empno NUMBER(4) PRIMARY KEY,
                                                                3 ename VARCHAR2(10),
                                                                4 job VARCHAR2(9),
                                                                5 mgr NUMBER(4) REFERENCES emp,
                                                                6 hiredate DATE,
                                                                7 sal NUMBER(7,2),
                                                                8 comm NUMBER(7,2),
                                                                9 deptno NUMBER(2) REFERENCES dept);


                                                                Table created.


                                                                SQL> INSERT INTO dept SELECT * FROM ggs.dept;


                                                                0 rows created.
                                                                SQL> INSERT INTO emp SELECT * FROM ggs.emp;


                                                                0 rows created.


                                                                ##创建type


                                                                SQL> CREATE OR REPLACE TYPE emp_type AS OBJECT
                                                                2 (empno NUMBER(4),
                                                                3 ename VARCHAR2(10),
                                                                4 job VARCHAR2(9),
                                                                5 mgr NUMBER(4),
                                                                6 hiredate DATE,
                                                                7 sal NUMBER(7,2),
                                                                8 comm NUMBER(7,2)
                                                                9 );
                                                                10 CREATE OR REPLACE TYPE emp_tab_type AS TABLE OF emp_type;
                                                                ##使用嵌套表
                                                                CREATE TABLE dept_and_emp
                                                                  (deptno NUMBER(2) PRIMARY KEY,
                                                                   dname VARCHAR2(14),
                                                                   loc VARCHAR2(13),
                                                                   emps emp_tab_type
                                                                  )
                                                                  NESTED TABLE emps STORE AS emps_nest;
                                                                复制
                                                                复制

                                                                2、创建方式

                                                                (1)、完全新建一张表;

                                                                语法格式如下:

                                                                create  table 表名(
                                                                复制
                                                                      --列的定义
                                                                复制
                                                                      列名1  数据类型1  [约束],
                                                                复制
                                                                      列名2  数据类型2  [约束],
                                                                复制
                                                                       ....
                                                                复制
                                                                      列名n  数据类型1  [约束]
                                                                复制
                                                                );
                                                                复制
                                                                复制
                                                                  ##例如
                                                                  SQL> CREATE TABLE t_student(
                                                                  2 stuNo CHAR(4),
                                                                  3 name VARCHAR2(20),
                                                                  4 age NUMBER(3),
                                                                  5 birthday DATE,
                                                                  6 sex VARCHAR2(5)
                                                                  7 );


                                                                  Table created.
                                                                  复制

                                                                  2)、在原有表的基础上新建一张表。

                                                                  复制
                                                                    Create table tableName as Select
                                                                    to_date(sysdate,’yyyymmdd’as exec_date,
                                                                                字段名1,
                                                                                字段名2,
                                                                                ……
                                                                    From tableName2
                                                                    ##例如
                                                                    SQL> create table t2 as select * from t1;


                                                                    Table created.


                                                                    SQL> create table t3 as select c1,c2,c3 from t1;


                                                                    Table created.
                                                                    复制

                                                                    复制

                                                                    3、修改表

                                                                    (1)、增加新的一列

                                                                    语法:alter table  表名   add  新的字段名  字段的类型;
                                                                    复制

                                                                      #给学生表添加一个列  电话号码 
                                                                      SQL> ALTER TABLE t_student ADD tel VARCHAR2(20);


                                                                      Table altered.
                                                                      复制

                                                                      (2)、修改已存在的列
                                                                      复制
                                                                      语法:alter table 表名  modify 字段的名  新的字段类型;
                                                                      复制

                                                                        把电话号码 的数据类型修改为 varchar2(30)

                                                                        SQL> ALTER TABLE t_student MODIFY tel VARCHAR2(30);


                                                                        Table altered.
                                                                        复制


                                                                        (3)、删除一列

                                                                        语法:alter table 表名  drop column 字段名;
                                                                        复制
                                                                        复制
                                                                          把tel这个列删除
                                                                          SQL> ALTER TABLE t_student DROP COLUMN tel;


                                                                          Table altered.
                                                                          复制

                                                                          (4)修改字段名

                                                                          语法:alter table 表名   rename column 字段名  to  新的字段名;
                                                                          复制

                                                                            把name 列名修改为sname

                                                                            SQL> ALTER TABLE t_student RENAME COLUMN name TO sname;


                                                                            Table altered.
                                                                            复制

                                                                            (5)修改表名

                                                                            语法:rename 表名 to 表名

                                                                              把t_student的表名修改为tb_student 
                                                                              SQL> RENAME t_student TO tb_student;


                                                                              Table renamed.
                                                                              复制

                                                                              (6)删除表

                                                                              复制
                                                                                语法:drop  table 表名 [purge]purge 清除  加这个关键字, 表示这个删除了,不能找回来;
                                                                                没有加purge, 删除把这表添加到Oracle回收站, 可以找回
                                                                                --删除 DROP TABLE tb_student;
                                                                                --找回,从回收站还原回来 Flashback table tb_student to before drop;
                                                                                --永久删除,找不回 DROP TABLE tb_student purge;
                                                                                复制
                                                                                复制

                                                                                (7) truncate 删除

                                                                                复制
                                                                                  语法:truncate table 表名;删除的是表格中所有数据,不删除表结构
                                                                                  例如:truncate table tb_student;
                                                                                  注意:truncate不能删除某一行,如果要删除某一行
                                                                                  需要使用delete truncate table t_student;

                                                                                  复制

                                                                                  复制

                                                                                  3.1.2. 分区表的类型、作用、使用场景

                                                                                   详见3.1.1表的类型(2)


                                                                                  3.1.3. 延迟段创建

                                                                                  延迟segment创建的意思是说:segment的空间分配是在插入记录的时候进行(注意不是commit的时候),在之前的数据库版本中,创建一个对象之后,会马上分配段和相应的extents。

                                                                                  复制
                                                                                    ##创建表格,此时没有段和extent
                                                                                    SQL> create table f_regs(reg_id number,reg_name varchar2(200));


                                                                                    Table created.


                                                                                    SQL> select count(*) from user_segments where segment_name='F_REGS';


                                                                                    COUNT(*)
                                                                                    ----------
                                                                                    0


                                                                                    SQL> select count(*) from user_extents where segment_name='F_REGS';


                                                                                    COUNT(*)
                                                                                    ----------
                                                                                    0
                                                                                    insert into f_regs values(1,'BRDSTN');


                                                                                    1 row created. ##并没有执行commit
                                                                                    ##打开另一个session,发现段和extent已经有了,说明segment空间分配是在插入记录的时候进行。
                                                                                    SQL> select count(*) from user_segments where segment_name='F_REGS';


                                                                                    COUNT(*)
                                                                                    ----------
                                                                                    1


                                                                                    SQL> select count(*) from user_extents where segment_name='F_REGS';


                                                                                    COUNT(*)
                                                                                    ----------
                                                                                    1
                                                                                    复制

                                                                                    3.1.4. 临时表的分类、创建语句、使用场景

                                                                                     详见3.1.1表的类型(5)

                                                                                     

                                                                                    3.1.5. 高水位问题

                                                                                    1、高水位问题概述:在oracle里,使用delete删除数据以后,数据库的存储容量不会减少,而且使用delete删除某个表的数据以后,查询这张表的速度和删除之前一样,不会发生变化。
                                                                                    因为oralce有一个HWM高水位,它是oracle的一个表使用空间最高水位线。当插入了数据以后,高水位线就会上涨,但是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。除非使用truncate删除数据。那么,这条高水位线在日常的增删操作中只会上涨,不会下跌,所以数据库容量也只会上升,不会下降。而使用select语句查询数据时,数据库会扫描高水位线以下的数据块,因为高水位线没有变化,所以扫描的时间不会减少,所以才会出现使用delete删除数据以后,查询的速度还是和delete以前一样。2、回收高水位的目的(1)、降低Oracle数据库中某些段(Segment)的高水位线,减少使用空间,从而避免不必要的表空间文件膨胀。(2)、提高表的扫描效率:由于Oracle的select语句会扫描高水位线以下的所有block,已分配而无数据的block过多时,必然会影响语句的执行效率。而降低高水位能提高这一效率。

                                                                                    3、回收高水位方法(1)基本步骤:

                                                                                    •  操作前状态检查,供操作后比对;如下所示

                                                                                    复制
                                                                                      SQL> select sum(bytes)/1024/1024 "FREE_MB",tablespace_name from dba_free_space group by tablespace_name;


                                                                                      FREE_MB TABLESPACE_NAME
                                                                                      ---------- ------------------------------------------------------------
                                                                                      30.125 SYSAUX
                                                                                      37.0625 UNDOTBS1
                                                                                      .5625 USERS
                                                                                      4.3125 SYSTEM
                                                                                      28.25 EXAMPLE
                                                                                      SQL> select tablespace_name ,bytes/1024/1024 "USED_MB",maxbytes/1024/1024 "MAX_MB" from dba_data_files;


                                                                                      TABLESPACE_NAME USED_MB MAX_MB
                                                                                      ------------------------------------------------------------ ---------- ----------
                                                                                      USERS 5 32767.9844
                                                                                      UNDOTBS1 60 32767.9844
                                                                                      SYSAUX 540 32767.9844
                                                                                      SYSTEM 770 32767.9844
                                                                                      EXAMPLE 338.125 32767.9844
                                                                                      复制
                                                                                      •   高水位回收操作;

                                                                                      •  操作后状态检查,与操作前状态比对。

                                                                                      (2)高水位回收方式

                                                                                      Oracle 10g开始采用了shrink技术

                                                                                      Shrink是通过事务的方式将数据行从一个数据块转移到另一个数据块。收缩过程中,表仍然可以进行DML操作

                                                                                      当然,事务要能够进行DML操作,还是需要等待收缩引起的事务锁释放。

                                                                                      收缩虽然是事务,但是数据并没有发生变化,因此不会引起触发器的触发。

                                                                                      使用shrink的前提条件

                                                                                      —表所在的表空间必须使用ASSM(自动段空间管理

                                                                                      —在收缩表上必须启用row movement选项

                                                                                      复制
                                                                                        ##开启行转移功能
                                                                                        SQL> alter table t_student enable row movement ;


                                                                                        Table altered.
                                                                                        ##压缩高水位线
                                                                                        SQL> alter table t_student shrink space;


                                                                                        Table altered.
                                                                                        ##回收后状态
                                                                                        select BLOCKS,EMPTY_BLOCKS,NUM_ROWS from user_tables where table_name='t_student';
                                                                                        复制

                                                                                        3、总结

                                                                                        (1).回收高水位操作shrink space可对高水位之下未储存数据的block加以回收,并降低高水位线。既能减少空间使用,又能提高查询效率,而对表内的数据、表上的索引没有影响。

                                                                                        (2).回收高水位操作shrink space是表和段级别的操作,能释放表空间文件内的空间,但不能缩小表空间文件的大小。

                                                                                        (3).回收操作是DDL操作而非DML操作,不由应用程序完成,需要管理员定期执行。 


                                                                                        3.1.6. 与表相关的动态性能视图和数据字典

                                                                                        1、数据字典
                                                                                        是只读表和视图的集合,数据字典的所有者为sys用户。
                                                                                        用户只能在数据字典上执行查询操作(select语句),而其维护和修改是由系统自动完成的。
                                                                                        组成:数据字典基表和数据字典视图,其中基表存储数据库的基本信息,普通用户不能直接访问数据字典的基表;数据字典视图是基于数据字典基表所建立的视图,普通用户可以用过查询数据字典视图取得系统信息。
                                                                                        数据字典视图包括user_xxx、all_xxx、dba_xxx三中类型。
                                                                                        ①user_tables:用于显示当前用户所拥有的所有表,它只返回用户所对应方案的所有表
                                                                                            eg:select  table_name  from  user_tables;

                                                                                          SQL> select  table_name  from  user_tables;


                                                                                          TABLE_NAME
                                                                                          ------------------------------------------------------------
                                                                                          STUDENT
                                                                                          STUDENT1
                                                                                          F_REGS
                                                                                          EMP
                                                                                          DEPT
                                                                                          T3
                                                                                          T_STUDENT


                                                                                          7 rows selected.
                                                                                          复制

                                                                                          ②all_tables:用于显示当前用户可以访问的所有表,它不仅返回当前用户方案的所有表,还会返回当前用户拥有访问其他权限的表
                                                                                              eg:select  table_name  from  all_tables;


                                                                                           

                                                                                          复制
                                                                                            SQL> select  table_name  from  all_tables;


                                                                                            TABLE_NAME
                                                                                            ------------------------------------------------------------
                                                                                            XDB$NONCEKEY
                                                                                            EPG$_AUTH
                                                                                            ORD_USAGE_RECS
                                                                                            SI_IMAGE_FORMATS_TAB
                                                                                            SI_FEATURES_TAB
                                                                                            SI_VALUES_TAB
                                                                                            ORDDCM_INTERNAL_TAGS
                                                                                            ORDDCM_DOC_TYPES
                                                                                            ORDDCM_INSTALL_DOCS
                                                                                            ORDDCM_DOCS
                                                                                            ORDDCM_DOC_REFS
                                                                                            ORDDCM_VR_DT_MAP
                                                                                            ORDDCM_STD_ATTRS
                                                                                            ORDDCM_PRV_ATTRS
                                                                                            ORDDCM_DICT_ATTRS
                                                                                            ORDDCM_CT_DAREFS
                                                                                            ORDDCM_MAPPING_DOCS
                                                                                            ORDDCM_MAPPED_PATHS
                                                                                            ORDDCM_ANON_RULE_TYPES
                                                                                            ORDDCM_ANON_ACTION_TYPES
                                                                                            ORDDCM_ANON_RULES
                                                                                            ORDDCM_ANON_ATTRS
                                                                                            复制

                                                                                            ③dba_tables:会显示所有方案拥有的数据库表。

                                                                                            但是查询这种数据库字典视图,要求用户必须是dba角色或是有select  any  table系统权限。(eg:当用户system用户查询数据字典视图dba_tables时,会返回system,sys,scott....方案所对应的数据库表)。

                                                                                            2、用户名、权限、角色
                                                                                            在建立用户时,oracle会把用户的信息存放到数据字典中,当给用户授予权限或是角色时,oracle会将权限和角色的信息存放到数据字典。
                                                                                                ①查询dba_users可以显示所有数据库用户的详细信息;

                                                                                            复制
                                                                                              SQL> select t.username,t.password from dba_users t;


                                                                                              USERNAME PASSWORD
                                                                                              ------------------------------------------------------------ ------------------------------------------------------------
                                                                                              MGMT_VIEW
                                                                                              SYS
                                                                                              SYSTEM
                                                                                              DBSNMP
                                                                                              SYSMAN
                                                                                              GGS
                                                                                              OUTLN
                                                                                              FLOWS_FILES
                                                                                              MDSYS
                                                                                              ORDSYS
                                                                                              EXFSYS
                                                                                              WMSYS
                                                                                              APPQOSSYS
                                                                                              APEX_030200
                                                                                              OWBSYS_AUDIT
                                                                                              ORDDATA
                                                                                              CTXSYS
                                                                                              ANONYMOUS
                                                                                              XDB
                                                                                              ORDPLUGINS
                                                                                              OWBSYS
                                                                                              SI_INFORMTN_SCHEMA
                                                                                              OLAPSYS
                                                                                              SCOTT
                                                                                              ORACLE_OCM
                                                                                              XS$NULL
                                                                                              BI
                                                                                              PM
                                                                                              MDDATA
                                                                                              IX
                                                                                              SH
                                                                                              DIP
                                                                                              OE
                                                                                              APEX_PUBLIC_USER
                                                                                              HR
                                                                                              SPATIAL_CSW_ADMIN_USR
                                                                                              SPATIAL_WFS_ADMIN_USR


                                                                                              37 rows selected.
                                                                                              复制
                                                                                              ②查询数字字典视图dba_sys_privs可以显示用户所具有的系统权限;
                                                                                              复制
                                                                                                SQL > select t.GRANTEE,t.privilege,t.ADMIN_OPTION from dba_sys_privs t;


                                                                                                GRANTEE PRIVILIGE ADMIN_OPTION
                                                                                                -------------------------------------------------------- ------------------------------------------------------------------------------ --------------------- CREATE ANY DIRECTORY NO
                                                                                                SYSMAN CREATE PUBLIC SYNONYM NO
                                                                                                APEX_030200 UNLIMITED TABLESPACE YES
                                                                                                APEX_030200 CREATE PUBLIC SYNONYM NO
                                                                                                APEX_030200 DROP PUBLIC SYNONYM NO
                                                                                                APEX_030200 CREATE INDEXTYPE YES
                                                                                                APEX_030200 CREATE SYNONYM YES
                                                                                                OWBSYS CREATE ANY CONTEXT NO
                                                                                                OWBSYS ALTER SESSION YES
                                                                                                OWBSYS CREATE SEQUENCE YES
                                                                                                OWBSYS CREATE EXTERNAL JOB NO
                                                                                                OWB$CLIENT ANALYZE ANY NO
                                                                                                OWB$CLIENT CREATE DIMENSION NO
                                                                                                SCOTT UNLIMITED TABLESPACE NO
                                                                                                HR CREATE DATABASE LINK NO
                                                                                                IX CREATE SEQUENCE NO
                                                                                                IX CREATE OPERATOR NO
                                                                                                SH CREATE SYNONYM NO
                                                                                                BI ALTER SESSION NO
                                                                                                BI UNLIMITED TABLESPACE NO
                                                                                                RESOURCE CREATE CLUSTER NO
                                                                                                RESOURCE CREATE PROCEDURE NO
                                                                                                RESOURCE CREATE TYPE NO
                                                                                                DBA CREATE ANY TABLE YES
                                                                                                DBA CREATE ANY INDEX YES
                                                                                                DBA CREATE ANY SEQUENCE YES
                                                                                                DBA ALTER ANY ROLE YES
                                                                                                DBA ANALYZE ANY YES
                                                                                                DBA DROP ANY LIBRARY YES
                                                                                                DBA CREATE ANY OPERATOR YES
                                                                                                DBA                                                          CREATE INDEXTYPE                                                                 YES
                                                                                                复制

                                                                                                    ③查询数字字典视图dba_tab_privs可以显示用户所具有的对象权限;
                                                                                                    ④查询数据字典dba_col_privs可以显示用户具有的列权限;
                                                                                                    ⑤查询数据库字典视图dba_role_privs可以显示用户所具有的角色;(查询oracle中所有的角色,一般是dba:select  *  from  dba_roles;)一般,Oracle数据库角色包含两种权限:系统权限和对象权限
                                                                                                (查询oracle中所有的系统权限,一般是dba:select  *  from  system_privilege_map  order  by  name;)
                                                                                                (查询oracle中所有对象权限,一般是dba:select  distinct  privilege  from  dba_tab_privs;)
                                                                                                (查询数据库的表空间:select  tablespace_name  from  dba_tablespaces;)

                                                                                                3.2. 索引相关

                                                                                                3.2.1. 索引的类型、作用、创建语句、使用场景

                                                                                                    1、索引的类型

                                                                                                1)位图索引(bitmap index)
                                                                                                假设数据库表中有一列其选择性非常窄,例如性别列,该用什么类型的索引?你可能会考虑对其使用位图索引。因为位图索引正是为相异值很少的列 而创建的。但需要考虑的因素还不只这些。一般而言,只有当你对表中值相宜度较小的多个不同的列都使用位图索引,这样位图索引才有用,因为你可以一起使用这 些索引才能对列产生更大的选择性,否则你还是需要对这些列进行一次全表扫描。例如,对于性别列,其索引只能有两个唯一值,那么用这个索引对表的任何搜索有 可能都返回一半的记录。其次,这些索引是为数据仓库而设计的,所以其假定条件是数据不会发生很大的改变。这些索引不能用来满足事务数据库或更新频繁的数据 库。应该说,对位图索引的表进行更新根本没有一点效率。
                                                                                                2)位图连接索引(bitmap join index)
                                                                                                位图连接索引比位图索引更进了一步。这些索引将位图化的列完全从表数据中抽取出来,并将其存储在索引中。其假定条件是这些列集合必须一起查 询。同样的,这也是为数据仓库数据库而设计的。除了在句法最后有一个WHERE子句之外,位图连接索引的创建指令就像创建位图索引的CREATE BITMAP INDEX一样。
                                                                                                3)压缩索引
                                                                                                压缩索引实际是标准b-tree索引的一个选项。压缩索引的叶节点更少,所以总的I/O数量和需要的缓存也更少。这些都意味着Oracle 的优化器更可能使用这些压缩索引,而不倾向于使用标准的非压缩索引。不过,这些好处也是有代价的,当你对这些压缩索引进行存取操作时,要消耗更多的CPU 来进行解压缩。而且,当你阅读关于优化器如何使用这些索引,又是如何选择合适的压缩级别的资料时,就开始变得晦涩了。不同的用户不同的设置从压缩索引中得 到的好处也可能会有所不同。
                                                                                                4)降序索引(descending index)
                                                                                                这是基于函数索引的一种特殊类型。降序索引可以显著优化ORDER BY x, y, z DESC子句查询的。
                                                                                                5)分区索引(partitioned index)
                                                                                                如果你的数据库中有一个分区表,你就有机会体验几种新的索引类型,从贯穿所有分区的全局分区索引(global)和集中于各个单独分区的本地分区索引(local)。这里不再进行赘述,想知道细节问题可以查询相关文献。
                                                                                                6)索引组织表(index organized table,IOT)
                                                                                                这是在Oracle 9i中引进的一种新类型表。Oracle会将级联索引及其扩展类型的索引用于表中所有的列。当所有数据都载入到索引结构之后,表就成多余的了,你尽可以将表本身删除掉。这就是索引组织表。
                                                                                                7)簇索引(cluster index)
                                                                                                基本上,簇索引就是将多个表的相同列放在一起,而对该列使用用一个簇索引。这种索引在实际应用中比较少,因为还有各种有待解决的性能问题存在。
                                                                                                8)域索引(domain index)
                                                                                                当我们创建为用户自定义数据类型(datatype)创建用户自定义索引类型(indextype)时就要使用域索引。
                                                                                                9)隐藏索引(invisible index)
                                                                                                这是Oracle 11g中推出的新特性。其创建过程和标准索引一样,但创建后对于基于代价的优化器(CBO)是不可见的。这可以让你对性能进行大型测试查询,而不会影响现有的正在运行的应用程序。
                                                                                                10)虚拟索引(virtual index)
                                                                                                这是为测试人员和开发人员准备的又一个工具。虚拟索引(不分配段空间)可以让你在不需要实际创建索引的情况下,测试新索引及其对查询计划的影响。对于GB级的表来说,构建索引非常耗费资源而且还要占用大量时间。
                                                                                                11)物理逻辑上的索引

                                                                                                逻辑上:
                                                                                                Single column 单行索引
                                                                                                Concatenated 多行索引
                                                                                                Unique 唯一索引
                                                                                                NonUnique 非唯一索引
                                                                                                Function-based函数索引
                                                                                                Domain 域索引
                                                                                                物理上:
                                                                                                Partitioned 分区索引
                                                                                                NonPartitioned 非分区索引
                                                                                                B-tree:
                                                                                                Normal 正常型B树
                                                                                                Rever Key 反转型B树 
                                                                                                Bitmap 位图索引



                                                                                                2、作用

                                                                                                (1)若没有索引,搜索某个记录时(例如查找name=’wish’)需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍;

                                                                                                (2)若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(name和rowid),存储到索引段中,查询name为wish时即可直接查找对应地方;

                                                                                                (3)创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引。


                                                                                                3、索引的创建

                                                                                                复制
                                                                                                  ##创建索引
                                                                                                  create index <index_name> on <table_name>(<column_name>) [tablespace<tablespace_name>];
                                                                                                  ##重置索引
                                                                                                  alter index <index_name> rebuild;
                                                                                                  ##删除索引
                                                                                                  drop index <index_name>
                                                                                                  ##实例
                                                                                                  create table test as
                                                                                                  select rownum as id,
                                                                                                  to_char(sysdate + rownum/24/3600,'yyyy-mm-dd hh24:mi:ss') as ttime,
                                                                                                  trunc(dbms_random.value(0,100)) as random_id,
                                                                                                  dbms_random.string('x',20) txt
                                                                                                  from dual
                                                                                                  connect by level<=20000000;
                                                                                                  select count(id) from test;
                                                                                                  select * from test where txt='2W8U82V49FKZYK0JQETF';
                                                                                                  drop table test;
                                                                                                  复制

                                                                                                  4、适用场景因不同索引的适用场景不同。


                                                                                                  3.2.2. 如何监控索引的使用情况

                                                                                                   a、单个索引监控

                                                                                                  复制
                                                                                                    -->演示环境
                                                                                                    SQL> select * from v$version where rownum<2;


                                                                                                    BANNER
                                                                                                    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                                                                    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
                                                                                                    -->创建测试表
                                                                                                    SQL> create table tb_emp as select * from emp;


                                                                                                    Table created.
                                                                                                    -->为测试表创建索引
                                                                                                    SQL> create index i_tb_emp_empno on tb_emp(empno);


                                                                                                    Index created.
                                                                                                    -->收集统计信息


                                                                                                    SQL> exec dbms_stats.gather_table_stats('GGS','TB_EMP',cascade=>true);


                                                                                                    PL/SQL procedure successfully completed.
                                                                                                    -->查看索引信息
                                                                                                    SQL> @idx_info
                                                                                                    Enter value for owner: ggs
                                                                                                    Enter value for table_name: tb_emp
                                                                                                    Table Name INDEX_NAME CL_NAM CL_POS STATUS IDX_TYP DSCD
                                                                                                    ------------------------- ------------------------------ -------------------- ------ -------- --------------- ----
                                                                                                    TB_EMP I_TB_EMP_EMPNO EMPNO 1 VALID NORMAL ASC
                                                                                                    -->查看索引使用情况
                                                                                                    -->此时use列为NO,表明索引未被使用到
                                                                                                    SQL> @idx_usage_tb
                                                                                                    Enter value for 1: tb_emp
                                                                                                    Enter value for 2: all
                                                                                                    Enter value for 2: all
                                                                                                    Table Name INDEX_NAME USE START_MONITORING END_MONITORING
                                                                                                    ------------------------- ------------------------------ --- ------------------- -------------------
                                                                                                    TB_EMP                    I_TB_EMP_EMPNO                 NO  02/19/2021 17:43:49
                                                                                                    -->实施即席查询
                                                                                                    SQL> select empno,ename,job from tb_emp where empno=7788;
                                                                                                    EMPNO ENAME JOB
                                                                                                    ---------- ---------- ---------
                                                                                                    7788 SCOTT ANALYST
                                                                                                    -->再次查看时USE列已经为YES
                                                                                                    SQL> @idx_usage_tb
                                                                                                    Enter value for 1: tb_emp
                                                                                                    Enter value for 2: all
                                                                                                    Enter value for 2: all
                                                                                                    Table Name INDEX_NAME USE START_MONITORING END_MONITORING
                                                                                                    ------------------------- ------------------------------ --- ------------------- -------------------
                                                                                                    TB_EMP                    I_TB_EMP_EMPNO                 YES 02/19/2021 17:43:49
                                                                                                    -->禁用索引监控
                                                                                                    SQL> alter index I_TB_EMP_EMPNO nomonitoring usage;
                                                                                                    Index altered.
                                                                                                    b、schema级别的索引监控
                                                                                                    -->切换到另外一个数据库cnbo1
                                                                                                    SQL> conn goex_admin/xxxxx@cnbo1
                                                                                                    Connected.
                                                                                                    -->下面的查询表明没有表开启索引监控
                                                                                                    SQL> @idx_usage;
                                                                                                    no rows selected
                                                                                                    -->开启索引监控
                                                                                                    SQL> @idx_monitor_on
                                                                                                    INDEX_NAME MON USE START_MONITORING END_MONITORING
                                                                                                    ------------------------------ --- --- ------------------- -------------------
                                                                                                    PK_AAH                         YES NO  02/19/2021 17:48:32
                                                                                                    IDX_GOAAE1                     YES NO  02/19/2021 17:48:32
                                                                                                    PK_GOAAT                       YES NO  02/19/2021 17:48:32
                                                                                                    PK_GOAACTL                     YES NO  02/19/2021 17:48:32
                                                                                                    ....... ................
                                                                                                    -->关闭索引监控
                                                                                                    SQL> @idx_monitor_off
                                                                                                    INDEX_NAME MON USE START_MONITORING END_MONITORING
                                                                                                    ------------------------------ --- --- ------------------- -------------------
                                                                                                    PK_GOARL                       NO  NO  03/19/2013 17:48:30 02/19/2021 17:50:02
                                                                                                    IDX_GOAQU1                     NO  NO  03/19/2013 17:48:30 02/19/2021 17:50:02
                                                                                                    IDX_GOAQU2                     NO  NO  03/19/2013 17:48:30 02/19/2021 17:50:02
                                                                                                    -->连接到原来的db,查看曾经开启索引监控的使用情况
                                                                                                    SQL> conn ggs/ggs
                                                                                                    Connected.
                                                                                                    SQL> @idx_usage
                                                                                                    Enter value for input_owner: GOEX_ADMIN
                                                                                                    Enter value for input_owner: GOEX_ADMIN
                                                                                                    OWNER INDEX_NAME Table Name MON USE START_MONITORING END_MONITORING
                                                                                                    --------------- ------------------------------ ------------------------- --- --- ------------------- ----------------
                                                                                                    GGS             I_TB_EMP_EMPNO                 TB_EMP                    NO  YES 02/19/2021 17:43:49 03/19/2013 17:46:04
                                                                                                    GOEX_ADMIN      ACC_GRP_EXT_INFO_TBL_LOG_PK    ACC_GRP_EXT_INFO_TBL_LOG  YES YES 02/22/2021 15:58:42
                                                                                                    GOEX_ADMIN      IDX_TDCL_CONTRACT_NUM          TRADE_CLIENT_TBL          YES YES 02/22/2021 15:58:42
                                                                                                    GOEX_ADMIN      IDX_TDCL_SETTLED_DATE          TRADE_CLIENT_TBL          YES YES 02/22/2021 15:58:42
                                                                                                    GOEX_ADMIN      IDX_TDCL_ACC_NUM               TRADE_CLIENT_TBL          YES YES 02/22/2021 15:58:41
                                                                                                    GOEX_ADMIN      IDX_TDCL_INSTRU_ID             TRADE_CLIENT_TBL          YES YES 02/22/2021 15:58:42
                                                                                                    复制
                                                                                                    3.2.3. 如何重建索引?什么情况下重建索引?
                                                                                                    复制

                                                                                                     1、重建索引的情况

                                                                                                    (1)、表上频繁发生update,delete操作;

                                                                                                    (2)、表上发生了alter table ..move操作(move操作导致了rowid变化)。

                                                                                                    2、重建索引

                                                                                                    复制
                                                                                                      ##分析索引
                                                                                                      SQL> Analyze index i_tb_emp_empno validate structure;
                                                                                                      ##说明:当查询出来的 height>=4 或者 DEL_LF_ROWS/LF_ROWS>0.2 的场合,该索引考虑重建 。
                                                                                                      ##重建索引的方式
                                                                                                      1、drop 原来的索引,然后再创建索引;


                                                                                                      举例:


                                                                                                      删除索引:drop index IX_PM_USERGROUP;


                                                                                                      创建索引:create index IX_PM_USERGROUP on T_PM_USER (fgroupid);


                                                                                                      说明:此方式耗时间,无法在24*7环境中实现,不建议使用。




                                                                                                      2 、直接重建:


                                                                                                      举例:


                                                                                                      alter index indexname rebuild; 或alter index indexname rebuild online;


                                                                                                      说明:此方式比较快,可以在24*7环境中实现,建议使用此方式。
                                                                                                      复制

                                                                                                      复制

                                                                                                      3.3. dblink

                                                                                                      3.3.1. 创建dblink的方法:

                                                                                                      结合平日的经验,现总结几种创建dblink的方法:

                                                                                                      1、最常用的方法:

                                                                                                      复制
                                                                                                        SQL> create database link dblink_120;


                                                                                                        Database link created.




                                                                                                        connect to ggs identified by “ggs”


                                                                                                        using '(DESCRIPTION =


                                                                                                        (ADDRESS_LIST =


                                                                                                        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.213.120)(PORT = 1521)))


                                                                                                        (CONNECT_DATA =(SERVICE_NAME = bond)))’;
                                                                                                        复制

                                                                                                        复制

                                                                                                        2、利用tns的方法:

                                                                                                        首先我们在服务端添加tns,注意这里一定是目标库服务端的tnsnames.ora下面添加,不是在客户端的tnsnames.ora下添加,否则会报错。

                                                                                                        复制
                                                                                                          db_110 =
                                                                                                          (DESCRIPTION =
                                                                                                          (ADDRESS = (PROTOCOL = TCP)(HOST = orcl)(PORT = 1521))
                                                                                                          (CONNECT_DATA =
                                                                                                          (SERVER = DEDICATED)
                                                                                                          (ERVICE_NAME = orcl)
                                                                                                          )
                                                                                                          )


                                                                                                          db_120 =
                                                                                                          (DESCRIPTION =
                                                                                                          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.213.120)(PORT = 1521))
                                                                                                          (CONNECT_DATA =
                                                                                                          (SERVER = DEDICATED)
                                                                                                          (SERVICE_NAME = bond)
                                                                                                          )
                                                                                                          )
                                                                                                          然后再创建dblink:


                                                                                                          3、 利用host:port/sid的方式:
                                                                                                          create database link dblink_120 connect to ggs identified by “ggs” using ‘192.168.213.110:1521/bond’;
                                                                                                          删除dblink方法:
                                                                                                          SQL> drop database link dblink_120;
                                                                                                          Database link dropped.
                                                                                                          复制


                                                                                                          3.3.2. 分布式事务了解

                                                                                                           1、不管是CBO(基于成本,或者讲统计信息)还是RBO(基于规则),如果SQL中涉及的表都是远端的,那么该语句在远端执行,在得到结果后返回调用端。2、无论是CBO还是RBO,当查询包含了本地表和远端表时,oracle总是先把远端表的数据通过网络传送到SQL的发起端,再跟本地表进行关联得到最终结果。3、可以通过driving_site这个hint来执行SQL在那端执行。这个hints在某些特定条件下的分布式查询调优非常有用。


                                                                                                          3.3.3ORA-19706错误和_external_scn_rejection_threshold_hours参数了解

                                                                                                          复制
                                                                                                            $oerr ora 19706


                                                                                                            19706, 00000, "invalid SCN"


                                                                                                            // *Cause: The input SCN is either not a positive integer or too large.


                                                                                                            // *Action: Check the input SCN and make sure it is a valid SCN.
                                                                                                            复制

                                                                                                             1、SCN的意思:SCN是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字。在Oracle内部,SCN分为两部分存储,分别称之为scn wrap和scn base。SCN长度为48位,即它其实就是一个48位的整数。那么SCN这个48位长的整数,最大就是 2^48(2的48次方, 281万亿,281474976710656),这是很大的一个数字了。据推算这个值可以保证Oracle数据库理论上可以处理500年的数据。

                                                                                                            (1)Maximum Reasonable SCN:在当前时间点,SCN最大允许达到的SCN值被称为" Maximum Reasonable SCN“(最大合理SCN),也称为Reasonable SCN Limit,简称RSL。这个值是一个限制,避免数据库的SCN无限制地增大,甚至达到了SCN的最大值。

                                                                                                            (2)SCN Headroom:这个是指Maximum Reasonable SCN与当前数据库SCN的差值。在alert中通常是以“天”为单位,这个只是为了容易让人读而已。天数=(Maximum Reasonable SCN-Current SCN)/16384/3600/24。这个值就的意思就是,如果按SCN的每大增长速率,多少天会到达Maximum Reasonable SCN。但实际上即使如此,也不会到达Maximum Reasonable SCN,因为到那时Maximum Reasonable SCN也增大了(越时间增大),要到达Maximum Reasonable SCN,得必须以SCN最大可能速率的2倍才行。


                                                                                                            2、SCN的异常增长几种类型

                                                                                                            (1):数据库内部BUG触发,

                                                                                                            (2):人为调整导致SCN异常增长过大,比如数据库通过特殊手段强制打开,手工把SCN递增得很大。

                                                                                                            (3):通过db link传播。如果A库通过db link连接到B库,如果A库的SCN高于B库的SCN,那么B库就会递增SCN到跟A库一样,反之如果A库的SCN低于B库的SCN,那么A库的SCN 会递增到跟B库的SCN一样。也就是说,涉及到db link进行操作的多个库,它们会将SCN同步到这些库中的最大的SCN。

                                                                                                            注意:从客户场景的实际情况来看,属于第3种类型导致SCN异常增长。B库的SCN值要高于A库的SCN,因此要将B库的SCN增同步到A库,但是如果B库的SCN过高,这样同步到A库之后, 使得A库面临Headroom过小的风险,那么A库会拒绝同步SCN,这个时候就会报ORA-19706: Invalid SCN错误。

                                                                                                            3、解决办法

                                                                                                              解决方法,如果A数据库版本低于11.2.0.4,需要给数据库打补丁,
                                                                                                              或直接升级至11.2.0.4及以上版本。然后修改隐含参数
                                                                                                              _external_scn_rejection_threshold_hours,
                                                                                                              此参数的含义为:当前库达到最大合理scn至少需要多少个小时,默认值为24,最小可调整至1


                                                                                                              --修改增长到最大合理scn的最小时间
                                                                                                              SQL> alter system set "_external_scn_rejection_threshold_hours" = 12
                                                                                                              2 comment='set threshold on 2015/09/01 - See MOS Document 1393363.1'
                                                                                                              3 scope=spfile;


                                                                                                              System altered.


                                                                                                              --重启数据库


                                                                                                              --查询修改是否成功
                                                                                                              select x.ksppinm name, y.ksppstvl value, x.ksppdesc describ
                                                                                                              from sys.x$ksppi x, sys.x$ksppcv y
                                                                                                              where x.inst_id = userenv('instance')
                                                                                                              and y.inst_id = userenv('instance')
                                                                                                              and x.indx = y.indx
                                                                                                              and x.ksppinm like '%_external_scn_rejection_threshold_hours%';
                                                                                                              复制



                                                                                                              3.3.4. 与dblink相关的动态性能视图和数据字典

                                                                                                               1、V$FIXED_TABLE,用于列出所有可用的动态性能视图和动态性能表。

                                                                                                              复制
                                                                                                                SQL> desc V$FIXED_TABLE
                                                                                                                Name Null? Type
                                                                                                                ----------------------------------------- -------- ----------------------------
                                                                                                                NAME VARCHAR2(30)
                                                                                                                OBJECT_ID NUMBER
                                                                                                                TYPE VARCHAR2(5)
                                                                                                                TABLE_NUM NUMBER
                                                                                                                复制

                                                                                                                复制

                                                                                                                2、查看DBLINK 

                                                                                                                   1*  select * from dba_db_links


                                                                                                                  OWNER DB_LINK USERNAME HOST CREATED
                                                                                                                  ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
                                                                                                                  GGS DBLINK_120 04-FEB-21
                                                                                                                  复制
                                                                                                                  复制
                                                                                                                  3.4. 物化视图

                                                                                                                  1、含义:物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照)。对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。(这个是基于本地的基表或者视图的聚合)。

                                                                                                                  2、作用:

                                                                                                                  • 能够提高查询速度,这主要是因为物化视图存储了实际的数据,其次具有查询重写功能。最后,物化视图具有实体表,你也可以在上面建立索引,总之大体上当作一个表用就可以了。

                                                                                                                  • 简化了开发任务,意思是开发的人员有的时候,无需直接关注部分sql的性能,而通过dba的努力,使用查询重写来完成性能的提升。

                                                                                                                  • 减少了工作量,因为物化视图可以定义两种刷新方式:立即刷新,按需刷新。所谓按需刷新就是你自己手动刷新,或者是定时刷新;所谓立即刷新,即视图主表发生变化的时候,视图立即刷新内容。 你可以根据自己的设备情况,应用情况和需求来控制刷新的方式。

                                                                                                                  • 刷新量的灵活限制,你可以快速是刷新(只刷新变化的),也可以全刷新。看你的需要。



                                                                                                                  3.4.1. 物化视图的分类、创建方式

                                                                                                                   1、分类

                                                                                                                  (1)、包含聚集的物化视图;

                                                                                                                  (2)、只包含连接的物化视图;

                                                                                                                  (3)、嵌套物化视图。

                                                                                                                  注意:

                                                                                                                  • 按刷新方式分:FAST/COMPLETE/FORCE

                                                                                                                  • 按刷新时间的不同:ON DEMAND/ON COMMIT

                                                                                                                  • 按是否可更新:UPDATABLE/READ ONLY

                                                                                                                  • 按是否支持查询重写:ENABLE QUERY REWRITE/DISABLEQUERY REWRITE


                                                                                                                  • 2、创建方式

                                                                                                                    (1)、BUILD IMMEDIATE是在创建物化视图的时候就生成数据。

                                                                                                                    (2)、BUILD DEFERRED则在创建时不生成数据,以后根据需要再生成数据。 

                                                                                                                    复制
                                                                                                                      创建物化视图需要的权限:
                                                                                                                      SQL> grant create materialized view to ggs;


                                                                                                                      Grant succeeded.
                                                                                                                      在源表建立物化视图日志:
                                                                                                                      SQL> create materialized view log on test_part with primary key;


                                                                                                                      Materialized view log created.
                                                                                                                      ##with primary key; -- 指定为主键类型
                                                                                                                      在目标数据库上创建MATERIALIZED VIEW:
                                                                                                                      SQL> create materialized view mv_materialized_test refresh force on demand start with sysdate next
                                                                                                                      2 to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),'10:25:00'),'dd-mm-yyyy hh24:mi:ss') as
                                                                                                                      3 select * from test_part;


                                                                                                                      Materialized view created.
                                                                                                                      --这个物化视图在每天1025进行刷新
                                                                                                                      修改刷新时间:
                                                                                                                      SQL> alter materialized view mv_materialized_test refresh force on demand start with sysdate
                                                                                                                      2 next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 23:00:00'),'dd-mm-yyyy hh24:mi:ss');


                                                                                                                      Materialized view altered.

                                                                                                                      SQL> alter materialized view mv_materialized_test refresh force on demand start with sysdate
                                                                                                                      2 next trunc(sysdate,'dd')+1+1/24;


                                                                                                                      Materialized view altered.
                                                                                                                      ##-- 每天1点刷新


                                                                                                                      删除物化视图及日志:
                                                                                                                      drop materialized view log on test_part; --删除物化视图日志:
                                                                                                                      drop materialized view mv_materialized_test; --删除物化视图
                                                                                                                      复制

                                                                                                                      复制

                                                                                                                      3.4.2. 物化视图的维护

                                                                                                                       
                                                                                                                      复制
                                                                                                                        #1、查看刷新组信息:
                                                                                                                        SQL> r
                                                                                                                        1* select rowner,rname,refgroup,job,next_date,interval,broken from dba_refresh


                                                                                                                        ROWNER RNAME REFGROUP JOB NEXT_DATE INTERVAL BR
                                                                                                                        ------------------------------ ------------------------------ ---------- ---------- ------------ ------------------------------ --
                                                                                                                        GGS MV_MATERIALIZED_TEST 1 23 05-FEB-21 trunc(sysdate,'dd')+1+1/24 N
                                                                                                                        ##2、查看刷新组内包含哪些要刷新的物化视图:
                                                                                                                        SQL> r
                                                                                                                        1* select owner,name,rowner,rname,refgroup,job,next_date from dba_refresh_children


                                                                                                                        OWNER NAME ROWNER RNAME REFGROUP JOB NEXT_DATE
                                                                                                                        ------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------- ---------- ------------
                                                                                                                        GGS MV_MATERIALIZED_TEST GGS MV_MATERIALIZED_TEST 1 23 05-FEB-21
                                                                                                                        ##3、查看都有哪些物化视图
                                                                                                                        SQL> r
                                                                                                                        1* select owner,mview_name,MASTER_LINK,REFRESH_METHOD,LAST_REFRESH_DATE from all_mviews
                                                                                                                        OWNER MVIEW_NAME MASTER_LINK REFRESH_METHOD LAST_REFRESH
                                                                                                                        ------------------------------ ------------------------------------------------------------ ------------------------------ ---------------- ------------
                                                                                                                        SYSMAN MGMT_ECM_MD_ALL_TBL_COLUMNS FORCE 16-JAN-21
                                                                                                                        SH FWEEK_PSCAT_SALES_MV FORCE 16-JAN-21
                                                                                                                        SH CAL_MONTH_SALES_MV FORCE 16-JAN-21
                                                                                                                        GGS MV_MATERIALIZED_TEST FORCE 04-FEB-21
                                                                                                                        ##4、查看job的信息
                                                                                                                        SQL> select job,log_user,last_date,next_date,broken,interval,failures,what from dba_jobs where job=41;


                                                                                                                        no rows selected
                                                                                                                        复制

                                                                                                                        复制

                                                                                                                        3.4.3. 查询重写的使用

                                                                                                                         

                                                                                                                         #将物化视图设置为enable query rewrite(默认为disable),并执行原查询语句,查看执行计划
                                                                                                                        SQL> alter MATERIALIZED VIEW MV_MATERIALIZED_TEST enable query rewrite;

                                                                                                                        Materialized view altered.
                                                                                                                        SQL> alter system flush buffer_cache;

                                                                                                                        System altered
                                                                                                                        复制


                                                                                                                           

                                                                                                                           

                                                                                                                          4. 表空间

                                                                                                                          4.1. 表空间的类型、作用、创建语句

                                                                                                                          4.1.1、表空间的类型:

                                                                                                                          一、按数据文件的类型,分为:
                                                                                                                          大文件表空间(bigfile tablespace)此为10g新增功能   bigfile表空间只有一个数据文件。
                                                                                                                          小文件表空间(smallfile tablespace)此为创建时默认值    smallfile表空间最多可包含1024个数据文件,
                                                                                                                          大文件表空间的优点有:
                                                                                                                          1、在一个表空间里只有一个大的数据文件,以后不需要再去管理数据文件;
                                                                                                                          2、一个大的数据文件相当于1024个小的数据文件,这样一来,在一个块大小为32K时,整个数据库可以达到(4g*32K)128TB,不过在实际环境中还是要受到操作系统的影响;
                                                                                                                          3、使用一个大的数据文件可以代替多个小数据文件,这样对数据文件的管理就少多了;
                                                                                                                          4、当打开数据库,发生检查点,执行DBWR进程时使用大文件表空间会增强性能。
                                                                                                                          大文件表空间的的需要注意有:
                                                                                                                          1、要使用在ORACLE的ASM(自动存储管理)的存储空间或者分散(striping)存储的LVM中,或者RAID阵列上;
                                                                                                                          2、不要把大文件表空间建立在不能分散(striping)存储的系统上;
                                                                                                                          3、不要把大文件表空间建立在没有空间(剩余空间少)的磁盘组上;
                                                                                                                          4、建立大文件表空间时不推荐建立在不能扩展的存储空间里;
                                                                                                                          5、大文件表空间只支持本地管理表空间(LMT)和本地段空间管理(ASSM);
                                                                                                                          6、在临时表空间与回滚段表空间,只能用手动段空间管理;
                                                                                                                          7、自动扩展数据文件必须是起用的,而且最大文件大小必须是不限制;
                                                                                                                          8、系统表空间和系统辅助(SYSAUX)表空间不能使用大文件表空间;
                                                                                                                          9、每个表空间只能包含一个数据文件。如果试图添加新的文件,则会报告 ora-32771 错误;
                                                                                                                          10、在 bft 上存储的表的 rowid 和 smallfile 表空间上的 rowid 结构有些不同的。要正确得到 rowid 信息,dbms_rowid 包增加了一个新的参数 ts_type_in 来解决这个问题。参考这个范例:

                                                                                                                            sql> select dbms_rowid.rowid_block_number (rowid, bigfile) 2 from foo;
                                                                                                                            dbms_rowid.rowid_block_number(rowid,bigfile)
                                                                                                                            ----------------------------------------------
                                                                                                                            24
                                                                                                                            复制

                                                                                                                            二、按管理方式,分为:
                                                                                                                            本地管理表空间(LMT)
                                                                                                                            数据字典管理表空间(DMT)
                                                                                                                            本地管理表空间:
                                                                                                                              一种比较先进的管理扩展(extent)的方式;
                                                                                                                              是用bitmap来管理表空间里的所有的extent;
                                                                                                                              当使用本地管理表空间时是使用6个块(从第三个到第八个)来标识整个表空间里的每一个扩展(extent);
                                                                                                                              其中的每一位(bit)来表示每个扩展的状态。1为已被分配,0为可被分配。
                                                                                                                              在本地管理表空间的方式里可以选择每个extent的大小是固定(Uniform)的或是自动的:在自动管理,系统一般是刚开始一个extent8个block,然后逐渐增加;固定大小为每个extent都是固定大小的,推荐使用。
                                                                                                                            字典管理表空间:这种方式是为了与之前版本兼容而提供的。不推荐使用。
                                                                                                                            10G里是不能创建字典管理表空间的,被强制推荐,只能倒入老版本中的字典管理表空间。
                                                                                                                            三、按使用类型,分为:
                                                                                                                            永久段表空间()
                                                                                                                            临时段表空间()
                                                                                                                            回滚段表空间()
                                                                                                                            永久表空间:
                                                                                                                              一般存储数据的表空间;
                                                                                                                              系统表空间,普通用户使用的表空间都为永久表空间;
                                                                                                                              永久表空间的状态有三种:读写,只读,脱机;
                                                                                                                              只有在永久表空间,才能配置ASSM管理模式;
                                                                                                                              可以设置记录日志模式。建立选yes,以便数据库出问题后进行恢复;
                                                                                                                              以设置为系统默认表空间。这样,创建用户时,没有指定默认表空间,就自动设置为系统默认表空间;
                                                                                                                              设置默认表空间的命令:
                                                                                                                              ALTER DATABASE DEFAULT TABLESPACE 
                                                                                                                            ;临时表空间:  一般用来排序和创建索引时使用;  临时表空间里不存放实际的数据,所以,即使出了问题,也不需要恢复,而且,也不需要备份,因此也不需要记录日志;  临时表空间只能使是读写模式,而且只能为手动管理段空间模式;  可以设置为系统默认临时表空间。这样,创建用户时,没有指定默认临时表空间,就自动设置为系统默认临时表空间,命令如下:  ALTER DATABASE DEFAULT TEMPORARY TABLESPACE ;回滚段表空间:  用来存放修改中数据的原数据;  回滚段表空间是用来保证数据读一致性的;

                                                                                                                            四、在永久表空间中按存储内容方式,分为:
                                                                                                                            系统表空间(SYSTEM TABLESPACE)
                                                                                                                            系统辅助表空间(SYSAUX TABLESPACE)
                                                                                                                            非系统表空间

                                                                                                                            4.1.2、作用

                                                                                                                            1. 决定数据库实体的空间分配

                                                                                                                            2. 设置数据库用户的空间份额

                                                                                                                            3. 控制数据库部分数据的可用性

                                                                                                                            4. 分布数据于不同的设备之间以改善性能

                                                                                                                            5. 备份和恢复数据。

                                                                                                                            4.1.3、创建表空间
                                                                                                                            复制
                                                                                                                              SQL> create tablespace test_liqi logging datafile
                                                                                                                              2 '/oracle/app/orcl/liqi.dbf'
                                                                                                                              3 SIZE 100M
                                                                                                                              4 AUTOEXTEND ON
                                                                                                                              5 NEXT 32M MAXSIZE UNLIMITED
                                                                                                                              6 EXTENT MANAGEMENT LOCAL;


                                                                                                                              Tablespace created.
                                                                                                                              复制

                                                                                                                              复制

                                                                                                                              4.2. undo表空间

                                                                                                                              复制
                                                                                                                                #创建undo表空间
                                                                                                                                SQL> create undo tablespace logging datafile
                                                                                                                                2 '/oracle/app/orcl/undo_liqi.dbf'
                                                                                                                                3 size 100M
                                                                                                                                4 AUTOEXTEND ON
                                                                                                                                5 NEXT 80M MAXSIZE UNLIMITED
                                                                                                                                6 EXTENT MANAGEMENT LOCAL;


                                                                                                                                Tablespace created.
                                                                                                                                复制

                                                                                                                                4.2.1. undo表空间的作用


                                                                                                                                  --事物回滚:当事物执行失败或用户执行回滚操作(rollback)时,Oracle会利用保存在回退段中的信息将数据恢复到原来的值;

                                                                                                                                  --数据库恢复:当数据库实例运行失败,在数据库重启恢复时,Oracle先利用重做日志文件的信息对数据库进行恢复(包括已提交和未提交的事务),再利用回滚段中的信息回滚未提交的事务;

                                                                                                                                  --读一致性:当一个用户对数据进行修改时,会预先将其原始值保存到回退段中,这时,如果有其它用户访问该数据,则访问回退段中的信息,使当前用户未提交的修改其他用户无法看到,保证了数据的一致性;

                                                                                                                                  --闪回查询:通过保留在回退段中的信息,用户可以查询某个数据在过去某个时刻的状态


                                                                                                                                4.2.2. undo表空间相关的参数

                                                                                                                                1、_UNDDO_RETENTION
                                                                                                                                在事务提交或回滚之后,因为flashback或一致读的需求,还需要将对应的UNDO数据
                                                                                                                                保存在UNDO表空间中一段时间,这个时间就是由undo_retention来设置的。
                                                                                                                                根据UNDDO_RETENTION可以继续将UNDO的inactive状态划分为EXPIRED,UNEXPIRED两类,
                                                                                                                                undo中超过undo_retention时间之外的inactive undo回滚区称为expired, 还处于
                                                                                                                                unod_retention时间之内的inactive undo回滚区称为unexpired .
                                                                                                                                2、RETENTION GUARANTEE
                                                                                                                                UNDO_RETENTION不是说必须达到这个时间后才能被覆盖,而只是一个期望值,比如UNDO
                                                                                                                                表空间文件设置为非自动扩展,当一个大事务需要将undo中未使用的区域及过期的undo
                                                                                                                                区域都使用完了,而UNDO空间不能自动扩展,这时保证事务顺利运行优先级比较高,UNDO
                                                                                                                                中没有过期的回滚区也会被覆盖使用(从其中使用时间越早的开始),也就是说retention
                                                                                                                                设置的时间段内的UNDO非过期数据是没有保证的。10g开始提供参数RETENTION GUARANTEE
                                                                                                                                设置在tablespace的属性中,那么未过期的UNDO数据就不会再被覆盖掉了。但是设置属性
                                                                                                                                RETENTION GUARANTEE,UNDO空间不足时很可能造成事务失败,所以一般不会设置。
                                                                                                                                3、_UNDO_AUTOTUNE
                                                                                                                                从10g开始,Oracle提供了UNDO自动优化功能,就是在UNDO表空间非自动增长的情况下,
                                                                                                                                Oracle会根据UNDO表空间的大小来调整UNDO RETENTION的大小,自动调整RETENTION就是
                                                                                                                                最大限度的利用当前UNDO表空间的可用空间,尽可能的保留最多的UNDO数据,以最大化的
                                                                                                                                减少类似ORA-01555 等错误发生。在这种情况下的UNDO RETENTION就基本没有用处了。
                                                                                                                                默认情况下 _UNDO_AUTOTUNE =TRUE, 开启UNDO自动优化功能。经过优化的UNDO RETENTION
                                                                                                                                可以在V$UNDOSTAT的  TUNED_UNDORETENTION 中看到, 一般oracle每10分钟写一条unod表
                                                                                                                                空间使用情况记录到V$UNDOSTAT, 包括 TUNED_UNDORETENTION 。


                                                                                                                                4.2.3. ORA-01555的由来

                                                                                                                                 ORA-01555 快照过旧,是数据库中很常见的一个错误,比如当我们的事务需要使用undo来构建CR块的时候,而此时对应的undo 已经不存在了, 这个时候就会报ORA-01555的错误。


                                                                                                                                1. 出现ORA-01555错误,通常有2种情况:

                                                                                                                                            (1)SQL语句执行时间太长,或者UNDO表空间过小,或者事务量过大,或者过于频繁的提交,导致执行SQL过程中进行一致性读时,SQL执行后修改的前镜像(即UNDO数据)在UNDO表空间中已经被覆盖,不能构造一致性读块(CR blocks)。  这种情况最多。

                                                                                                                                            (2)SQL语句执行过程中,访问到的块,在进行延迟块清除时,不能确定该块的事务提交时间与SQL执行开始时间的先后次序。 这种情况很少。


                                                                                                                                2. 第1种情况解决的办法:

                                                                                                                                (1)增加UNDO表空间大小

                                                                                                                                (2)增加undo_retention 时间,默认只有15分钟

                                                                                                                                (3)优化出错的SQL,减少查询的时间,首选方法

                                                                                                                                (4)避免频繁的提交.


                                                                                                                                4.2.4. undo表空间相关的动态性能视图、数据字典


                                                                                                                                数据字典解释
                                                                                                                                v$undostat包含所有undo表空间的统计信息,用于对undo表空间进行监控和调整。
                                                                                                                                通过该视图,可以估计当前undo表空间的大小,Oracle利用该视图完成对回退信息的自动管理,该视图数据是有最近4天内,每10分钟产生一条统计记录构成的。
                                                                                                                                v$rollstat包含undo表空间中回退段的性能统计信息
                                                                                                                                v$transaction包含事务所使用的回退段信息
                                                                                                                                dba_undo_extents包含undo表空间中区的大小与状态信息
                                                                                                                                dba_hist_undostat包含v$undostat的快照,主要是4天前的统计信息
                                                                                                                              •  
                                                                                                                                • SQL> desc v$undostat
                                                                                                                                  Name Null? Type
                                                                                                                                  ----------------------------------------- -------- ----------------------------
                                                                                                                                  BEGIN_TIME DATE
                                                                                                                                  END_TIME DATE
                                                                                                                                  UNDOTSN NUMBER
                                                                                                                                  UNDOBLKS NUMBER
                                                                                                                                  TXNCOUNT NUMBER
                                                                                                                                  MAXQUERYLEN NUMBER
                                                                                                                                  MAXQUERYID VARCHAR2(13)
                                                                                                                                  MAXCONCURRENCY NUMBER
                                                                                                                                  UNXPSTEALCNT NUMBER
                                                                                                                                  UNXPBLKRELCNT NUMBER
                                                                                                                                  UNXPBLKREUCNT NUMBER
                                                                                                                                  EXPSTEALCNT NUMBER
                                                                                                                                  EXPBLKRELCNT NUMBER
                                                                                                                                  EXPBLKREUCNT NUMBER
                                                                                                                                  SSOLDERRCNT NUMBER
                                                                                                                                  NOSPACEERRCNT NUMBER
                                                                                                                                  ACTIVEBLKS NUMBER
                                                                                                                                  UNEXPIREDBLKS NUMBER
                                                                                                                                  EXPIREDBLKS NUMBER
                                                                                                                                  TUNED_UNDORETENTION NUMBER
                                                                                                                                  SQL> desc v$rollstat
                                                                                                                                  Name Null? Type
                                                                                                                                  ----------------------------------------- -------- ----------------------------
                                                                                                                                  USN NUMBER
                                                                                                                                  LATCH NUMBER
                                                                                                                                  EXTENTS NUMBER
                                                                                                                                  RSSIZE NUMBER
                                                                                                                                  WRITES NUMBER
                                                                                                                                  XACTS NUMBER
                                                                                                                                  GETS NUMBER
                                                                                                                                  WAITS NUMBER
                                                                                                                                  OPTSIZE NUMBER
                                                                                                                                  HWMSIZE NUMBER
                                                                                                                                  SHRINKS NUMBER
                                                                                                                                  WRAPS NUMBER
                                                                                                                                  EXTENDS NUMBER
                                                                                                                                  AVESHRINK NUMBER
                                                                                                                                  AVEACTIVE NUMBER
                                                                                                                                  STATUS VARCHAR2(15)
                                                                                                                                  CUREXT NUMBER
                                                                                                                                  CURBLK NUMBER
                                                                                                                                  复制

                                                                                                                                  复制

                                                                                                                                  4.3. temp表空间

                                                                                                                                  临时表的创建如下 
                                                                                                                                  复制
                                                                                                                                    SQL> CREATE TEMPORARY TABLESPACE tmp_liqi
                                                                                                                                    2 TEMPFILE '/oracle/app/orcl/tmp_lq.dbf'
                                                                                                                                    3 size 100M
                                                                                                                                    4 AUTOEXTEND OFF;


                                                                                                                                    Tablespace created.
                                                                                                                                    复制

                                                                                                                                    复制

                                                                                                                                    4.3.1. temp表空间的作用

                                                                                                                                     

                                                                                                                                    1、临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。像数据库中一些操作:CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。

                                                                                                                                    2、临时表空间存储大规模排序操作(小规模排序操作会直接在RAM里完成,大规模排序才需要磁盘排序Disk Sort)和散列操作的中间结果.它跟永久表空间不同的地方在于它由临时数据文件(temporary files)组成的,而不是永久数据文件(datafiles)。临时表空间不会存储永久类型的对象,所以它不会也不需要备份。另外,对临时数据文件的操作不产生redo日志,不过会生成undo日志。

                                                                                                                                    3、创建临时表空间或临时表空间添加临时数据文件时,即使临时数据文件很大,添加过程也相当快。这是因为ORACLE的临时数据文件是一类特殊的数据文件:稀疏文件(Sparse File),当临时表空间文件创建时,它只会写入文件头部和最后块信息(only writes to the header and last block of the file)。它的空间是延后分配的.这就是你创建临时表空间或给临时表空间添加数据文件飞快的原因。

                                                                                                                                    4、另外,临时表空间是NOLOGGING模式以及它不保存永久类型对象,因此即使数据库损毁,做Recovery也不需要恢复Temporary Tablespace。


                                                                                                                                    4.3.2. ORA-1652:问题处理

                                                                                                                                     1、查看数据库的表空间的大小


                                                                                                                                    SQL> r
                                                                                                                                    1* select file_name,file_id,bytes/1024/1024,status,autoextensible tmp_liqi from DBA_TEMP_FILES


                                                                                                                                    FILE_NAME FILE_ID BYTES/1024/1024 STATUS TMP_LI
                                                                                                                                    ------------------------------ ---------- --------------- -------------- ------
                                                                                                                                    /oracle/app/orcl/temp01.dbf 1 20 ONLINE YES
                                                                                                                                    /oracle/app/orcl/tmp_lq.dbf 2 100 ONLINE NO
                                                                                                                                    复制
                                                                                                                                      复制

                                                                                                                                       2、通过文件大小初步判断出增长是否异常。然后具体看错误日志处理。

                                                                                                                                      4.3.3. temp表空间相关的动态性能视图、数据字典

                                                                                                                                      1、V$TEMPSEG_USAGE:显示了临时段的使用


                                                                                                                                      2、DBA_TEMP_FREE_SPACE:描述了表空间级别的临时表空间使用的信息
                                                                                                                                    • 3、
                                                                                                                                    • V$SORT_SEGMENT:显示给定实例的每个排序段的信息,只有发生在临时表空间的操作才会更新该视图。这里不仅仅记载排序动作,只要在临时表空间操作就会记录;而排序发生在内存,也不会更新该视图的。


                                                                                                                                    最后修改时间:2021-04-28 11:42:07
                                                                                                                                    文章转载自浅谈Oracle,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                                                                    评论