資料庫名、執行個體名、資料庫域名、全局資料庫名、服務名
這是幾個令非常多剛開始學習的人easy混淆的概念。相信非常多剛開始學習的人都與我一樣被标題上這些個概念搞得一頭霧水。我們如今就來把它們弄個明确。
一、資料庫名
什麼是資料庫名?
資料庫名就是一個資料庫的辨別,就像人的身份證号一樣。他用參數DB_NAME表示,如果一台機器上裝了多全資料庫,那麼每個資料庫都有一個資料庫名。在資料庫安裝或建立完畢之後,參數DB_NAME被寫入參數檔案之中。格式例如以下:
DB_NAME=myorcl
...
在 建立資料庫時就應考慮好資料庫名,而且在建立完資料庫之後,資料庫名不宜改動,即使要改動也會非常麻煩。由于,資料庫名還被寫入控制檔案裡,控制檔案是以 二進制型式存儲的,使用者無法改動控制檔案的内容。如果使用者改動了參數檔案裡的資料庫名,即改動DB_NAME的值。可是在Oracle啟動時,由于參數文 件中的DB_NAME與控制檔案裡的資料庫名不一緻,導緻資料庫啟動失敗,将傳回ORA-01103錯誤。
資料庫名的作用
資料庫名是在安裝資料庫、建立新的資料庫、建立資料庫控制檔案、改動資料結構、備份與恢複資料庫時都須要使用到的。
有非常多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
方法三:檢視參數檔案。
改動資料庫名
前面建議:應在建立資料庫時就确定好資料庫名,資料庫名不應作改動,由于改動資料庫名是一件比較複雜的事情。那麼如今就來說明一下,怎樣在已建立資料之後,改動資料庫名。過程例如以下:
1.關閉資料庫。
2.改動資料庫參數檔案裡的DB_NAME參數的值為新的資料庫名。
3.以NOMOUNT方式啟動執行個體,修建控制檔案(有關建立控制檔案的指令文法,請參考oracle文檔)
二、資料庫執行個體名
什麼是資料庫執行個體名?資料庫執行個體名是用于和作業系統進行聯系的辨別,就是說資料庫和作業系統之間的互動用的是資料庫執行個體名。執行個體名也被寫入參數檔案裡,該參數為instance_name,在winnt平台中,執行個體名同一時候也被寫入注冊表。
資料庫名和執行個體名能夠同樣也能夠不同。
在普通情況下,資料庫名和執行個體名是一對一的關系,但假設在oracle并行server架構(即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:協定擴充卡錯誤”。
資料庫執行個體名與網絡連接配接
資料庫執行個體名除了與作業系統互動外,還用于網絡連接配接的oracleserver辨別。當你配置oracle主機連接配接串的時候,就須要指定執行個體名。當然8i以後版本号的網絡元件要求使用的是服務名SERVICE_NAME。這個概念接下來說明 。
三、資料庫域名
什麼是資料庫域名?
在分布工資料庫系統中,不同版本号的資料庫server之間,不論執行的作業系統是unix或是windows,各server之間都能夠通過資料庫鍊路進行遠端複制,資料庫域名主要用于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
四、資料庫服務名
什麼是資料庫服務名?從oracle9i版本号開始,引入了一個新的參數,即資料庫服務名。參數名是SERVICE_NAME。
假設資料庫有域名,則資料庫服務名就是全局資料庫名;否則,資料庫服務名與資料庫名同樣。
查詢資料庫服務名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
資料庫服務名與網絡連接配接從oracle8i開如的oracle網絡元件,資料庫與client的連接配接主機串使用資料庫服務名。之前用的是ORACLE_SID,即資料庫執行個體名
建立Oracle資料庫(以Oracle10g為例)
有兩種建立資料庫的方式,一種是以指令行腳本方式,即手動方式建立;還有一種是利用Oracle提供的資料庫配置向導來建立。本篇主要介紹在Unix和Windows下以指令行腳本方式建立Oracle資料庫。
一個完整的資料庫系統,應包含一個實體結構、一個邏輯結構、一個記憶體結構和一個程序結構,假設要建立一個新的資料庫,則這些結構都必須完整的建立起來。
一、在Unix下建立資料庫
1.确定資料庫名、資料庫執行個體名和服務名
關于資料庫名、資料庫執行個體名和服務名,我之前有專門用一篇來具體介紹。這裡就不再說明了。
2.建立參數檔案 參數檔案非常确定了資料庫的整體結構。Oracle10g有兩種參數檔案,一個是文本參數檔案,一種是server參數檔案。在建立資料庫時先建立文本參數檔案, 在資料庫建立後,能夠由檔案參數檔案建立server參數檔案。文本參數檔案的取名方式為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:最大程序數,包含背景程序與server程序
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
DEFAULT TEMPORARY TALESPACE temp TEMPFILE
'/home1/app/oracle/product/10.1.0/oradata/myoracle/temp01.dbf' size 325m
DEFAULT TABLESPACE users DATAFILE
'/home1/app/oracle/product/10.1.0/oradata/myoracle/usertbs01.dbf' size 1000m
CHARACTER SET ZHS16GBK;
這裡說明一下CREATE DATABASE語句的各個keyword的含義:
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
二、在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
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;
一、啟動資料$sqlplus "sys/pass as sysdba"
sql>startup
二、啟動監聽器資料庫啟動後,假設未啟動監聽程序,則client無法與資料庫連接配接。監聽程序的啟動方法為:
$lsnrctl start
在widnows中,能夠從服務清單中啟動監聽器。
監聽裡程配置檔案為listener.ora,位于檔案夾/home/app/oracle/product/10.1.0/db1/network/admin/。
此配置檔案分為兩部分,一部分為監聽程式本身的配置,包含協定,位址,port号等;還有一部分為監聽程式所連接配接的資料庫的執行個體資訊,包含:執行個體名,全局資料庫名,oracle主檔案夾等。監聽器能夠利用oracle net config 向導來配置。
要顯示監聽器的執行狀态:$lsnrctl status;
要停止監聽器:$lsnrctl stop。
三、資料庫的啟動過程
分為三個階段:
1. 啟動執行個體,包含下面操作:
1) 讀取參數檔案
2) 配置設定SGA
3) 啟動背景程序
2.裝載資料庫
裝載資料庫是将資料庫與已啟動的執行個體相聯系。資料庫裝載後,資料庫保持關閉狀态。
3.打開資料庫
此步驟使用資料庫能夠進行正常的操作的處理。主要是打開控制檔案,資料庫檔案和日志檔案。
四、資料庫啟動參數
1.NOMOUNT:僅僅啟動執行個體,不裝載資料庫
2.MOUNT:啟動執行個體,并裝載資料,但不打開資料庫
sql>startup mount
3.READ ONLY:将資料庫置為僅僅讀
sql>alter database open read only
4.READ WRITE:以可讀寫方式打開資料,這是預設方式
sql>alter database open read write
5.OPEN:打開資料庫,這是預設方式
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
五、資料庫的關閉與啟動過程相相應,關閉包含三個過程
1).關閉資料庫
2).解除安裝資料庫
3).關閉資料庫執行個體
1.NORMAL關閉方式
NORMAL關閉方式是正常關閉方式,是預設關閉方式。在這樣的關機方式下,資料庫server必須等待全部client從Oracle中正常退出時,才幹夠關閉資料庫。
SQL>SHUTDOWN NORMAL
2.IMMEDIATE關閉方式
使用這樣的方式關閉資料庫時,系統将連接配接到資料庫的所實使用者尚未送出的事務所有回退,中斷連接配接,然後關閉資料庫。
SQL>SHUTDOWN IMMEDIATE
3.ABORT關閉方式
ABORT關閉方式為異常方式,使用這樣的方式關閉資料庫時,系統馬上将資料庫執行個體關閉,對事務膛資料完整性不作檢查。是最快的關機方式。
sql>shutdown abort;
4.TRANSACTIONAL關閉方式
在這樣的關機方式中,資料庫必須等待全部的客戶執行的事務結束,送出或回退。
sql>shutdown transactional
Oracle資料庫的連接配接結構有三種:1) 組合使用者與server結構:在這樣的連接配接方式中,client與server同處一台機器中,對于每個使用者,其庫應用程式與server程式組合成單個server程序。
2) 專用server(Dedicated Server)結構:在這樣的方式中,對于每個使用者,其資料庫應用是由使用者程序所執行,并有一個專用server程序為之服務,執行Oracleserver代碼。
3) 多線程server(Multithreaded Server)體系結構:在這樣的方式中,一個或多個客戶應用程式共享一組server程序,與專用server不同的是,客戶和server程序不是一對一的關系,而是由排程程序對多個server程序進行排程,以服務來自客戶應用的連接配接請求。
專用server
專用server的工作過程:
1) client通過oracle net向監聽器發連接配接請求
2) 監聽器收到請求并将此請求導向server,server向使用者傳回一個連接配接成功資訊,并為此使用者建立一個專用server程序
3) 客戶直接與該專用server程序進行互動,處理SQL,而且server在該會話的PGA中建立一個專用SQL區。
假設client要求建立專用server連接配接方式,能夠改動客戶羰的網絡配置檔案tnsnames.ora或改動連接配接描寫叙述串。添加keyword“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”
多線程server體系結構
專用server結構中,一個server程序僅僅為一個客戶服務。這種話,假設有一千個客戶,就須要有一千個對應的server程序,就會耗費大量的系統資源。為了支 持對于可伸縮性的需求,在oracle7中引入了多線程server(MTS,也稱為共享server)。以下說明共享server建立連接配接的過程,以級與建立專用server連 接過程的不同:
1) 客戶通過網絡與監聽器聯系
2) 監聽器檢測到請求,基于Oracle net結構來确定是否與多線程server連接配接。監聽器将客戶請求導向對應的排程程式。
3) 監聽器通過使客戶與排程程式了解對方的網絡位址,從面完畢了兩方的介紹。
4) 一旦客戶與排程程式知道怎樣找到對方,它們就直接通信,不要須要監聽器。客戶直接将操作請求發送給高度程式。
5) 排程程式将客戶請求放在SGA的請求隊列中。
6) 下一個可用的共享server程序從請求隊列中讀取請求,進行對應的工作。
7) 共享server程序将結果存放在送出對應請求的排程程式的響應隊列中。
8) 排程程式從響應隊列中讀取資料并将結果送組客戶。
有幾個概念在這裡作個補充說明:1) 監聽器(Listener):為一個或多個執行個體“監聽”連接配接請求,它是oracle客戶與server的中介。監聽器不是Oracle執行個體的一部分,它的作用是将連接配接的請求導向對應的執行個體。
2) 排程程式(dispatcher):在MTS體系結構中,監聽器與排程程式聯系,排程程式負責排程MTS中的各個共享server程序。
多線程server的設定參數有:
MTS_SERVICE:多線程server名稱,一般為資料庫名
MTS_DISPATCHERS:初始排程器個數
MTS_MAX_DISPATCHERS:排程器最大個數
MTS_SERVERS:共享server個數
MTS_MAX_SERVERS:最大共享server個數
多線程server的設定是通過對以上各個參數的設定完畢的。格式例如以下:
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
有關多線程server的資料字典例如以下:
V$MTS
V$DISPATCHER
V$SHARED_SERVER
V$CIRCULT
各字典的具體說明請參考Oracle文檔。
Oracle執行個體的程序結構
這裡所講的裡程是指Unix系統中的程序,在Windows中,Oracle是一個作業系統服務。
Oracle執行個體由記憶體區域和背景程序組成。
Oracle執行個體分為單程序執行個體(一個程序運作全部的Oracle代碼,僅僅同意單個使用者存取)和多程序執行個體(由多個程序運作Oracle代碼的不同部分,對于每個連接配接的使用者都有一個程序,同意多個使用者同一時候使用)。
在多程序結構中,除server程序(請注意,此“server程序”不是指全部的執行個體中的程序,見以下的說明)外,還有其它背景程序,包含:Dnnn, DBWR, LGWR,ARCH,PMON,SMON,CKPT,RECO等。在資料庫啟動後,這些程序常駐作業系統。Oracle中全部程序的數量之和不能超過參數 PROCESS設定的值:
sql>show parameter process
當Oracleclient應用程式與Oracle執行個體連接配接的時候,Oracle會産生一個server程序來為這些客戶服務,此程序在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 表示資料庫username,
typ 表示程序類型,use為使用者程序,bac為背景程序
%hit 表示資料緩沖區命中率,
cpu 表示使用cpu的時間,
bchng 表示改動了的資料塊的個數。
以下介紹各個背景程序
1. DBWR程序
DBWR(Database Writer)程序将緩沖區中的資料寫入資料檔案,負責資料緩沖區的管理。
當資料緩沖區中的一個資料被改動後,被标記為“髒”,DBWR程序負責将“髒”資料寫入磁盤。
DBWR採用LRU算法來替換資料緩沖區中的資料。
DBWR的作用包含:
1) 管理資料緩沖區,以便server程序總能找到空暇緩沖區
2) 将全部改動後的緩沖區中的資料寫入資料庫檔案
3) 使用LRU算法将近期使用過的塊保留在記憶體中
4) 通過延遲寫來優化磁盤i/o.
在下列情況下DBWR要将髒資料寫入磁盤資料檔案:
1) 當一個server程序将緩沖資料塊移“髒表”,面該髒表達到一定程度進。(該臨界長度由參數DB_BLOCK_WRITE_BATCH決定)
2) 當一個server程序在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),程序監控裡程,在server程序出現問題時運作程序恢複,負責清理記憶體記憶體和釋放該程序所使用的資源。
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并行server環境下,用于多個執行個體間的封鎖,該程序最多能夠啟動10個。
9. Dnnn程序
Dnnn(Despatcher,排程)程序。用于多線程server體系結構中。
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;