1. 程式人生 > >ORACLE資料庫常用命令

ORACLE資料庫常用命令

 1 監聽器啟動和關閉
1.1 檢視監聽狀態
lsnrctl status
1.2 啟動監聽
lsnrctl start
1.3 停止監聽
lsnrctl stop

2 啟動和關閉資料庫
2.1 確保監聽器處於啟動狀態
2.2 啟動資料庫
sqlplus /nolog;
SQL >conn / as sysdba;
SQL >startup
(若啟動檔名不是ORACLE預設的檔名,則啟動時應帶啟動目錄與檔名)
SQL>startup pfile=<file-pathr/init-file>

2.3 資料庫關閉
sqlplus "/as sysdba"
SQL>shutdown ABORT|IMMEDIATE|NORMAL|TRANSACTIONAL
一般選擇IMMEDIATE方式(如果shutdown不跟任何引數,預設表示等待事務結束後再關閉資料庫,如果這個時候有使用者程序使用著,那麼資料庫就不能停止。)

3 修改Oracle資料庫的一些系統資料操作
(1) 啟動sqlplus。
oracle% sqlplus "/as sysdba"
(2) 修改作業系統鑑權使用者的字首,允許遠端鑑權。
SQL> alter system set remote_login_passwordfile=NONE scope=spfile;
SQL> alter system set os_authent_prefix="ops$" scope=spfile;
SQL> alter system set remote_os_authent=true scope=spfile;
SQL> ALTER SYSTEM SET db_cache_size = 3300M SCOPE=MEMORY
(3) 修改log_buffer引數為1MB。
SQL> alter system set log_buffer=10485760 scope=spfile;
(4) 修改fast_start_mttr_target引數為1800秒。
SQL> alter system set fast_start_mttr_target=1800 scope=spfile;
(5) 建立getpwd命令所需要的密碼錶:
 A、確保存在表mgr_passwd 。如沒有以ORACLE系統使用者身份執行以下操作
 create table mgr_passwd(m_user varchar2(20), m_passwd varchar2(40),
 primary key(m_user) );

 //PWD=`GetPwd $DBNAME`
 //echo "一條SQL語句;" | sqlplus $DBNAME/$PWD >/dev/null 2>&1
 注意在SQL語句後加分號。這裡的GetPwd是一個PRO*C程式,它有兩個作用,一是為新使用者隨機生成一個口令,並將此口令插入到ORACLE中的口令表(mgr_passwd)中去;另一個作用是從口令表中獲得已有使用者的口令。口令表是事先建立好的。這個程式將在後面的移植中頻繁的呼叫。
 B、分配mgr_passwd表的 select, insert, update, delete許可權給public;
   grant select,insert,update,delete on mgr_passwd to public;
 C、應該建立mgr_passwd的synonym 。如果沒有,需建立
 create public synonym mgr_passwd for mgr_passwd;
(6) 修改完畢後需要重啟動資料庫伺服器使之生效。
SQL>shutdown immediate
SQL>startup
(7) 檢查修改是否成功。
SQL>select name,value from v$parameter  where name='log_buffer';
NAME
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
log_buffer
10485760
SQL>select name,value from v$parameter  where name='fast_start_mttr_target';
NAME
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
fast_start_mttr_target
1800
SQL> select name,value from v$parameter  where name='remote_os_authent';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
remote_os_authent
FALSE
SQL> select name,value from v$parameter  where name='os_authent_prefix';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
os_authent_prefix
ops$
SQL> select name,value from v$parameter  where name='remote_login_passwordfile';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
remote_login_passwordfile
EXCLUSIVE
4 資料庫使用者管理
4.1 建立使用者
create user  username
identified by  password
default tablespace  dataspacename
temporary tablespace  tempspacename
例子:
create user ops$scpln identified by scpln default tablespace "DATA" temporary tablespace "TEMP";
4.2 修改使用者
將imuse203的口令改為hello:
 alter user imuse203 identified by hello;

將imuse203的預設表空間改為IMUSE02:
 alter user imuse203 default tablespace IMUSE02;

將imuse203的臨時表空間改為IMUSE02_TMP:
 alter user imuse203 tempory tablespace IMUSE02_TMP;
4.3 刪除使用者
刪除使用者的命令為:
DROP USER 使用者名稱 [CASCADE]
若不使用CASCADE選項,則必須在該使用者的所有實體都刪除之後,才能刪除該使用者。使用CASCADE後,則不論使用者實體有多大,都一併刪除。

4.4 使用者解鎖
1)查詢Oracle系統中被鎖住的使用者資訊
select username,account_status,lock_date from dba_users;

2)使用ALTER USERS解鎖被鎖住的SMPORA使用者。
SQL>show user;
SQL>alter user SMPORA account unlock;
5 Oracle的許可權管理
5.1 系統許可權
ORACLE7提供了80多種系統許可權,每種系統許可權允許使用者執行特定的資料庫操作。
系統許可權的授予命令為GRANT,例如把建立任何表檢視的許可權授予imuse01使用者:
    GRANT create any view TO imuse01;
系統許可權的回收命令為REVOKE,例如將create any view 許可權從imuse01使用者手中收回:
        REVOKE create any view FROM imuse01;

5.2 實體許可權
每種型別的實體有與之相關的實體許可權。
授予實體許可權的命令舉例(將basetab表上的Select和Insert許可權授給imuse01):
    GRANT select,insert ON basetab TO imuse01;
回收實體許可權的命令舉例(將basetab表上的Select許可權從imuse01手中回收):
    REVOKE select ON basetab FROM imuse01;
例子:
為業務使用者賦許可權
grant connect, resource,dba to ops$smpln;
grant connect, resource, dba to smpmupto ;
為smp使用者授權
grant select on sys.v_$instance to ops$smpln;
grant select on sys.v_$session to ops$smpln;
grant select on DBA_FREE_SPACE to ops$smpln;
grant select on DBA_DATA_FILES to ops$smpln;
為sdu使用者授權
grant select on sys.v_$instance to ops$sduora;
grant select on sys.v_$session to ops$sduora;
5.3 管理角色
角色是許多許可權和角色的組合。它極大地方便了ORACLE的許可權管理。
" 建立角色,如建立一個名為dept1的角色,口令為hello:
    CREATE ROLE  ROLEiMUSE01 IDENTIFIED BY hello;
" 使用角色,可以通過修改使用者的預設角色來使用角色,或通過授權的方法來將角色授予其它角色或使用者。如將imuse01使用者的預設角色修改為RoleTmp:
ALTER USER imuse01 DEFAULT ROLE RoleTmp;
將角色RoleTmp角色授予imuse01:
  GRANT RoleTmpTO imuse01;
" 使角色生效或失效,DBA可以通過控制角色的生效或失效,來暫時回收使用者的一部分許可權。如使RoleTmp角色失效:
    SET ROLE RoleTmp DISABLE;
" 刪除角色,這將會影響到擁有該角色的使用者和其它角色的許可權。用DROP ROLE命令刪除角色,如:
    DROP ROLE RoleTmp;
6 更改字符集為中文
sqlplus /nolog;
SQL>conn / as sysdba;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
(這一步一般會出錯,所以需要重複執行上面從SHUTDOWN IMMEDIATE開始的所有語句)
SQL> SHUTDOWN IMMEDIATE; 
SQL> STARTUP;


7 SQL檔案的執行
7.1 使用@執行sql檔案(baseline.sql檔案在同一目錄下面)
1)
<5 rx6600 [scpmupto] :/tellin/scpmupto>sqlplus /
SQL*Plus: Release 11.1.0.6.0 - Production on 星期三 9月 17 16:21:27 2008
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> @baseline_sql
2)sqlplus / @ baseline_sql
3) sqlplus ops\$scpmupto/scpmupto@oracle1 @baseline.sql
4)cat oracle/install_baseline.sql | sqlplus $SMPDBNAME/`getpwd $SMPDBNAME`

7.2 將執行的sql語句結果儲存在檔案
SQL>spool  a.txt
SQL>SELECT * FROM DEPT WHERE DEPTNO=10;
DEPTNO          DNAME         LOC
10               ACCOUNTING    NEW YORK
SQL> spool off
7.3 將執行的sql語句儲存在檔案中:
SQL>SELECT * FROM DEPT WHERE DEPTNO=10;
SQL>SAVE b.sql  CREATE/REPLACE/APPEND
7.4 將檔案裡面的sql語句讀到SQL緩衝區中
SQL>get b.sql
  1* SELECT * FROM DEPT WHERE DEPTNO=10
8 查詢語句
8.1 當前存在哪些表空間
Select * from v$tablespace;

8.2 表空間有多大
Select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name;

8.3 表空間還剩多少空閒空間
Select tablespace_name,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;

8.4 查詢imuse01使用者所使用的預設表空間
select default_tablespace from dba_users where username='imuse01';

8.5 查詢imuse01使用者所使用的臨時表空間
select temporary_tablespace from dba_users where username='imuse01';

8.6 查詢當前使用者所擁有的角色
select * from session_roles;

8.7 檢視違反唯一索引的表及列:
如果插入資料時系統提示:unique constraint (IMUSE01.SYS_C004960) violated.則說明在為IMUSE01使用者插入資料時違反了唯一索引SYS_C004960。

8.8 檢視違反唯一索引的表:
select table_name from user_indexes where index_name=' SYS_C004960';

8.9 檢視違反唯一索引的列:
select column_name from user_ind_columns where index_name=' SYS_C004960';

8.10 檢視編譯無效的儲存過程:
select object_name from user_objects where status='INVALID' and object_type=' PROCEDURE';

8.11 檢視當前執行的例項名:
select instance_name from v$instance;

9 表空間管理
9.1 建立表空間
create tablespace IMUSE01
datafile '/export/home/oracle/oradata/mdspdata/imuse01_dat1'
size 100M;
9.2 增加表空間的大小
如將表空間IMUSE01增加100M:
alter tablespace IMUSE01
add datafile '/export/home/oracle/oradata/mdspdata/imuse01_dat2'
size 100M;
9.3 修改表空間的大小
如將表空間IMUSE01改為1000M:
alter database
datafile '/export/home/oracle/oradata/mdspdata/imuse01_dat1'
resize 1000M;
9.4 自動擴充套件表空間大小
alter database datafile '/opt/oracle/app/oradata/ora11g/users01.dbf' autoextend on next 100m maxsize unlimited
9.5 刪除表空間
drop tablespace imuse01 cascade;
10 資料檔案被誤刪後的處理
如果不小心物理上刪除了一Oracle的資料檔案,比如說,某應用表空間所對應資料檔案"adc.dbf",Oracle讀控制檔案時,和開啟資料庫時所面對的引數不一致,Oracle資料庫將啟動不了,解決這種問題的方法是把該檔案對應的表空間先卸下,再刪除,以保證控制檔案描述和物理上存在檔案一致。

以sys使用者登入並進入Sql*Plus:
SQL >startup mount
SQL >alter database datafile '/directory/abc.dbf' offline;
SQL >alter database open;
SQL >drop tablespace abc;
11 查詢當前系統的配置引數
有三種查詢方法:
1. 靜態查詢:
即直接查詢initXXXX.ora檔案(XXXX為ORACLE的SID)。 因為有很多系統引數使用的是
預設值,並未在該檔案中給出,所以該方法不能看到所有引數及其含義。
2. 在SQL*PLUS中用命令查詢
1) 顯示所有資料庫引數值
SQL>show parameters;

2) 顯示含有"sort"的引數的值
SQL>show parameter sort;
3. 在SQL*PLUS中用SQL語句查詢
SQL> select name,type,value from v$parameter where name='db_block_buffers';
12 顯示當前使用者
sql>show user;
13 Oracle排錯處理
13.1 錯誤說明
ORACLE中出現的錯誤的格式為:錯誤型別-錯誤程式碼:錯誤資訊,例如:
"ORA-1652: unable to extend temp segment by 128 in tablespace TEMP"
一般來說,這種錯誤資訊比較簡單,但是可以根據這個資訊用oerr命令得到更詳細的資訊。

13.2 檢視錯誤詳細說明
oerr 是ORACLE提供的一個在伺服器端使用的錯誤資訊幫助命令。使用該命令前,必須先用ORACLE使用者登入到伺服器上,命令格式為:
oerr 錯誤型別 錯誤程式碼
返回資訊格式為:
錯誤程式碼, "通用錯誤資訊"
//*錯誤原因
//*應採取的動作

如對上面的錯誤可用如下命令:
oerr ora 1652

13.3 alert_XXXX.ora(XXXX為ORALE的SID)檔案的說明
    alert_XXXX.ora是ORACLE中一個十分有用的的檔案,該檔案在伺服器的具體位置由initXXXX.ora中的引數"background_dump_dest"的值決定。該檔案中的資訊有:資料庫每次STARTUP、SHUTDOWN的具體資訊;在資料庫中進行的各種DML操作;資料庫中出現的各種錯誤的資訊等等,內容十分詳細,並且有各種資訊發生的具體時間。如果遇到問題,可以仔細瀏覽該檔案,根據問題發生的時間來尋找相應的資訊。
14 查看錶結構
SQL>desc 表名
15 檢視資料庫檔案
共有三種資料庫檔案:控制檔案、資料檔案、日誌檔案
1.檢視控制檔案
select * from v$controlfile;
2.檢視資料檔案
select status,bytes,name from v$datafile;
3.檢視日誌檔案
select name from v$logfile;

16 將select查詢出的結果儲存至一個檔案
SQL>spool /result.txt
SQL>select * from basetab;
SQL>spool off
則從basetab查詢出的結果都被儲存到當前路徑下的result.txt檔案中
17 儲存過程
1. 儲存過程的寫法:
create or replace procedure proc_name
(
ifield1 in number,
sfield2 out varchar
)
as
 v_err_code int;
  v_err_msg  varchar2(2048);
begin
 select field2 into sfield2 from tabSp where field1  = ifield1;
 DBMS_OUTPUT.PUT_LINE(sfield2);
exception
 when others then
 begin
v_err_code :=sqlcode;
       v_err_msg :=sqlerrm;
       DBMS_OUTPUT.PUT_LINE(v_err_code||'   '||v_err_msg);
  rollback;
 end;
end proc_name;

注意:
1) 儲存過程的輸入輸出引數以逗號間隔,區域性變數部分以分號間隔;
2) 儲存過程的輸入輸出引數部分:最後一個引數後沒有逗號;
3) 儲存過程的區域性變數部分:最後一個變數後有分號;
4) 可把多個儲存過程儲存到一個檔案中,檔名必須用.sql字尾;
5) 每個儲存過程結束後,要用"/"作為提交;
2. 儲存過程的建立:
sqlplus 使用者名稱/密碼@資料庫標識 @儲存過程檔名
(這裡的儲存過程檔名可以省略.sql字尾,因為檔案字尾預設是.sql)
3. 儲存過程的執行
sql>execute 儲存過程名字(引數)

注意:
1.如果執行儲存過程時提示:必須說明識別符號'儲存過程名',則表明該儲存過程不存在或編譯未成功。可用如下命令重新編譯該儲存過程:
SQL>alter procedure儲存過程名 compile;
2.如果執行儲存過程時提示:未找到資料在'imuse01.test_adduser',有可能是在該儲存過程中存在類似"select col _name into tmp from table_name where ….."這樣的語句,而查詢出的結果為空的緣故。
3.如果執行儲存過程時提示:SQL緩衝區中無可執行的程式,說明此時緩衝區是空的。如在執行上面找不到相應記錄的指令碼後會提示該錯誤。
4.如果執行儲存過程時提示:輸入被截為1個字元,表明某個"/"之後少一個回車符。
5.如果執行儲存過程時提示:建立的過程帶有編譯錯誤,可能是某個儲存過程結束處少一個"/"。
6.如果執行儲存過程時提示:缺少表示式,有可能是某個變數沒被賦值。
18 資料庫的備份與恢復
ORACLE系統提供的Export/轉入(備份)、Import/轉出(恢復)應用程式實現備份與恢復功能。
Export是在資料庫開啟並能使用的情況下備份資料庫資料的實用程式。用Export將資料庫中的資料寫到以二進位制形式表示的作業系統檔案中(ORACLE),該檔案叫卸出文件。用Export可實現應用程式失敗時的恢復,例如可把某個表或某些表恢復到執行該Export時的狀態。
由於卸出文件的特殊格式,所以只能用Import實用程式將其讀入資料庫中。

18.1 Export 轉入程式

ORACLE資料庫有兩類備份方法,第一類為物理備份,該方法實現資料庫的完整恢復,但資料庫必須執行在歸檔模式下,且需要極大的外部儲存裝置,例如磁帶機;第二類備份方式為邏輯備份,客戶服務中心業務資料庫就是採用這種方式,這種方法不需要資料庫執行在歸檔模式下,不但備份簡單,而且可以不需要外部儲存裝置。

邏輯備份又分為三種模式。
表模式(T):這種模式可以卸出當前使用者資料庫模式下的表,甚至是所有的表。具有特權的使用者可根據所指定的資料庫模式來(限制表)卸出他們所包含的表。預設情況是卸出屬於當前正在進行卸出的使用者的所有表。
使用者模式(U):這種模式可以卸出當前使用者資料庫模式下的所有實體(表、資料和索引)。
全資料庫模式(F):只有具有EXP_FULL_DATABASE角色的使用者才可能以這種模式卸出。以這種模式進行卸出的使用者,除SYS模式下的內容之外,資料庫中所有實體都可以卸出。 下面列出給使用者賦予EXP_FULL_DATABASE角色的方法。

要選擇表、使用者或全資料庫方式,可相應指定TABLES=tablelist、OWNER=userlist或FULL=y。
18.1.1  表模式
exp  imuse01/ imuse01  BUFFER=8192(或64000) 
FILE=imuse01.dmp 或(磁帶裝置/dev/rmt0)
TABLES=imuse01.basetab
(或imuse01.basetab,imuse01.serviceinfo .....)
ROWS=Y 
COMPRESS=N
LOG= EXP_IMUSE01 _SERVICEINFO.LOG
引數說明:
BUFFER 緩衝區大小
FILE 由Export建立的輸出檔案的名字
TABLES 將要卸出的表名列表
ROWS 指明是否卸出表中資料的行數,預設為"Y"。
COMPRESS 指明在裝入期間是否將表中資料壓縮到一個區域中。如果在卸出資料時,指定引數COMPRESS=Y,那麼裝入時,就會將資料壓縮到一個初始區域中。這種選擇可以保持初始化區域的原始大小。預設為"Y"。
LOG 指定一個接收有用資訊和錯誤資訊的檔案
例子:
1)匯出多個表
   exp userid=ops\$scpmupto/scpmupto tables=(accitemproperty,ser_area) file= e1.dmp
2)匯出單個表
  exp userid=ops\$scpmupto/scpmupto tables=accitemproperty file= e1.dmp
18.1.2  使用者模式
exp imuse01/ imuse01 OWNER= imuse01 BUFFER=8192(或64000)
FILE= imuse01.dmp 或(磁帶裝置/dev/rmt0)
ROWS=Y
COMPRESS=N
LOG= EXP_IMUSE01 .LOG
引數說明:
OWNER 將要卸出的使用者名稱列表
BUFFER、FILE、ROWS、COMPRESS、LOG 同上
例子:
匯出自身方案
1)exp ops\$scpmupto/scpmupto@oracle1 indexes=y rows=y file=scp0822.dmp buffer=10000000
2) exp ops\$scptm/scptm@oracle1 owner=ops\$scptm file=data.dmp
18.1.3  全資料庫模式
exp  imuse01/ imuse01  BUFFER=8192(或64000)
FILE=EXP_IMUSE01.dmp (或磁帶裝置/dev/rmt0)
FULL=Y    ROWS=Y   COMPRESS=N
LOG= EXP_IMUSE01_DB.LOG
對於資料庫備份,建議採用增量備份,即只備份上一次備份以來更改的資料。
增量備份命令:
EXP ICDMAIN/ICD  BUFFER=8192(或64000)
FILE=EXP_ICDMAIN_DB.DMP (或磁帶裝置/dev/rmt0)
FULL=Y  INCTYPE= incremental ROWS=Y COMPRESS=N
LOG=EXP_ICDMAIN_DB.LOG
引數說明:
BUFFER、FILE、ROWS、COMPRESS、LOG 同上
FULL 指明是否卸出完整的資料庫。如果FULL=Y,將以全資料庫模式進行卸出。
INCTYPE 增加卸出的型別,有效值有complete(完全)、comulative(固定)和incremental(增量)。
complete 輸出所有表
comulative 將輸入第一次完全輸出後修改過的表
incremental 將輸出前一次輸出後修改過的表

?  說明:
關於增量備份必須滿足下列條件:
只對資料庫備份有效,且第一次需要FULL=Y引數,以後需要INCTYPE=INCREMENTAL引數。
使用者必須有EXP_FULL_DATABASE許可權。
例子:
匯出所有資料庫物件以及資料
exp userid=system/manager full=y file=database.dmp
18.2 Import 恢復程式
Import和Export是兩個相配套的實用程式,Export把資料庫中的資料卸出到作業系統檔案中,而Import實用程式則把Export卸出的資料恢復到資料庫中。
按備份方案確定恢復方案,例如:採用表邏輯備份方案,則恢復方案也採用恢復到表的方式(不應恢復到使用者)。
要使用Import,必須具有CREATE SESSION特權,以便能註冊到ORACLE RDBMS中去。這一特權屬於在資料庫建立時所建立的CONNECT角色。
如果卸出文件是由某使用者利用EXP_FULL_DATABASE角色建立的全資料庫卸出,那麼只有具有IMP_FULL_DATABASE角色的使用者才能裝入這樣的檔案。

資料庫的邏輯恢復分為表、使用者、資料庫三種模式。
18.2.1 表模式
恢復方法為:
imp  imuse01/imuse01  FILE=檔名 LOG=LOG檔名
ROWS=Y COMMIT=Y BUFFER=Y IGNORE=Y
TABLES=(表名1,表名2,表名3,表名4,.......)   
引數說明:
BUFFER 緩衝區大小
FILE 用於裝入的卸出文件名字
TABLES 將要裝入的表名列表
ROWS 指明是否裝入表資料的行數,預設為"Y"。
IGNORE 指明如何處理實體建立錯誤。指定IGNORE=Y,當試圖建立資料庫實體時,忽略實體存在錯誤。對除了表之外的其他實體,指定IGNORE=Y,Import不報告錯誤,繼續執行。而指定IGNORE=N時,Import在繼續執行前報告實體建立錯誤。
COMMIT 指明在每個矩陣插入之後是否提交。預設時,Import在裝入每個實體之後提交。指定COMMIT=N時,如有錯誤產生,Import在記錄裝入下一個實體之前,完成一個回退。指定COMMIT=Y時,可以抑制回滾欄位無限制增大,並改善大量裝入時的效能,表具有唯一約束時,這種選擇比較好。如果再次開始裝入,將拒絕裝入已經裝入的任何行,原因是非致命性錯誤。表具有非唯一約束時,指定COMMIT=N可能是比較好的選擇。因為重新裝入可能會產生重複行。
LOG 指定一個接收有用資訊和錯誤資訊的檔案
例子:
表匯入:
imp system/manager tables=(dept,emp) file=e1.dmp //匯入自身的表
imp system/manager tables=(dept,emp) file=e1.dmp touser=smith rows=n  //只導表結構
imp system/manager tables=(dept,emp) file=e1.dmp touser=smith ignore=y //如果物件存在,則可以指匯入資料
18.2.2 使用者模式
如果備份方式為使用者模式,採用下列恢復方法:
imp  system/manager FROMUSER=imuse01 TOUSER= imuse01
FILE=檔名 LOG=LOG檔名 ROWS=Y COMMIT=Y
BUFFER=Y IGNORE=Y
引數說明同上。
例子:
imp usdp1/usdp1@rp4440_10.71.114.152 file=b044cp001.dmp fromuser=usdp touser=usdp1 indexes=y rows=y buffer=10000000
18.2.3 資料庫模式
如果備份方式為資料庫模式,採用下列恢復方法:
imp  system/manager FULL=Y
FILE=檔名 LOG=LOG檔名 ROWS=Y COMMIT=Y
BUFFER=Y IGNORE=Y
字符集轉換
對於單位元組字符集(例如US7ASCII),恢復時,資料庫自動轉換為該會話的字符集(NLA_LANG引數);對於多位元組字符集(例如ZHS168CGB),恢復時,應儘量使字符集相同(避免轉換),如果要轉換,目標資料庫的字符集應是輸出資料庫字符集的超集。
例子:
imp userid=system/manager full=y file=database.dmp //匯入方案
18.2.4 增量卸出/裝入
下面介紹利用Export/Import實用程式對ORACLE資料庫進行備份、恢復的方法:增量卸出/裝入。增量卸出是一種常用的資料備份方法,包括3個子類:
(1)  "完全"增量卸出
就是對整個ORACLE資料庫進行完全卸出。如:
$ exp system/口令 inctype=complete full=y file=today.dmp
(1)  "增量型"增量卸出
即從ORACLE資料庫中卸出上次卸出操作之後所有資料庫的變化資訊。如:
$exp system/口令 inctype=incremental file=today.dmp
增量型卸出文件的大小,可能只是完全卸出文件大小的1%,具體要看"新資訊或更新過的資訊"的總量而定。
(2)  "累積型"增量卸出
累積型卸出方式只是卸出自上次"完全" 卸出之後資料庫中變化了的資訊。用法如下:
$exp system/口令 inctype=cumulative file=today.dmp
DBA可以排定一個備份日程表,用資料卸出的三個不同方式合理高效地完成資料庫的備份任務。比如DBA作如下安排:
星期一:完全卸出(F1)
星期二:增量卸出(I1)
星期三:增量卸出(I2)
星期四:累積卸出(C1)
星期五:增量卸出(I3)
星期六:增量卸出(I4)
如果在星期日,資料庫遭到意外破壞,DBA可按以下步驟來恢復資料庫:
  用命令CREATE DATABASE重新生成你的資料庫結構;
  最近增量裝入I4:$imp system/口令 inctype=system full=y file=I4
  完全增量裝入F1:$imp system/口令 inctype=restore full=y file=F1
  累積增量裝入C1:$imp system/口令 inctype=restore full=y file=C1
  對於由累積裝入或完全裝入尚未能裝入的資訊,作增量裝入:
         $imp system/口令 inctype=restore full=y file=I3
         $imp system/口令 inctype=restore full=y file=I4
  注意:
在I1和I2中的資訊已包括在C1中了。


19 Load匯入資料檔案
19.1  第一種情況
19.1.1  informix方式
 dbaccess $DBNAME -<<EOF
 load from a.unl insert into areanumbe1
 EOF
19.1.2  oracle方式
 PWD=`GetPwd $DBNAME`
 load "$DBNAME/$PWD" a.unl "|" "insert into areanumbel"
注意:不同於INFORMIX,此load 是手工編寫的一個PRO*C程式。
19.2  第二種情況
19.2.1  informix方式
 dbaccess $DBNAME -<<EOF
 load from $2 DELIMITER ',' insert into $TBL
 EOF
19.2.2 oracle方式
 PWD=`GetPwd $DBNAME`
 load "$DBNAME/$PWD" "$2" "," "insert into $TBL"
19.3  第三種情況
19.3.1  informix方式
 dbaccess $DBNAME -<<EOF
 load from $DATAFILENAME insert into Ser_Rights (ServiceKey,RightId,RightDesc,OperateRight);
 EOF
19.3.2  oracle方式
 PWD=`GetPwd $DBNAME`
 load "$DBNAME/$PWD" "$DATAFILENAME" "|" "insert into Ser_Rights (ServiceKey,RightId,RightDesc,OperateRight)"
注意insert into 語句前面一個或幾個單詞必須與前面的分隔符等在同一行,後面可以換行(如上例)。如果沒有分隔符(如空格,逗號等)一定要自己加上一個("|")。
20 Unload資料匯出資料
20.1  第一種情況
20.1.1  informix方式
 dbaccess  $DBNAME -<<EOF
 unload to ${DATABACKNAME}.$2 select ServiceKey,RightId,RightDesc,OperateRight from Ser_Rights where servicekey=$2;
 EOF
20.1.2  oracle方式
 PWD=`GetPwd $DBNAME`
 unload "$DBNAME/$PWD" "$DATABACKNAME" "|" "select ServiceKey,RightId,RightDesc,OperateRight from Ser_Rights where servicekey=$2";
注意select語句前面一個或幾個單詞必須與前面的分隔符等在同一行,後面可以換行(如上例)。
不同於INFORMIX,此unload 是手工編寫的一個PRO*C程式。
20.2 第二種情況
20.2.1 informix方式
 dbaccess $DBNAME -<<EOF
 unload to $tmpfile DELIMITER ' ' select distinct scpno from pps_batch_toscp;
 EOF
20.2.2 oracle方式
 PWD=`GetPwd $DBNAME`
 unload  "$DBNAME/$PWD" "$tmpfile" " " "select distinct scpno from pps_batch_toscp";
注意:如果沒有分隔符(如空格,逗號等)一定要自己加上一個("|")。
如果要通過sqlplus來呼叫load和unload則需要在它們之前加感嘆號(!)。例如:
20.3  第三種情況
20.3.1  informix方式
 cat <<EOF > $1
 unload to $DATABACKNAME  select rightid,rightname,rightdesc,righttype,rightfather from op_rights;
 delete from op_rights;
 load from $DATAFILENAME insert into op_rights(rightid,rightname,rightdesc,righttype,rightfather);
 EOF
 dbaccess $DBNAME loadrights.sql
20.3.2  oracle方式
 cat <<EOF > $1
 !unload "$DBNAME/$PWD" "$DATABACKNAME" "|" "select rightid,rightname,rightdesc,righttype,rightfather  from op_rights";
 delete from op_rights;
 !load "$DBNAME/$PWD" "$DATAFILENAME" "|" "insert into op_rights (rightid,rightname,rightdesc,righttype,rightfather)";
 exit;
 EOF
 PWD=`GetPwd $DBNAME`
sqlplus $DBNAME/$PWD @loadrights.sql

21 “Select first 1 *”Oracle的實現
在informix中select frist 1是指從結果集中取出第一條記錄,在oracle中沒有相對應的語法,可以使用一點小技巧完成,舉例如下:
   informix:
      select first 1 sduno into :ll_sduno
      from serrunscu
     where serviceid = :il_serviceid
     and scuno =:ll_scuno
     and Not(sduno is null);
 Oracle:
    select sduno into :ll_sduno
      from (select sduno
      from serrunscu
     where serviceid = :il_serviceid
     and scuno =:ll_scuno
     and Not(sduno is null))
     where rownum =1;

 其他

1. 查詢oracle執行計劃
select * from v$sqlarea where sql_text like '%sf_hw_ht_str2list%';

2. 清空執行計劃
alter system flush shared_pool;

3 用巢狀表的方式來替換in(1,2,3,4)操作,實現引數繫結。
create or replace type t_hw_ht_strlist as table of VARCHAR(23);
create or replace function sf_hw_ht_str2list(in_strSequence in varchar) return t_hw_ht_strlist  as
tmp_str varchar(4001) := in_strSequence || ',';
tmp_iIndex Number;
tmp_list t_hw_ht_strlist := t_hw_ht_strlist();

Begin

/*
功能:將由逗號分隔的不帶引號的字元序列轉換為資料表
引數:in_strSequence如:G0000123,G0000124,G0000125...
*/

Loop
  tmp_iIndex := Instr(tmp_str, ',');
  Exit When(Nvl(tmp_iIndex, 0) = 0);
  tmp_list.Extend;
  tmp_list(tmp_list.Count) := Trim(Substr(tmp_str, 1, tmp_iIndex - 1));
  tmp_str := Substr(tmp_str, tmp_iIndex + 1);
End Loop;
Return tmp_list;

end sf_hw_ht_str2list;

強制使用基於規則的優化器模式(/*+ rule*/)查詢
select /*+ rule*/ HuntingNumberID, GLFlag, HuntingNumber
                       from R_COMMON_HuntingListEntry
                       where HuntingListID = :HuntingListID
                       and HuntingNumberID in (Select * From Table(Cast(sf_hw_ht_str2list(:strHuntingNumberSeq) as T_HW_HT_STRLIST)))
                       and (LastHangUpTime>=LastAnswerTime or LastAnswerTime is NULL)
        
        
4 查詢oracle程序號查詢當前正在執行的SQL
SELECT a.username,
       a.machine,
       a.program,
       a.sid,
       a.serial#,
       a.status,
       c.piece,
       c.sql_text
  FROM v$session a,
       v$process b,
       v$sqltext c
WHERE b.spid=3595
   AND b.addr=a.paddr
   AND a.sql_address=c.address(+)
ORDER BY c.piece


5. 儲存過程中獲取異常的具體內容:
create or replace
function sf_hw_edr_getExceptionMsg return varchar2 as
begin
  return sqlerrm || '
' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
     --DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
     --out_strResultCode := sqlcode;
     --out_strResultCode := out_strResultCode || substr(sqlerrm,2,100);
end sf_hw_edr_getExceptionMsg;
結果:
OUT_STRRESULTCODE = ORA-00942: 表或檢視不存在
ORA-06512: 在 "SDU111.SF_HW_EDR_GETPRESTATISTICTIME", line 28
ORA-06512: 在 "SDU111.SF_HW_EDR_PRESTAT", line 78
31. 儲存過程中判斷遊標是否開啟:
if tmp_cursor%isopen != false then
          close tmp_cursor;
end if;


6. oracle定時任務job
建立job:

VARIABLE jobno number;  -- VARIABLE可有可無
begin
DBMS_JOB.SUBMIT(:jobno,'myProcs;',Sysdate,'sysdate+1');   --myProcs是呼叫的儲存過程
commit;
end;

修改job:
VARIABLE jobno number;
begin
DBMS_JOB.change(1,'myProcs;',Sysdate,'sysdate+1');  
commit;
end;
       
7. tnsping SID:檢視資料庫例項是否可用
sqlplus sys/xxx@SID as sysdba:系統dba使用者登入資料庫

8. 修改dba密碼
sqlplus "/as sysdba"
alter user sys identified by 新密碼;