Environment:
DB : SQL Server 2008
client framework : .Net Framework 3.5
Test Code:
Case1 : use connection pool, 3000 times select table
SqlConnection sqlconn = new SqlConnection();
sqlconn.ConnectionString = "Network Library=DBMSSOCN;Data Source=serverip,port;
Initial Catalog=wgs;User ID=your id; Password=your password;"+
"Min Pool Size=0; Max Pool Size=8;
Connection Timeout=3;Connection Lifetime=10";
//"Pooling=false; Connect Timeout=3";
string queryString = "SELECT * FROM dbo.yourtable;";
//Console.WriteLine("State: {0}", sqlconn.ConnectionString);
SqlCommand command = new SqlCommand(queryString, sqlconn);
DateTime beging = DateTime.Now;
int n = 0;
while (n < 3000) {
sqlconn.Open();
SqlDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
//Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
}
}
finally
{
// Always call Close when done reading.
reader.Close();
}
n=n+1;
sqlconn.Close();
//Console.WriteLine("State: {0}", sqlconn.State);
}
DateTime end = DateTime.Now;
Console.WriteLine("Cost Time: {0}", end.Subtract(beging));
Case2 :don't use connection pool, 3000 times select table
SqlConnection sqlconn = new SqlConnection();
sqlconn.ConnectionString = "Network Library=DBMSSOCN;Data Source=serverip,port;
Initial Catalog=wgs;User ID=your id; Password=your password;"+
"Pooling=false; Connect Timeout=3";
string queryString = "SELECT * FROM dbo.yourtable;";
//Console.WriteLine("State: {0}", sqlconn.ConnectionString);
SqlCommand command = new SqlCommand(queryString, sqlconn);
DateTime beging = DateTime.Now;
int n = 0;
while (n < 3000) {
sqlconn.Open();
SqlDataReader reader = command.ExecuteReader();
try
{
while (reader.Read())
{
//Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
}
}
finally
{
// Always call Close when done reading.
reader.Close();
}
n=n+1;
sqlconn.Close();
//Console.WriteLine("State: {0}", sqlconn.State);
}
DateTime end = DateTime.Now;
Console.WriteLine("Cost Time: {0}", end.Subtract(beging));
Conclusion:
Case1: cost 4.1~.4.3 seconds.
Case2: cost up 25 seconds.
Using Connection Pool is a good solution.
2010年4月15日 星期四
2010年1月28日 星期四
.Net Framework Provider for Oacle
最近有需求在.net(C#) + oracle 環境 加上Connection Pool,
在網路上用google大神,仔細比較了幾種方式:
1.Oracle 提供的 Interface or API
2.Vender 寫的Client呼叫 Oracle的
為了有 connection pool 機制,又可以用OCI,所選擇的連線方式:
使用 Oracle 的 .NET Framework 資料提供者
Oracle 的 .NET Framework 資料提供者利用由 Oracle 用戶端軟體所提供的「Oracle 呼叫介面 (OCI)」,來存取 Oracle 資料庫。
Oracle 的 .NET Framework 資料提供者系統需求
Oracle 的 .NET Framework 資料提供者需要 Microsoft Data Access Components (MDAC) 2.6 (含) 以後版本。建議使用 MDAC 2.8 SP1。
您還必須安裝 Oracle 8i 3 版 (8.1.7) 用戶端 (含) 以後版本。
Oracle 9i 版之前的 Oracle 用戶端軟體無法存取 UTF16 資料庫,因為 UTF16 是 Oracle 9i 的新功能。若要使用此功能,您必須將用戶端軟體升級至 Oracle 9i (含) 以後版本。
Connection Pooling for the .NET Framework Data Provider for Oracle
Enlisting in Distributed Transactions
OracleConnection.ConnectionString Property
在網路上用google大神,仔細比較了幾種方式:
1.Oracle 提供的 Interface or API
2.Vender 寫的Client呼叫 Oracle的
為了有 connection pool 機制,又可以用OCI,所選擇的連線方式:
使用 Oracle 的 .NET Framework 資料提供者
Oracle 的 .NET Framework 資料提供者利用由 Oracle 用戶端軟體所提供的「Oracle 呼叫介面 (OCI)」,來存取 Oracle 資料庫。
Oracle 的 .NET Framework 資料提供者系統需求
Oracle 的 .NET Framework 資料提供者需要 Microsoft Data Access Components (MDAC) 2.6 (含) 以後版本。建議使用 MDAC 2.8 SP1。
您還必須安裝 Oracle 8i 3 版 (8.1.7) 用戶端 (含) 以後版本。
Oracle 9i 版之前的 Oracle 用戶端軟體無法存取 UTF16 資料庫,因為 UTF16 是 Oracle 9i 的新功能。若要使用此功能,您必須將用戶端軟體升級至 Oracle 9i (含) 以後版本。
Connection Pooling for the .NET Framework Data Provider for Oracle
Enlisting in Distributed Transactions
OracleConnection.ConnectionString Property
2010年1月27日 星期三
Oracle Connection Pool integrate with Microsoft .Net
List all methods of .net connection to oralce , then choice one which has connection pool.
Oracle Database on Windows and .NET FAQ
Oracle offers a variety of data access methods for COM-based, .NET-based, and Win32/64-based programming languages. Oracle developers can use any one of the following data access drivers based on the Windows programming language employed:
.NET: Oracle Data Provider for .NET, OLE DB.NET via Oracle Provider for OLE DB, ODBC.NET via Oracle ODBC Driver
COM: Oracle Objects for OLE (OO4O), Oracle Provider for OLE DB via Microsoft's ActiveX Data Objects (ADO)
PL/SQL and Java (server-side programming) to COM Automation servers (e.g. Microsoft Office): COM Automation Feature
Win32/64: ODBC Driver, Oracle Call Interface (OCI), Oracle Provider for OLE DB
Pooling=>
Solution 1
Oracle Data Provider.NET (ODP) and built a C# window service.
Getting Started with Oracle Data Provider for .NET (C# Version)
Solution 2
Connection Pooling in ADO .NET
reference from Connection Pooling in ADO .NET
ODBC V.S. OLEDB V.S. ODP Performance
reference from here
Oracle odbc 插入一萬筆要51秒,而OleDB只要14秒,用Oracle donet client 只要八秒
MDAC Architecture
Oracle Database on Windows and .NET FAQ
Oracle offers a variety of data access methods for COM-based, .NET-based, and Win32/64-based programming languages. Oracle developers can use any one of the following data access drivers based on the Windows programming language employed:
.NET: Oracle Data Provider for .NET, OLE DB.NET via Oracle Provider for OLE DB, ODBC.NET via Oracle ODBC Driver
COM: Oracle Objects for OLE (OO4O), Oracle Provider for OLE DB via Microsoft's ActiveX Data Objects (ADO)
PL/SQL and Java (server-side programming) to COM Automation servers (e.g. Microsoft Office): COM Automation Feature
Win32/64: ODBC Driver, Oracle Call Interface (OCI), Oracle Provider for OLE DB
Pooling=>
Solution 1
Oracle Data Provider.NET (ODP) and built a C# window service.
Getting Started with Oracle Data Provider for .NET (C# Version)
Solution 2
Connection Pooling in ADO .NET
reference from Connection Pooling in ADO .NET
ODBC V.S. OLEDB V.S. ODP Performance
reference from here
Oracle odbc 插入一萬筆要51秒,而OleDB只要14秒,用Oracle donet client 只要八秒
MDAC Architecture
2009年1月5日 星期一
Oracle Net Configure Setting
來源:http://bbs.loveunix.net/blog.php?tid=56050&starttime=0&endtime=0
以下內容來之Internet,不知道原作者是哪位了,非常感謝作者的總結。
版權歸原作者。
最近看到好多人說到tns或者數據庫不能登錄等問題,就索性總結了下面的文檔。
首先來說Oracle的網絡結構,往複雜處說能加上加密、LDAP等等。。這裡不做討論,重點放在基本的網絡結構也就是我們最常用的這種情況
三個配置文件
listener.ora、 sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME\network\admin目錄下。
重點:三個文件的作用和使用
sqlnet.ora-- ---作用類似於 linux或者其他unix的nsswitch.conf文件,通過這個文件來決定怎麼樣找一個連接中出現的連接字符串,
例如我們客戶端輸入
sqlplus sys/oracle@orcl
假如我的sqlnet.ora是下面這個樣子
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那麼,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網絡的途徑去解析它的ip地址然後去連接這個ip上GLOBAL_DBNAME=orcl這個實例,當然我這裡orcl並不是一個主機名
如果我是這個樣子
NAMES.DIRECTORY_PATH= (TNSNAMES)
那麼客戶端就只會從tnsnames.ora查找orcl的記錄
括號中還有其他選項,如LDAP等並不常用。
Tnsnames.ora-- ----這個文件類似於unix 的hosts文件,提供的tnsname到主機名或者ip的對應,只有當 sqlnet.ora中類似
NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是客戶端解析連接字符串的順序中有TNSNAMES是,才會嘗試使用這個文件。
例子中有兩個,ORCL 對應的本機,SALES對應的另外一個IP地址,裡邊還定義了使用主用服務器還是共享服務器模式進行連接,一句一句說
#你所要連接的時候輸入得TNSNAME
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
#下面是這個TNSNAME對應的主機,端口,協議
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
#使用專用服務器模式去連接需要跟服務器的模式匹配,如果沒有就根據服務器的模式
#自動調節
(SERVER = DEDICATED)
#對應service_name,SQLPLUS>show parameter service_name;
#進行查看
(SERVICE_NAME = orcl)
)
)
#下面這個類似
SALES =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
)
)
客戶端完了我們來看服務器端
listener.ora------listener 監聽器進程的配置文件
關於listener進程就不多說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。所以如果不是使用的遠程的連接, listener進程就不是必需的,同樣的如果關閉listener進程並不會影響已經存在的數據庫連接。
Listener.ora文件的例子
#listener.ora Network Configuration File: #E:\oracle\product\10.1.0\Db_2\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
#下面定義LISTENER進程為哪個實例提供服務
#這裡是ORCL,並且它對應的ORACLE_HOME和GLOBAL_DBNAME
#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做數據庫連接
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = E:\oracle\product\10.1.0\Db_2)
(SID_NAME = ORCL)
)
)
#監聽器的名字,一台數據庫可以有不止一個監聽器
#再向下面是監聽器監聽的協議,ip,端口等,這裡使用的tcp1521端口,並且使#用的是主機名
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
上面的例子是一個最簡單的例子,但也是最普遍的。一個listener進程為一個instance(SID) 提供服務。
監聽器的操作命令
$ORACLE_HOME/bin/lsnrctl start,其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。
上面說到的三個文件都可以通過圖形的配置工具來完成配置
$ORACLE_HOME/netca 嚮導形式的
$ORACLE_HOME/netmgr
本人比較習慣netmgr,
profile 配置的是sqlnet.ora也就是名稱解析的方式
service name 配置的是tnsnames.ora文件
listeners配置的是listener.ora文件,即監聽器進程
具體的配置可以嘗試一下然後來看一下配置文件。
這樣一來總體結構就有了,是當你輸入sqlplus sys/oracle@orcl的時候
1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
2. 則查詢tnsnames.ora文件,從裡邊找orcl的記錄,並且找到主機名,端口和service_name
3. 如果listener進程沒有問題的話,建立與listener進程的連接。
4. 根據不同的服務器模式如專用服務器模式或者共享服務器模式,listener採取接下去的動作。默認是專用服務器模式,沒有問題的話客戶端就連接上了數據庫的server process。
5. 這時候網絡連接已經建立,listener進程的歷史使命也就完成了。
幾種連接用到的命令形式
1.sqlplus / as sysdba 這是典型的操作系統認證,不需要listener進程
2.sqlplus sys/oracle 這種連接方式只能連接本機數據庫,同樣不需要listener進程
3.sqlplus sys/oracle@orcl 這種方式需要listener進程處於可用狀態。最普遍的通過網絡連接。
以上連接方式使用sys用戶或者其他通過密碼文件驗證的用戶都不需要數據庫處於可用狀態,操作系統認證也不需要數據庫可用,普通用戶因為是數據庫認證,所以數據庫必需處於open狀態。
平時排錯可能會用到的
1.lsnrctl status查看服務器端listener進程的狀態
LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:
start stop status
services version reload
save_config trace change_password
quit exit set*
show*
LSNRCTL> status
2.tnsping 查看客戶端sqlnet.ora和tnsname.ora文件的配置正確與否,及對應的服務器的listener進程的狀態。
C:\>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 16-8月 -2005 09:36:08
Copyright (c) 1997, 2003, Oracle. All rights reserved.
Used parameter files:
E:\oracle\product\10.1.0\Db_2\network\admin\sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))
OK (20 msec)
3.
SQL>show sga 查看instance是否已經啟動
SQL> select open_mode from v$database; 查看數據庫是打開還是mount狀態。
OPEN_MODE
----------
READ WRITE
使用hostname訪問數據庫而不是tnsname的例子
使用tnsname訪問數據庫是默認的方式,但是也帶來點問題,那就是客戶端都是需要配置tnsnames.ora文件的。如果你的數據庫服務器地址發生改變,就需要重新編輯客戶端這個文件。通過hostname訪問數據庫就沒有了這個麻煩。
需要修改
服務器端listener.ora
#監聽器的配置文件listener.ora
#使用host naming則不再需要tnsname.ora文件做本地解析
# listener.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
# (SID_NAME = PLSExtProc)
(SID_NAME = orcl)
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = d:\oracle\product\10.1.0\db_1)
# (PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
)
客戶端sqlnet.ora 如果確認不會使用TNSNAME訪問的話,可以去掉TNSNAMES
# sqlnet.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (HOSTNAME)
Tnsnames.ora文件不需要配置,刪除也無所謂。
下面就是網絡和操作系統的配置問題了,怎麼樣能夠解析我的主機名的問題了
可以通過下面的方式連接
sqlplus sys/oracle@boway
這樣的話,會連接boway這台服務器,並且listener來確定你所要連接的service_name。
簡單來說,以conn hr/hr@abc 為例
abc是我們連接遠端數據庫用到的服務命名,但是最終必須轉化為host:port:sid這樣的連接字串,而這個轉化可以理解為是翻譯的過程,而要想翻
譯成功,則必須選擇好翻譯方法,那麼sqlnet.ora就是我們用來選擇翻譯方法的,其中的NAMES.DIRECTORY_PATH=
(TNSNAMES,HOSTNAME) 就是我們選擇的命名解析方法;
tnsnames.ora是翻譯方法中的一種——本地命名解析方法的配置文件,就好像我們選擇了查字典方法,這個文件就是我們的字典一樣裡面存放著所有服
務命名對應的連接字串;至於listener.ora則是負責接受我們請求的負責任人連接地址配置文件,裡麵包括了連接負責人的連接地址,也放著經過他允
許可以連接的數據庫信息。這樣就構成了Oracle的網絡架構。
以下內容來之Internet,不知道原作者是哪位了,非常感謝作者的總結。
版權歸原作者。
最近看到好多人說到tns或者數據庫不能登錄等問題,就索性總結了下面的文檔。
首先來說Oracle的網絡結構,往複雜處說能加上加密、LDAP等等。。這裡不做討論,重點放在基本的網絡結構也就是我們最常用的這種情況
三個配置文件
listener.ora、 sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME\network\admin目錄下。
重點:三個文件的作用和使用
sqlnet.ora-- ---作用類似於 linux或者其他unix的nsswitch.conf文件,通過這個文件來決定怎麼樣找一個連接中出現的連接字符串,
例如我們客戶端輸入
sqlplus sys/oracle@orcl
假如我的sqlnet.ora是下面這個樣子
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那麼,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網絡的途徑去解析它的ip地址然後去連接這個ip上GLOBAL_DBNAME=orcl這個實例,當然我這裡orcl並不是一個主機名
如果我是這個樣子
NAMES.DIRECTORY_PATH= (TNSNAMES)
那麼客戶端就只會從tnsnames.ora查找orcl的記錄
括號中還有其他選項,如LDAP等並不常用。
Tnsnames.ora-- ----這個文件類似於unix 的hosts文件,提供的tnsname到主機名或者ip的對應,只有當 sqlnet.ora中類似
NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是客戶端解析連接字符串的順序中有TNSNAMES是,才會嘗試使用這個文件。
例子中有兩個,ORCL 對應的本機,SALES對應的另外一個IP地址,裡邊還定義了使用主用服務器還是共享服務器模式進行連接,一句一句說
#你所要連接的時候輸入得TNSNAME
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
#下面是這個TNSNAME對應的主機,端口,協議
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
#使用專用服務器模式去連接需要跟服務器的模式匹配,如果沒有就根據服務器的模式
#自動調節
(SERVER = DEDICATED)
#對應service_name,SQLPLUS>show parameter service_name;
#進行查看
(SERVICE_NAME = orcl)
)
)
#下面這個類似
SALES =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
)
)
客戶端完了我們來看服務器端
listener.ora------listener 監聽器進程的配置文件
關於listener進程就不多說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。所以如果不是使用的遠程的連接, listener進程就不是必需的,同樣的如果關閉listener進程並不會影響已經存在的數據庫連接。
Listener.ora文件的例子
#listener.ora Network Configuration File: #E:\oracle\product\10.1.0\Db_2\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
#下面定義LISTENER進程為哪個實例提供服務
#這裡是ORCL,並且它對應的ORACLE_HOME和GLOBAL_DBNAME
#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做數據庫連接
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = E:\oracle\product\10.1.0\Db_2)
(SID_NAME = ORCL)
)
)
#監聽器的名字,一台數據庫可以有不止一個監聽器
#再向下面是監聽器監聽的協議,ip,端口等,這裡使用的tcp1521端口,並且使#用的是主機名
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
上面的例子是一個最簡單的例子,但也是最普遍的。一個listener進程為一個instance(SID) 提供服務。
監聽器的操作命令
$ORACLE_HOME/bin/lsnrctl start,其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。
上面說到的三個文件都可以通過圖形的配置工具來完成配置
$ORACLE_HOME/netca 嚮導形式的
$ORACLE_HOME/netmgr
本人比較習慣netmgr,
profile 配置的是sqlnet.ora也就是名稱解析的方式
service name 配置的是tnsnames.ora文件
listeners配置的是listener.ora文件,即監聽器進程
具體的配置可以嘗試一下然後來看一下配置文件。
這樣一來總體結構就有了,是當你輸入sqlplus sys/oracle@orcl的時候
1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
2. 則查詢tnsnames.ora文件,從裡邊找orcl的記錄,並且找到主機名,端口和service_name
3. 如果listener進程沒有問題的話,建立與listener進程的連接。
4. 根據不同的服務器模式如專用服務器模式或者共享服務器模式,listener採取接下去的動作。默認是專用服務器模式,沒有問題的話客戶端就連接上了數據庫的server process。
5. 這時候網絡連接已經建立,listener進程的歷史使命也就完成了。
幾種連接用到的命令形式
1.sqlplus / as sysdba 這是典型的操作系統認證,不需要listener進程
2.sqlplus sys/oracle 這種連接方式只能連接本機數據庫,同樣不需要listener進程
3.sqlplus sys/oracle@orcl 這種方式需要listener進程處於可用狀態。最普遍的通過網絡連接。
以上連接方式使用sys用戶或者其他通過密碼文件驗證的用戶都不需要數據庫處於可用狀態,操作系統認證也不需要數據庫可用,普通用戶因為是數據庫認證,所以數據庫必需處於open狀態。
平時排錯可能會用到的
1.lsnrctl status查看服務器端listener進程的狀態
LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:
start stop status
services version reload
save_config trace change_password
quit exit set*
show*
LSNRCTL> status
2.tnsping 查看客戶端sqlnet.ora和tnsname.ora文件的配置正確與否,及對應的服務器的listener進程的狀態。
C:\>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 16-8月 -2005 09:36:08
Copyright (c) 1997, 2003, Oracle. All rights reserved.
Used parameter files:
E:\oracle\product\10.1.0\Db_2\network\admin\sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))
OK (20 msec)
3.
SQL>show sga 查看instance是否已經啟動
SQL> select open_mode from v$database; 查看數據庫是打開還是mount狀態。
OPEN_MODE
----------
READ WRITE
使用hostname訪問數據庫而不是tnsname的例子
使用tnsname訪問數據庫是默認的方式,但是也帶來點問題,那就是客戶端都是需要配置tnsnames.ora文件的。如果你的數據庫服務器地址發生改變,就需要重新編輯客戶端這個文件。通過hostname訪問數據庫就沒有了這個麻煩。
需要修改
服務器端listener.ora
#監聽器的配置文件listener.ora
#使用host naming則不再需要tnsname.ora文件做本地解析
# listener.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
# (SID_NAME = PLSExtProc)
(SID_NAME = orcl)
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = d:\oracle\product\10.1.0\db_1)
# (PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
)
客戶端sqlnet.ora 如果確認不會使用TNSNAME訪問的話,可以去掉TNSNAMES
# sqlnet.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (HOSTNAME)
Tnsnames.ora文件不需要配置,刪除也無所謂。
下面就是網絡和操作系統的配置問題了,怎麼樣能夠解析我的主機名的問題了
可以通過下面的方式連接
sqlplus sys/oracle@boway
這樣的話,會連接boway這台服務器,並且listener來確定你所要連接的service_name。
簡單來說,以conn hr/hr@abc 為例
abc是我們連接遠端數據庫用到的服務命名,但是最終必須轉化為host:port:sid這樣的連接字串,而這個轉化可以理解為是翻譯的過程,而要想翻
譯成功,則必須選擇好翻譯方法,那麼sqlnet.ora就是我們用來選擇翻譯方法的,其中的NAMES.DIRECTORY_PATH=
(TNSNAMES,HOSTNAME) 就是我們選擇的命名解析方法;
tnsnames.ora是翻譯方法中的一種——本地命名解析方法的配置文件,就好像我們選擇了查字典方法,這個文件就是我們的字典一樣裡面存放著所有服
務命名對應的連接字串;至於listener.ora則是負責接受我們請求的負責任人連接地址配置文件,裡麵包括了連接負責人的連接地址,也放著經過他允
許可以連接的數據庫信息。這樣就構成了Oracle的網絡架構。
2008年12月3日 星期三
Creating Tablespace
CREATE TABLESPACE userdata
DATAFILE '/u01/oradata/userdata01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 5M MAXSIZE 200M;
Creating User
CREATE USER tester
IDENTIFIED BY sysdba
DEFAULT TABLESPACE userdata
TEMPORARY TABLESPACE temp
QUOTA 15m ON userdata
PASSWORD EXPIRE;
Crant User
GRANT CREATE SESSION TO tester;
2008年10月29日 星期三
ORA-01102: cannot mount database in EXCLUSIVE mode
出處一:
http://www.dba-oracle.com/t_ora_01102_cannot_mount_database_in_exclusive_mode.htm
********************************
http://www.orafaq.com/forum/t/40030/0/
database is started in EXCLUSIVE mode by default. Therefore, the
ORA-01102 error is misleading and may have occurred due to one of the
following reasons:
- there is still an "sgadef.dbf" file in the "ORACLE_HOME/dbs"
directory
- the processes for Oracle (pmon, smon, lgwr and dbwr) still exist
- shared memory segments and semaphores still exist even though the
database has been shutdown
- there is a "ORACLE_HOME/dbs/lk" file
The "lk" and "sgadef.dbf" files are used for locking shared memory.
It seems that even though no memory is allocated, Oracle thinks memory is
still locked. By removing the "sgadef" and "lk" files you remove any knowledge
oracle has of shared memory that is in use. Now the database can start.
POSSIBLE SOLUTION:
Verify that the database was shutdown cleanly by doing the following:
1. Verify that there is not a "sgadef.dbf" file in the directory
"ORACLE_HOME/dbs".
% ls $ORACLE_HOME/dbs/sgadef.dbf
If this file does exist, remove it.
% rm $ORACLE_HOME/dbs/sgadef.dbf
2. Verify that there are no background processes owned by "oracle"
% ps -ef | grep ora_ | grep $ORACLE_SID
If background processes exist, remove them by using the Unix
command "kill". For example:
% kill -9
3. Verify that no shared memory segments and semaphores that are owned
by "oracle" still exist
% ipcs -b
If there are shared memory segments and semaphores owned by "oracle",
remove the shared memory segments
% ipcrm -m
and remove the semaphores
% ipcrm -s
NOTE: The example shown above assumes that you only have one
database on this machine. If you have more than one
database, you will need to shutdown all other databases
before proceeding with Step 4.
4. Verify that the "$ORACLE_HOME/dbs/lk" file does not exist
5. Startup the instance
//////////////////////////////////////
出處二
http://www.dbifan.com/?p=248
ORA-01102: cannot mount database in EXCLUSIVE mode
今天在STARTUP一数据库时,发生如下错误:
SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 276824064 bytes
Fixed Size 778736 bytes
Variable Size 137371152 bytes
Database Buffers 138412032 bytes
Redo Buffers 262144 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode
SQL> shutdown immediate
ORA-01507: database not mounted
ORACLE instance shut down.
GOOGLE一下,发现是lk文件造成的,该文件位于ORALCE_HOME下的dbs目录下,马上检查该文件:
[root@qa-oracle dbs]# fuser -u lkNDMSQA
lkNDMSQA: 6666(oracle) 6668(oracle) 6670(oracle) 6672(oracle) 6674(oracle) 6676(oracle) 6678(oracle) 6680(oracle) 6690(oracle) 6692(oracle) 6694(oracle) 6696(oracle) 6737(oracle) 6830(oracle)
果然该文件没释放,用fuser命令kill掉:
[root@qa-oracle dbs]# fuser -k lkNDMSQA
lkNDMSQA: 6666 6668 6670 6672 6674 6676 6678 6680 6690 6692 6694 6696 6737 6830
[root@qa-oracle dbs]# fuser -u lkNDMSQA
然后:
SQL> startup
ORACLE instance started.
Total System Global Area 276824064 bytes
Fixed Size 778736 bytes
Variable Size 137371152 bytes
Database Buffers 138412032 bytes
Redo Buffers 262144 bytes
Database mounted.
Database opened.
SQL>
数据库成功OPEN.
关于该错误更详细的介绍如下:原文链接:http://www.hellodba.com/cases/case-unexception_down.htm
数据库异常关闭后无法启动问题处理一例
作者: fuyuncat
来源: www.HelloDBA.com
某系统突然掉电,系统启动后发现Oracle无法启动。启动时报如下错误:
ORA-01102 cannot mount database in EXCLUSIVE mode
出现1102错误可能有以下几种可能:
一、在HA系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;
二、说明Oracle被异常关闭时,有资源没有被释放,一般有以下几种可能,
1、 Oracle的共享内存段或信号量没有被释放;
2、 Oracle的后台进程(如SMON、PMON、DBWn等)没有被关闭;
3、 用于锁内存的文件lk和sgadef.dbf文件没有被删除。
首先,虽然我们的系统是HA系统,但是备节点的实例始终处在关闭状态,这点通过在备节点上查数据库状态可以证实。
其次、是因系统掉电引起数据库宕机的,系统在接电后被重启,因此我们排除了第二种可能种的1、2点。最可疑的就是第3点了。
查$ORACLE_HOME/dbs目录:
$ cd $ORACLE_HOME/dbs
$ ls sgadef*
sgadef* not found
$ ls lk*
lkORA92
果然,lk文件没有被删除。将它删除掉
$ rm lk*
再启动数据库,成功。
如果怀疑是共享内存没有被释放,可以用以下命令查看:
$ipcs -mop
IPC status from /dev/kmem as of Thu Jul 6 14:41:43 2006
T ID KEY MODE OWNER GROUP NATTCH CPID LPID
Shared Memory:
m 0 0×411c29d6 –rw-rw-rw- root root 0 899 899
m 1 0×4e0c0002 –rw-rw-rw- root root 2 899 901
m 2 0×4120007a –rw-rw-rw- root root 2 899 901
m 458755 0×0c6629c9 –rw-r—– root sys 2 9113 17065
m 4 0×06347849 –rw-rw-rw- root root 1 1661 9150
m 65541 0xffffffff –rw-r–r– root root 0 1659 1659
m 524294 0×5e100011 –rw——- root root 1 1811 1811
m 851975 0×5fe48aa4 –rw-r—– oracle oinstall 66 2017 25076
然后它ID号清除共享内存段:
$ipcrm –m 851975
对于信号量,可以用以下命令查看:
$ ipcs -sop
IPC status from /dev/kmem as of Thu Jul 6 14:44:16 2006
T ID KEY MODE OWNER GROUP
Semaphores:
s 0 0×4f1c0139 –ra——- root root
… …
s 14 0×6c200ad8 –ra-ra-ra- root root
s 15 0×6d200ad8 –ra-ra-ra- root root
s 16 0×6f200ad8 –ra-ra-ra- root root
s 17 0xffffffff –ra-r–r– root root
s 18 0×410c05c7 –ra-ra-ra- root root
s 19 0×00446f6e –ra-r–r– root root
s 20 0×00446f6d –ra-r–r– root root
s 21 0×00000001 –ra-ra-ra- root root
s 45078 0×67e72b58 –ra-r—– oracle oinstall
根据信号量ID,用以下命令清除信号量:
$ipcrm -s 45078
如果是Oracle进程没有关闭,用以下命令查出存在的oracle进程:
$ ps -ef|grep ora
oracle 29976 1 0 Jun 22 ? 0:52 ora_dbw0_ora92
oracle 29978 1 0 Jun 22 ? 0:51 ora_dbw1_ora92
oracle 5128 1 0 Jul 5 ? 0:00 oracleora92 (LOCAL=NO)
… …
然后用kill -9命令杀掉进程
$kill -9
总结:
当发生1102错误时,可以按照以下流程检查、排错:
1.如果是HA系统,检查其他节点是否已经启动实例;
2.检查Oracle进程是否存在,如果存在则杀掉进程;
3.检查信号量是否存在,如果存在,则清除信号量;
4.检查共享内存段是否存在,如果存在,则清除共享内存段;
5.检查锁内存文件lk和sgadef.dbf是否存在,如果存在,则删除。
http://www.dba-oracle.com/t_ora_01102_cannot_mount_database_in_exclusive_mode.htm
********************************
http://www.orafaq.com/forum/t/40030/0/
database is started in EXCLUSIVE mode by default. Therefore, the
ORA-01102 error is misleading and may have occurred due to one of the
following reasons:
- there is still an "sgadef
directory
- the processes for Oracle (pmon, smon, lgwr and dbwr) still exist
- shared memory segments and semaphores still exist even though the
database has been shutdown
- there is a "ORACLE_HOME/dbs/lk
The "lk
It seems that even though no memory is allocated, Oracle thinks memory is
still locked. By removing the "sgadef" and "lk" files you remove any knowledge
oracle has of shared memory that is in use. Now the database can start.
POSSIBLE SOLUTION:
Verify that the database was shutdown cleanly by doing the following:
1. Verify that there is not a "sgadef
"ORACLE_HOME/dbs".
% ls $ORACLE_HOME/dbs/sgadef
If this file does exist, remove it.
% rm $ORACLE_HOME/dbs/sgadef
2. Verify that there are no background processes owned by "oracle"
% ps -ef | grep ora_ | grep $ORACLE_SID
If background processes exist, remove them by using the Unix
command "kill". For example:
% kill -9
3. Verify that no shared memory segments and semaphores that are owned
by "oracle" still exist
% ipcs -b
If there are shared memory segments and semaphores owned by "oracle",
remove the shared memory segments
% ipcrm -m
and remove the semaphores
% ipcrm -s
NOTE: The example shown above assumes that you only have one
database on this machine. If you have more than one
database, you will need to shutdown all other databases
before proceeding with Step 4.
4. Verify that the "$ORACLE_HOME/dbs/lk
5. Startup the instance
//////////////////////////////////////
出處二
http://www.dbifan.com/?p=248
ORA-01102: cannot mount database in EXCLUSIVE mode
今天在STARTUP一数据库时,发生如下错误:
SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 276824064 bytes
Fixed Size 778736 bytes
Variable Size 137371152 bytes
Database Buffers 138412032 bytes
Redo Buffers 262144 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode
SQL> shutdown immediate
ORA-01507: database not mounted
ORACLE instance shut down.
GOOGLE一下,发现是lk
[root@qa-oracle dbs]# fuser -u lkNDMSQA
lkNDMSQA: 6666(oracle) 6668(oracle) 6670(oracle) 6672(oracle) 6674(oracle) 6676(oracle) 6678(oracle) 6680(oracle) 6690(oracle) 6692(oracle) 6694(oracle) 6696(oracle) 6737(oracle) 6830(oracle)
果然该文件没释放,用fuser命令kill掉:
[root@qa-oracle dbs]# fuser -k lkNDMSQA
lkNDMSQA: 6666 6668 6670 6672 6674 6676 6678 6680 6690 6692 6694 6696 6737 6830
[root@qa-oracle dbs]# fuser -u lkNDMSQA
然后:
SQL> startup
ORACLE instance started.
Total System Global Area 276824064 bytes
Fixed Size 778736 bytes
Variable Size 137371152 bytes
Database Buffers 138412032 bytes
Redo Buffers 262144 bytes
Database mounted.
Database opened.
SQL>
数据库成功OPEN.
关于该错误更详细的介绍如下:原文链接:http://www.hellodba.com/cases/case-unexception_down.htm
数据库异常关闭后无法启动问题处理一例
作者: fuyuncat
来源: www.HelloDBA.com
某系统突然掉电,系统启动后发现Oracle无法启动。启动时报如下错误:
ORA-01102 cannot mount database in EXCLUSIVE mode
出现1102错误可能有以下几种可能:
一、在HA系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;
二、说明Oracle被异常关闭时,有资源没有被释放,一般有以下几种可能,
1、 Oracle的共享内存段或信号量没有被释放;
2、 Oracle的后台进程(如SMON、PMON、DBWn等)没有被关闭;
3、 用于锁内存的文件lk
首先,虽然我们的系统是HA系统,但是备节点的实例始终处在关闭状态,这点通过在备节点上查数据库状态可以证实。
其次、是因系统掉电引起数据库宕机的,系统在接电后被重启,因此我们排除了第二种可能种的1、2点。最可疑的就是第3点了。
查$ORACLE_HOME/dbs目录:
$ cd $ORACLE_HOME/dbs
$ ls sgadef*
sgadef* not found
$ ls lk*
lkORA92
果然,lk
$ rm lk*
再启动数据库,成功。
如果怀疑是共享内存没有被释放,可以用以下命令查看:
$ipcs -mop
IPC status from /dev/kmem as of Thu Jul 6 14:41:43 2006
T ID KEY MODE OWNER GROUP NATTCH CPID LPID
Shared Memory:
m 0 0×411c29d6 –rw-rw-rw- root root 0 899 899
m 1 0×4e0c0002 –rw-rw-rw- root root 2 899 901
m 2 0×4120007a –rw-rw-rw- root root 2 899 901
m 458755 0×0c6629c9 –rw-r—– root sys 2 9113 17065
m 4 0×06347849 –rw-rw-rw- root root 1 1661 9150
m 65541 0xffffffff –rw-r–r– root root 0 1659 1659
m 524294 0×5e100011 –rw——- root root 1 1811 1811
m 851975 0×5fe48aa4 –rw-r—– oracle oinstall 66 2017 25076
然后它ID号清除共享内存段:
$ipcrm –m 851975
对于信号量,可以用以下命令查看:
$ ipcs -sop
IPC status from /dev/kmem as of Thu Jul 6 14:44:16 2006
T ID KEY MODE OWNER GROUP
Semaphores:
s 0 0×4f1c0139 –ra——- root root
… …
s 14 0×6c200ad8 –ra-ra-ra- root root
s 15 0×6d200ad8 –ra-ra-ra- root root
s 16 0×6f200ad8 –ra-ra-ra- root root
s 17 0xffffffff –ra-r–r– root root
s 18 0×410c05c7 –ra-ra-ra- root root
s 19 0×00446f6e –ra-r–r– root root
s 20 0×00446f6d –ra-r–r– root root
s 21 0×00000001 –ra-ra-ra- root root
s 45078 0×67e72b58 –ra-r—– oracle oinstall
根据信号量ID,用以下命令清除信号量:
$ipcrm -s 45078
如果是Oracle进程没有关闭,用以下命令查出存在的oracle进程:
$ ps -ef|grep ora
oracle 29976 1 0 Jun 22 ? 0:52 ora_dbw0_ora92
oracle 29978 1 0 Jun 22 ? 0:51 ora_dbw1_ora92
oracle 5128 1 0 Jul 5 ? 0:00 oracleora92 (LOCAL=NO)
… …
然后用kill -9命令杀掉进程
$kill -9
总结:
当发生1102错误时,可以按照以下流程检查、排错:
1.如果是HA系统,检查其他节点是否已经启动实例;
2.检查Oracle进程是否存在,如果存在则杀掉进程;
3.检查信号量是否存在,如果存在,则清除信号量;
4.检查共享内存段是否存在,如果存在,则清除共享内存段;
5.检查锁内存文件lk
2008年7月18日 星期五
訂閱:
文章 (Atom)