天天看點

oracle開發管理經驗(1)

1、不安裝Oracle客戶連接配接Oracle 8的方法

請将以下檔案拷貝到運作檔案所在目錄

一、ODBC動态庫 :

ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll

二、建立EXTRA子目錄,将MSVCRT.DLL檔案拷貝到該子目錄下

EXTRA/MSVCRT.DLL

三、ORACLE動态庫及配置檔案

Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora Sqltnsnt.dll CORE35.DLL

四、PB動态庫

pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll

Oracle的用戶端不安裝讓pb連上,我記得以前有文章的,你可以搜尋一下。

具體步驟。

(1).先在某機器上安裝好用戶端(最好安裝在c盤);

(2).複制此用戶端oracle目錄下的所有檔案作為獨立的oracle安裝檔案;

(3).搜尋系統資料庫,找到 HKey_Local_machine/software/oracle,把此項目及分支全部導出。

(4).打包好你的pb程式,并獨立打包好oracle用戶端和系統資料庫導出檔案。

(5).到幹淨的用戶端,解開兩個包,導入系統資料庫檔案,然後加入路徑支援:

  path=%path%;"c:/Ora817/bin"

這樣處理,應該沒有問題,因為我就是這樣快速處理了幾十個機器。

若不想搞系統資料庫,你可以在程式中自己寫系統資料庫,構成Oracle用戶端必要的系統資料庫支援,至于路徑,手工添加應該不難。

至于Oracle用戶端那些檔案不需要,這個不好說,你可以把那些bin目錄下的所有exe删除,Oracle Document删除(7x兆)

至于定義Oracle服務,找到 Ora817/net80/admin/TnsName.ora,參照格式,程式中生成一個也不麻煩。

=======================================================

2、在ORACLE中傳回遊标結果集

你需要寫到一個包中:

create or replace package pag_cs_power as

    type c_Type is ref cursor;

FUNCTION FUN_CS_GETDICTLIST(

  v_DictIndex in  varchar2) return c_Type;

end pag_cs_power;

函數代碼:

FUNCTION FUN_CS_GETDICTLIST(

  v_DictIndex in  varchar2) return c_Type

     as

        c_cursor            c_Type;

begin

   open c_cursor for

      select DICTID,DICTNAME FROM SYS_DICT WHERE DICTINDEX = v_DictIndex;

   return c_cursor;

end FUN_CS_GETDICTLIST;

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

3、P4機器安裝ORACLE

(1)、将ORACLE安裝軟體拷貝到硬碟。

(2)、将  硬碟目錄檔案/stage/Components/oracle.swd.jre/1.1.7.30/1

/DataFiles/Expanded/jre/win32/bin/symcjit.dll的檔案改名為symcjit.old

(3).再運作SETUP.exe  檔案進行安裝。

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

4、單引号的插入問題

SQL> insert into a values('i''m good');       --兩個''可以表示一個'

SQL> insert into a values('i'||chr(39)||'m good'); --chr(39)代表字元'

SQL> insert into a values('a'||'&'||'b');     

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

5、全資料庫的導入與導出

exp username/password full=y file=yourdata.dmp grants=y rows=y

imp username/password full=y ignore=y file=yourdata.dmp grants=y

6、exp與imp的具體用法

exp username/[email protected]_61 full=y file=yourdata.dmp grants=y rows=y

imp username/password full=y ignore=y file=yourdata.dmp grants=y

exp mzbs/[email protected]_61 file = c:/zzzzzzz.dmp grants = y rows = y

imp mzbs/[email protected]_61 file = c:/zzzzzzz.dmp grants = y ignore=y  FULL=Y

(1)

exp參數:

關鍵字   說明(預設)  

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

USERID   使用者名/密碼

FULL   導出整個檔案 (N)

BUFFER   資料緩沖區的大小

OWNER   所有者使用者名清單

FILE   輸出檔案 (EXPDAT.DMP)

TABLES   表名清單

COMPRESS  導入一個範圍 (Y)

RECORDLENGTH  IO 記錄的長度

GRANTS   導出權限 (Y)

INCTYPE   增量導出類型

INDEXES   導出索引 (Y)

RECORD   跟蹤增量導出 (Y)

ROWS   導出資料行 (Y)

PARFILE   參數檔案名

CONSTRAINTS  導出限制 (Y)

CONSISTENT  交叉表一緻性

LOG   螢幕輸出的日志檔案

STATISTICS  分析對象 (ESTIMATE)

DIRECT   直接路徑 (N)

TRIGGERS  導出觸發器 (Y)

FEEDBACK  顯示每 x 行 (0) 的進度

FILESIZE  各轉儲檔案的最大尺寸

QUERY   標明導出表子集的子句

imp參數:

關鍵字   說明(預設)  

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

USERID   使用者名/密碼

FULL   導入整個檔案 (N)

BUFFER   資料緩沖區大小

FROMUSER  所有人使用者名清單

FILE   輸入檔案 (EXPDAT.DMP)

TOUSER   使用者名清單

SHOW   隻列出檔案内容 (N)

TABLES   表名清單

IGNORE   忽略建立錯誤 (N)

RECORDLENGTH  IO 記錄的長度

GRANTS   導入權限 (Y)

INCTYPE   增量導入類型

INDEXES   導入索引 (Y)

COMMIT   送出數組插入 (N)

ROWS   導入資料行 (Y)

PARFILE   參數檔案名

LOG   螢幕輸出的日志檔案

CONSTRAINTS  導入限制 (Y)

DESTROY   覆寫表空間資料檔案 (N)

INDEXFILE  将表/索引資訊寫入指定的檔案

SKIP_UNUSABLE_INDEXES 跳過不可用索引的維護 (N)

ANALYZE   執行轉儲檔案中的 ANALYZE 語句 (Y)

FEEDBACK  顯示每 x 行 (0) 的進度

TOID_NOVALIDATE  跳過指定類型 id 的校驗

FILESIZE  各轉儲檔案的最大尺寸

RECALCULATE_STATISTICS 重新計算統計值 (N)

(2)

一、建立一個expdata.sql檔案

USERID=RMTAFIS/3       這裡寫你的使用者名和密碼

BUFFER=32768

OWNER=RMTAFIS         這裡寫導出的使用者

FILE=E:/Exp/RMTAFIS.DMP      導出的檔案,可以是相對路徑

ROWs=Y

GRANTS=Y

COMPRESS=Y

CONSISTENT=Y

二、建立一個expdata.bat

exp parfile=expdata.sql

如果是805

exp80 parfile=expdata.sql

輕按兩下expdata.bat就導出資料了

7、如果在like的變量中,是以‘%’開頭的話,是不會使用index的。反之,不是以‘%‘開頭,而又有相應的index,是會使用index的。具體可以用plain plan來看一下。

8、複制空表結構

   create table new_table

as select * from old_table where 1=2;

   複制表(含記錄)

   create table new_table

as select * from old_table ;

9、把一個使用者下的表導入到另一個使用者下,但需要改名

先用exp導出所有的表;

用imp将導出的表導入到新使用者;

在新使用者下,執行

  select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'

    from tab

   where tabtype='TABLE';

将上面的查詢結果儲存到一個sql檔案中,處理後執行就可以了。

10、審計步驟

 修改參數檔案init.ora,參數audit_trail值為true;

 重新啟動資料庫;

 打開審計audit session; (audit session by username)

 執行登入操作;

 察看審計結果:

   select * from dba_audit_session;

   select * from sys.aud$;

   select * from dba_audit_trail;

   select * from dba_audit_exists;

 關于審計:

   為了使oracle8i的審計功能可用,必須在資料庫參數檔案中修改audit_trail初始參數,而這個修改并不支配oracle8i把生成的審計記錄記入審計痕迹中,

由于狀态,特權和模式對象已被修改,因而審計的預設值不可用,其參數應設定為none.下面列出了audit_trail 可用的參數

db_使資料庫審計和全部直屬審計記錄到資料庫審計的痕迹中

os_是資料庫審計依據直屬審計記入到作業系統的審計很集中

none_不可用

11、BFILE的用法

(1)、create or replace directory

BFILE_TEST

as

'/oracle/oradata/bfiles';

(2)、grant read on directory BFILE_TEST to SCOTT;

(3)、host ls -l /oracle/oradata/bfiles/1.TXT

(4)、connect SCOTT/TIGER

create table BFILES (ID number, TEXT bfile );

(5)、insert into BFILES values ( 1,

bfilename ( 'BFILE_TEST', '1.TXT' ) );

12、如何在Windows 2000下将Oracle完全解除安裝?

一、系統環境:

(1)、作業系統:Windows 2000 Server,機器記憶體128M

(2)、資料庫: Oracle 8i R2 (8.1.6) for NT 企業版

(3)、安裝路徑:D:/ORACLE

二、解除安裝步驟:

(1)、開始->設定->控制台->管理工具->服務

   停止所有Oracle服務。

(2)、開始->程式->Oracle - OraHome81->Oracle Installation Products->Universal Installer

   卸裝所有Oracle産品

(3)、運作regedit,選擇HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE,按del鍵删除這個入口。

(4)、運作regedit,選擇HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services,滾動這個清單,删除所有Oracle入口

(5)、從桌面上、STARTUP(啟動)組、程式菜單中,删除所有有關Oracle的組和圖示

(6)、重新啟動計算機,重起後才能完全删除Oracle所在目錄

(7)、删除與Oracle有關的檔案,選擇Oracle所在的預設目錄C:/Oracle,删除這個入口目錄及所有子目錄,

  并從Windows 2000目錄(一般為C:/WINNT)下删除以下檔案

  ORACLE.INI、oradim80.INI

(8)、WIN.INI檔案中若有[ORACLE]的标記段,删除該段

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

13、如何使用SQLPLUS和SVRMGRL運作腳本

(1)、用sqlplus調用:

c:/script.txt的内容

startup;

指令行:sqlplus internal/oracle @c:/script.txt

(2)、用svrmgrl調用:

c:/script.txt的内容

connect internal/oracle;

startup;

指令行:svrmgrl @c:/script.txt

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

14、ORACLE的臨時表

CREATE GLOBAL TEMPORARY TABLE TABLENAME (

   COL1  VARCHAR2(10),

   COL2  NUMBER

) ON COMMIT PRESERVE(DELETE) ROWS ;

這種臨時表不占用表空間,而且不同的SESSION之間互相看不到對方的資料

在會話結束後表中的資料自動清空,如果選了DELETE ROWS,則在送出的時候即清空資料,PRESERVE則一直到會話結束

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

在Oracle8i中,可以建立以下兩種臨時表:

(1)會話特有的臨時表

   CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)

   ON COMMIT PRESERVE ROWS;

(2)事務特有的臨時表

   CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)

   ON COMMIT DELETE ROWS;

  CREATE GLOBAL TEMPORARY TABLE MyTempTable

所建的臨時表雖然是存在的,但是你試一下insert 一條記錄然後用别的連接配接登上去select,記錄是空的,明白了吧,我把下面兩句話再貼一下:

--ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次送出後ORACLE将截斷表(删除全部行)

--ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE将截斷表。

沖突的問題更本不用考慮.

臨時表隻是儲存目前會話(session)用到的資料,資料隻在事務或會話期間存在。

通過CREATE GLOBAL TEMPORARY TABLE指令建立一個臨時表,對于事務類型的臨時表,

資料隻是在事務期間存在,對于會話類型的臨時表,資料在會話期間存在。

會話的資料對于目前會話私有。每個會話隻能看到并修改自己的資料。DML鎖不會加到

臨時表的資料上。下面的語句控制行的存在性。

● ON COMMIT DELETE ROWS 表名行隻是在事務期間可見

● ON COMMIT PRESERVE ROWS 表名行在整個會話期間可見

可以對臨時表建立索引,視圖,出發器,可以用export和import工具導入導出表的

定義,但是不能導出資料。表的定義對所有的會話可見。

例如:

CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(

table_name VARCHAR2(20),

primary_key VARCHAR2(100),

field VARCHAR2(1000))

ON COMMIT PRESERVE ROWS;

CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(

table_name VARCHAR2(20),

primary_key VARCHAR2(100),

field VARCHAR2(1000))

ON COMMIT DELETE ROWS;

15、如何使用OEM

先啟資料庫服務,再啟oracle manager服務。

否則重建檔案資料庫

如果還不行就把ORACLEHOME/NETWORK/sqlnet.ora檔案的内容

     sqlnet.authentication_services=(NTS)

     改成sqlnet.authentication_services=(NONE)

登入 sysman/oem_temp

16、TNS:沒有監聽器的問題。

(1)查一下監聽服務是否啟動,

   如果沒有啟動,則運作lsnrctrl start。

(2)檢視一下 LISTENER.ORA内監聽的伺服器名、伺服器IP、資料庫名是否正确。

(3)檢視一下 TNSNAMES.ORA内伺服器名、伺服器IP、資料庫名是否正确。

17、LINUX、UNIX下自動啟動ORACLE服務

(1)

 !/bin/sh

# chkconfig: 345 51 49

# description: starts the oracle dabase deamons

#

ORA_HOME=/u01/app/oracle/product/8.1.7

ORA_OWNER=oracle

case "$1" in

'start')

echo -n "Starting Oracle8i: "

su - $ORA_OWNER -c $ORA_HOME/bin/dbstart

touch /var/lock/subsys/oracle8i

echo

;;

'stop')

echo -n "Shutting down Oracle8i: "

su - $ORA_OWNER -c $ORA_HOME/bin/dbshut

rm -f /var/lock/subsys/oracle8i

echo

;;

'restart')

echo -n "Restarting Oracle8i: "

$0 stop

$0 start

echo

;;

*)

echo "Usage: oracle8i { start | stop | restart }"

exit 1

esac

exit 0

我仿照su - $ORA_OWNER -c $ORA_HOME/bin/dbshut 的形式

添加su - $ORA_OWNER -c $ORA_HOME/bin/lsnrctl start

但是在系統啟動的時候listener啟動不了

(2)

/etc/rc.local

改成如下就可以了

touch /var/lock/subsys/local

#echo 2147483648 > /proc/sys/kernel/shmmax

echo -n "Starting Oracle Database:"

date +"%D %T %a"

su - oracle -c "lsnrctl start"

#su - oracle -c "sqlplus /nolog @startmaster.sql"

echo -n "Oracle Database Started:"

date +"%D %T %a"

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

第一個#是改共享記憶體大小的

第二個#是啟動資料庫的。

(3)

ftp://ftp.rpmfind.net/linux/rhcontrib/7.1/i386/oraclerun9i-1.0-1.i386.rpm

下載下傳這個軟體包并安裝。

裡面每個檔案都有一些要修改的地方。配置完成之後,就可以在系統服務配置中找到它,選中它就可能以自啟動了。

18、復原段不夠的處理方法

(1)、先使復原段脫機一個,

如果不好用,則再脫機一個。直至好用。

   ALTER rollback segment rollbackname offline;

(2)、增加復原段資料檔案的大小

   alter database datafile 'datafile' resize 200M;

19、WINNT向WIN2000移植

不用EXP和IMP的

停掉資料庫的服務後,可以做一個資料庫的全備份。

在WIN2000上建一個同名的資料庫,随便建,越小越好,可以縮短時間。

把WINNT下的資料庫備份恢複到WIN2000的資料庫上就可以了。但建庫的目錄

必須一樣。(也可以不一樣,但需要更改資料檔案的連接配接)

我曾多次為使用者這樣移植資料,萬無一失的。

注意:因為資料很重要,是以建議你先EXP備份一下。這是我們的習慣。

20、ORACLE SQL PLUS Worksheet亂碼問題。

dbappscfg.properties,修改該檔案即可解決上述問題。$ORACLE_HOME/sysman/config目錄下,修改

# SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

為SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。

對于Windows作業系統,還需要修改一項

#SQLPLUS_SYSTEMROOT=c://WINNT40

為SQLPLUS_SYSTEMROOT=C://WINNT

如作業系統的主目錄在C槽的Winnt下

對于後面一項的修改隻對Windows作業系統進行,對UNIX作業系統則不需要。如果在Windows作業系統中不修改該項,在Oracle Enterprise Manager中,連接配接系統時,會提示如下的錯誤:

ORA-12560 TNS:protocol adapter error

或者

ORA-12545 Connect failed because target host or object does not exist

重新連接配接SQL PLUS Worksheet

21、DROP掉名字是小寫的表(用雙引号括起來)。

    drop table "tablename"

    select * from "tablename"

22、日期的顯示格式

注意:SIMPLIFIED CHINESE(簡體中文需要" "括起來)

      别的國家不用" " 例如:ENGLISH

select to_char(sysdate,'DAY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual;

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

星期四

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

23、一個從ORACLE中讀表資訊的存儲過程

可以在vc下調用存儲過程來實作

例子:

先修改init.ora

例如:

utl_file_dir=/usr    //路徑為 oracle所在的盤:/usr

此過程将使用者TEMP的P1過程的代碼儲存到ORACLE安裝盤下/USR/TEXT.TXT中

create or replace procedure TEST

is

  file_handle utl_file.file_type;

  STOR_TEXT VARCHAR2(4000);

  N NUMBER;

I NUMBER;

 begin

I:=1;

   SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';

file_handle:=utl_file.fopen('/usr','test.txt','a');

WHILE I<=N LOOP

   SELECT TEXT  INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;

   I:=I+1;

   utl_file.put_line(file_handle,stor_text);

END LOOP;

   utl_file.fclose(file_handle);

commit;

end TEST;

/

24、關于修改ORACLE的列寬

(1)、不論如何都要備份資料。

(2)、如果沒有資料,則可以修改寬度。比如NUMBER,CHAR,VARCHAR2

(3)、如果有資料,則可以增加寬度。比如NUMBER,CHAR,VARCHAR2

   注意:不可以減小寬度。

(4)、文法:alter talbe tablename modify columnname columntype not null;

25、如何檢視使用者的存儲過程和函數

select name,text from user_source where name= Procedurename and type = 'PROCEDURE' order by line;

26、在批進行中自動啟動ORACLE服務(win2000)

編一個批處理檔案

net start OracleServiceSID

OracleServiceSID是ORACLE的執行個體名稱

27、對行加鎖時,隻對tb1加鎖

select tb1.r1 from tb1, tb2  where tb1.r2 = tb2.r2 and tb2.r1 = xxx for update of tb1.r1 nowait

28、得到列的資訊

desc tablename

select cname from col where tname='TABLENAME';

select column_name from user_tab_columns where table_name='TABLENAME';

select column_name from ALL_tab_columns where table_name='TABLENAME';

select column_name from dba_tab_columns where table_name='TABLENAME';

select column_name from user_col_comments where table_name='TABLENAME';   

select column_name from all_col_comments where table_name='TABLENAME';

select column_name from dba_col_comments where table_name='TABLENAME';

29、使觸發器無效(login_on)

svrmgrl

connect internal/oracle

alter trigger login_on disable;

使觸發器為無效alter trigger yourtriggername disable

如果是對于某一個表的所有的觸發器:

alter table yourtablename disable all triggers

30、如在SQLPLUS中何調用存儲過程和函數。

    call隻能調用存儲過程後面加上括号就可以了

    call 存儲過程名();

    exec procedurename;(可以不加())

    調用函數用sql語句

    select 函數名(參數) from dual;

31、函數中如果調用DML語句就不可以調用SELECT語句

32、REDO LOG BUFFER 什麼時候寫到REDO LOGFILE中

    (1)、在COMMIT的時候

    (2)、重做日志緩沖區1/3滿的時候

    (3)、重做日志緩沖區大于1M的時候

    (4)、它寫資訊必須是在資料寫程序前調用

    (5)、一般CHECKPOINT在日志組切換的時候進行或者由初始化參數設定

         在CHECKPOINT的時候需要調用資料寫程序  

33、ORACLE的http server 把原有的WEB server沖掉,如何解決?

    (1).如果你原來的http server是用IIS等其他釋出工具做的,那麼可以在服務中停掉         oracle http server服務,并且改為手動啟動。

    (2).如果原來的http server是用apache釋出,則可以改變http.conf中的參數

34、關于建立重建檢視索引

建立索引:

CREATE INDEX IND_NAME ON TABLE_NAME(COL1,COL2,...);

重建索引:

ALTER INDEX IND_NAME REBUILD;

檢視索引:

SELECT * FROM USER_INDEXES WHERE INDEX_NAME='IND_NAME';

35、ORACLE如何清除使用者的程序

   一|根據使用者的應用程式和SQL語句,在DBA STUDIO找到使用者的SESSION并斷開其連接配接

   二、

   (1)、要殺掉一個session應先應知道其sid和serial#,假設你已經知道。

   (2)、select paddr from v$session where sid=v_sid and serial#=v_serial#

   select spid from v$process where addr=paddr(以上語句所查出的);

   (3)、使用ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate; 試一試如不行轉   

   三、LINUX和UNIX下

   轉到作業系統下執行:kill -9 spid (以上語句所查出的) 

36、ORACLE中檢查表是否被鎖的語句

    SELECT A.OWNER,  

         A.OBJECT_NAME,  

         B.XIDUSN,  

         B.XIDSLOT,  

         B.XIDSQN,  

         B.SESSION_ID,  

         B.ORACLE_USERNAME,  

         B.OS_USER_NAME,  

         B.PROCESS,  

         B.LOCKED_MODE,  

         C.MACHINE,  

         C.STATUS,  

         C.SERVER,  

         C.SID,  

         C.SERIAL#,  

         C.PROGRAM 

    FROM ALL_OBJECTS A,  

         V$LOCKED_OBJECT B,  

         SYS.GV_$SESSION C

   WHERE ( A.OBJECT_ID = B.OBJECT_ID )

     AND (B.PROCESS = C.PROCESS )

   ORDER BY 1,2    

殺掉:alter system kill session 'sid, serial#'

37、ORACLE的登入問題,使用者名和密碼。

可以直接輸入:

    internal/[email protected]_name

  sys/[email protected]_name

  system/[email protected]_name

  scott/[email protected]_name

注意:

9i中沒有internal/oracle

如果選擇典型安裝則有 scott使用者

如果自定義可以不安裝  scott使用者

如果是本機則可以省略@serivce_name

oem:(ORACLE ENTERPRISE MANAGER)

sysman/oem_temp

38、修改表的列名

Oracle9i:

alter table xxx rename column xx to yy;

Oracle8i & lower version

connect sys/passed;

update col$ set name=xx where obj#=對象id and name = 字段

(一般不要這樣用,會造成意想不到的結果)

注:最好是删除再建立新的列

39、把使用者模式對象所在的表空間移到新的表空間

(1). create the new tablesapce

(2). alter user test default tablespace test_data;

(3). alter user test quota unlimited on test_data;

(4). alter table the_table_name move tablespace test_data;

    生成腳本:

    select 'alter table'||tname||' move tablespace test_date;'

    from tab

   where tabtype='TABLE'

(5). rebuild the indexes;

40、使用OEM備份或者EXP的步驟

 WIN2000下:

(1). 控制台――>管理工具―― >計算機管理――>本地使用者群組――>使用者――>建立使用者sys和sysman(sys和sysman 的帳号要和登陸資料庫的帳号相同);

(2).控制台――>管理工具―― >本地安全政策――>本地政策――>使用者權利指派――>

作為批處理作業登陸――>添加sys和sysman兩個帳号。

(3).使用Enterprise Manager配置輔助工具

開始→程式→Oracle - OraHome81→Enterprise Manager→Configuration Assistant

a、使用Configuration Assistant工具來建立一個新的資料檔案庫。

(4).控制台――>管理工具―― > 服務,檢視OracleOraHome81ManagementServer是否啟動,如果沒有啟動,則手動啟動該服務。

(5).以sysman/oem_temp(default)登陸DBA Studio

(第二個選項:登陸到Oracle Management Server),立即修改密碼為你剛才在NT下建的使用者sysman的密碼。

(6). 以sysman/ *** (bluesky) 從開始→程式→Oracle - OraHome81→Console 登陸到 控制台。

在 系統→首選項→首選身份證明(我的首選身份設定如下:)

DEFAULT節點:name:sysman

DEFAULT資料庫:name:sys

(7). 在搜尋/添加結點後,以sysman/ *** 登陸到該結點,以sys/ *** as sysdba登陸資料庫(也就是在首選身份設定的結果)。

(8). 在工具→備份管理→向導→預定義備份政策(自定義備份政策)→送出備份計劃

(9).從開始→程式→Oracle - OraHome81→Console 登陸到 控制台,檢視活動(曆史記錄)可以看到你的備份是否成功,如果不成功,可以點選備份看明細。(我第一次也沒成功,後來我修改系統的臨時目錄C:/WINNT/Temp→c:/temp/systmp,重新啟動機器就ok了)

41、如何修改INTERNAL的密碼

以下是oracle8的8i你可以仿照來做

(1)、進入DOS下

(2)、預設internal密碼檔案在c:/orant/database下,是隐藏屬性,檔案名稱與資料庫執行個體名有關

  如預設ORACLE執行個體名為ORCL,則internal密碼檔案名為pwdorcl.ora

(3)、建立新的internal密碼檔案,起個新名字為pwdora8.ora

  orapwd80 file=pwdora8.ora password=B entries=5     --注:password項一定要用大寫,并且不要用單引号

(4)、拷貝pwdora8.ora檔案到c:/orant/database目錄下

(5)、運作regedit,修改密碼檔案指向

(6)、找到HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE項

  定位ORA_ORCL_PWFILE子項,改變其值為c:/orant/database/pwdora8.ora

(7)、關閉ORACLE資料庫,重新啟動

(8)、進入svrmgr30服務程式,測試internal密碼是否更改成功

42、憑證檢索失敗的決絕方法。

原因: 由于Oracle不能應用OS認證而導緻憑證檢索失敗

解決辦法:

    (1).打開network/admin下的sqlnet.ora

        修改SQLNET.AUTHENTICATION _SERVICES=(NONE)。

    (2).啟動Net8 configuration assistant-->選第三項本地網絡服務名配置

    -->删除...(删除原來的本地網絡服務名)

    (3).重複第二步

    -->添加.. (建立本地網絡服務名)

    (4).restart oracle

    注意:NTS是WinNT的認證方式

43、指令行編譯存儲過程

    ALTER PROCEDURE procedure_name COMPILE;

44、關于如何建立資料庫連結(DBlink)

可以通過建立客戶機資料庫網絡服務名的辦法,将伺服器的名字或是IP位址設定為你需要連接配接的那個機器就行

如果你要在一個應用中連接配接它,現在做好上步工作,然後按如下處理

建立資料庫連接配接

CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';

DBaseLinkName  是建立的資料連接配接名稱

UserName       是可以連接配接到的使用者名

Password        是可以連接配接到的使用者的密碼

NetServiceName  是可以連接配接的資料庫網絡服務名或是資料庫名

查詢建立資料連接配接的表執行個體

Select * From [email protected] DBaseLinkName;

注意:如果在CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';中NetServiceName  是資料庫名修改init.ora中:global_names = true

否則global_names = false

init.ora中:global_names = false

45、Object Browser7.0中文版的破解方法

到OBJECT BROWSER的目錄裡,找到DeIsL1.isu檔案,用記事本打開,看到的是亂碼吧?沒關系,将Stirling Technologies ,Inc 這個字元串前面的亂碼去掉(如果有的話),讓後在Stirling之前加一個空格(一定要加的),儲存,退出,重新運作一下看看,雖然還有提示輸入驗證資訊,但是不用管他,直接确定就行。是不是可以用了呢?保證好使。

46、錯誤号ORA-01536:space quota exceeded for table space 'ALCATEL'的解決辦法

     三個解決辦法,任你選擇:

    (1) alter user USERNAME quota 100M on TABLESPACENAME;

    (2) alter user USERNAME quota unlimited on TABLESPACENAME;

    (3) grant unlimited tablespace to USERNAME;

47、如何在Oracle中捕獲到SQL語句的全部操作内容

       SELECT osuser, username, sql_text from v$session a, v$sqltext b

       where a.sql_address =b.address order by address, piece;  

48、ORACLE中如何實作自增字段:

(1)第一種方法

ORACLE一般的做法是同時使用序列和觸發器來生成一個自增字段.

CREATE SEQUENCE SEQname

 INCREMENT BY  1

 START WITH  1

 MAXVALUE  99999999

/

CREATE TRIGGER TRGname

BEFORE  INSERT  ON table_name

REFERENCING

 NEW AS :NEW

FOR EACH ROW

Begin

   SELECT SEQname.NEXTVAL

     INTO :NEW.FIELDname

     FROM DUAL;

End;

(2)第二種方法:

CREATE OR REPLACE TRIGGER TR1

  BEFORE INSERT ON temp_table

  FOR EACH ROW

declare

com_num NUMBER;

BEGIN

SELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE;

:NEW.ID:=COM_NUM+1;

END TR1;

49、job的使用:

修改initsid.ora參數

job_queue_processes = 4            8i,9i  (允許同時執行的JOB數)

job_queue_interval = 10            8i 

job_queue_keep_connections=true       8i

DBMS_JOB.SUBMIT(:jobno,//job号

                'your_procedure;',//要執行的過程

                trunc(sysdate)+1/24,//下次執行時間

                'trunc(sysdate)+1/24+1'//每次間隔時間

               );

删除job:dbms_job.remove(jobno);

修改要執行的操作:dbms_job.what(jobno,what);

修改下次執行時間:dbms_job.next_date(job,next_date);

修改間隔時間:dbms_job.interval(job,interval);

停止job:dbms.broken(job,broken,nextdate);

啟動job:dbms_job.run(jobno);

注意:修改後一定要COMMIT;

例子:

VARIABLE jobno number;

begin

      DBMS_JOB.SUBMIT(:jobno,

              'Procdemo;',//Procdemo為過程名稱

               SYSDATE, 'SYSDATE + 1/720');

         commit;

end;

50、如何配置mts

修改初始化參數檔案

增加以下内容:

mts_dispatchers = "(protocol=TCP)(disp=2)(con=1000)"

mts_max_dispatchers = 50

mts_servers = 20

mts_max_servers = 50

51、取出一個表的最後一條記錄

select * from (select rownum id,tname.* from tname) a where a.id=(select count(*) from a);

52、重做日志(Redolog)被删掉,通過什麼方法才能恢複!

先mount資料庫,然後再目錄下建同名檔案redo01.log、redo02.log、redo03.log

然後執行alter databse clear logfile group n

對于current的group,執行alter databse clear unarchived logfile group n

然後,再open,就ok了

53、Oracle常見服務

幾個主要的:

OracleOraHome81TNSListener     監聽服務

OracleServiceSID               ORACLE服務

OracleOraHome81Agent           智能代理服務

OracleOraHome81CMan            連接配接管理服務

OracleOraHome81HTTPServer      APACHE WEB 服務

OracleOraHome81ManagementServer ORACLE 企業管理器服務

OracleOraHome81Names            ORACLE命名服務

剩下的也不常用。

54、ORACLE的熱備份

在不關閉資料庫的時候進行ORACLE的備份。

原理停複雜的,你去找本書看看吧。

舉個簡單的例子:備份表空間USERS

ALTER TABLESPACE USERS BEGIN BACKUP

COPY USERS TABLESPACE 的資料檔案到備份目錄

ALTER TABLESPACE USERS END BACKUP

55、導緻索引不起作用的解決辦法

你的問題我剛處理過,是由optimizer_mode參數引起的,該參數的預設值為choose,即為如表有statis則查詢走基于cost的方式,否則走基于rule的方式,因些你可以有以下幾個解決方法。

(1)、簡單的在init<sid>.ora中設optimizer_mode=rule,重起資料庫。

(2)、使用analyze table table_name(索引基表) delete statistics;

(3)、最後一個萬能辦法,将表和索引drop掉,重建。

56、關于資料庫程序的問題。

(1).檢視相關程序在資料庫中的會話

Select a.sid,a.serial#,a.program, a.status ,

substr(a.machine,1,20), a.terminal,b.spid

from v$session a, v$process b

where a.paddr=b.addr

and b.spid = &spid;

(2).檢視資料庫中被鎖住的對象和相關會話

select a.sid,a.serial#,a.username,a.program,

c.owner, c.object_name

from v$session a, v$locked_object b, all_objects c

where a.sid=b.session_id and

c.object_id = b.object_id;

(3).檢視相關會話正在執行的SQL

select sql_text from v$sqlarea where address =

( select sql_address from v$session where sid = &sid );

57、檢視IP位址

select SYS_CONTEXT('USERENV','IP_ADDRESS')  from dual;

58、運作SQLPLUS時不用輸入使用者名和密碼,進入之後使用CONNECT

        SQLPLUS /NOLOG

        SQL>CONNECT SCOTT/TIGER

59、檢視目前會話

        userenv() 函數

        select userenv('language') from dual 字元集

        select userenv('isdba') from dual 是否DBA

        select userenv('sessionid') from dual sessionid

        select userenv('TERMINAL') from dual 用戶端名字

        select userenv('INSTANCE') from dual 執行個體數

        SYS_CONTEXT() 函數

        select SYS_CONTEXT('USERENV','CURRENT_SCHEMA')  from dual;  目前模式

        select SYS_CONTEXT('USERENV','CURRENT_SCHEMAID')  from dual;  目前模式ID

        select SYS_CONTEXT('USERENV','CURRENT_USER')  from dual; 目前使用者 

        select SYS_CONTEXT('USERENV','DB_NAME')  from dual; 資料庫

        select SYS_CONTEXT('USERENV','HOST')  from dual; 主機

        ..........

60、删除重複列的方法

(1) DELETE FROM table_name A WHERE ROWID > (

       SELECT min(rowid) FROM table_name B

        WHERE A.key_values = B.key_values);

(2) create table table2 as select distinct * from table1;

     drop table1;

     rename table2 to table1;

(3) Delete from mytable where rowid not in(

       select max(rowid) from mytable

       group by column_name );

(4) delete from mytable t1

      where  exists (select 'x' from my_table t2

                   where t2.key_value1 = t1.key_value1

                     and t2.key_value2 = t1.key_value2

                     ...

                     and t2.rowid > t1.rowid);

61、ORA-12571: TNS:packet writer failure(包寫入程式失敗)

   (1) 這個錯誤在用戶端遇到過,通常重新連接配接一下伺服器就好了。

   伺服器重新啟動的時候,在client也會遇到該錯誤。

   這個錯誤你是在server還是client上遇到的?最常用的辦法就是加上跟蹤,檢視一下    跟蹤記錄,分析分析錯誤的原因。

   網絡問題也會出現該錯誤,比如網絡路由沒有配置好。

   (2) 安裝的防毒軟體導緻的

   (3) 伺服器端的IP是否被改動

   (4) 最後不行的話,重新建立監聽器

62、ORACLE服務不能自動啟動的解決辦法  

   把ORACLEHOME/network/ADMIN/sqlnet.ora

   檔案中的 sqlnet.authentication_service=(nts)

   注釋掉就可以了

63、不完全的時間點恢複

shutdown immediate

copy 備份檔案到需要恢複的目錄下

startup mount

recover database until time '2002-12-26 09:00:00'

alter database open resetlogs

自己仔細檢查一下,不會發生這樣的問題的。

64、oracle如何設定查詢逾時

select    *  from  veryLargeTable 

65、修改字元集

(1)、ALTER DATABAE CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK ;

(2)、update props$ set value$='ZHS16CGB231280'

where name='NLS_CHARACTERSET';

update props$ set value$='ZHS16CGB231280'

where  name='NLS_NCHAR_CHARACTERSET';

建議不使用(2)

注意:

(1)、執行ALTER DATABASE CHARACTER SET必須有SYSDBA權限,并且在STARTUP RESTRICT模式下執行

(2)、原字元集必須是目标字元集的一個真子集(就是浪子所說的隻能從WE8ISO8859P1轉到ZHS16GBK的原因)

(3)、CLOB字段裝換可能有問題,建議在轉換以前把有CLOB字段的表導出後DROP,轉換以後再導回

(4)、該轉換不可逆,是以在做這個操作以前建議做資料庫全備份

66、修改資料庫名字

(1)、啟動svrmgrl,以文本方式備份控制檔案

 oracle>svrmgrl

 svrmgrl>connect internal

 svrmgrl>alter system backup controlfile to trace

(2)、編輯産生的跟蹤檔案,在udump目錄下

 改CREATE CONTROLFILE REUSE DATABASE "CTC" NORESETLOGS ARCHIVELOG

 中的REUSE為SET

 然後把create controlfile這段語句拷出

(3)、正常宕庫,後啟動到nomount下

 svrmgrl>shutdown immediate

 svrmgrl>startup nomount

(4)、執行create controlfile那段語句

(5)、打開資料庫

 svrmgrl>alter database open

 如提示用resetlogs選項則使用

  svrmgrl>alter database open resetlogs

(8)、相應修改初始化參數

67、rownum的用法

   select * from (select t.*,rownum id from dept t)

   where id between 1 and 20

68、oracle的内部參數

   SELECT a.ksppinm NAME,

       b.ksppstdf default_val,

       a.ksppdesc DESCRIPTION

  FROM x$ksppi a,

       x$ksppcv b

 WHERE a.indx=b.indx

   AND substr(a.ksppinm,1,1)='_'

 ORDER BY a.ksppinm

69、9i安裝時報areasqueries錯誤的解決辦法

    包括IAS 和 IDS

    把安裝源檔案目錄全部改為英文字母或數字

    注意:不能是中文的路徑

70、我如何知道一個表空間還有多少可以用

(1)、

SELECT upper(f.tablespace_name) 表空間名,

       d.Tot_grootte_Mb "表空間大小(M)",

       d.Tot_grootte_Mb - f.total_bytes "已使用空間(M)",

       round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) "使用比",

       f.total_bytes "空閑空間(M)",

       f.max_bytes "最大塊(M)"

 FROM     

    (SELECT tablespace_name,

            round(SUM(bytes)/(1024*1024),2) total_bytes,

            round(MAX(bytes)/(1024*1024),2) max_bytes

      FROM sys.dba_free_space

     GROUP BY tablespace_name) f,

    (SELECT dd.tablespace_name, round(SUM(dd.bytes)/(1024*1024),2) Tot_grootte_Mb

      FROM   sys.dba_data_files dd

      GROUP BY dd.tablespace_name) d

WHERE d.tablespace_name = f.tablespace_name   

ORDER BY 4 DESC

(2)、select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space

group by tablespace_name

71、creck pl/sql developer 的方法

(1)、安裝pl/sql developer

(2)、用UltraEdit将程式PLSQLDev.exe打開

(3)、将UltraEdit設定為16進制模式

(4)、查找串:BA 1E 00 00 00 2B D0

   修改:2B D0  為:4A 90

(5)、存盤退出

(6)、運作PLSQLDev.exe,如果提示你還有29天的時間可用,那就恭喜你了!

72、使索引無效

ALTER INDEX idx UNUSABLE;

ALTER INDEX idx_acctno DISABLE;(only to a function based index)

73、在SQLPLUS中給指定使用者進行 set autotrace on/off

    以SCOTT使用者為例:

    SQL>CONNECT scott/tiger

    connected.

    SQL>@$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL

    Table created.

    SQL>CONNECT / AS SYSDBA

    connected.

    SQL>@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL

    drop role plustrace;

    Role dropped.

    create role plustrace;

    Role created.

    .

    grant plustrace to dba with admin option;

    Grant succeeded.

    SQL>GRANT PLUSTRACE TO SCOTT;

    Grant succeeded.

    SQL>CONNECT SCOTT/TIGER

    connected.       

    SQL>set autotrace on

    SQL>

74、關于限制的四種狀态

Disabled novalidate:當限制使不能時,限制的規則不能強制在列

       (包含在限制中)的資料之上。但限制的定義儲存在資料字典中。

       在執行資料倉庫卷起(rollup)或裝載且要加快裝載過程時該方式

       是有用的。

Enabled novalidate:是能無效,該狀态的表可以包含非法

      的資料,但不可能加入新的非法資料。

Enabled validate:使能有效,一個使能的限制是強制的,表的資料檢查

      有效

75、在SQLPLUS中調用存儲過程

SET SERVEROUTPUT ON

declare

 out_param varchar2(100);

begin

 your_proc(1,out_param);

 dbms_output.put_line(out_param);

end;

/

SET SERVEROUTPUT OFF

75、生成系統表和存儲過程的三個檔案。

     cat*.sql

     dbms*.sql

     utl*.sql

76、JOB中日期的使用

每個月1号:

last_day(sysdate)+1

每個季度的第一天:

to_date(decode(to_char(sysdate,'q'),'1',to_char(sysdate,'yyyy')||'0101',

    '2',to_char(sysdate,'yyyy')||'0401','3',to_char(sysdate,'yyyy')||'0701',

    '4',to_char(sysdate,'yyyy')||'1001'),'yyyymmdd')

每天:

sysdate+1

每個星期幾:

decode(to_char(sysdate,'w'),'1',sysdate+7,

to_char(sysdate,'w'),'2',sysdate+6,to_char(sysdate,'w'),'3',sysdate+5,

to_char(sysdate,'w'),'4',sysdate+4,to_char(sysdate,'w'),'5',sysdate+3,

to_char(sysdate,'w'),'6',sysdate+2,to_char(sysdate,'w'),'7',sysdate+1)

每個星期x下午三點:interval(21, 'next_day(trunc(sysdate),x+1)+15/24');

每個季度的第一個星期x:

interval(21, 'next_day(trunc(sysdate,''Q''),3),5)');

77、使用execute immediate 的問題

8i以上才支援execute immediate

8.05隻能用dbms_sql 

最好使用execute immediate

78、ORACLE9i中删除表空間中資料檔案的方法

drop tablespace tbsname including contents

79、找出串中的數字

SELECT TRANSLATE('2KRW229',

   '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')

   "Translate example"

     FROM DUAL

/

2229

--全是數字的:

select * from 你的表 where translate(你的列,'0123456789',' ')='';

select * from 你的表 where trim(ltrim(rtrim(replace(col_name,'0123456789',' ')))) is null

80、分析表

analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;

81、表空間管理和使用者管理

--檢視表空間和資料檔案

select file_name,tablespace_name,autoextensible from dba_data_files;

--資料表空間

CREATE TABLESPACE USER_DATA

    LOGGING

    DATAFILE 'D:/ORACLE/ORADATA/ORCL/test.DBF' SIZE 50m REUSE ,

             'c:/USERS01112.DBF' SIZE 50m REUSE 

    AUTOEXTEND

    ON NEXT  1280K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL

--臨時表空間

CREATE TEMPORARY

    TABLESPACE  USER_DATA_TEMP TEMPFILE 'D:/TEMP0111.DBF'

    SIZE 50M REUSE AUTOEXTEND

    ON NEXT  1024K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL UNIFORM

    SIZE 1024K

--增加資料檔案

ALTER TABLESPACE  USER_DATA

  ADD DATAFILE 'c:/USERS01113.DBF' SIZE 50M;

ALTER TABLESPACE USER_DATA

  ADD DATAFILE 'c:/USERS01114.DBF'  SIZE 50M

  AUTOEXTEND ON

;

--删除表空間

DROP TABLESPACE USER_DATA INCLUDING CONTENTS;

--修改資料檔案大小

 ALTER DATABASE

 DATAFILE 'c:/USERS01113.DBF' RESIZE 40M;

--建立使用者、賦予權限

CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY  USER_DATA

    DEFAULT

    TABLESPACE USER_DATA  TEMPORARY

    TABLESPACE USER_DATA  ACCOUNT UNLOCK;

GRANT CONNECT TO USER_DATA;

GRANT RESOURCE TO USER_DATA;

--把表移到另一個表空間

ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;

--建立索引

CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME);

CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;

--重建立立索引

ALTER INDEX INDEXNAME REBUILD TABLESPACE  TABLESPACE;

--建立表

CREAE TABLE TABLENAME

(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)

(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);

--建表的索引存儲配置設定

CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX  STORAGE(INITIAL 100K NEXT 100K)

TABLESPACE indx,

last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,

dept_id NUMBER(7))

TABLESPACE data;

--建立主鍵

ALTER TABLE TABLENAME

ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)

--使限制無效

ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT CONSTRANAME;

ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT CONSTRANAME;

--删除限制

ALTER TABLE TABLENAME  DROP CONSTRAINT constraintname;

DROP TABLE TABLENAEM CASCADE CONSTRAINTS;(删除表後将所用的外鍵删除)

--給表增加列

ALTER TABLE TABLENAME

ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;

--給列增加預設值

ALTER TABLE TABLENAME

MODIFY COLUMNNAME  DEFAULT(VALUE) NOT NULL;

--給表增加外鍵

 ALTER TABLE  TABLENAME

 ADD CONSTRAINT  CONSTRAINTNAME

 FOREIGN KEY(COLUMN) REFERENCES TABLE1NAME(COLUMN1);