數據庫名、實例名、數據庫域名、全局數據庫名、服務名
這是幾個令不少初學者容易混淆的概念。相信不少初學者都與我同樣被標題上這些個概念搞得一頭霧水。咱們如今就來把它們弄個明白。java
1、數據庫名算法
什麼是數據庫名? 數據庫名就是一個數據庫的標識,就像人的身份證號同樣。他用參數DB_NAME表示,若是一臺機器上裝了多全數據庫,那麼每個數據庫都有一個數據庫名。在數據庫安裝或建立完成以後,參數DB_NAME被寫入參數文件之中。格式以下: DB_NAME=myorcl ... 在 建立數據庫時就應考慮好數據庫名,而且在建立完數據庫以後,數據庫名不宜修改,即便要修改也會很麻煩。由於,數據庫名還被寫入控制文件中,控制文件是以 二進制型式存儲的,用戶沒法修改控制文件的內容。假設用戶修改了參數文件中的數據庫名,即修改DB_NAME的值。可是在Oracle啓動時,因爲參數文 件中的DB_NAME與控制文件中的數據庫名不一致,致使數據庫啓動失敗,將返回ORA-01103錯誤。sql
數據庫名的做用 數據庫名是在安裝數據庫、建立新的數據庫、建立數據庫控制文件、修改數據結構、備份與恢復數據庫時都須要使用到的。 有不少Oracle安裝文件目錄是與數據庫名相關的,如: winnt: d:/oracle/product/10.1.0/oradata/DB_NAME/... Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/... pfile: winnt: d:/oracle/product/10.1.0/admin/DB_NAME/pfile/ini.ora Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora 跟蹤文件目錄: winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/... 另外,在建立數據時,careate database命令中的數據庫名也要與參數文件中DB_NAME參數的值一致,不然將產生錯誤。 一樣,修改數據庫結構的語句alter database, 固然也要指出要修改的數據庫的名稱。 若是控制文件損壞或丟失,數據庫將不能加載,這時要從新建立控制文件,方法是以nomount方式啓動實例,而後以create controlfile命令建立控制文件,固然這個命令中也是指指DB_NAME。 還有在備份或恢復數據庫時,都須要用到數據庫名。 總之,數據庫名很重要,要準確理解它的做用。數據庫
查詢當前數據名 方法一:select name from v$database; 方法二:show parameter db 方法三:查看參數文件。c#
修改數據庫名 前面建議:應在建立數據庫時就肯定好數據庫名,數據庫名不該做修改,由於修改數據庫名是一件比較複雜的事情。那麼如今就來講明一下,如何在已建立數據以後,修改數據庫名。步驟以下: 1.關閉數據庫。 2.修改數據庫參數文件中的DB_NAME參數的值爲新的數據庫名。 3.以NOMOUNT方式啓動實例,修建控制文件(有關建立控制文件的命令語法,請參考oracle文檔)windows
2、數據庫實例名性能優化
什麼是數據庫實例名? 數據庫實例名是用於和操做系統進行聯繫的標識,就是說數據庫和操做系統之間的交互用的是數據庫實例名。實例名也被寫入參數文件中,該參數爲instance_name,在winnt平臺中,實例名同時也被寫入註冊表。 數據庫名和實例名能夠相同也能夠不一樣。 在通常狀況下,數據庫名和實例名是一對一的關係,但若是在oracle並行服務器架構(即oracle實時應用集羣)中,數據庫名和實例名是一對多的關係。這一點在第一篇中已有圖例說明。服務器
查詢當前數據庫實例名 方法一:select instance_name from v$instance; 方法二:show parameter instance 方法三:在參數文件中查詢。網絡
數據庫實例名與ORACLE_SID 雖 然二者都表是oracle實例,但二者是有區別的。instance_name是oracle數據庫參數。而ORACLE_SID是操做系統的環境變 量。 ORACLD_SID用於與操做系統交互,也就是說,從操做系統的角度訪問實例名,必須經過ORACLE_SID。在winnt不臺, ORACLE_SID還需存在於註冊表中。 且ORACLE_SID必須與instance_name的值一致,不然,你將會收到一個錯誤,在unix平臺,是「ORACLE not available」,在winnt平臺,是「TNS:協議適配器錯誤」。session
數據庫實例名與網絡鏈接
數據庫實例名除了與操做系統交互外,還用於網絡鏈接的oracle服務器標識。當你配置oracle主機鏈接串的時候,就須要指定實例名。固然8i之後版本的網絡組件要求使用的是服務名SERVICE_NAME。這個概念接下來講明 。
3、數據庫域名
什麼是數據庫域名? 在分佈工數據庫系統中,不一樣版本的數據庫服務器之間,不論運行的操做系統是unix或是windows,各服務器之間均可以經過數據庫鏈路進行遠程複製,數據庫域名主要用於oracle分佈式環境中的複製。舉例說明如: 全國交通運政系統的分佈式數據庫,其中: 福建節點: fj.jtyz 福建廈門節點: xm.fj.jtyz 江西: jx.jtyz 江西上饒:sr.jx.jtyz 這就是數據庫域名。 數據庫域名在存在於參數文件中,他的參數是db_domain.
查詢數據庫域名 方法一:select value from v$parameter where name = 'db_domain'; 方法二:show parameter domain 方法三:在參數文件中查詢。
全局數據庫名 全局數據庫名=數據庫名+數據庫域名,如前述福建節點的全局數據庫名是:oradb.fj.jtyz
4、數據庫服務名
什麼是數據庫服務名? 從oracle9i版本開始,引入了一個新的參數,即數據庫服務名。參數名是SERVICE_NAME。 若是數據庫有域名,則數據庫服務名就是全局數據庫名;不然,數據庫服務名與數據庫名相同。
查詢數據庫服務名 方法一:select value from v$parameter where name = 'service_name'; 方法二:show parameter service_name 方法三:在參數文件中查詢。
數據庫服務名與網絡鏈接 從oracle8i開如的oracle網絡組件,數據庫與客戶端的鏈接主機串使用數據庫服務名。以前用的是ORACLE_SID,即數據庫實例名
建立Oracle數據庫(以Oracle10g爲例)
有兩種建立數據庫的方式,一種是以命令行腳本方式,即手動方式建立;另外一種是利用Oracle提供的數據庫配置嚮導來建立。本篇主要介紹在Unix和Windows下以命令行腳本方式建立Oracle數據庫。
一個完整的數據庫系統,應包括一個物理結構、一個邏輯結構、一個內存結構和一個進程結構,若是要建立一個新的數據庫,則這些結構都必須完整的創建起來。
1、在Unix下建立數據庫
1.肯定數據庫名、數據庫實例名和服務名 關於數據庫名、數據庫實例名和服務名,我以前有專門用一篇來詳細介紹。這裏就再也不說明了。
2.建立參數文件 參數文件很肯定了數據庫的整體結構。Oracle10g有兩種參數文件,一個是文本參數文件,一種是服務器參數文件。在建立數據庫時先建立文本參數文件, 在數據庫建立後,能夠由文件參數文件建立服務器參數文件。文本參數文件的取名方式爲initORACLE_SID.ora,其中,ORACLE_SID是 數據庫實例名。其名稱及路徑爲: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/initORACLE_SID.ora 其中,DB_NAME爲數據庫名。因此,應建立一個以之命名的目錄,並將文本參數文件存放在上述目錄中。假設新建立的數據庫名爲MYORACLE,SID與數據庫名一致。則上述目錄實際爲: /home/app/oracle/product/10.1.0/admin/MYORACLE/pfile/initMYORACLE.ora
1)參數文件的介紹 參數文件決定着數據庫的整體結構,用於設置數據庫的近260個系統參數。下面分類別說明一下各參數的做用,關於參數的詳細使用說明請參考Oracle官方參考文檔。
a.數據庫標識類參數 DB_NAME: 數據庫名,此參數在建立數據前決定,數據庫建立後修改時,必須建控制文件 DB_DOMAIN: 數據庫域名,用於區別同名數據庫。數據庫名與域名一塊兒構成了全局數據庫名 INSTANCE_NAME: 數據庫實例名,能夠與數據庫相同 SERVICE_NAMES: 數據庫服務名,與全局數據庫名相同若是沒有域名,則服務名就是數據庫名
b.日誌管理類參數 LOG_ARCHIVE_START: 是否啓動自動歸檔進程ARCH LOG_ARCHIVE_DEST: 歸檔日誌文件存儲目錄 LOG_ARCHIVE_FORMAT: 歸檔日誌文件的默認文件存儲格式 LOG_ARCHIVE_DUPLEX_DEST: 歸檔日誌文件鏡像存儲目錄(Oracle8以上) LOG_ARCHIVE_DEST_n: 歸檔日誌文件存儲目錄(Oracle8i以上) LOG_ARCHIVE_DEST_STATE_n: 設置參數LOG_ARCHIVE_DEST_n失效或生效 LOG_ARCHIVE_MAX_PROCESSES: 設置自動歸檔進程的個數 LOG_ARCHIVE_MIN_SUCCEED_DEST: 設置最少的成功歸檔日誌存儲目錄的個數 LOG_CHECKPOINT_INTERVAL: 根據日誌數量設置檢驗點頻率 LOG_CHECKPOINT_TIMEOUT: 根據時間間隔設置檢驗點頻率
c.內存管理參數 DB_BLOCK_SIZE: 標準數據塊大小 DB_nK_CACHE_SIZE: 非標準數據塊數據緩衝區大小 SHARED_POOL_SIZE: 共享池大小控制參數,單位爲字節 DB_CACHE_SIZE: 標準數據塊數據緩衝區大小 DB_BLOCK_BUFFERS: 數據緩衝區大小,9i以後已放棄使用 LOG_BUFFER: 日誌緩衝區大小 SORT_AREA_SIZE: 排序區大小 LARGE_POOL_SIZE: 大池大小 JAVA_POOL_SIZE: Java池大小
d.最大許可用戶數量限制參數 LICENSE_MAX_SESSIONS:數據庫能夠鏈接的最大會話數 LICENSE_MAX_USERS:數據庫支持的最大用戶數 LICENSE_MAX_WARNING:數據庫最大警告會數(會話數據達到這個值時,產生新會話時就會產生警告信息)
e.系統跟蹤信息管理參數 USER_DUMP_DEST:用戶跟蹤文件生成的設置 BACKGROUND_DUMP_DEST:後臺進程跟蹤文件生成的位置 MAX_DUMPFILE_SIZE:跟蹤文件的最大尺寸
f.系統性能優化與動態統計參數 SQL_TRACE:設置SQL跟蹤 TIMED_STATICS:設置動態統計 AUDIT_TRAIL:啓動數據庫審計功能
g.其餘系統參數 CONTROL_FILES:控制文件名及路徑 Undo_MANAGMENT:Undo空間管理方式 ROLLBACK_SEGMENTS:爲這個例程分配的回退段名 OPEN_CURSORS:一個用戶一次能夠打開的遊標的最大值 PROCESSES:最大進程數,包括後臺進程與服務器進程 IFILE:另外一個參數文件的名字 DB_RECOVERY_FILE_DEST:自動數據庫備份目錄 DB_RECOVERY_FILE_SIZE:數據庫備份文件大小
2)參數文件樣式 db_name=myoracle instance_name=myoracle db_domain=fangys.xiya.com service_names=myoracle.fangys.xiya.com control_files=(/home/app/oracle/product/10.1.0/oradata/myoracle/control01.ctl, /home/app/oracle/product/10.1.0/oradata/myoracle/control02.ctl, /home/app/oracle/product/10.1.0/oradata/myoracle/control03.ctl) db_block_size=8192 user_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/udump background_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/bdump core_dump_dest=/home/app/oracle/product/10.1.0/admin/myoracle/cdump db_recovery_file_dest=/home/app/oracle/product/10.1.0/flash_recover_area db_recovery_file_size=100G ...
3.設置操做系統參數 $ORACLE_SID=myoracle $export ORACLE_SID
4.啓動實例並建立數據庫 在建立數據庫以前,首先要以新的數據庫參數啓動數據庫實例,由於這時數據庫的控制文件尚未產生,不能MOUNT或OPEN數據庫。啓動實例時,Oracle只按照內存參數分配SGA區,啓動系統後臺進程。 $sqlplus "sys/pass as sysdba"
sql>startup nomount 若是參數文件不在規定的目錄中,能夠在啓動實例時指定參數文件: sql>startup pfile=/export/home/user/initmyoracle.init nomount 在實例啓動後就可使用CREATE DATABASE命令建立數據。其詳細語法請參考Oracle官方SQL參考文檔。這裏以實例來介紹: sql>CREATE DATABASE myoracle MAXINSTANCE 1 MAXLOGHISTORY 216 MAXLOGFILES 50 MAXLOGMEMBERS 5 DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/system01.dbf' SIZE 500m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED LOGFILE GROUP 1('/home1/app/oracle/product/10.1.0/oradata/myoracle/log1a.log', '/home1/app/oracle/product/10.1.0/oradata/myoracle/log1b.log') SIZE 10m, GROUP 2('/home1/app/oracle/product/10.1.0/oradata/myoracle/log2a.log', '/home1/app/oracle/product/10.1.0/oradata/myoracle/log2b.log') SIZE 10m, GROUP 3('/home1/app/oracle/product/10.1.0/oradata/myoracle/log3a.log', '/home1/app/oracle/product/10.1.0/oradata/myoracle/log3b.log') SIZE 10m, Undo TABLESPACE undotbs DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/undotbs01.dbf' size 200m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED DEFAULT TEMPORARY TALESPACE temp TEMPFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/temp01.dbf' size 325m AUTOEXTEND ON NEXT 100m MAXSIZE UNLIMITED DEFAULT TABLESPACE users DATAFILE '/home1/app/oracle/product/10.1.0/oradata/myoracle/usertbs01.dbf' size 1000m CHARACTER SET ZHS16GBK; 這裏說明一下CREATE DATABASE語句的各個關鍵字的含義: DATAFILE:SYSTEM表空間的數據文件定義 LOGFILE:日誌文件組的定義 Undo_TABLESPACE:重作表空間的定義 DEFAULT TEMPORTY TABLESPACE:默認臨時表空間的定義 DEFAULT TABLESPACE:默認數據表空間的定義。
5.建立數據字典 在數據庫建立結束後,數據庫自動處於OPEN狀態下,這時全部V$××××類數據字典均可以查詢。而其它數據字典,如DBA_DATA_FILES、DBA_TABLESPACES等都不存在,必須經過下列驟爲系統建立數據字典。 1)加載經常使用的數據字典包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/catalog 2)加載PL/SQL程序包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/admin/catproc 3)加載數據複製支持軟件包 sql>@/home/app/oracle/product/10.1.0/db_1/rdbms/admin/catrep 4)加載Java程序包 sql>@/home/app/oracle/product/10.1.0/db_1/javavm/install/initjvm 5)加載系統環境文件 sql>connect system/pass sql>@/home/app/oracle/product/10.1.0/db_1/sqlplus/admin/pupbld
2、在Windows下建立數據庫 Oracle實例在Windows下表現爲操做系統服務。在windows下,使用命令行方式建立數據的方法有所不一樣,差異在於在Windows下,須要先建立數據庫服務和實例。
1.肯定數據庫名、數據庫實例名和服務名並建立目錄(DBCA建立的腳本不包含創建目錄命令,須本身建立) 創建目錄命令(下面以 db_name=eygle爲例):
mkdir D:/oracle/ora90/cfgtoollogs/dbca/eygle mkdir D:/oracle/ora90/database mkdir d:/oracle/admin/eygle/adump mkdir d:/oracle/admin/eygle/bdump mkdir d:/oracle/admin/eygle/cdump mkdir d:/oracle/admin/eygle/dpdump mkdir d:/oracle/admin/eygle/pfile mkdir d:/oracle/admin/eygle/udump mkdir d:/oracle/flash_recovery_area mkdir d:/oracle/oradata mkdir d:/oracle/oradata/eygle
2.建立參數文件 在Windows下的參數文件名稱及路徑以下: d:/oracle/product/10.1.0/admin/DB_NAME/pfile/init.ora(oracle10g) d:/orant/database/iniORACLE_SID.ora(oracle7,oracle8) 參數據文件內容與前述一致。這裏再也不說明。
3.選擇數據庫實例 設置環境變量ORACLE_SID c:/>set ORACLE_SID=數據庫實例名
4.建立數據庫實例 在Windows中建立數據庫實例的命令爲Oradim.exe,是一個可執行文件,能夠在操做系統符號下直接運行。直接輸入oradim顯示此命令的幫助。 c:/>Oradim 下面對Oradim命令的參數進行一個說明 ------------------------------- -NEW 表示新建一個實例 -EDIT 表示修改一個實例 -DELETE 表示刪除一個實例 -SID sid 指定要啓動的實例名稱 -SRVC service 指定要啓動的服務名稱 -INTPWD password 以Internal方式鏈接數據庫時的口令字 -MAXUSERS count 該實例能夠鏈接的最大用戶數 -USRPWD password 指定內部用戶的口令,如是做爲Windows管理登陸,不用此參數 -PFILE pfile 該實例所使用的參數文件名及路徑 -STARTTYPE srvc|inst|srvc,inst 啓動選項(srvc:只啓動服務,inst:啓動實例,服務必須先啓動,srvc,inst:服務和實例同時啓動) -SHUTTYPE srvc|linst|srvc,inst 關閉選項(srvc:只關閉服務,實例必須已關閉,inst:只關閉實例,srvc,inst:服務和實例同時關閉) -STARTMODE a|m 建立實例所使用的模式(a:自動,即windows啓動時自動啓動 m:手動) -SHUTMODE a|i|m 關閉實例時所使用的模式(a:abort異常方式,i:immediate當即方式,n:normal正常方式) ---------------------------- 例:建立一個數據庫實例 c:/>oradim -NEW -SID myoracle -STARTMODE m -PFILE "d:/fangys/initmyoracle.ora" 或 c:/>oradim -NEW -SRVC OracleServicemyoracle -STARTMODE m -PFILE "d:/fangys/initmyoracle.ora" 例:修改一個數據實例 c:/>oradim -EDIT -SID myoracle -STARTMODE a 或 c:/>oradim -EDIT -SRVC OracleServicemyoracle -STARTMODE a 例:刪除一個實例 c:/>oradim -DELETE -SID myoracle 或 c:/>oradim -DELETE -SRVC Oracleservicemyoracle 例:啓動服務與實例 c:/>oradim -STARTUP -SID myoracle -STARTTYPE srvc,inst 只啓動服務 c:/>oradim -STARTUP -SID myoracle -STARTTYPE srvc 啓動實例: c:/>oradim -STARTUP -SID myoracle -STARTTYPE inst 例:關閉服務與實例 c:/>oradim -SHUTDOWN -SID myoracle c:/>oradim -SHUTDOWN -SID myoracle -SHUTTYPE srvc,inst
5.啓動實例並建立數據庫 c:/>oradim -NEW -SID myoracle -INTPWD syspass -STARTMODE a -PFILE d:/fangys/initmyoracle.ora c:/>set ORACLE_SID=myoracle c:/>sqlplus sys/syspass as sysdba sql>startup -pfile=d:/fangys/initmyoracle.ora nomount sql>CREATE DATABASE myoracle logfile group... ...
6.建立數據字典 sql>@d:/oracle/product/10.1.0/db_1/rdbms/admin/catalog.sql; sql>@d:/oracle/product/10.1.0/db_1/rdbms/admin/catproc.sql; sql>@d:/oracle/product/10.1.0/db_1/rdbms/admin/catrep.sql; sql>@d:/oracle/product/10.1.0/db_1/javavm/install/initjvm.sql; sql>@d:/oracle/product/10.1.0/db_1/sqlplus/admin/ppbld.sql;
1、啓動數據 $sqlplus "sys/pass as sysdba" sql>startup
2、啓動監聽器 數據庫啓動後,若是未啓動監聽進程,則客戶端沒法與數據庫鏈接。監聽進程的啓動方法爲: $lsnrctl start 在widnows中,能夠從服務列表中啓動監聽器。 監聽里程配置文件爲listener.ora,位於目錄/home/app/oracle/product/10.1.0/db1/network/admin/。 此配置文件分爲兩部分,一部分爲監聽程序自己的配置,包括協議,地址,端口號等;另外一部分爲監聽程序所鏈接的數據庫的實例信息,包括:實例名,全局數據庫名,oracle主目錄等。監聽器能夠利用oracle net config 嚮導來配置。 要顯示監聽器的運行狀態:$lsnrctl status; 要中止監聽器:$lsnrctl stop。
3、數據庫的啓動過程 分爲三個階段:
1. 啓動實例,包括如下操做: 1) 讀取參數文件 2) 分配SGA 3) 啓動後臺進程
2.裝載數據庫 裝載數據庫是將數據庫與已啓動的實例相聯繫。數據庫裝載後,數據庫保持關閉狀態。
3.打開數據庫 此步驟使用數據庫能夠進行正常的操做的處理。主要是打開控制文件,數據庫文件和日誌文件。
4、數據庫啓動參數 1.NOMOUNT:只啓動實例,不裝載數據庫 sql>startup nomount 2.MOUNT:啓動實例,並裝載數據,但不打開數據庫 sql>startup mount 3.READ ONLY:將數據庫置爲只讀 sql>startup mount sql>alter database open read only 4.READ WRITE:以可讀寫方式打開數據,這是默認方式 sql>startup mount sql>alter database open read write 5.OPEN:打開數據庫,這是默認方式 sql>startup mount sql>alter database open; 6.RESTRICT:以受限方式打開,只有具備RESTRICTED SESSION權限的用戶才能夠鏈接數據庫 sql>startup restrict 7.PFILE:啓時指定參數文件 sql>startup pfile=/u02/user/mypfile.ora 8.FORCE:以強制方式啓動數據庫 sql>startup pfile=/u02/user/mypfile.ora open restrict force
5、數據庫的關閉 與啓動過程相對應,關閉包括三個過程
1).關閉數據庫 2).卸載數據庫 3).關閉數據庫實例
1.NORMAL關閉方式 NORMAL關閉方式是正常關閉方式,是默認關閉方式。在這種關機方式下,數據庫服務器必須等待全部客戶端從Oracle中正常退出時,才能夠關閉數據庫。 SQL>SHUTDOWN NORMAL
2.IMMEDIATE關閉方式 使用這種方式關閉數據庫時,系統將鏈接到數據庫的全部用戶還沒有提交的事務所有回退,中斷鏈接,而後關閉數據庫。 SQL>SHUTDOWN IMMEDIATE
3.ABORT關閉方式 ABORT關閉方式爲異常方式,使用這種方式關閉數據庫時,系統當即將數據庫實例關閉,對事務膛數據完整性不做檢查。是最快的關機方式。 sql>shutdown abort;
4.TRANSACTIONAL關閉方式 在這種關機方式中,數據庫必須等待全部的客戶運行的事務結束,提交或回退。 sql>shutdown transactional
Oracle數據庫的鏈接結構有三種: 1) 組合用戶與服務器結構:在這種鏈接方式中,客戶端與服務器同處一臺機器中,對於每個用戶,其庫應用程序與服務器程序組合成單個服務器進程。 2) 專用服務器(Dedicated Server)結構:在這種方式中,對於每個用戶,其數據庫應用是由用戶進程所運行,並有一個專用服務器進程爲之服務,執行Oracle服務器代碼。 3) 多線程服務器(Multithreaded Server)體系結構:在這種方式中,一個或多個客戶應用程序共享一組服務器進程,與專用服務器不一樣的是,客戶和服務器進程不是一對一的關係,而是由調度進程對多個服務器進程進行調度,以服務來自客戶應用的鏈接請求。
專用服務器
專用服務器的工做過程: 1) 客戶端經過oracle net向監聽器發鏈接請求 2) 監聽器收到請求並將此請求導向服務器,服務器向用戶返回一個鏈接成功信息,併爲此用戶建立一個專用服務器進程 3) 客戶直接與該專用服務器進程進行交互,處理SQL,而且服務器在該會話的PGA中創建一個專用SQL區。 若是客戶端要求創建專用服務器鏈接方式,能夠修改客戶羰的網絡配置文件tnsnames.ora或修改鏈接描述串。增長關鍵字「Server=DEDICATED」,如: prod= (DESCRIPTION= (ADDRESSLIST= (ADDRESS= (PROTOCOL=TCP)(HOST=192.168.0.3)(PORT=1521) (SERVER=DEDICATED) ) ) (CONNECT_DATA=(SID=PROD) ) ) 還必須修改SQLNET.ORA文件,增長「USE_DEDICATED_SERVER=TRUE」
多線程服務器體系結構 專用服務器結構中,一個服務器進程只爲一個客戶服務。這樣的話,若是有一千個客戶,就須要有一千個對應的服務器進程,就會耗費大量的系統資源。爲了支 持對於可伸縮性的需求,在oracle7中引入了多線程服務器(MTS,也稱爲共享服務器)。下面說明共享服務器創建鏈接的過程,以級與創建專用服務器連 接過程的不一樣: 1) 客戶經過網絡與監聽器聯繫 2) 監聽器檢測到請求,基於Oracle net結構來肯定是否與多線程服務器鏈接。監聽器將客戶請求導向相應的調度程序。 3) 監聽器經過使客戶與調度程序瞭解對方的網絡地址,從面完成了雙方的介紹。 4) 一旦客戶與調度程序知道如何找到對方,它們就直接通訊,不要須要監聽器。客戶直接將操做請求發送給高度程序。 5) 調度程序將客戶請求放在SGA的請求隊列中。 6) 下一個可用的共享服務器進程從請求隊列中讀取請求,進行相應的工做。 7) 共享服務器進程將結果存放在提交相應請求的調度程序的響應隊列中。 8) 調度程序從響應隊列中讀取數據並將結果送組客戶。
有幾個概念在這裏做個補充說明: 1) 監聽器(Listener):爲一個或多個實例「監聽」鏈接請求,它是oracle客戶與服務器的中介。監聽器不是Oracle實例的一部分,它的做用是將鏈接的請求導向相應的實例。 2) 調度程序(dispatcher):在MTS體系結構中,監聽器與調度程序聯繫,調度程序負責調度MTS中的各個共享服務器進程。
多線程服務器的設置參數有: MTS_SERVICE:多線程服務器名稱,通常爲數據庫名 MTS_DISPATCHERS:初始調度器個數 MTS_MAX_DISPATCHERS:調度器最大個數 MTS_SERVERS:共享服務器個數 MTS_MAX_SERVERS:最大共享服務器個數 多線程服務器的設置是經過對以上各個參數的設置完成的。格式以下: MTS_SERVICE=RS MTS_SERVERS=10 MTS_MAX_SERVERS=100 MTS_DISPATCHERS="(PROTOCOL=TCP)(POOL=YES)(MULT=YES)" MTS_DISPATCHERS="(PROTOCOL=IPX)(POOL=YES)(MULT=YES)" MTS_DISPATCHERS="(PROTOCOL=IPC)(POOL=YES)(MULT=YES)" MTS_MAX_DISPATCHERS=100
有關多線程服務器的數據字典以下: V$MTS V$DISPATCHER V$SHARED_SERVER V$CIRCULT 各字典的詳細說明請參考Oracle文檔。
Oracle實例的進程結構
這裏所講的里程是指Unix系統中的進程,在Windows中,Oracle是一個操做系統服務。 Oracle實例由內存區域和後臺進程組成。 Oracle實例分爲單進程實例(一個進程執行所有的Oracle代碼,只容許單個用戶存取)和多進程實例(由多個進程執行Oracle代碼的不一樣部分,對於每個鏈接的用戶都有一個進程,容許多個用戶同時使用)。 在多進程結構中,除服務器進程(請注意,此「服務器進程」不是指全部的實例中的進程,見下面的說明)外,還有其餘後臺進程,包括:Dnnn, DBWR, LGWR,ARCH,PMON,SMON,CKPT,RECO等。在數據庫啓動後,這些進程常駐操做系統。Oracle中全部進程的數量之和不能超過參數 PROCESS設定的值: sql>show parameter process 當Oracle客戶端應用程序與Oracle實例鏈接的時候,Oracle會產生一個服務器進程來爲這些客戶服務,此進程在widnows下表現爲線程。 此進程的主要做用有:對於用戶發出的SQL語句進行語法分析,編譯,執行用戶的SQL語句,如是數據塊不在數據緩衝區時,則從磁盤數據文件將數據讀入到 SGA的共享數據緩衝區中,將SQL語句的執行結果返回組應用程序。下面的語句用來查詢數據庫中的用戶會話信息。 sql>select substr(s.sid,1,3) sid,substr(s.serial#,1,5) ser,spid,substr(schemaname,1,10) schema,substr(type,1,3) typ,substr(decode((consistent_gets+block_gets),0,'None',(100*(consistent_gets+block_gets-physical_reads)/consistent_gets+block_gets))),1,4) "%hit",value cpu,substr(block_changes,1,5) bchng from v$process p,v$sesstat t,v$sess_io i,v$session s where i.sid=s.sid and p.addr=paddr(+) and s.sid=t.sid and t.statistic#=12; 結果中: sid 表示會話ID號, ser 表示會話serial#號,serial#與sid組合以惟一表示一個會話, spid 表示操做系統進程號, schema 表示數據庫用戶名, typ 表示進程類型,use爲用戶進程,bac爲後臺進程 %hit 表示數據緩衝區命中率, cpu 表示使用cpu的時間, bchng 表示修改了的數據塊的個數。
下面介紹各個後臺進程
1. DBWR進程 DBWR(Database Writer)進程將緩衝區中的數據寫入數據文件,負責數據緩衝區的管理。 當數據緩衝區中的一個數據被修改後,被標記爲「髒」,DBWR進程負責將「髒」數據寫入磁盤。 DBWR採用LRU算法來替換數據緩衝區中的數據。 DBWR的做用包括: 1) 管理數據緩衝區,以便服務器進程總能找到空閒緩衝區 2) 將全部修改後的緩衝區中的數據寫入數據庫文件 3) 使用LRU算法將最近使用過的塊保留在內存中 4) 經過延遲寫來優化磁盤i/o. 在下列狀況下DBWR要將髒數據寫入磁盤數據文件: 1) 當一個服務器進程將緩衝數據塊移「髒表」,面該髒表達到必定程度進。(該臨界長度由參數DB_BLOCK_WRITE_BATCH決定) 2) 當一個服務器進程在LRU表中查找DB_BLOCK_MAX_SCAN_CNT緩衝區時,沒有查到空閒的緩衝區 3) 出現超時 4) 檢查點發生時 在一個Oracle實例中,容許啓動多個DBWR進程,DBWR進程個數由參數DB_WRITE_PROCESSES指定,上限爲20,進程名依次自動命名爲:DBW0,DBW1,DBW2...DBW19。 sql>show parameter processes
2. LGWR進程 LGWR(Log Writer)進程將日誌數據從日誌緩衝區中寫入磁盤日誌文件中。 關於LGWR進程的工做時機能夠看我寫的第一篇《一次事務過程》。 LGWR的寫盤條件是: 1) 發生提交,即commit; 2) 日誌緩衝區達到總數的1/3時; 3) 超時; 4) DBWR進程須要爲檢驗點清除緩衝區時。 每個Oracle實例只有一個LGWR進程。 LGWR將日誌信息同步的寫入到日誌文件組的多個日誌成員中,若是組中的一個成員文件被刪除或不可以使用,LGWR將日誌信息繼續寫到該組的其餘文件中,不影響數據庫的運行。
3. SMON進程 SMON(System Monitor),系統監控進程,在實例啓動時執行實例恢復,並負責清理再也不使用的臨時段。
4. PMON進程 PMON(Process Monitor),進程監控里程,在服務器進程出現故障時執行進程恢復,負責清理內存內存和釋放該進程所使用的資源。
5. ARCH進程 ARCH(Archive Process,歸檔進程)在日誌存滿時將日誌信息寫到磁盤或磁帶,用於介質失敗時的恢復。 日誌信息首先產生於日誌緩衝區,再由日誌寫入進程LGWR將日誌數據寫入日誌文件組,日誌切換時,由歸檔進程ARCH將日誌數據從日誌文件組中寫入歸檔日誌中。 在 一個數據庫實例中,歸檔進程最多能夠啓動10個,進程名依次自動命名爲ARC0,ARC1,ARC2...ARC9,設置方法是:在參數文件中增長 參數LOG_ARCHIVE_MAX_PROCESSES。關於如何啓用數據庫的自動歸檔,在前面的《物理結構》一篇中已有說明,這裏說明一個幾個相關的 參數: 1) LOG_ARCHIVE_DEST:用於設置歸檔日誌的文件存儲目錄 2) LOG_ARCHIVE_DUBLEX_DEST:用於設置歸檔日誌文件的鏡像存儲目錄,此參數在oracle 8及以上的版本中支持 3) LOG_ARCHIVE_DEST_n:用於設置更多的鏡像目錄,其中,1<=n<=10,該參數有如下三個選項: (1)MANDATORY:表示必須完成此目錄的歸檔,才能夠切換。 (2)REOPEN:歸檔目錄或介質失敗後,需等多長時間能從新寫入日誌,默認時間爲300秒。 (3)OPTIONAL:無論是否歸檔完成都進行切換,這是默認方式 舉例以下: LOG_ARCHIVE_DEST_1='LOCATION=/u01/oracle/archive/ MANDATORY REOPEN=500' LOG_ARCHIVE_DEST_2='LOCATION=/u02/oracle/archive/ OPTIONAL' LOG_ARCHIVE_DEST_n只適用於oracle 8i及以上的版本。 4) LOG_ARCHIVE_DEST_STATE_n:用於對歸檔日誌目錄進行失效或生效,該參數與LOG_ARCHIVE_DEST_n一一相對應。如: LOG_ARCHIVE_DEST_STATE_1=DEFER LOG_ARCHIVE_DEST_STATE_2=ENABLE 此參數能夠在線設置: sql> ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=DEFER; 此參數只適用於oracle 10g及以上版本。
6. CKPT進程 CKPT(CheckPoint,檢查點)進程出現時,系統對所有數據庫文件及控制文件的文件頭的同步號進行修改,以保證數據庫的同步。 如下兩個參數是對CKPT有影響的: LOG_CHECKPOINT_TIMEOUT:決定產生一個檢驗點的時間間隔,單位爲秋,默認爲1800; LOG_CHECKPOINT_INTERVAL:執行一個檢驗點須要填充的日誌文件塊的數目,默認爲0,表示不起做用。 系統對於數據庫的改變信息用系統改變號SCN表示,SCN也叫檢驗點號,在日誌中用CHECKPOINT_CHANGE#表示,它是數據文件,日誌文件,控制文件的同步的同步依據,同時存儲在這三個中,在系統改變時,檢驗點號也會同時改變。 引發CKPT產生的主要時機有: 1)日誌切換時 2)達到LOG_CHECKPOINT_TIMEOUT指定的間隔時間 3)達到LOG_CHECKPOINT_INTERVAL指定的日誌塊數 4)數據庫關閉 5)DBA強制產生 6)表空間OFFLINE時
7. RECO進程 RECO(Recover,恢復)進程用於分佈式數據庫系統,RECO進程自動地解決在分佈式數據庫中的事務故障。
8. LCKn進程 LCKn(鎖進程)用於Oracle並行服務器環境下,用於多個實例間的封鎖,該進程最多能夠啓動10個。
9. Dnnn進程 Dnnn(Despatcher,調度)進程。用於多線程服務器體系結構中。
10. SNP進程 SNP是做業進程,主要用於分佈式數據庫中,進行數據庫之間快照的自動刷新,並同時通達DBMS_JOB程序包自動運行預約的存儲過程,SQL,PL/sql程序等。有兩個參數用來控制做業進程的計劃: 1) JOB_QUEUE_PROCESS:用於設置做業進程個數 2) JOB_QUEUE_INTERVAL:用於設置做業進程被週期性喚醒的時間間隔
後臺進程跟蹤信息 全部修改數據庫結構的命令會自動被後臺進程跟蹤記錄,跟蹤信息由oracle後臺進程自動存儲,跟蹤文件的名稱爲alter_SID。此文件的存儲目錄由參數BACKGROUND)DUMP_DEST指定。 能夠用工具命令TKPROF來格式化跟蹤文件,如: $tkprof oralogfile1.log 除了跟蹤後臺進程外,還能夠啓用參數SQL_TRACE對用戶的語句進行跟蹤。修改參數文件: TIMED_STATISTICS=TRUE USER_DUMP_DEST=目錄名 MAX_DUMP_FILE_SIZE=5M SQL_TRACE=TRUE 或者: SQL>ALTER SESSION SET SQL_TRACE=TRUE對當前會話進行SQL跟蹤。
鎖等待問題與KILL SESSION 爲了保證數據的一致性,系統提供鎖機制。有關鎖的概念能夠參數《數據庫系統概論》一書。要了解當前在等待鎖資源的用戶: sql>select a.username,a.sid,a,serial#,b.id1 from v$session,v$lock where a.lockwait=b.kaddr; 要了解鎖住其它用戶的用戶進程: SQL>SELECT A.USERNAME,A.SID,A,SERIAL#,B.ID1 FROM V$SESSION A,V$LOCK B WHERE B.ID1 IN (SELECT DISTINCT E.ID1 FROM V$SESSION D,V$LOCK E WHERE D.LOCKWAIT=E.KADDR) AND A.SID=B.SID AND B.REQUEST=0;