詳解:數據庫名、實例名、ORACLE_SID、數據庫域名、全局數據庫名、服務名及手工腳本創建oracle數據庫


數據庫名、實例名、數據庫域名、全局數據庫名、服務名 ,
這是幾個令很多初學者容易混淆的概念。相信很多初學者都與我一樣被標題上這些個概念搞得一頭霧水。我們現在就來把它們弄個明白。

一、數據庫名
什么是數據庫名?
數據庫名就是一個數據庫的標識,就像人的身份證號一樣。他用參數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並行服務器架構(即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:協議適配器錯誤”。

數據庫實例名與網絡連接
數據庫實例名除了與操作系統交互外,還用於網絡連接的oracle服務器標識。當你配置oracle主機連接串的時候,就需要指定實例名。當然8i以后版本的網絡組件要求使用的是服務名SERVICE_NAME。這個概念接下來說明 。

三、數據庫域名
什么是數據庫域名?
在分布工數據庫系統中,不同版本的數據庫服務器之間,不論運行的操作系統是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

四、數據庫服務名
什么是數據庫服務名?
從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數據庫。

    一個完整的數據庫系統,應包括一個物理結構、一個邏輯結構、一個內存結構和一個進程結構,如果要創建一個新的數據庫,則這些結構都必須完整的建立起來。

一、在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

二、在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;

一、啟動數據
$sqlplus "sys/pass as sysdba"
sql>startup

二、啟動監聽器
  數據庫啟動后,如果未啟動監聽進程,則客戶端無法與數據庫連接。監聽進程的啟動方法為:
$lsnrctl start
在widnows中,可以從服務列表中啟動監聽器。
監聽里程配置文件為listener.ora,位於目錄/home/app/oracle/product/10.1.0/db1/network/admin/。
此配置文件分為兩部分,一部分為監聽程序本身的配置,包括協議,地址,端口號等;另一部分為監聽程序所連接的數據庫的實例信息,包括:實例名,全局數據庫名,oracle主目錄等。監聽器可以利用oracle net config 向導來配置。
要顯示監聽器的運行狀態:$lsnrctl status;
要停止監聽器:$lsnrctl stop。

三、數據庫的啟動過程
  分為三個階段:

  1. 啟動實例,包括以下操作:
  1. 讀取參數文件
  2. 分配SGA
  3. 啟動后台進程
    2.裝載數據庫
      裝載數據庫是將數據庫與已啟動的實例相聯系。數據庫裝載后,數據庫保持關閉狀態。
    3.打開數據庫
      此步驟使用數據庫可以進行正常的操作的處理。主要是打開控制文件,數據庫文件和日志文件。

四、數據庫啟動參數
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

五、數據庫的關閉
  與啟動過程相對應,關閉包括三個過程
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數據庫體系結構 之四: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將日志信息繼續寫到該組的其他文件中,不影響數據庫的運行。
  1. SMON進程
      SMON(System Monitor),系統監控進程,在實例啟動時執行實例恢復,並負責清理不再使用的臨時段。

  2. PMON進程
      PMON(Process Monitor),進程監控里程,在服務器進程出現故障時執行進程恢復,負責清理內存內存和釋放該進程所使用的資源。

  3. 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及以上版本。
  1. 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時

  2. RECO進程
      RECO(Recover,恢復)進程用於分布式數據庫系統,RECO進程自動地解決在分布式數據庫中的事務故障。

  3. LCKn進程
      LCKn(鎖進程)用於Oracle並行服務器環境下,用於多個實例間的封鎖,該進程最多可以啟動10個。

  4. Dnnn進程
      Dnnn(Despatcher,調度)進程。用於多線程服務器體系結構中。詳見下一篇《Oracle連接配置結構》

  5. 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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM