Oracle數(shù)據(jù)庫常見問題答疑一
2024-08-29 13:42:42
供稿:網(wǎng)友
Oracle數(shù)據(jù)庫以其強大的功能和穩(wěn)定性而著稱,但同時,在開發(fā)和治理方面也存在很多困難,筆者在此總結(jié)了一些Oracle數(shù)據(jù)庫開發(fā)和治理的常見問題,希望能對大家有所幫助。
問:假如發(fā)現(xiàn)表中有壞塊,如何檢索其它未壞的數(shù)據(jù)?
答:首先需要找到壞塊的ID(可以運行dbverify實現(xiàn)),假設(shè)為1234。運行下面的查詢查找段名:
select segment_name, segment_type, block_id, blocks
from dba_extents
where (1234 between block_id and (block_id + blocks - 1));
一旦找到壞段名稱,若段是一個表,則最好建立一個臨時表,存放好的數(shù)據(jù)。若段是索引,則刪除它,再重建。
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)
問:如請問如何關(guān)閉FORM調(diào)用REPORT時的小窗口?
答:在利用Oracle數(shù)據(jù)庫的Develop 2000設(shè)計開發(fā)界面的過程中,當FORM調(diào)用REPORT時,會顯示一個背景窗口REPORT BACKGROUD ENGINE,等待FORM對REPORT的調(diào)用,當FORM調(diào)用其它REPORT時,也使用這個后臺服務(wù)器,不論調(diào)用多少個REPORT,這個后臺服務(wù)器存在且只有一個。但當FORM與REPORT全部退出后,該窗口仍處于等待狀態(tài),不會關(guān)閉,這時,我們需要手工將其關(guān)閉。
我們可以使用以下參數(shù)在FORM調(diào)用REPORT時不顯示這個小窗口:
Add_Parameter( pl_id, 'ORACLE_SHUTDOWN',TEXT_Parameter, 'Yes' );
需要注重的是,該參數(shù)必須加在所有參數(shù)的前面,即它必須為第一個參數(shù)。
問:請問如何根據(jù)查詢條件在REPORT中動態(tài)顯示記錄?
答:1. 在REPORT的“數(shù)據(jù)模型”下面的“用戶參數(shù)”中,創(chuàng)建用戶自定義參數(shù)W_CLAUSE,W_CLAUSE為從FORM傳遞過來的查詢條件,數(shù)據(jù)類型為字符型,缺省值為NULL。
2. 修改查詢Q_1,將SQL查詢語句修改為select from dept &&w_clause。
3. 在運行報表時,報表會自動將符合&&w_clause的查詢條件記錄顯示出來。
假如從FORM傳遞過來的w_clause為where dept=1,本報表的SQL查詢自動轉(zhuǎn)換為select from dept where dept=1,并在報表運行結(jié)果中顯示符合該查詢條件的記錄,假如從FORM傳遞過來的w_cluase為where to_char(年度,'YYYY.MM')='2000.03',則在報表運行結(jié)果中自動顯示2000年3月份的記錄。
問:在Oracle中,我們?nèi)绾尾榭茨潮砩系募s束?
答:我們可以使用下面語句從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也包括組成表上約束列的信息。
問:如何將數(shù)據(jù)庫從noarchivelog方式改變?yōu)閍rchivelog方式?
答:首先打開Init.ora文件,確保存檔日志目標指向一有效目錄。
然后啟動Server Manager
svrmgrl〉 shutdown immediate
svrmgrl〉 startup mount
svrmgrl〉 alter database archivelog;
svrmgrl〉 alter database open;
svrmgrl〉 archive log list;
在init.ora中設(shè)置參數(shù)archive_log_start=TRUE,它設(shè)置存檔日志為自動啟動。在Oracle 8i中支持多個存檔日志的目標,因此參數(shù)修改為log_archive_dest[n],其中n為1到5。
問:在Oracle數(shù)據(jù)庫中,我們?nèi)绾卧黾颖砜臻g的大小?
答: 在開發(fā)Oracle數(shù)據(jù)庫中,我們有兩種方法增加表空間的大小:
1.增加額外的數(shù)據(jù)文件到表空間中
例如:alter tablespace users add datafile '/u01/oradata/orcl/users02.dbf' size 25m;
2.修改表空間當前的數(shù)據(jù)文件
例如:alter database datafile
'/u01/oradata/orcl/users01.dbf' resize 50M;
問:請問如何在REPORT中設(shè)置動態(tài)顯示域?
答:在REPORT中設(shè)置動態(tài)顯示域的方法如下:
1. 在REPORT的“數(shù)據(jù)模型”下面的“用戶參數(shù)”中,創(chuàng)建用戶自定義參數(shù),如RQ,RQ是從FORM傳遞過來的顯示日期,數(shù)據(jù)類型為字符型。
2. 在布局模型中,創(chuàng)建一個顯示域F_1,在屬性選項板中修改該顯示域的源為用戶自定義參數(shù)RQ,并且設(shè)為“不可見的”。
3. 在動態(tài)預覽中,創(chuàng)建一個文本域D_1,調(diào)整該文本域的位置和寬度,在該域的內(nèi)容中輸入&&F_1,則該域會動態(tài)顯示用戶定義參數(shù)RQ的值。
問:有關(guān)口令
我在Solaris系統(tǒng)上運行 Oracle8i 8.1.7企業(yè)版。我創(chuàng)建了兩個數(shù)據(jù)庫:SUGAR和TestDb。將兩者的remote_login_passWordfile都設(shè)置為 “獨占(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(警告:你已經(jīng)與ORACLE斷開連接)
問:我為什么不能以SYSDBA身份連接到TestDb?
答:通常Oracle中的SYS口令與INTERNAL口令是同步的,SYS口令存儲于口令文件中。在上述情況下你建立了包含有一個口令的口令文件,而不是使用缺省的 “change_on_install,”這就是問題之所在。
希望下面的方法對你有所幫助。首先,建立一個口令文件,其中包含一個口令,這個口令不要與系統(tǒng)口令匹配:
$ orapwd file=orapw password=Foobar
entries=40
然后,進入服務(wù)器,啟動數(shù)據(jù)庫:
$ svrmgr
SVRMGR> connect internal
Connected.(已連接)
SVRMGR> startup
ORACLE instance started.(ORACLE 實例已啟動)
Tot
al System Global Area (系統(tǒng)全局區(qū)域大小)
193073136 bytes
Fixed Size (固定大小)
69616 bytes
Variable Size (可變大小)
141639680 bytes
Database Buffers (數(shù)據(jù)庫緩沖區(qū))
45056000 bytes
Redo Buffers (重做緩沖區(qū))
6307840 bytes
Database mounted. (數(shù)據(jù)庫已加載)
Database opened.數(shù)據(jù)庫已打開。
現(xiàn)在使用SYS用戶的口令,以SYS身份連接:
SVRMGR> connect sys/change_on_install@ora81
Connected.(已連接)
成功了。現(xiàn)在試著以SYSDBA身份連接:
SVRMGR> connect sys/change_on_install@ora81
as sysdba;
ORA-01017: invalid username/password; logon
denied(無效的用戶名/口令;登錄被拒絕)
這里出現(xiàn)了你所說的錯誤。你的SYS口令為:change_on_install,但口令文件中的口令卻是foobar。SYS用戶是專用的,以SYSDBA身份連接就像是以INTERNAL連接,你必須使用口令文件中的口令。試試這樣做:
SVRMGR— connect sys/foobar@ora81 as sysdba;
Connected.(已連接)
并不是每個人都需要使用口令文件中的口令;用戶需要使用他們自己的口令。通過授權(quán)SYSDBA給SCOTT,你就可以明白這一點:
SVRMGR> grant sysdba to scott;
Statement PRocessed.(已處理)
這個命令將SCOTT以SCOTT的憑證加入到口令文件中。假如你改變了SCOTT的口令,口令文件也會自動同步改變。現(xiàn)在,你可以試試以SYSDBA身份連接SCOTT了:
SVRMGR> connect scott/tiger@ora81 as sysdba;
Connected.(已連接)
一切正常。現(xiàn)在可以使用ALTER USER 命令來改變SYS用戶的口令。
SVRMGR> alter user sys identified by
change_on_install;
Statement processed.(已成功更改)
SVRMGR≫ connect sys/change_on_install@ora81
as sysdba;
Connected.(已連接)
你還可以用change_on_install,因為改變SYS用戶口令將同時改變口令文件中的口令。當你建立了口令文件后,Oracle數(shù)據(jù)庫在其中放入兩個賬號:SYS和INTERNAL,并將你在命令行中提供的口令作為這兩個賬戶的口令。當你改變數(shù)據(jù)庫中的SYS用戶口令時,數(shù)據(jù)庫將沖掉口令文件中的SYS和INTERNAL口令。下面操作將顯示口令foobar已經(jīng)是無效的了:
SVRMGR> connect sys/foobar@ora81 as sysdba;
ORA-01017: invalid username/password; logon
denied(無效的用戶名/口令,登錄被拒絕)