db_name和db_unique_name的區別
db_name和db_unique_name的區別
DB_NAME 資料庫名稱,也就是資料庫的名字標識。這裡,資料庫裡可能有多個例項,比如RAC裡的多節點,這多個節點是不同的例項,但是卻有相同的名字,它們的 DB_NAME是相同的但是Instance_name是不同的。DB_NAME會保持在資料檔案頭裡,所以更改DB_NAME不能僅僅修改parameter,還需要用nid 來進行更改,並且更改後還需要手工做些工作,使其生效。
DB_UNIQUE_NAME在HA的應用,Data guard會經常提及的,和DB_NAME不一樣的作用,在DG裡,要求物理DG,主從庫都有一樣的DB_NAME,雖然它們和RAC不一樣,並不是同一個庫。這裡是資料庫的唯一名字。但是它們的DB_UNIQUE_NAME是不一樣的,用以進行不同的標識。DB_UNQUIE_NAME會影響到service_names,也會影響到動態監聽的時候的service_name
比如如下片段
Service "zxdbdg1" has 1 instance(s).
Instance "zxdb", status BLOCKED, has 1 handler(s) for this service...
Service "zxdbdg1_XPT" has 1 instance(s).
Instance "zxdb", status BLOCKED, has 1 handler(s) for this service...
The command completed successfully
這裡的zxdbdg1就是dg中的從庫,從庫的db_name和主庫保持一樣為zxdb,DB_UNIQUE_NAME不同。在動態監聽後,註冊為zxdbdg1的service,啟動的instance_name還是zxdb。
Instance_name簡單講就是ORACLE_SID,oracle裡透過ORSCLE_SID來管理不同的資料庫例項。
另外,上面的動態監聽資訊裡出現了Instance "zxdb", status BLOCKED
這裡是因為從庫資料庫不是open狀態。
1、db_name 資料庫名
SQL> connect xys/manager as sysdba
已連線。
SQL> show user
USER 為 "SYS"
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string test1
db_name是資料庫的名字,oracle本身可能是比較有用的,對我們而言沒有什麼太多的用處,db_name記錄在controlfile,datafile_header,redo中,要想修改db_name是比較麻煩的有兩種辦法:1、重建controlfile,之後要求必須以reseglogs方式開啟資料庫;2、透過nid。另外在建庫時db_name被限制為最長8個字元,儘管10g在建立時沒有錯誤提示了,但是看看庫裡最多能存下幾個字元就明白了,為什麼即使輸入超過8個字元不會報錯,但是最終還是被截斷了。
SQL> desc v$database;
名稱 是否為空? 型別
----------------------------------------- -------- ------------------------
DBID NUMBER
NAME VARCHAR2(9)
因此在建庫時指定恰當的db_name還是非常重要的。db_name還有一個非常重要的作用就是動態註冊監聽,不管是否指定了service_name,或者說service_name的值是什麼,pmon都會使用db_name動態註冊監聽的。
SQL> host lsnrctl status
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 03-12月-2007 10:1
9:36
Copyright (c) 1991, 2005, Oracle. All rights reserved.
正在連線到 (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER 的 STATUS
------------------------
別名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
啟動日期 03-12月-2007 09:29:47
正常執行時間 0 天 0 小時 49 分 50 秒
跟蹤級別 off
安全性 ON: Local OS Authentication
SNMP OFF
監聽程式日誌檔案 e:/oracle/product/10.2.0/db_1/network/log/listener.log
監聽端點概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1521)))
服務摘要..
服務 "TEST2.COM" 包含 1 個例程。
例程 "inst_test", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "TEST3.COM" 包含 1 個例程。
例程 "inst_test", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "test1.COM" 包含 1 個例程。
例程 "inst_test", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "test1_XPT.COM" 包含 1 個例程。
例程 "inst_test", 狀態 READY, 包含此服務的 1 個處理程式...
命令執行成功
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string TEST2, TEST3
我們發現service_names的值是TEST2, TEST3,但是lsnrctl status顯示的結果中包含了“服務 "test1.COM" 包含 1 個例程。
例程 "inst_test", 狀態 READY, 包含此服務的 1 個處理程式...”
2、instnace_name 例項名
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string inst_test
instance_name除了動態註冊監聽用到之外,到目前為止我沒有發現其它用處,也許oracle用它來區分各個例項?不過相信僅僅透過instance_name也不能完全區分,至少也得用到sid吧,看看上面顯示出來的動態註冊監聽中的資訊,其中inst_test就是instance_name
3、SID:System Identifier
The SID identifies the instance's shared memory on a host, but may not uniquely distinguish this instance from other instances
doc上把sid解釋為在host上用sid來標識例項的共享記憶體的,可見sid主要是和os打交道的。
sid可以透過如下語句在庫中查詢:
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
tsid
儘管v$instance中欄位 instance_name 看起來是例項名,但是實際上儲存的是sid,在win下sid不能重複,不管oracle_home是否相同,相同當然不行,主要是不同也不行,這裡的不同是針對unix/linux而言的,在unix/linux下只要不同版本的oracle安裝在不同的oracle_home下就可以建立相同sid的例項,但是win下不可以,這不是由oracle決定的,主要是受到windows服務的限制,在服務中不能存在服務名相同的oracle服務,服務名是由如下格式組成的:OracleServiceSID,因為服務名中包括了sid,所以sid如果相同了,服務名就相同了,這是windows所不允許的。因此在win下無法建立相同sid的不同例項。
4、service_names 服務名
服務名是複數,意味著service_names 可以是多個值,這裡的服務名除了在動態註冊監聽中被用到之外,沒有發現其它用處,dataguard中建議在primary,standby上使用相同的service_names,這樣可能便於儘可能的實現透明切換,前提是如果沒有配置靜態靜聽的話,當然如果配置了靜態註冊的監聽在primary,standby上也務必保持在listener中要求輸入的服務名相同,還是那句話,儘可能的實現透明切換。
下面查詢可以顯示service_names:
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string TEST2, TEST3
這裡指定了2個值test2,test3,再來看看動態註冊的監聽是如何使用服務名的,監聽的部分狀態資訊如下:
服務 "TEST2.COM" 包含 1 個例程。
例程 "inst_test", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "TEST3.COM" 包含 1 個例程。
例程 "inst_test", 狀態 READY, 包含此服務的 1 個處理程式...
這裡我們看到顯示出來的服務名有字尾com,是因為我設定了db_domain
5、db_domain 資料庫域名
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string COM
doc上說它被"."分割,包括句點最多128個字元,沒見過這麼長的,不知道,沒有驗證過,db_domain 的作用主要是用在分散式資料庫中,分散式事務的各個資料庫應該有db_domain ,但是要求他們是否相同,doc上沒說,不過高階複製中要同步的物件所在的資料庫是無論如何也要設定db_domain 的,是否要求相同也不得而知了,我在配置複製的時候把db_domain 設定為相同的了。介紹db_domain 的另一個用途就是在同一個os域中如果要建立同名db_name的資料庫時建議最好讓具有相同db_name的資料庫具有不同的db_domain,以保證在同一個域中global_name是唯一的。doc上也是這樣建議的:Oracle recommends that you specify DB_DOMAIN as a unique string for all databases in a domain
當指定了db_domain的時候,在建立db link時會自動在db_link的後面加上db_domain(doc:If you omit the domains from the name of a database link, Oracle expands the name by qualifying the database with the domain of your local database as it currently exists in the data dictionary, and then stores the link name in the data dictionary. The characters valid in a database domain name are: alphanumeric characters, underscore (_), and number sign (#).),9i好像記得是這樣的,但是10g我驗證了一下不是:
SQL> create database link dbl_test using 'orcl';
資料庫連結已建立。
SQL> select db_link from dba_db_links;
DB_LINK
----------------------------------------------------------------------------
DBL
DBL_TEST
ORCL
還有一點需要主要的是:You must set this parameter for every instance, and multiple instances must have the same value in Real Application Clusters
6、global_name 全域性資料庫名
global_name 是由db_name.db_domain構成的,doc如下:
Understanding How Global Database Names Are Formed
A global database name is formed from two components: a database name and a domain. The database name and the domain name are determined by the following initialization parameters at database creation:
Component Parameter Requirements Example
Database name DB_NAME Must be eight characters or less. sales
Domain containing the database DB_DOMAIN Must follow standard Internet conventions. Levels in domain names must be separated by dots and the order of domain names is from leaf to root, left to right. us.acme.com
但是透過驗證發現oracle並沒有把db_name.db_domain和global_name 同步起來,不知道為什麼?global_name oracle是透過提供了一個view,sys.global_name,該視圖是源於props$的,可以檢視建立view的指令碼,最終我們訪問的是一個public synonym global_name:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------
test1
按照doc的意思,我上面看到的查詢結果應該是test1.com才對,不過我們也可以修改global_name:
SQL> alter database rename global_name to test1.com;
資料庫已更改。
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
TEST1.COM
SQL> alter database rename global_name to test123.com;
資料庫已更改。
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
TEST123.COM
SQL>
需要注意的是一旦加上了域就不能透過上面的命令去掉了,如:
SQL> alter database rename global_name to test123.com;
資料庫已更改。
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
TEST123.COM
SQL> alter database rename global_name to test1;
資料庫已更改。
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
TEST1.COM
SQL> alter database rename global_name to test123;
資料庫已更改。
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
TEST123.COM
不過可以直接update global_name 或者props$來去掉字尾:
SQL> update global_name set global_name='test1';
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from global_name;
GLOBAL_NAME
---------------------------------------------------------------
test1
global_name 的作用主要也是用在Distributed Database中,我只在高階複製中用過global_name
7、global_names 是一個布林值,為什麼要提它,是因為global_names和global_name看起來很相似,global_names的作用是建立db link時是否強制使用遠端資料庫的global_name,如果global_names=true,則db link name必須要求是remote database的global_name,否則建立之後db link 不能連通,測試如下,預設值是false
SQL> show parameter global_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean TRUE
SQL> select count(*) from t_emp@dbl;
select count(*) from t_emp@dbl
*
第 1 行出現錯誤:
ORA-02085: 資料庫連結 DBL 連線到 ORCL
SQL> col db_link format a10
SQL> col host format a10
SQL> col owner format a10
SQL> col username format a10
SQL> select * from dba_db_links;
OWNER DB_LINK USERNAME HOST CREATED
---------- ---------- ---------- ---------- --------------
SYS DBL TEST orcl 01-12月-07
SYS ORCL TEST orcl 01-12月-07
SQL> select count(*) from t_emp@orcl;
COUNT(*)
----------
4
8、在透過netmanager配置靜態監聽註冊時,需要輸入的全域性資料庫名(GLOBAL_DBNAME )到底應該輸入什麼?而透過netmanager配置網路服務命名(tns)是需要輸入的服務名(SERVICE_NAME )又是什麼?
listener.ora內容如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = test)
(ORACLE_HOME = E:/oracle/product/10.2.0/db_1)
(SID_NAME = tsid)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
tnsnames.ora內容如下:
TEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test)
)
)
這裡明確的告訴大家,配置靜態監聽註冊時,需要輸入的全域性資料庫名(GLOBAL_DBNAME )輸入什麼都可以,只要保證listerner.ora中的GLOBAL_DBNAME和tnsnames.ora中的SERVICE_NAME保持一致就可以,下面透過實驗看看效果:
值得注意的是GLOBAL_DBNAME = test,而此時資料庫的db_name和global_name以及service_names分別如下顯示:
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string test1
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
test1
SQL> alter database rename global_name to abcd.yu;
資料庫已更改。
SQL> select *from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
ABCD.YU
SQL> show parameter service_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string TEST2, TEST3
而我在配置listener和tnsnames時提供的test和db_name,globla_name,service_name沒有任何關係,然後看看tnsping的效果:
C:/>tnsping test
已使用 TNSNAMES 介面卡來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = xys)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = test)))
OK (30 毫秒)
9、db_unique_name
DB_UNIQUE_NAME是10g的引數,在配置dataguard環境時必須為處於dg環境中每個db設定一個唯一值,在沒有DB_UNIQUE_NAME引數之前,在同一臺機器上搭建dg時必須使用引數LOCK_NAME_SPACE在standby引數檔案中,10g有了引數db_unique_name,LOCK_NAME_SPACE已經被廢棄。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24742969/viewspace-1614022/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 叢集修改OCR中記錄的db_unique_name以及db_name
- Oracle修改instance_name、db_name、db_unique_name、service_namesOracle
- ../和./和/的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ||和??的區別
- /*和/**的區別
- jquery $(this) 和this的區別jQuery
- JQuery this和$(this)的區別jQuery
- T和?的區別
- makefile =和:=的區別
- ++a和a++的區別
- ./ 和sh 的區別
- 和區別
- springmvc和springboot的區別SpringMVCSpring Boot
- SDK和API的區別?API
- ArrayList和LinkedList的區別?
- button和submit的區別MIT
- MTV和MVC的區別MVC
- hadoop和spark的區別HadoopSpark
- rpop 和 brpop的區別
- WebApi和MVC的區別WebAPIMVC
- GET和POST的區別?
- ArrayList和LinkedList的區別
- WBS和TASK的區別?
- JavaScript中for in 和for of的區別JavaScript
- innerText 和 textContent 的區別?
- var 和 let 的區別
- @JsonProperty和@JsonAlias的區別JSON
- POST 和 GET 的區別
- sass和less的區別
- MySQL和Oracle的區別MySqlOracle
- sizeThatFits 和 sizeToFit的區別
- GitHub和GitLab的區別GithubGitlab
- Js中for in 和for of的區別JS
- isKindOfClass和isMemberOfClass的區別
- innerText和textContent的區別
- cookie和session的區別CookieSession
- require 和 import 的區別?UIImport