Oracle資料庫以其強大的功能和穩定性而著稱,但同時,在開發和管理方面也存在很多困難,筆者在此總結了一些Oracle資料庫開發和管理的常見問題,希望能對大家有所幫助。
問:如果發現表中有壞塊,如何檢索其它未壞的資料?
答:首先需要找到壞塊的ID(可以運作dbverify實作),假設為1234。運作下面的查詢查找段名:
select segment_name, segment_type, block_id, blocks
from dba_extents
where (1234 between block_id and (block_id + blocks - 1));
一旦找到壞段名稱,若段是一個表,則最好建立一個臨時表,存放好的資料。若段是索引,則删除它,再重建。
create table good_table
as
select from bad_table where rowid not in
( select /+index(bad_table, any_index)/ rowid
from bad_table where substr( rowid, 1, 8 ) = 1234)
問:如請問如何關閉FORM調用REPORT時的小視窗?
答:在利用Oracle資料庫的Develop 2000設計開發界面的過程中,當FORM調用REPORT時,會顯示一個背景視窗REPORT BACKGROUD ENGINE,等待FORM對REPORT的調用,當FORM調用其它REPORT時,也使用這個背景伺服器,不論調用多少個REPORT,這個背景伺服器存在且隻有一個。但當FORM與REPORT全部退出後,該視窗仍處于等待狀态,不會關閉,這時,我們需要手工将其關閉。
我們可以使用以下參數在FORM調用REPORT時不顯示這個小視窗:
Add_Parameter( pl_id, 'ORACLE_SHUTDOWN',TEXT_Parameter, 'Yes' );
需要注意的是,該參數必須加在所有參數的前面,即它必須為第一個參數。
問:請問如何根據查詢條件在REPORT中動态顯示記錄?
答:1. 在REPORT的“資料模型”下面的“使用者參數”中,建立使用者自定義參數W_CLAUSE,W_CLAUSE為從FORM傳遞過來的查詢條件,資料類型為字元型,預設值為NULL。
2. 修改查詢Q_1,将SQL查詢語句修改為select from dept &&w_clause。
3. 在運作報表時,報表會自動将符合&&w_clause的查詢條件記錄顯示出來。
如果從FORM傳遞過來的w_clause為where dept=1,本報表的SQL查詢自動轉換為select from dept where dept=1,并在報表運作結果中顯示符合該查詢條件的記錄,如果從FORM傳遞過來的w_cluase為where to_char(年度,'YYYY.MM')='2000.03',則在報表運作結果中自動顯示2000年3月份的記錄。
問:在Oracle中,我們如何檢視某表上的限制?
答:我們可以使用下面語句從all_constraints視圖中檢視某表上的限制:
SELECT constraint_name, table_name, r_owner, r_constraint_name
FROM all_constraints
WHERE table_name = 'table_name' and owner = 'owner_name';
另一個視圖ALL_CONS_COLUMNS也包括組成表上限制列的資訊。
問:如何将資料庫從noarchivelog方式改變為archivelog方式?
答:首先打開Init.ora檔案,确儲存檔日志目标指向一有效目錄。
然後啟動Server Manager
svrmgrl〉 shutdown immediate
svrmgrl〉 startup mount
svrmgrl〉 alter database archivelog;
svrmgrl〉 alter database open;
svrmgrl〉 archive log list;
在init.ora中設定參數archive_log_start=TRUE,它設定存檔日志為自動啟動。在Oracle 8i中支援多個存檔日志的目标,是以參數修改為log_archive_dest[n],其中n為1到5。
問:在Oracle資料庫中,我們如何增加表空間的大小?
答: 在開發Oracle資料庫中,我們有兩種方法增加表空間的大小:
1.增加額外的資料檔案到表空間中
例如:alter tablespace users add datafile '/u01/oradata/orcl/users02.dbf' size 25m;
2.修改表空間目前的資料檔案
例如:alter database datafile
'/u01/oradata/orcl/users01.dbf' resize 50M;
問:請問如何在REPORT中設定動态顯示域?
答:在REPORT中設定動态顯示域的方法如下:
1. 在REPORT的“資料模型”下面的“使用者參數”中,建立使用者自定義參數,如RQ,RQ是從FORM傳遞過來的顯示日期,資料類型為字元型。
2. 在布局模型中,建立一個顯示域F_1,在屬性選項闆中修改該顯示域的源為使用者自定義參數RQ,并且設為“不可見的”。
3. 在動态預覽中,建立一個文本域D_1,調整該文本域的位置和寬度,在該域的内容中輸入&&F_1,則該域會動态顯示使用者定義參數RQ的值。
問:有關密碼
我在Solaris系統上運作 Oracle8i 8.1.7企業版。我建立了兩個資料庫:SUGAR和TestDb。将兩者的remote_login_passwordfile都設定為 “獨占(exclusive)”。我試圖以SYSDBA身份連接配接到TestDb,但未能成功。下面是我的做法:
$sqlplus /nolog
SQL> conn sys/change_on_install@testdb
Connected.(已連接配接)
SQL> select * from v$pwfile_users;
username sysdb sysop
-----------------------------------------
internal true true
sys true true
SQL> conn sys/change_on_install@testdb as
sysdba
ERROR(錯誤)
ORA-01017: invalid username/password; logon
denied(無效的使用者名/密碼,登入被拒絕)
Warning: You are on longer connected to
ORACLE(警告:你已經與ORACLE斷開連接配接)
我為什麼不能以SYSDBA身份連接配接到TestDb?
答:通常Oracle中的SYS密碼與INTERNAL密碼是同步的,SYS密碼存儲于密碼檔案中。在上述情況下你建立了包含有一個密碼的密碼檔案,而不是使用預設的 “change_on_install,”這就是問題之所在。
希望下面的方法對你有所幫助。首先,建立一個密碼檔案,其中包含一個密碼,這個密碼不要與系統密碼比對:
$ orapwd file=orapw password=foobar
entries=40
然後,進入伺服器,啟動資料庫:
$ svrmgr
SVRMGR> connect internal
Connected.(已連接配接)
SVRMGR> startup
ORACLE instance started.(ORACLE 執行個體已啟動)
Total System Global Area (系統全局區域大小)
193073136 bytes
Fixed Size (固定大小)
69616 bytes
Variable Size (可變大小)
141639680 bytes
Database Buffers (資料庫緩沖區)
45056000 bytes
Redo Buffers (重做緩沖區)
6307840 bytes
Database mounted. (資料庫已加載)
Database opened.資料庫已打開。
現在使用SYS使用者的密碼,以SYS身份連接配接:
SVRMGR> connect sys/change_on_install@ora81
成功了。現在試着以SYSDBA身份連接配接:
as sysdba;
denied(無效的使用者名/密碼;登入被拒絕)
這裡出現了你所說的錯誤。你的SYS密碼為:change_on_install,但密碼檔案中的密碼卻是foobar。SYS使用者是專用的,以SYSDBA身份連接配接就像是以INTERNAL連接配接,你必須使用密碼檔案中的密碼。試試這樣做:
SVRMGR— connect sys/foobar@ora81 as sysdba;
并不是每個人都需要使用密碼檔案中的密碼;使用者需要使用他們自己的密碼。通過授權SYSDBA給SCOTT,你就可以明白這一點:
SVRMGR> grant sysdba to scott;
Statement processed.(已處理)
這個指令将SCOTT以SCOTT的憑證加入到密碼檔案中。如果你改變了SCOTT的密碼,密碼檔案也會自動同步改變。現在,你可以試試以SYSDBA身份連接配接SCOTT了:
SVRMGR> connect scott/tiger@ora81 as sysdba;
一切正常。現在可以使用ALTER USER 指令來改變SYS使用者的密碼。
SVRMGR> alter user sys identified by
change_on_install;
Statement processed.(已成功更改)
SVRMGR≫ connect sys/change_on_install@ora81
你還可以用change_on_install,因為改變SYS使用者密碼将同時改變密碼檔案中的密碼。當你建立了密碼檔案後,Oracle資料庫在其中放入兩個賬号:SYS和INTERNAL,并将你在指令行中提供的密碼作為這兩個賬戶的密碼。當你改變資料庫中的SYS使用者密碼時,資料庫将沖掉密碼檔案中的SYS和INTERNAL密碼。下面操作将顯示密碼foobar已經是無效的了:
SVRMGR> connect sys/foobar@ora81 as sysdba;
問:利用QUERY選項輸出資料
我知道在Oracle8i中,可以使用QUERY有選擇地輸出表資料。我想用EXP指令來實作,但沒有成功。下面是我所寫的指令,以及得到的錯誤資訊:
exp ddd/ddd file=/dbf/u11/customer.dmp
tables=AASC.AST_CUSTOMER_KEEP
query=\'where CUA_TRANS_DTS \<
add_months\(sysdate, -6\)\'
table_export[2]: CUA_TRANS_DTS: not found.(沒有找到)
答:作業系統不同,用來指定QUERY=參數的方法也不同。WHERE 語句裡面往往有很多特殊的字元,如=.>.<和空格等等。而UNIX和Windows作業系統中的外殼指令提示是不歡迎這些字元的,這些字元将被忽略。你應該根據不同的作業系統采用不用的方法。我一般使用帶有QUERY選項的參數檔案(PARFILE),利用PARFILE,可以不考慮作業系統平台而使用完全相同的方法。
下面給出一個例子。我用select * from all_objects建立了一個表T,我希望輸出所有object_id 小于5000的行。在Windows中,必須這樣做:
C:\exp>exp userid=tkyte/tkyte tables=t
query="""where object_id < 5000"""
注意:在windows中,需要在WHERE語句的兩端使用三個雙引号。在UNIX中,必須這樣做:
$ exp userid=/ tables=t query=\"where
object_id \< 5000\"
exp userid=/ tables=t parfile=exp.par
如果使用包含query="where object_id < 5000"的PARFILE檔案,我可以在兩個系統中使用相同的一個指令:
在兩種作業系統中,完全相同。這相對于在不同的平台中使用不同的QUERY字元串容易多了。
問:DBMS_RANDOM
您能否告訴我寫一個能産生大于0小于1的随機數的随機數産生器的最好方法?
答:Oracle8 8.0版介紹了DBMS_RANDOM包,Oracle8i 8.1.6版介紹了DBMS_RANDOM包的新功能,但Oracle8i 文檔中沒有詳細全面介紹其功能。幸運的是:有一個新的DBMS_RANDOM包函數能夠傳回0-1之間的随機數。這個新函數是:
FUNCTION value RETURN NUMBER;
FUNCTION value (low IN NUMBER, high IN
NUMBER) RETURN NUMBER;
FUNCTION normal RETURN NUMBER;
FUNCTION string (opt char, len NUMBER)
RETURN VARCHAR2;
VALUE函數的第一種形式傳回一個大于或等于0且小于1的随機數;第二種形式傳回一個大于或等于LOW,小于HIGH的随機數。下面是其用法的一個示例:
SQL> select dbms_random.value,
dbms_random.value(55,100)
2 from dual;
VALUE DBMS_RANDOM.VALUE(55,100)
--------------- -----------------------------
.782821936 79.6367038
NORMAL函數傳回服從正态分布的一組數。此正态分布标準偏差為1,期望值為0。這個函數傳回的數值中有68%是介于-1與+1之間,95%介于-2與+2之間,99%介于-3與+3之間。事實上,這就是你在清單1中所看到的。
最後,是STRING函數。它傳回一個長度達60個字元的随機字元串。參數OPT可以是清單2顯示的值中的任何一個單個字元。
關于這些函數及DBMS_RANDOM包的檔案都包含在SQLPlus中:
select text
from all_source
where name = 'DBMS_RANDOM'
and type = 'PACKAGE' order by line;
問:連接配接次序與謂詞求值
在下面的查詢中,WHERE 語句的哪一部分先執行?
Select field names from emp, dept
where emp.dept_num = dept.num and
emp.name Like 'S%' and dept.name='IT';
答:執行次序随已有的索引、統計、和session/init.ora參數的不同而變化。
假定已有一個建立在DEPT(name)和EMP(dept_num)上的索引。假定優化器認為DEPT是唯一的,它可能按下面的順序進行操作:
利用建立在DEPT(name)上的索引查找dept列
利用建立在EMP(dept_num)上的索引查找比對的emp列(即連接配接emp.dept_num = dept.num)
依據建立在emp.ename like 'S%'進行過濾
現在,我們假定沒有建立在EMP(dept_num)上的索引,也沒有建立在DEPT(name)上的索引,而存在建立在EMP(name)和DEPT(num)上的索引。優化器可能按下面的次序進行操作:
利用建立在EMP(name)上的索引找到帶有S的EMPS
利用建立在DEPT(num)上的索引找到比對項
根據dept.name = 'IT'過濾結果
謂詞求值的次序是不确定的,可以随時間的改變而改變,并由優化器決定。不要假定任何事情會按一定的次序發生。如果你那麼做,随着時間的推移,你的應用程式可能會出現一些看起來非常奇怪的錯誤。看以下的例子:建立一個表,輸入一些資料。當X='a’時,第二列的資料“Y”是一個數值,當X='b’時,“Y”不是數字。
SQL> create table t ( x varchar2(1), y varchar2(1) );
Table created.
SQL> insert into t values ( 'a', '1' );
1 row created.
SQL> insert into t values ( 'b', 'x' );
現在根據這個表運作一個查詢:查找滿足x='a',y=1的行。
SQL> select * from t where x = 'a' and
y = 1;
ERROR:
ORA-01722: invalid number
no rows selected(錯誤,無效的數字,沒有選擇任何行)
呦,沒有成功。在這種情況下,資料庫首先執行Y=1,當找到Y='X'的行後,很顯然,它不能将'X'轉換為一個數字,是以失敗了。而下面的程式将給出不同的結果:
SQL> analyze table t compute statistics;
Table analyzed.(表已經分析過)
X Y
- -
a 1
使用不同的優化器模式,成功了!為什麼?優化器說:“嘿,檢查x= 'a'要比檢查y=1來得快,因為在y=1中有一個将y從字元變為數字的轉換。是以,我先檢查x= 'a',然後再檢查y=1。”
這個例子說明謂詞執行的次序可能是不确定的,你不能指望有一種特定的執行次序。也就是說,當你依靠一個隐含的轉換時,必須非常謹慎。
問:顯示SGA--fixed size(固定大小)與variable size(可變大小)
當在svrmgr提示符下運作 “show SGA”時,fixed size和variable size是什麼意思?
答:fixed size就是SGA中固定元件(它在編譯oracle 資料庫本身時就固定于其中)的大小。它是固定大小的記憶體,用來指向SGA的其它部分。SGA這一部分的大小是不能改變的。
variable size指配置設定的記憶體塊大小可變。SGA的可變塊,分為共享池、大池、JAVA池、遊标區和其他結構。
__________________________________________________________________________________________________________________
Oracle常見錯誤碼參考:
ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME
産生原因:上述ORACLE錯誤為復原段表空間不足引起的,這也是ORACLE資料管理者最常見的ORACLE錯誤資訊。當使用者在做一個非常龐大的資料操作導緻現有復原段的不足,使可配置設定用的復原段表空間已滿,無法再進行配置設定,就會出現上述的錯誤。
ORA-01652:unable to extend temp segment by num in tablespace name
産生原因:ORACLE臨時段表空間不足,因為ORACLE總是盡量配置設定連續空間,一但沒有足夠的可配置設定空間或者配置設定不連續就會出現上述的現象。
ORA-01628:max # of extents num reached for rollback segment num
産生原因:這種錯誤通常為一個復原段和一個表空間已經達到MAXEXTENTS參數設定的極限。要注意的是這個MAXEXTENTS不是該復原段或表空間的硬體極限,硬體極限取決于資料庫建立時在init.ora檔案中指定的DB_BLOCK_SIZE參數的值。
ORA-01688:unable to extend table name.name partition NAME by NUM in tablespace NAME
産生原因:指定的tablespace空間已經被占用滿,無法擴充。
本文轉自斯克迪亞部落格園部落格,原文連結:http://www.cnblogs.com/sgsoft/archive/2004/10/12/51128.html,如需轉載請自行聯系原作者