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