天天看點

Oracle碎碎念~1

Oracle碎碎念

1. 設定SQL*Plus提示符

    SQL> set sqlprompt "_user'@'_connect_identifier>"

    SYS@orcl>

    為了對所有的SQL*Plus會話自動設定sqlprompt,将上面的指令放置在ORACLE_HOME/sqlplus/admin目錄中的glogin.sql檔案内

2. 檢視角色RESOURCE被授予的系統權限

   SQL> select * from dba_sys_privs where grantee='RESOURCE';

   GRANTEE                               PRIVILEGE                                         ADM

   ------------------------------   --------------------------------------- ---

   RESOURCE                             CREATE TRIGGER                               NO

   RESOURCE                             CREATE SEQUENCE                            NO

   RESOURCE                             CREATE TYPE                                   NO

   RESOURCE                             CREATE PROCEDURE                          NO

   RESOURCE                             CREATE CLUSTER                              NO

   RESOURCE                             CREATE OPERATOR                            NO

   RESOURCE                             CREATE INDEXTYPE                           NO

   RESOURCE                             CREATE TABLE                                  NO

   檢視SCOTT使用者被授予的對象權限和系統權限

   SQL> select * from dba_tab_privs where grantee='SCOTT';

   GRANT OWNER TABLE_NAME GRA PRIVILEGE GRA HIE

   ----- ----- ------------- --- ---------------------------------------- --- ---

   SCOTT SYS DATA_PUMP_DIR SYS WRITE NO NO

   SCOTT SYS DATA_PUMP_DIR SYS READ NO NO

   SQL> select * from dba_sys_privs where grantee='SCOTT';

   GRANT PRIVILEGE ADM

   ----- ---------------------------------------- ---

   SCOTT UNLIMITED TABLESPACE NO

3. 檢視系統timestamp

    SQL> select systimestamp from dual;

4. 在Automatic Memory Management情況下檢視pga和sga的大小

    SQL> select sum(value) from v$sesstat natural join v$statname  where name='session pga memory';

    SQL> select sum(bytes) from v$sgastat;

5. 識别資料庫中的所有無效對象

    SQL> select owner,object_name,object_type from dba_objects where status='INVALID';

6. 檢查資料庫補充日志

    SQL> select supplemental_log_data_min "MIN", 

                      supplemental_log_data_pk "PK", 

                      supplemental_log_data_ui "UI",

                      supplemental_log_data_fk "FK", 

                      supplemental_log_data_all "ALL" 

             from v$database;

7. 檢視資料庫是否運作在歸檔模式

    SQL> select log_mode from v$database;

    SQL> archive log list

8. 檢視資料庫的字元集

    SQL> select * from nls_database_parameters;

9. 檢視對于表的注釋和列的注釋

    user_tab_comments

    user_col_comments

10. 檢視行對應的資料塊位址

     SQL> select empno,ename,rowid,dbms_rowid.rowid_relative_fno(rowid) || '_' ||dbms_rowid.rowid_block_number

             (rowid) || '_' || dbms_rowid.rowid_row_number(rowid) location from emp;

              EMPNO     ENAME     ROWID                LOCATION

              ---------- ---------- ------------------ ---------------

              7369        SMITH AAAR3sAAEAAAACXAAA 4_151_0

              7499        ALLEN AAAR3sAAEAAAACXAAB 4_151_1

              7521        WARD AAAR3sAAEAAAACXAAC 4_151_2

              7566        JONES AAAR3sAAEAAAACXAAD 4_151_3

       4_151_0表示empno為7369的行記錄實際的實體位置位于4号檔案的第151個資料塊的第0行記錄

11. 如何利用非預設位置的spfile啟動資料庫

     大家知道,資料庫啟動時一般是在預設位置查找spfile(即在$ORACLE_HOME/dbs下),那麼如何利用非預設位置的spfile啟動資料庫呢?

     一、建立參數檔案pfile.ora,裡面隻有一個參數

          vim /home/oracle/pfile.ora

          spfile=/home/oracle/spfileorcl.ora

     二、利用該參數檔案啟動資料庫

          SQL> startup pfile='/home/oracle/pfile.ora';

12. 如何傳回目前會話使用者

      SQL> select user,uid from dual;

      USER                    UID

     -------------           ----------

      SCOTT                  84

      USER returns the name of the session user (the user who logged on) with the data type VARCHAR2.

      UID returns an integer that uniquely identifies the session user (the user who logged on).

      In a distributed SQL statement, the 

UID

 and 

USER

 functions together identify the user on your local database. 

13. 如何檢視閃回恢複區的空間使用情況

      SQL> select * from v$flash_recovery_area_usage;

14. 當用shutdown immediate正常關庫時,有時會hang住,觀察告警日志,發現以下資訊:

      All dispatchers and shared servers shutdown

      Wed Jun 18 00:40:49 2014

      SHUTDOWN: Active processes prevent shutdown operation

      這不是Oralce bug,而是非正常順序關庫導緻的。原因在于主機上登陸使用者(無論是sys還是scott)通過!或者host指令切換到主機環境了。隻要該使用者退回到oracle環境,并斷開連接配接,shutdown immediate即可繼續正常關庫。

15. 如何建立資料庫連結

     SQL> grant create database link  to scott;   -->> 賦權,由dba權限的使用者操作

     SQL> create database link sz connect to scott identified by tiger using 'sz';    -->>在scott使用者下操作

     SQL> select db_link,username from user_db_links;    -->> 檢視目前使用者擁有的資料庫連結

16. 如何使用DBMS_XPLAY生成執行計劃

  SQL> @?/rdbms/admin/utlxplan.sql

  Table created.

SQL> explain plan for
  2  select * from emp;

Explained.

SQL> select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |     |    11 |   352 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    11 |   352 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected.      

      上述指令與SQL*Plus下的SET AUTOTRACE TRACE EXPLAIN等價。

17. 角色PUBLIC隻有對象權限,沒有系統權限。可通過下表查詢:

     SQL> select grantee,privilege from dba_sys_privs where grantee='PUBLIC';

     no rows selected

     SQL> select grantee,privilege,table_name from dba_tab_privs where grantee='PUBLIC' and table_name like '%UTL_FILE%';  

     GRANTEE PRIVILEGE TABLE_NAME

     ------------ ------------ ------------------------------

     PUBLIC EXECUTE UTL_FILE

     第二個查詢語句表明角色PUBLIC對UTL_FILE包有執行權限

18. 如何捕捉剛執行的SQL語句

      SQL> select sql_text from v$sql where parsing_schema_name='SCOTT' order by last_load_time desc;

      SQL_TEXT

      --------------------------------------------------------------------------------

      DELETE FROM EMP WHERE DEPTNO = :B1

      delete from dept where deptno=20  

19. 如何重建Scott模式

       SQL> @?/rdbms/admin/utlsampl.sql

20.  如何在Linux環境下檢視錯誤代碼

      [oracle@node2 ~]$ oerr ora 00001

21.  如何建立HR模式

      SQL> @?/demo/schema/human_resources/hr_main.sql

      在11g2中,human_resources目錄下隻有一個hr_code.sql,其它相關腳本沒有自帶,可網上下載下傳,并上傳到human_resources目錄下

      下載下傳位址:http://pan.baidu.com/s/1o6I6Mzo

22.  非PL/SQL變量(來源于環境或宿主語言如C,java)

SQL> VARIABLE message varchar2(15);
SQL> begin
  2    :message :='Hello World';
  3  end;
  4  /
PL/SQL procedure successfully completed.
SQL> print message
MESSAGE
--------------------------------
Hello World      
SQL> VARIABLE message varchar2(15);
SQL> begin
  2    :message :='Hello World';
  3    dbms_output.put_line(:message);
  4  end;
  5  /
Hello World      
SQL> VARIABLE message varchar2(15);
SQL> exec :message :='Hello World'
SQL> print message
MESSAGE
--------------------------------
Hello World      

 22. 如何檢視目前會話生成的redo_size

CREATE OR REPLACE VIEW redo_size
AS
SELECT VALUE
FROM v$mystat, v$statname
WHERE v$mystat.statistic# = v$statname.statistic#
AND v$statname.NAME = 'redo size'      

 23. autotrace

     SQL> set autotrace on

     SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled

     SP2-0611: Error enabling STATISTICS report

     解決:

     SQL> @?/sqlplus/admin/plustrce.sql

     SQL> grant plustrace to public;

24. Multiple Address Lists in tnsnames.ora

TEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node3.being.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = node3.being.com)(PORT = 1522))
      (ADDRESS = (PROTOCOL = TCP)(HOST = node3.being.com)(PORT = 1523))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = sz.being.com)
    )
  )      

     預設LOAD_BALANCE on 和FAILOVER on

25. how to free up space from recovery area    

     1> Consider changing RMAN RETENTION POLICY. If you are using Data Guard,then consider changing RMAN ARCHIVELOG DELETION POLICY.

     2> Back up files to tertiary device such as tape using RMAN BACKUP RECOVERY AREA command.

     3> Add disk space and increase db_recovery_file_dest_size parameter to reflect the new space.

     4> Delete unnecessary files using RMAN DELETE command. If an operating system command was used to delete files, then use RMAN CROSSCHECK and DELETE EXPIRED commands.

26. 建立目錄

      SQL> create directory tmp as '/home/oracle';

      Directory created.

      SQL> grant read,write on directory tmp to scott;

      Grant succeeded.

      SQL> select * from dba_directories;

27. 如何啟動Minimal Supplemental Logging

     ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

28. 檢視表的實體位置

SQL> select
  2  (select name from v$datafile
  3   where file#=e.file_id) file_name,
  4   file_id,block_id,blocks
  5  from dba_extents e
  6  where owner='SCOTT' and segment_name='EMP';

FILE_NAME                                FILE_ID   BLOCK_ID       BLOCKS
---------------------------------------- ---------- ---------- ----------
/u01/app/oracle/oradata/sz/users01.dbf          4       144        8      

     可見,EMP表占用8個連續的資料塊,從144号151号,均在4号資料檔案users01.dbf中

29. 檢視使用者擁有的索引,及建立在哪些字段上

SQL> select i.owner,i.table_name,i.index_name,c.column_name
  2  from dba_indexes i,dba_ind_columns c
  3  where i.owner=c.index_owner
  4  and i.index_name=c.index_name
  5  and i.table_owner='SCOTT';

OWNER TABLE_NAME INDEX_NAME COLUMN_NAM
----- ---------- ---------- ----------
SCOTT EMP     PK_EMP     EMPNO
SCOTT DEPT     PK_DEPT    DEPTNO      

30. 删除資源回收筒對象

     SQL> purge table "BIN$Ax1lzh8y4Q/gUKjADQIGqA==$0";   --删除一個特定的資源回收筒對象

     SQL> purge user_recyclebin;   --删除目前使用者的資源回收筒的所有對象

     SQL> purge tablespace users;  --删除USERS表空間中的所有的資源回收筒對象

     SQL> purge dba_recyclebin;     --删除資料庫中所有的資源回收筒中的所有對象

31. 如何在SCN和時間戳之間進行轉換     

SQL> select dbms_flashback.get_system_change_number scn from dual;

       SCN
----------
   1086480

1 row selected.

SQL> select scn_to_timestamp(1086480) from dual;

SCN_TO_TIMESTAMP(1086480)
---------------------------------------------------------------------------
16-SEP-14 04.49.19.000000000 AM

1 row selected.

SQL> select timestamp_to_scn(to_timestamp('2014-09-16 04:44:15','yyyy-mm-dd hh24:mi:ss')) scn from dual;

       SCN
----------
   1086363

1 row selected.      

32. 在資料泵(Data Pump)中如何使用 / as sysdba

[oracle@node3 ~]$ expdp \"/ as sysdba\" dumpfile=scott.dmp schemas=scott 

33. Oracle Database 11g Release 2 Examples下載下傳位址

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

選擇相應的平台,點選See All

34. GUID(Globally Unique Identifier),全局唯一辨別符

     SQL> select sys_guid() from dual;

     SYS_GUID()

     --------------------------------

     040E20AF25012D8EE050A8C00D0205B1

     GUID由16個位元組組成的RAW資料類型,由Oracle通過目前的日期和時間、主伺服器名稱和程序辨別符來唯一生成。這個辨別符可以是在Streams複制中定義為表的主鍵或是主鍵的一部分。當插入一行内容到表中時,這個辨別符可以用一個觸發器觸發生成。

35. RMAN中清除已手工删除的日志資訊

     RMAN> crosscheck archivelog all;

     RMAN> delete expired archivelog all;

36. 如何完全删除流複制

     SQL>  EXEC DBMS_STREAMS_ADM.REMOVE_STREAMS_CONFIGURATION();