很詳細(xì)、實(shí)用的資料,日常運(yùn)維可用到。歡迎收藏。 1. Oracle 數(shù)據(jù)庫(kù)啟動(dòng)與關(guān)閉 1.1 打開和關(guān)閉數(shù)據(jù)庫(kù) (手工) 1.1.1 sqlplus 連接 #su - oracle #sqlplus /nolog 1.1.2 打開數(shù)據(jù)庫(kù) sql> connect sys/oracle as sysdba; sql> startup [nomount|mount] 等待十幾秒左右,當(dāng)看到 oracle instances started, database mounted, database opened 的時(shí)候,oracle 數(shù)據(jù)庫(kù)打開成功 備注:打開數(shù)據(jù)庫(kù) startup 可帶三個(gè)參數(shù),分別是 SQL > startup nomount 僅啟動(dòng) instances SQL > startup mount 啟動(dòng) instances,連上(mount)數(shù)據(jù)庫(kù) SQL > startup normal 啟動(dòng) instances,連上(mount)數(shù)據(jù)庫(kù)(推薦) 打開(open)數(shù)據(jù)庫(kù) startup 缺省參數(shù)是 normal 1.1.3 啟動(dòng) oracle listener #su - oracle #lsnrctl start 如果出錯(cuò)檢查環(huán)境變量是否設(shè)好,及 lsnrctl 文件的內(nèi)容和執(zhí)行屬性。 1.1.4 關(guān)閉 oracle listener #su - oracle #lsnrctl stop 1.1.5 關(guān)閉數(shù)據(jù)庫(kù) sql> connect sys/oracle as sysdba; sql> shutdown 關(guān)閉數(shù)據(jù)庫(kù)(推薦) 等待幾秒左右,當(dāng)看到 database closed database dismounted oracle instances shut down 的時(shí)候,oracle 數(shù)據(jù)庫(kù)關(guān)閉成功 備注:關(guān)閉數(shù)據(jù)庫(kù) shutdown可帶三個(gè)參數(shù),分別是 shutdown 缺省參數(shù)是 normal 2. 數(shù)據(jù)庫(kù)備份 2.1 冷備份 關(guān)閉數(shù)據(jù)庫(kù)時(shí)作的備份稱為冷備份。 關(guān)閉數(shù)據(jù)庫(kù),將所有和本實(shí)例有關(guān)的文件,包括datafile,controlfile,redolog,archived redolog,initora.ora 等全部備份?;謴?fù)時(shí)只要將這些文件放回從前的目錄,startup數(shù)據(jù)庫(kù)即可。 數(shù)據(jù)庫(kù)處于歸檔非歸檔狀態(tài)均可。 2.2 用 exp、imp 命令做邏輯備份 EXP: 有三種主要的方式(完全、用戶、表) 1、完全: exp system/manager buffer=64000 file=/backup/full.dmp full=y 如果要執(zhí)行完全導(dǎo)出,必須具有角色 EXP_FULL_DATABASE 。 2、用戶模式: exp system/manager buffer=64000 file=/backup/bill.dmp owner=bill 這樣用戶 bill 的所有對(duì)象被輸出到文件中。 3、表模式: exp system/manager buffer=64000 file=/backup/area.dmp owner=bill tables=area 這樣用戶 bill 的表 area 就被導(dǎo)出到文件中。 需要注意的參數(shù)是 Inctype,這個(gè)參數(shù)可以取一下三個(gè)值: Complete(全備份):把數(shù)據(jù)庫(kù)中所有數(shù)據(jù)對(duì)象導(dǎo)出到 dump 文件中,只有具有 Exp_full_database 的用戶有使用這個(gè)參數(shù)的權(quán)限。 Incremental(增量備份):把數(shù)據(jù)庫(kù)中所有上次備份后修改的表備份出來(lái)。 Cumulative(累計(jì)備份):把數(shù)據(jù)庫(kù)中所有全備份或者累計(jì)備份以后修改的表備份出來(lái)。 IMP: 具有三種模式(完全、用戶、表) 1、完全: imp system/manager buffer=64000 file=/backup/full.dmp full=y 如果要執(zhí)行完全導(dǎo)入,必須具有角色 IMP_FULL_DATABASE 。 2、用戶模式: imp system/manager buffer=64000 file=/backup/area.dmp fromuser=bill touser=billbak 文件中用戶 bill 的所有對(duì)象被導(dǎo)入到用戶billbakK 中。必須指定 fromuser、touser 參數(shù)。 3、表模式: imp system/manager buffer=64000 file=/backup/area.dmp fromuser=bill touser=billbak tables=area 文件中用戶 bill 的表 area 就被導(dǎo)入到用戶 billbak 中。 2.3 用 tar 命令做物理備份 1、#su - oracle 2、% tar cvf /dev/rmt0 . 把 oracle 路徑下所有文件備份到磁帶機(jī)上 3、% tar xvf /dev/rmt0 把備份磁帶上所有文件恢復(fù)進(jìn) oracle 當(dāng)前路徑 4、% tar tvf /dev/rmt/0 查看磁帶上有些什么文件 2.4 備份控制文件 控制文件是 Oracle 數(shù)據(jù)庫(kù)中非常重要的文件。它記錄著 oracle 數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)信息,比如數(shù)據(jù)文件,日值文件的數(shù)量和位置等。在數(shù)據(jù)庫(kù)啟動(dòng)過程中,需要讀取控制文件。如果控制文件損壞或丟失,數(shù)據(jù)庫(kù)就無(wú)法啟動(dòng)。因此,做好控制文件的備份十分重要。一般的數(shù)據(jù)庫(kù)配置都會(huì)有多個(gè)控制文件。這些控制文件是完全相同的,分別存放在不同的位置(最好在不同的磁盤上),他們之間互為備份。數(shù)據(jù)庫(kù)啟動(dòng)過程中,必須保證所有控制文件都是一致的,否則數(shù)據(jù)庫(kù)不能啟動(dòng)。在 oracle 數(shù)據(jù)庫(kù)的參數(shù)文件(initSid.ora)中指定控制文件的位置。如果部分控制文件損壞,可以在參數(shù)文件中去掉相應(yīng)的控制文件,即可啟動(dòng)數(shù)據(jù)庫(kù)。 每次數(shù)據(jù)庫(kù)物理結(jié)構(gòu)發(fā)生改變時(shí),必須及時(shí)備份控制文件。 $sqlplus SQL>connect internal SQL>alter database backup controlfile to /…/test.ctl ; 也可以把控制文件備份成腳本,在必要的時(shí)候重建控制文件 SQL>alter database backup controlfile to trace; 2.5 聯(lián)機(jī)全備份 日志備份 2.5.1 設(shè)置 ORACLE 數(shù)據(jù)庫(kù)有兩種運(yùn)行方式:一是歸檔方式(ARCHIVELOG),歸檔方式的目的是當(dāng)數(shù)據(jù)庫(kù)發(fā)生故障時(shí)最大限度恢復(fù)所有已提交的事物;二是不歸檔方式(NOARCHIVELOG),恢復(fù)數(shù)據(jù)庫(kù)到最近的回收點(diǎn)。這兩種方式將對(duì)備份方法產(chǎn)生較大的影響。 1.改變不歸檔方式為為歸檔方式 2.關(guān)閉數(shù)據(jù)庫(kù),備份已有的數(shù)據(jù) 3.改變數(shù)據(jù)庫(kù)的運(yùn)行方式是對(duì)數(shù)據(jù)庫(kù)的重要改動(dòng),所以要對(duì)數(shù)據(jù)庫(kù)做備份,對(duì)可能出現(xiàn)的問題作出保護(hù)。 4.啟動(dòng) Instance ,Mount 數(shù)據(jù)庫(kù)但不打開數(shù)據(jù)庫(kù),來(lái)改變歸檔方式 #sqlplus sql>connect internal sql>startup mount sql>alter database archivelog; 5.使能自動(dòng)存檔 在初始化文件 init*.ora(一般放 ORACLE 根目錄的下層目錄 dbs 下)加參數(shù): log_archive_start=true 6.指定存檔的重做登錄文件名和存放的位置 同樣是在初始化文件 init*.ora 中加入下面的參數(shù): log_archive_format=%S.arc log_archive_dest=/arch12/arch (arch12 是日志文件存放的目錄) 7.關(guān)閉數(shù)據(jù)庫(kù),重新啟動(dòng)數(shù)據(jù)庫(kù),歸檔方式轉(zhuǎn)換完成。 8.可用 archive log list 查看狀態(tài),去除歸檔日志功能的命令為 alter database noarchivelog。 2.5.2 步驟 聯(lián)機(jī)全備份: 數(shù)據(jù)庫(kù)處于 open 狀態(tài),依次對(duì)各個(gè)表空間備份 sqlplus '/ as sysdba' SQL>alter tablespace system begin backup; 復(fù)制此 tablespace 各個(gè) datafile SQL>alter tablespace system end backup; 注意:begin backup 是對(duì) tablespace 凍結(jié)寫入,end backup 是解除凍結(jié),因此復(fù)制 datafile 的過程不宜過長(zhǎng) 備份 controlfile SQL>alter database backup controlfile to ……. ; 日志備份: sqlplus '/ as sysdba' SQL>alter system archive log stop; 移去日志目錄下的所有 archived redolog SQL>alter system archive log start; 2.5.3 恢復(fù) 數(shù)據(jù)庫(kù)處于 shutdown 狀態(tài) 2.5.3.1 磁盤全部損壞,僅保存上次聯(lián)機(jī)全備份和每天日志備份 這是最壞情況 解決硬件故障,配置系統(tǒng)軟件及環(huán)境 oracle 用戶,將全備份和日志備份轉(zhuǎn)移至相應(yīng)目錄,根據(jù) initSid.ora中 controlfile 的配置,將備份控制文件復(fù)制到響應(yīng)目錄下 sqlplus '/ as sysdba' SQL>startup mount SQL>recover database until cancel using backup controlfile; 逐個(gè)確認(rèn)待恢復(fù)的 archived redolog,待最后一個(gè)完成后,鍵入 cancel,使恢復(fù)結(jié)束 SQL>alter database open resetlogs; 注意:由于日志已經(jīng)重置,所以應(yīng)盡快做一次聯(lián)機(jī)全備份 2.5.3.2 丟失某數(shù)據(jù)文件 只要將此文件從上次聯(lián)機(jī)全備份中復(fù)制至其目錄,并將自上次聯(lián)機(jī)全備份以來(lái)所有日志備份移至歸檔目錄 sqlplus '/ as sysdba' SQL>startup mount SQL>alter database recover datafile path/file ;或者簡(jiǎn)單些 recover database; SQL>alter database open; 2.5.3.3 文件損壞或丟失,又無(wú)備份, 這種情況只能將此文件脫機(jī),將數(shù)據(jù) exp 出來(lái),重建表空間,再 imp 進(jìn)去 sqlplus '/ as sysdba' SQL>connect internal SQL>startup mount SQL>alter database datafile path/file offline; SQL>alter database open; 2.5.4 注意要點(diǎn) 無(wú)論有多少把握,恢復(fù)前先做冷備份,此為第一原則。不這樣做,便是無(wú)路可退,一旦失誤,后果十分嚴(yán)重。 1.rollback 段損壞 這是非常嚴(yán)重的問題,可在 initora.ora 中寫入_corrupted_rollback_segments=(rxx),啟動(dòng)時(shí)避開損壞的 rollback段,這只是權(quán)宜之計(jì)。如數(shù)據(jù)庫(kù)處于 archivelog,應(yīng)從上一次全備份起利用備份的日志進(jìn)行恢復(fù);如數(shù)據(jù)庫(kù)處于 noarchivelog,應(yīng)盡快將全部數(shù)據(jù) export 出來(lái),重建數(shù)據(jù)庫(kù),再 import 進(jìn)去。所有操作之前,應(yīng)做冷備份。 2.數(shù)據(jù)庫(kù)異常中止處理 通過手工 shutdown abort 操作中止數(shù)據(jù)庫(kù),不會(huì)產(chǎn)生大的問題,通常直接 startup無(wú)需使用介質(zhì)恢復(fù)命令 如果由于機(jī)器崩潰引起的中止,則情況嚴(yán)重得多,有可能要使用到上面提到的恢復(fù)方法,不過這種現(xiàn)象并不多見。一般需要顯式使用介質(zhì)恢復(fù)命令,如下: sqlplus '/ as sysdba' SQL>startup mount; SQL>recover database; SQL>alter database open; 3. 數(shù)據(jù)庫(kù)的擴(kuò)充 3.1 增加一個(gè)表空間 3.1.1 創(chuàng)建表空間 命令示例: 針對(duì)具體情況增加回滾和臨時(shí)表空間 命令示例: 回滾和臨時(shí)表空間用完后,可刪除或使它 offline SQL>drop tablespace rbs8; SQL>drop tablespaces billtemp; SQL>alter tablespace rbs offline; SQL>alter tablespace billtemp offline; 3.1.2 增加某個(gè)表空間的大小 當(dāng)一個(gè)表空間的大小不能滿足工作需要時(shí),應(yīng)該擴(kuò)充表空間。 舉例: SQL>alter tablespace system add datafile /usr/oracle/dbs/sys338.dbf size 3M; 3.2 增加 oracle 的用戶,并給用戶授權(quán) 3.2.1 增加 oracle 的用戶,并給用戶授權(quán) 舉例: SQL>create user newuser identified by userpasswd default tablespace application temporary tablespace billtemp; SQL>grant connect to newuser; SQL>grant resource to newuser; SQL>grant update on emp to newuser; 3.2.2 增加 oracle 的角色 oracle 的缺省角色有 connect、resource、dba。它是一組可以分配給其它 role 或用戶的權(quán)限總和,connect 有 8 個(gè)權(quán)限,resource 有 5 個(gè)權(quán)限,dba 有 77 個(gè)權(quán)限。給一般連接用戶賦 connect,給一般編程人員賦 connect加 resource,只有數(shù)據(jù)庫(kù)管理員才有 dba的權(quán)限。 ①創(chuàng)建一個(gè)角色 SQL>create role newrole identified by rolepasswd; ②給角色賦權(quán)限 SQL>grant select on all table to newrolle; SQL>grant connect to newrole with admin option; 3.2.3 中斷用戶同 oracle 的連接 當(dāng) oracle 數(shù)據(jù)庫(kù)要關(guān)機(jī)或某個(gè)用戶占有的大量的資源需要被釋放時(shí),dba 需中斷用戶同 oracle 的連接。 ①、SQL>select sid,serial#,username from v$session; ②、SQL>alter system kill session interger1,interger2 ; interger1,interger2 分別對(duì)應(yīng)于 sid 和 serial# 3.3 表、視圖、索引、約束 Oracle 數(shù)據(jù)庫(kù)數(shù)據(jù)對(duì)象中最基本的是表和視圖,其他還有約束、序列、函數(shù)、存儲(chǔ)過程、包、觸發(fā)器等。對(duì)數(shù)據(jù)庫(kù)的操作可以基本歸結(jié)為對(duì)數(shù)據(jù)對(duì)象的操作。 3.3.1 表和視圖 Oracle 中表是數(shù)據(jù)存儲(chǔ)的基本結(jié)構(gòu)。ORACLE8 引入了分區(qū)表和對(duì)象表,ORACLE8i 引入了臨時(shí)表,使表的功能更強(qiáng)大。視圖是一個(gè)或多個(gè)表中數(shù)據(jù)的邏輯表達(dá)式。本文我們將討論怎樣創(chuàng)建和管理簡(jiǎn)單的表和視圖。 3.3.1.1 管理表 3.3.1.1.1 建立表 表可以看作有行和列的電子數(shù)據(jù)表,表是關(guān)系數(shù)據(jù)庫(kù)中一種擁有數(shù)據(jù)的結(jié)構(gòu)。用 CREATE TABLE 語(yǔ)句建立表,在建立表的同時(shí),必須定義表名,列,以及列的數(shù)據(jù)類型和大小。例如: 這樣我們就建立了一個(gè)名為 products 的表, 關(guān)鍵詞 CREATE TABLE 后緊跟的表名,然后定義了三列,同時(shí)規(guī)定了列的數(shù)據(jù)類型和大小。 在創(chuàng)建表的同時(shí)你可以規(guī)定表的完整性約束,也可以規(guī)定列的完整性約束,在列上普通的約束是 NOT NULL,關(guān)于約束的討論我們?cè)谝院筮M(jìn)行。 在建立或更改表時(shí),可以給表一個(gè)缺省值。缺省值是在增加行時(shí),增加的數(shù)據(jù)行中某一項(xiàng)值為 null 時(shí),oracle 即認(rèn)為該值為缺省值。 下列數(shù)據(jù)字典視圖提供表和表的列的信息: . DBA_TABLES . DBA_ALL_TABLES . USER_TABLES . USER_ALL_TABLES . ALL_TABLES . ALL_ALL_TABLES . DBA_TAB_COLUMNS . USER_TAB_COLUMNS . ALL_TAB_COLUMNS 3.3.1.1.2 表的命名規(guī)則 表名標(biāo)識(shí)一個(gè)表,所以應(yīng)盡可能在表名中描述表,oracle 中表名或列名最長(zhǎng)可以達(dá) 30 個(gè)字符串。表名應(yīng)該以字母開始,可以在表名中包含數(shù)字、下劃線、#、$等。 3.3.1.1.3 從其它表中建立表 可以使用查詢從基于一個(gè)或多個(gè)表中建立表,表的列的數(shù)據(jù)類型和大小有查詢結(jié)果決定。建立這種形式的表的查詢可以選擇其他表中所有的列或者只選擇部分列。在 CREATE TABLE 語(yǔ)句中使用關(guān)鍵字 AS,例如: SQL>CREATE TABLE emp AS SELECT * FROM employee TABLE CREATED SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2 需要注意的是如果查詢涉及 LONG 數(shù)據(jù)類型,那么 CREATE TABLE....AS SELECT....將不會(huì)工作。 3.3.1.1.4 更改表定義 在建立表后,有時(shí)候我們可能需要修改表,比如更改列的定義,更改缺省值,增加新列,刪除列等等。ORACLE 使用ALTER TABLE 語(yǔ)句來(lái)更改表的定義 3.3.1.1.4.1 增加列 語(yǔ)法:ALTER TABLE [schema.] table_name ADD column_definition 例: ALTER TABLE orders ADD order_date DATE; 對(duì)于已經(jīng)存在的數(shù)據(jù)行,新列的值將是 NULL. 3.3.1.1.4.2 更改列 語(yǔ)法: ALTER TABLE [schema.] table_name MODIFY column_name new_attributes; 例: ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15)); 這個(gè)例子中我們修改了表 orders, 將 STATUS 列的長(zhǎng)度增加到 15,將 QUANTITY 列減小到 10,3; 修改列的規(guī)則如下: 可以增加字符串?dāng)?shù)據(jù)類型的列的長(zhǎng)度,數(shù)字?jǐn)?shù)據(jù)類型列的精度。 減少列的長(zhǎng)度時(shí),該列應(yīng)該不包含任何值,所有數(shù)據(jù)行都為 NULL 改變數(shù)據(jù)類型時(shí),該列的值必須是 NULL. 對(duì)于十進(jìn)制數(shù)字,可以增加或減少但不能降低他的精度。 3.3.1.1.4.3 刪除數(shù)據(jù)列 優(yōu)化 ORACLE 數(shù)據(jù)庫(kù),唯一的方法是刪除列,重新建立數(shù)據(jù)庫(kù)。在 ORACLE8i 中有很多方法刪除列,你可以刪除未用數(shù)據(jù)列或者可以標(biāo)示該列為未用數(shù)據(jù)列然后刪除。 刪除數(shù)據(jù)列的語(yǔ)法是: ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS] 要注意的是在刪除列時(shí)關(guān)于該列的索引和完整性約束也同時(shí)刪除。注意關(guān)鍵字 CASCADE CONSTRAINS,如果刪除的列是多列約束的一部分,那么這個(gè)約束條件相對(duì)于其他列也同時(shí)刪除。 如果用戶擔(dān)心在大型數(shù)據(jù)庫(kù)中刪除列要花太多時(shí)間,可以先將他們標(biāo)記為未用數(shù)據(jù)列,標(biāo)記未用數(shù)據(jù)列的語(yǔ)法如下: 這個(gè)語(yǔ)句將一個(gè)或多個(gè)數(shù)據(jù)列標(biāo)記為未用數(shù)據(jù)列,但并不刪除數(shù)據(jù)列中的數(shù)據(jù),也不釋放占用的磁盤空間。但是,未用數(shù)據(jù)列在視圖和數(shù)據(jù)字典中并不顯示,并且該數(shù)據(jù)列的名稱將被刪除,新的數(shù)據(jù)列可以使用這個(gè)名稱?;谠摂?shù)據(jù)列的索引、約束,統(tǒng)計(jì)等都將被刪除。 刪除未用數(shù)據(jù)列的語(yǔ)句是: ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE} 3.3.1.1.4.4 刪除表和更改表名 刪除表非常簡(jiǎn)單,但它是一個(gè)不可逆轉(zhuǎn)的行為。 語(yǔ)法: DROP TABLE [schema.] table_name [CASCADE CONSTRAINTS] 刪除表后,表上的索引、觸發(fā)器、權(quán)限、完整性約束也同時(shí)刪除。ORACLE 不能刪除視圖,或其他程序單元,但 oracle 將標(biāo)示他們無(wú)效。如果刪除的表涉及引用主鍵或唯一關(guān)鍵字的完整性約束時(shí),那么 DROP TABLE 語(yǔ)句就必須包含 CASCADE CONSTRAINTS 子串。 更改表名 RENAME 命令用于給表和其他數(shù)據(jù)庫(kù)對(duì)象改名。ORACLE 系統(tǒng)自動(dòng)將基于舊表的完整性約束、索引、權(quán)限轉(zhuǎn)移到新表中。ORACLE 同時(shí)使所有基于舊表的數(shù)據(jù)庫(kù)對(duì)象,比如視圖、程序、函數(shù)等,為不合法。 語(yǔ)法:RENAME old_name TO new_name; 例:SQL> RENAME orders TO purchase_orders; 3.3.1.1.4.5 截短表 TRUNCATE 命令與 DROP 命令相似, 但他不是刪除整個(gè)數(shù)據(jù)表,所以索引、完整性約束、觸發(fā)器、權(quán)限等都不會(huì)被刪除。缺省情況下將釋放部分表和視圖空間,如果用戶不希望釋放表空間,TRUNCATE 語(yǔ)句中要包含 REUSE STORAGE 子串。TRUNCATE 命令語(yǔ)法如下: TRUNCATE {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE} 例:SQL> TRUNCATE TABLE t1; 3.3.1.2 管理視圖 視圖是一個(gè)或多個(gè)表中的數(shù)據(jù)的簡(jiǎn)化描述,用戶可以將視圖看成一個(gè)存儲(chǔ)查詢(stored query)或一個(gè)虛擬表(virtual table).查詢僅僅存儲(chǔ)在 oracle 數(shù)據(jù)字典中,實(shí)際的數(shù)據(jù)沒有存放在任何其它地方,所以建立視圖不用消耗其他的空間。視圖也可以隱藏復(fù)雜查詢,比如多表查詢,但用戶只能看見視圖。視圖可以有與他所基于表的列名不同的列名。用戶可以建立限制其他用戶訪問的視圖。 3.3.1.2.1 建立視圖 CREATE VIEW 命令創(chuàng)建視圖,定義視圖的查詢可以建立在一個(gè)或多個(gè)表,或其他視圖上。 查詢不能有 FOR UPDATE 子串,在早期的 ORACLE8i 版本中不支持 ORDER BY 子串,現(xiàn)在的版本中CREATE VIEW 可以擁有 ORDER BY 子串。 例: 用戶可以在創(chuàng)建視圖的同時(shí)更改列名,方法是在視圖名后立即加上要命名的列名。重新定義視圖需要包含 OR REPLACE 子串。 如果在創(chuàng)建的視圖包含錯(cuò)誤在正常情況下,視圖將不會(huì)被創(chuàng)建。但如果你需要?jiǎng)?chuàng)建一個(gè)帶錯(cuò)誤的視圖必須在 CREATE VIEW 語(yǔ)句中帶上 FORCE 選項(xiàng)。如:CREATE FORCE VIEW ORDER_STATUS AS SELECT * FROM PURCHASE_ORDERS WHERE STATUS= APPPOVE ; SQL>/ warning :View create with compilation errors 這樣將創(chuàng)建了一個(gè)名為 ORDER_STATUS 的視圖,但這樣的視圖的狀態(tài)是不合法的,如果以后狀態(tài)發(fā)生變化則可以重新編譯,其狀態(tài)也變成合法的。 3.3.1.2.2 從視圖中獲得數(shù)據(jù) 從視圖中獲得數(shù)據(jù)與從表中獲得數(shù)據(jù)基本一樣,用戶可以在連接和子查詢中使用視圖,也可以使用 SQL 函數(shù),以及所有 SELECT 語(yǔ)句的字串。 3.3.1.2.3 插入、更新、刪除數(shù)據(jù) 用戶在一定的限制條件下可以通過視圖更新、插入、刪除數(shù)據(jù)。如果視圖連接多個(gè)表,那么在一個(gè)時(shí)間里只能更新一個(gè)表。所有的能被更新的列可以在數(shù)據(jù)字典 USER_UPDATETABLE_COLUMNS 中查到。 用戶在 CREATE VIEW 中可以使用了 WITH 子串。WITH READ ONLY 子串表示創(chuàng)建的視圖是一個(gè)只讀視圖,不能進(jìn)行更新、插入、刪除操作。WITH CHECK OPTION 表示可以進(jìn)行插入和更新操作,但應(yīng)該滿足 WHERE 子串的條件。這個(gè)條件就是創(chuàng)建視圖 WHERE 子句的條件,比如在上面的例子中用戶創(chuàng)建了一個(gè)視圖 TOP_EMP,在這個(gè)視圖中用戶不能插入 salary 小于 2000 的數(shù)據(jù)行。 3.3.1.2.4 刪除視圖 刪除視圖使用DROP VIEW 命令。同時(shí)將視圖定義從數(shù)據(jù)字典中刪除,基于視圖的權(quán)限也同時(shí)被刪除,其他涉及到該視圖的函數(shù)、視圖、程序等都將被視為非法。 例:DROP VIEW TOP_EMP; 3.3.2 索引 索引是一種可以提高查詢性能的數(shù)據(jù)結(jié)構(gòu),在這一部分我們將討論索引如何提高查詢性能的。ORACLE提供了以下幾種索引: B-Tree、哈希(hash)、位圖(bitmap)等索引類型 基于原始表的索引 基于函數(shù)的索引 域(Domain)索引 實(shí)際應(yīng)用中主要是 B-Tree 索引和位圖索引,所以我們將集中討論這兩種索引類型。 3.3.2.1 B-Tree 索引 B-Tree 索引是最普通的索引,缺省條件下建立的索引就是這種類型的索引。B-Tree 索引可以是唯一或非唯一的,可以是單一的(基于一列)或連接的(多列)。B-Tree 索引在檢索高基數(shù)數(shù)據(jù)列(高基數(shù)數(shù)據(jù)列是指該列有很多不同的值)時(shí)提供了最好的性能。對(duì)于取出較小的數(shù)據(jù) B-Tree 索引比全表檢索提供了更有效的方法。但當(dāng)檢查的范圍超過表的 10%時(shí)就不能提高取回?cái)?shù)據(jù)的性能。正如名字所暗示的那樣,B-Tree 索引是基于二元樹的,由枝干塊(branch block)和樹葉塊(leaf block)組成,枝干塊包含了索引列(關(guān)鍵字)和另一索引的地址。樹葉塊包含了關(guān)鍵字和給表中每個(gè)匹配行的 ROWID。 3.3.2.2 位圖索引 位圖索引主要用于決策支持系統(tǒng)或靜態(tài)數(shù)據(jù),不支持行級(jí)鎖定。位圖索引可以是簡(jiǎn)單的(單列)也可以是連接的(多列),但在實(shí)踐中絕大多數(shù)是簡(jiǎn)單的。位圖索引最好用于低到中群集(cardinality)列,在這些列上多位圖索引可以與 AND 或 OR 操作符結(jié)合使用。 位圖索引使用位圖作為鍵值,對(duì)于表中的每一數(shù)據(jù)行位圖包含了 TRUE(1)、FALSE(0)、或 NULL 值。位圖索引的位圖存放在 B-Tree 結(jié)構(gòu)的頁(yè)節(jié)點(diǎn)中。B-Tree結(jié)構(gòu)使查找位圖非常方便和快速。另外,位圖以一種壓縮格式存放,因此占用的磁盤空間比 B-Tree 索引要小得多。 3.3.2.3 修改索引 ALTER INDEX scott.ord_region_id_idx ALLOCATE EXTENT (SIZE 200K DATAFILE DISK6/indx01.dbf );重建索引對(duì)于頻繁更新的表,索引會(huì)變得層次很深,效率變低。這時(shí)需要重建索引。 ALTER INDEX scott.ord_region_id_idx REBUILD TABLESPACE indx02; 3.3.3 序列(Sequences) Oracle 序列是一個(gè)連續(xù)的數(shù)字生成器。序列常用于人為的關(guān)鍵字,或給數(shù)據(jù)行排序否則數(shù)據(jù)行是無(wú)序的。像約束一樣,序列只存在于數(shù)據(jù)字典中。序列號(hào)可以被設(shè)置為上升、下降,可以沒有限制或重復(fù)使用直到一個(gè)限制值。 3.3.3.1 創(chuàng)建序列 創(chuàng)建序列使用SET SEQUENCE語(yǔ)句。 CREATE SEQUENCE [schema] sequence KEYWORD KEYWORD 包括下面的值: KEYWORD 描述 START WITH 定義序列生成的第一個(gè)數(shù)字,缺省為 1 INCREMENT BY 定義序列號(hào)是上升還是下降,對(duì)于一個(gè)降序的序列 INCREMENT BY 為負(fù)值 MINVALUE 定義序列可以生成的最小值,這是降序序列中的限制值。缺省情況下該值為NOMINVALUE,NOMINVALUE,對(duì)于升序?yàn)?1,對(duì)于降序?yàn)?10E26. MAXVALUE 序列能生成的最大數(shù)字。這是升序序列中的限制值,缺省的 MAXVALUE 為NOMAXVALUE,NOMAXVALUE,對(duì)于升序?yàn)?10E26,對(duì)于降序?yàn)?1。 CYCLE 設(shè)置序列值在達(dá)到限制值以后可以重復(fù)NOCYCLE 設(shè)置序列值在達(dá)到限制值以后不能重復(fù),這是缺省設(shè)置。當(dāng)試圖產(chǎn)MAXVALUE 1 的值時(shí),將會(huì)產(chǎn)生一個(gè)異常CACHE 定義序列值占據(jù)的內(nèi)存塊的大小,缺省值為 20 NOCACHE 在每次序列號(hào)產(chǎn)生時(shí)強(qiáng)制數(shù)據(jù)字典更新,保證在序列值之間沒有間隔當(dāng)創(chuàng)建序列時(shí),START WITH 值必須等于或大于 MINVALUE。 3.3.3.2 刪除序列 刪除序列使用DROP SEQUENCE 語(yǔ)句 DROP SEQUENCE sequence_name 3.4 網(wǎng)絡(luò)管理 3.4.1 Net8 server 端配置 3.4.1.1 listener.ora 文件的樣本: 3.4.1.2 啟動(dòng)listener 在響應(yīng)的端口上設(shè)置并啟動(dòng) listener 手工啟動(dòng) listener: 1. >lsnrctl start 查看狀態(tài) 2. >lsnrctl status 3.4.2 Net 8 client 端配置 ¢Net 8 client 端常用的配置方法為 tns 方式 ¢使用圖形配置工具進(jìn)行配置 開始->程序->Oracle-> Network Administration->Net8 Assistant. 1、選本地 -> 概要文件 加入 tnsnames 2、選本地 ->服務(wù)命名 新建一個(gè)連接串,包括主機(jī)名、端口,協(xié)議 3、選文件->保存網(wǎng)絡(luò)配置 ¢直接配置$ORACLE_HOME/network/admin/tnsnames.ora 1. 備份 tnsnames.ora 2. 按照示例對(duì)連接串做拷貝 3. 改變連接串的名字,主機(jī)名,端口,協(xié)議,SID 等參數(shù) 4. 保存文件 3.4.3 sqlnet.ora 3.4.4 網(wǎng)絡(luò)連通性測(cè)試 sqlplus tnsping ping ,netstat 1. sqlplus system/manager @gis 注意:gis 是剛才設(shè)置的新的連接串 2.在客戶端 >Tnsping gis, 并且檢查 tnsnames.ora 中的配置是否與 server 端的$ORACLE_HOME/network/admin/listener.ora 中的配置是否一致。 1. Ping server IP 地址,查看網(wǎng)絡(luò)連通性 3.4.5 常見 NET8 錯(cuò)誤 故障排除是每個(gè)系統(tǒng)管理人員必要面對(duì)的工作。下面給出幾種故障分析和排除方法。 3.4.5.1 服務(wù)器端診斷 任務(wù) 1: 數(shù)據(jù)庫(kù)系統(tǒng)是否啟動(dòng) 確定數(shù)據(jù)庫(kù)系統(tǒng)是否已啟動(dòng),只要用 SQL*PLUS 登錄即可: SQLPLUS system/manager 如果收到下面信息,則數(shù)據(jù)庫(kù)還不能用。 ORA-1017: invalid U/P ORA-1034: Oracle not available 任務(wù) 2: 執(zhí)行繞彎測(cè)試 為了確認(rèn) listener.ora, tnsnames.ora sqlnet.ora 文件的存在, 有效。要在服務(wù)器端 UNIX 在:$ORACLE_HOME/network/admin Windows NT 在:ORACLE_HOME\network\admin a. 這些文件是否在工作。 b. TNS_ADMIN 變量有效性。 使用 Net8 Assistant 進(jìn)行繞彎測(cè)試: 3.4.5.2 客戶端診斷 當(dāng)服務(wù)器已經(jīng)通過一般的 SQL*PLUS 測(cè)試和繞彎測(cè)試后,可以進(jìn)行客戶端的測(cè)試,步驟如下: 1. 檢查所安裝的協(xié)議是否與服務(wù)器端一致; 在 UNIX, 可以運(yùn)行$ORACLE_HOME/bin 目錄下的 adapters 來(lái)確認(rèn)。結(jié)果顯示: 2. 檢查所有 Net8 軟件在客戶端已經(jīng)安裝。 3. 確認(rèn)客戶端機(jī)器$ORACLE_HOME/network/admin 目錄下的 tnsnames.ora 和sqlnet.ora 文件的內(nèi)容: a. 當(dāng)前的工作目錄 b. TNS_ADMIN 環(huán)境變量 在 NT 中,如果 TNS_ADMIN 環(huán)境變量沒有注冊(cè),就要進(jìn)行注冊(cè)。 c. 用 FTP, TELNET 及 PING 檢查網(wǎng)絡(luò)的連接情況。 4. 用 TNSPING 、TRCROUTE 實(shí)用程序或 Net8 Assistant進(jìn)行測(cè)試 TNSPING: tnsping net_service_name [count] net service name: 在tnsnames.ora 或名字服務(wù)上得使用。如:NIS 或 DCE 的CDS. count (可選): 實(shí)驗(yàn)次數(shù) 例 1:使用 spotdb 服務(wù)名進(jìn)行測(cè)試: tnsping spotdb 可能提示: 例 2:用 TNSPING 測(cè)試 10 次: tnsping stprd 10 可能提示: 5. 如果連接失敗,可以進(jìn)行下面操作: 查找原因 用下面站點(diǎn)與 Oracle 聯(lián)系: http://support.oracle.com 與 Oracle Worldwide Support 聯(lián)系 3.4.5.3 常見錯(cuò)誤 ORA-12154: TNS:could not resolve service name 原因: 在 tnsnames.ora ,Net8 不能定位到服務(wù)器上 措施: 1. 確定 tnsnames.ora 文件存在 2. 確定不要有多個(gè) tnsnames.ora 3.確認(rèn) tnsnames.ora 文件的服務(wù)名的正確性。 4. 確認(rèn)不要有多個(gè) sqlnet.ora 5. 如果使用域名,確認(rèn) sqlnet.ora 包含NAMES.DEFAULT_DOMAIN 參數(shù)。如果該參數(shù)不存在,必須在連接字串中指定域名。 如果沒有使用域名,而 NAMES.DEFAULT_DOMAIN 參數(shù)存在,則刪掉它或注釋掉。 6. 如果從對(duì)話框進(jìn)行連接,要帶@號(hào)。 7. 啟動(dòng)客戶端的跟蹤功能,再連接。 ORA-12198: TNS:could not find path to destination ORA-12203:TNS:unable to connect to destination 原因: 在客戶端找不到目標(biāo)數(shù)據(jù)庫(kù) 措施: 1. 所輸入的網(wǎng)絡(luò)服務(wù)名是否正確 2. 確認(rèn) tnsnames.ora 文件中的 ADDRESS 參數(shù)是否正確 3. 確認(rèn) tnsnames.ora 文件是否在正確的目錄上。 4. 確認(rèn)遠(yuǎn)程監(jiān)聽器是否啟動(dòng):輸入: lsnrctl lsnrctl> status listener_name listener_name 缺省 LISTENER. 如果沒有啟動(dòng),則啟動(dòng): lsnrctl> start listener_name 5.如果從對(duì)話框連接,不要忘記加@號(hào) ORA-12203: TNS:unable to connect to destination ORA-12203 是一般的錯(cuò)誤,可以檢查$ORACLE_HOME/network/log 目錄的 sqlnet.log 文件。 原因: 所安裝的協(xié)議不正確??赡芘c下面原因一樣: ORA-12203 ORA-12538 ORA-00508 措施: 檢查安裝的 Oracle 協(xié)議。 在 UNIX 下,運(yùn)行$ORACLE_HOME/bin 目錄下的 adapters 程序。 應(yīng)該輸出: Installed Net8 Tranport Protocols are: IPC TCP/IP BEQueath SSL RAW ... ORA-12203 原因: 不正確的服務(wù)名。 HOST 或 SERVICE 正確? PORT 正確? ORA-12203 另外原因: Net8 在 tnsnames.ora 文件中沒有找到服務(wù)描述符。 措施: 用下面命令確認(rèn)數(shù)據(jù)庫(kù)是否在運(yùn)行: lsnrctl lsnrctl> status listener_name listener_name 不是必須的,缺省 LISTENER 如果系統(tǒng)提示沒有運(yùn)行,則用下面命令啟動(dòng): lsnrctl> start listener_name 2. 確認(rèn) tnsnames.ora 文件的正確位置。 ORA-12203 另外原因: 目標(biāo)系統(tǒng)的監(jiān)聽沒有工作。 措施: 確包遠(yuǎn)程系統(tǒng)的監(jiān)聽在工作,輸入: lsnrctl lsnrctl> status listener_name 如果確實(shí)沒有工作,則輸入: lsnrctl> start listener_name ORA-12203 另外原因: 存在潛在的事務(wù)問題。 措施: 確保實(shí)用程序支持目前的網(wǎng)絡(luò)協(xié)議,如 TCP/IP。用 PING 試。 ORA-12203 另外原因: tnsnames.ora 文件沒有放對(duì)地方(目錄)。 Action:確保 tnsnames.ora文件在正確的位置。 ORA-12203 另外原因: TCP/IP 地址 (HOST=server_name) 參數(shù) TCP/IP 或 SPX 地址參數(shù)(SERVICE=tns_application) 與客戶端不一致。 措施: 確認(rèn)這些參數(shù)使用相同的名字。 對(duì)于 TCP/IP ,確保 listener.ora 文件的 HOST 和 tnsnames.ora 文件指到相同的名字?;蛎洲D(zhuǎn)換到相同的 IP地址。 對(duì)于 SPX ,在客戶端的名字必須相同。 ORA-12224: TNS:no listener 原因:由于監(jiān)聽沒有工作而連接請(qǐng)求不能完成。 措施: 1. 確認(rèn)支持的目標(biāo)地址與數(shù)據(jù)庫(kù)之一匹配。 2.檢查版本問題 ORA-12533: TNS:illegal ADDRESS parameters 原因:在 tnsnames.ora 文件的 ADDRESS 節(jié)指定不 正確。 措施:根據(jù) ADDRESS 語(yǔ)法進(jìn)行改正。 ORA-12545: TNS:name lookup failure 原因:遠(yuǎn)程節(jié)點(diǎn)不能連接。 措施: 1. tnsnames.ora 文件的 ADDRESS 和 listener.ora 文件的正確性。 2. 確認(rèn)遠(yuǎn)程節(jié)點(diǎn)已經(jīng)啟動(dòng)。輸入: lsnrctl lsnrctl> status listener_name 如果沒有啟動(dòng),則輸入: lsnrctl> start listener_name ORA-12560: TNS:protocol adapter error 原因:監(jiān)聽不能啟動(dòng)。 措施: 1. 調(diào)整后再運(yùn)行。 2. 分析跟蹤文件的內(nèi)容。 ORA-3113: TNS:End of file on communication channel 原因:一個(gè)無(wú)法預(yù)料文件結(jié)束在通信通道里被處理??赡苁峭ㄐ胚B接被臨時(shí)地停止了。 措施:需要修改發(fā)射次數(shù)等。 ORA-3121: No interface driver connection -function not performed 原因:SQL*NET 版本引起。 措施:不要使用下面前綴進(jìn)行連接: T: X: P: 4. ORACLE8i 與系統(tǒng)管理有關(guān)的新特性 Oracle8i 引入了幾項(xiàng)嶄新的特性,可簡(jiǎn)化對(duì) ORDBMS 的管理,并使其更易操作和使用。 4.1 本地化管理表空間 在 Oracle8I 以前,表空間的使用狀況都是通過數(shù)據(jù)字典來(lái)完成的,稱為 Dictionary-Managed Tablespace. 在 Oracle8I 推出以前,這一直都是唯一的表空間管理方式。自從 Oracle8I 以后,Oracle 又增加了一種新的表空間管理方式:Locally Managed Tablespace(本地化管理的表空間)。 在傳統(tǒng)的數(shù)據(jù)字典管理的表空間里,Oracle 在數(shù)據(jù)字典的表里面記錄了每個(gè)表空間的每個(gè)區(qū)的使用狀況:每當(dāng)一個(gè)區(qū)被使用或被釋放時(shí),Oracle 都在數(shù)據(jù)字典里面更新相應(yīng)的信息,并產(chǎn)生相應(yīng)的 redo 信息。在 Oracle8I 里,這仍然是默認(rèn)的表空間管理方式。 在 Oracle8I 的版本中,Oracle 推出了一種全新的表空間管理方式:本地化管理的表空間。所謂本地化管理,就是指 Oracle 不再利用數(shù)據(jù)字典的表來(lái)記錄 Oracle 表空間里面的區(qū)的使用狀況,而是在每個(gè)表空間的數(shù)據(jù)文件的頭部加入了一個(gè)記錄塊,在其中記錄每個(gè)區(qū)的使用狀況。每當(dāng)一個(gè)區(qū)被使用,或者被釋放以供重新使用時(shí),Oracle 都會(huì)更新數(shù)據(jù)文件頭部的這個(gè)記錄,反映這個(gè)變化。 本地化管理的表空間的創(chuàng)建過程: 解釋:關(guān)鍵字 EXTENT MANAGEMENT LOCAL 指定這是一個(gè)本地化管理的表空間。對(duì)于系統(tǒng)表空間,只能在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候指定 EXTENT MANGEMENT LOCAL,因?yàn)樗菙?shù)據(jù)庫(kù)創(chuàng)建時(shí)建立的第一個(gè)表空間。 若為 DICTIONARY,則表明這是一個(gè)傳統(tǒng)的數(shù)據(jù)字典管理的表空間,這是個(gè)默認(rèn)選項(xiàng)。 當(dāng)選擇了 LOCAL 關(guān)鍵字,即表明這是這是一個(gè)本地化管理的表空間后,還可以繼續(xù)選擇更細(xì)的管理方式:是 AUTOALLOCATE 還是 UNIFORM.。若為 AUTOALLOCATE,則表明讓 Oracle 來(lái)決定區(qū)塊的使用辦法;若選擇了 UNIFORM,則還可以詳細(xì)指定每個(gè)區(qū)塊的大小,若不加指定,則為每個(gè)區(qū)使用 1M 大小。 是本地化管理的表空間還是創(chuàng)建數(shù)據(jù)字典管理的表空間只能在創(chuàng)建表空間的時(shí)候指定。在表空間已經(jīng)創(chuàng)建以后,則不能再把本地化管理的表空間和數(shù)據(jù)字典管理的表空間再相互轉(zhuǎn)換。在創(chuàng)建臨時(shí)表空間時(shí),也可以在 CREATE TEMPORARY TABLESPACE 中指定EXTENT MANAGEMENT LOCAL 來(lái)指定這是一個(gè)本地化管理的表空間。 本地化管理表空間的優(yōu)點(diǎn): 1. 本地化管理的表空間避免了遞歸的空間管理操作。而這種情況在數(shù)據(jù)字典管理的表空間是經(jīng)常出現(xiàn)的,當(dāng)表空間里的區(qū)的使用狀況發(fā)生改變時(shí),數(shù)據(jù)字典的表的信息發(fā)生改變,從而同時(shí)也使用了在系統(tǒng)表空間里的回滾段。 2. 本地化管理的表空間避免了在數(shù)據(jù)字典相應(yīng)表里面寫入空閑塊、已使用塊的信息,從而減少了數(shù)據(jù)字典表的競(jìng)爭(zhēng)。 3. 區(qū)的本地化管理自動(dòng)跟蹤表空間里的空閑塊,減少了手工合并自由空間的需要。 4. 表空間里的區(qū)的大小可以選擇由 Oracle 系統(tǒng)來(lái)決定,或者由數(shù)據(jù)庫(kù)管理員指定一個(gè)統(tǒng)一的大小。 5. 從由數(shù)據(jù)字典來(lái)管理空閑塊改為由數(shù)據(jù)文件的頭部記錄來(lái)管理空閑塊,這樣避免產(chǎn)生回滾信息,不再使用系統(tǒng)表空間里的回滾段。因?yàn)橛蓴?shù)據(jù)字典來(lái)管理的話,它會(huì)把相關(guān)信息記在數(shù)據(jù)字典的表里,從而產(chǎn)生回滾信息。由于這種表空間的以上特性,所以它支持在一個(gè)表空間里邊進(jìn)行更多的并發(fā)操作,并減少了對(duì)數(shù)據(jù)字典的依賴。 當(dāng)然本地化管理的表空間也不是對(duì)所有的數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)對(duì)象都是適用的。首先,它不能指定存儲(chǔ)特性,無(wú) STORAGE 子句可供使用。其次,它不適用于存儲(chǔ)較小的數(shù)據(jù)庫(kù)對(duì)象。 總的來(lái)說(shuō),oracle8I 提供了這種全新的表空間管理方式,給了我們更多的選擇。對(duì)于用來(lái)存儲(chǔ)大對(duì)象的表空間和臨時(shí)表空間來(lái)說(shuō),用本地化管理的表空間組織方式不失為一個(gè)較好的選擇。 4.2 FBI 索引 Oracle8i的很重要的一個(gè)新特性就是增加了 function-based index 這種索引類型(后面簡(jiǎn)稱為 FBI)。有了這個(gè)特性后,Oracle DBA 就可以在索引中使用函數(shù)或者表達(dá)式了。這些函數(shù)可以使 Oracle 自己的函數(shù),也可以使用戶自己的 PL/SQL 函數(shù)等。 DBA 在 SQL 語(yǔ)句調(diào)優(yōu)的過程中遇到的一個(gè)很常見的問題就是,如何優(yōu)化那些在 WHERE子句中使用了函數(shù)的語(yǔ)句。因?yàn)樵谝郧?,?WHERE 子句中使用函數(shù)會(huì)使在這個(gè)表上創(chuàng)建的索引沒法利用,從而難以提高這個(gè)語(yǔ)句的性能。 例子: 使用基于成本的優(yōu)化器,索引為標(biāo)準(zhǔn)的 B 樹索引,建立在 SURNAME 列上。 從 SQL*PLUS 的 autotrace 產(chǎn)生的執(zhí)行路徑可以看到,雖然我們?cè)?WHERE 子句中用到的SURNAME 列上創(chuàng)建了索引,但是仍然執(zhí)行的是全表掃描。如果這張表很大的話,這回消耗大量的時(shí)間。 現(xiàn)在我們?cè)囍⒁粋€(gè) FBI 索引: SQL*Plus 返回的執(zhí)行計(jì)劃我們可以看到,這次,Oracle 對(duì)表不再全表掃描,而是先掃描索引,因?yàn)閮?yōu)化器可以知道 FBI 索引得存在使用 FBI 索引所能夠帶來(lái)的性能提升取決于表的大小、表中重復(fù)記錄的量、在 WHERE子句中使用的列等因素。 有一點(diǎn)需要清楚,F(xiàn)BI 索引并不真正在索引里邊存儲(chǔ)了表達(dá)式的結(jié)果,而是使用了一個(gè)'表達(dá)樹'(expression tree)。 由優(yōu)化器來(lái)對(duì) SQL 語(yǔ)句中的表達(dá)式進(jìn)行解析,并且和 FBI 索引上面的表達(dá)式進(jìn)行對(duì)比。這里,SQL 函數(shù)的大小寫時(shí)敏感的。因此要求 SQL 語(yǔ)句中使用的函數(shù)和創(chuàng)建 FBI 索引得時(shí)候的那個(gè) SQL 函數(shù)的大小寫一致,否則無(wú)法利用這個(gè) FBI索引。因此,在編程的時(shí)候要有一個(gè)良好的編程風(fēng)格。 Init.ora里邊需要修改的參數(shù) 下面這幾個(gè)參數(shù)必須在 init.ora 里邊指定: QUERY_REWRITE_INTEGRITY = TRUSTED QUERY_REWRITE_ENABLED = TRUE COMPATIBLE = 8.1.0.0.0 (or higher) 授權(quán): 要使一個(gè)用戶能夠創(chuàng)建 FBI 索引,他必須被授予以下權(quán)限:CREATE INDEX 和 QUERYREWRITE,或者CREATE ANY INDEX 和 GLOBAL QUERY REWRITE 這兩個(gè)權(quán)限。 索引的使用者必須能夠有那個(gè) FBI 索引上使用的那個(gè)函數(shù)的執(zhí)行權(quán)限。如果沒有相應(yīng) 的權(quán)限,那么這個(gè) FBI 索引得狀態(tài)將變成 DISABLED(DBA_INDEXES)。 如果那個(gè)FBI 索引得狀態(tài)是 DISABLED,那么 DBA 可以這樣來(lái)處理: A:刪除并重建 B:ALTER INDEX index_name ENABLED。這個(gè) Enabled 只能對(duì) FBI 索引使用。 C:ALTER INDEX UNUSABLE; 注意:如果一個(gè)查詢中使用到了這個(gè)索引,但是這個(gè) FBI 索引的狀態(tài)是 DISABLED,但是優(yōu)化器選擇了使用這個(gè)索引,那么將會(huì)返回一個(gè) Oracle 錯(cuò)誤。 例子: ORA error: ERROR at line 1: ORA-30554: function-based index MYUSER.FBI is disabled. 而且,一旦這個(gè) FBI 索引的狀態(tài)是 Disabled,那么這張表上所有涉及索引列的 DML 操作也將失敗。除非這個(gè)索引得狀態(tài)變成 UNUSABLE,而且在初始化參數(shù)里邊指定 SKIP_UNUSABLE_INDEXES為 TRUE。 一些例子: 復(fù)合索引的例子: 限制和規(guī)則總結(jié): 對(duì)于下面這些限制,不能創(chuàng)建 FBI 索引: a) LOB 列 b) REF c) Nested table 列 d) 包含上面數(shù)據(jù)類型的對(duì)象 FBI 索引必須遵守下面的規(guī)則: a) 必須使用基于成本的優(yōu)化器,而且創(chuàng)建后必須對(duì)索引進(jìn)行分析 b) 不能存儲(chǔ) NULL 值。因?yàn)槿魏魏瘮?shù)在任何情況下都不能返回 NULL 值。 c)如果一個(gè)用戶定義的 PL/SQL 例程失效了,而且這個(gè)例程被 FBI 索引用到了,那么相應(yīng)的這個(gè) FBI 索引會(huì)變成 DISABLED d)創(chuàng)建 FBI 索引得函數(shù)必須是確定性的。即,對(duì)于指定的輸入,總是會(huì)返回確定的結(jié)果。 e) 索引的屬主如果沒有了在 FBI 索引里面使用的函數(shù)的執(zhí)行權(quán)限,那么這個(gè) FBI 索引會(huì)變成 DISABLED. f) 在創(chuàng)建索引得函數(shù)里面不能使用 SUM 等總計(jì)函數(shù)。 g)要把一個(gè) DISABLED 了的索引重新變成 ENABLED,這個(gè)函數(shù)必須首先是 ENABLED 的才可以。 4.3 在線索引創(chuàng)建和重建 索引創(chuàng)建與重建在 Oracle8i中可聯(lián)機(jī)實(shí)現(xiàn),而不必中斷對(duì)基表可能實(shí)施插入、更新或刪除操作。創(chuàng)建與重建索引是一件非常耗時(shí)的工作,尤其當(dāng)基表很大時(shí)。在 Oracle8i 之前,在索引創(chuàng)建與重建期間,不允許對(duì)其基表進(jìn)行任何 DML操作。 在線創(chuàng)建索引: 在線重建索引: 注:在線索引構(gòu)建期間,盡管能 UPDATE(更新)基表,但根據(jù) Oracle 的建議,最好不要采取會(huì)影響到大部分?jǐn)?shù)據(jù)行的操作。 4.4 使用可傳輸?shù)谋砜臻g實(shí)現(xiàn)數(shù)據(jù)在數(shù)據(jù)庫(kù)間的移動(dòng) 對(duì)于可傳輸?shù)谋砜臻g這一特性來(lái)說(shuō),允許我們把一個(gè)或多個(gè)表空間從一個(gè)數(shù)據(jù)庫(kù)移動(dòng)或復(fù)制到另一個(gè)數(shù)據(jù)庫(kù)。 可傳輸?shù)谋砜臻g有下面幾點(diǎn)限制: 源和目標(biāo)數(shù)據(jù)庫(kù)必須處于同一個(gè)硬件平臺(tái)。 源和目標(biāo)數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)塊大小必須一樣,而且必須采用同一個(gè)字符集。 如果表空間名和目標(biāo)數(shù)據(jù)庫(kù)上的表空間名雷同,這個(gè)表空間就不能被傳輸?shù)侥繕?biāo)數(shù)據(jù)庫(kù)。 數(shù)據(jù)庫(kù)表空間遷移的基本過程是:令表空間為只讀,并復(fù)制相應(yīng)的數(shù)據(jù)文件,然后利用 EXP/IMP,從數(shù)據(jù)字典中卸載元數(shù)據(jù),并把它裝載到目標(biāo)數(shù)據(jù)庫(kù)。 表空間遷移前首先要檢測(cè)待遷移的表空間是否自包含。我們可以通過執(zhí)行內(nèi)置的 PL/SQL過程 DBMS_TTS.TRANSPORT_SET_CHECK 判斷表空間是否自包含: 其中, SALEDAT,SALESIDX 是表空間名。若TRANSPORT_SET_VOILATIONS 沒有記錄,則說(shuō)明待遷移的表空間是自包含。 以下是表空間遷移的操作步驟,1-5 步操作在源數(shù)據(jù)庫(kù)表空間操作完成,6、7、8步在目的數(shù)據(jù)庫(kù)表空間操作完成。 1.用數(shù)據(jù)庫(kù)管理員(INTERNAL)身份登錄 ORACLE,(CONNECT INTERNAL/******)。 2.將源 tablsspace_name 表空間置為 READ ONLY,使得表空間下的數(shù)據(jù)文件置為 READONLY 狀態(tài),可以進(jìn)行操作系統(tǒng)級(jí)的拷貝,(ALTER TABLESPACE tablsspace_name READONLY)。如果是生產(chǎn)系統(tǒng)請(qǐng)注意選擇好進(jìn)行此操作的時(shí)間。 3.利用 EXP 工具進(jìn)行數(shù)據(jù)庫(kù)表空間的遷移,(EXP INTERNAL/****** FILE=filename.DMP LOG=logname.LOG TRANSPORT_TABLESPACE=Y TABLESPACES=tablsspace_name BUFFER=1024000 )。 4.將待遷移的表空間下的所有數(shù)據(jù)文件進(jìn)行操作系統(tǒng)級(jí)的拷貝,復(fù)制到目的數(shù)據(jù)庫(kù)操作系統(tǒng)硬盤下。 5.將源 tablsspace_name 表空間置為 READ WRITE,使得表空間下的數(shù)據(jù)文件置為 READ WRITE 狀態(tài),(ALTER TABLESPACE tablsspace_name READ WRITE)。 6.在目的數(shù)據(jù)庫(kù)上建立相應(yīng)的用戶 user_name 并賦予 CREATE SESSION 權(quán)限。 7.在目的數(shù)據(jù)庫(kù)上利用 IMP 工具進(jìn)行數(shù)據(jù)庫(kù)表空間的遷移,(IMP INTERNAL/****** FILE=filename.DMP LOG=logname.LOG TRANSPORT_TABLESPACE=Y TABLESPACES=tablsspace_name DATAFILES=datafile_name1,datafile_name2)。 8.在目的數(shù)據(jù)庫(kù)上將目的 tablsspace_name 表空間置為 READ WRITE,使得表空間下的數(shù)據(jù)文件置為 READ WRITE 狀態(tài),(ALTER TABLESPACE tablsspace_name READ WRITE)。 |
|
來(lái)自: yi321yi > 《數(shù)據(jù)庫(kù)》