安裝好Oracle數據庫和客戶端后, 服務器端用lsnrctl start啟動監聽程序, 在客戶端用net config 配置,連接數據庫, 最后生成tnsnames.ora文件, 格式如下(這是治理兩個節點的配置).
#C:/oracle/ora92/NETWORK/ADMIN/tnsnames.ora
servicename =
(DESCRipTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.120.1.70)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test)
)
)
TEST_2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.120.1.71)(PORT = 1526))
)
(CONNECT_DATA =
(SERVICE_NAME = myora)
)
)
可以用tnsping servicename來測試連接然后sqlplus username/passwd@servicename 連接
常見問題:
<> ORA-12537: TNS: 連接已關閉
A:監聽程序沒有啟動, 運行lsnrctl start命令
<>ORA-12545: 因目標主機或對象不存在,連接失敗
A: 檢查tnsnames.ora文件配置, 主機名和端口是否正確, 監聽程序是否啟動.
<>ORA-12560: TNS:protocol adapter error
A: 檢查tnsnames.ora文件配置,主機名和端口是否正確, 監聽程序是否啟動. SID是否正確,可以用tnsping 檢測
<>ORA-03113 :通信通道的文件結束
A:這個原因的問題很多, 一般應檢查網絡狀況, 或者系統參數的配置
具體見: http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=8&topic=393&show=2340
<> select 查詢時,有2000條記錄符合條件,如何先取出符合條件前1000條,然后再取出符合條件的后1000條?
A:
select * from table_name where rownum<=1000;
select * from table_name where rownum<=2000 minus select * from table_name where rownum<=1000;
select * from table_name where rownum<=3000 minus select * from table_name where rownum<=2000;
<>怎樣能夠查到數據庫的名字?
A: select value from v$parameter where upper(name) like '%DB_NAME%'
<>怎樣得到一個表的最后更新時間?
A: 1. 打開審計功能, 設置初始化文件: AUDIT_TRAIL = true
2. 重新啟動instance.
3. 審計表:
AUDIT INSERT,SELECT,DELETE,UPDATE on TableName by access WHENEVER SUCCESSFUL
4. 得到具體信息:
SELECT OBJ_NAME,ACTION_NAME ,to_char(timestamp,'dd/mm/yyyy , HH:MM:SS') from sys.dba_audit_object.
<>察看表空間都有哪些表
A; select table_name from dba_tables where tablespace_name='xxx';
<> 一個不常見的錯誤:
$ sqlplus
exec(): 0509-036 Cannot load program sqlplus because of the following errors:
0509-130 Symbol resolution failed for sqlplus because:
0509-136 Symbol pw_post (number 272) is not eXPorted from dependent module /unix.
0509-136 Symbol pw_wait (number 273) is not exported from dependent module /unix.
0509-136 Symbol pw_config (number 274) is not exported from dependent module /unix.
0509-136 Symbol aix_ora_pw_version3_required (number 275) is not exported from dependent module /unix.
0509-192 Examine .loader section symbols with the
'dump -Tv' command.
A: 重新 /etc/loadext -l /etc/pw-syscall (reload)
可能是 Oracle Kernel Extension for aix 在服務器重啟動的時候沒 load
SQLPLUS的AutoTrace是分析SQL的執行計劃,執行效率的一個非常簡單方便的工具,在絕大多數情況下,也是非常有用的工具。
這里,我們試圖歸納一些常見的問題,并進行一定的分析。
1。如何設置和使用AUTOTRACE
SQL> connect / as sysdba
SQL> @?/rdbms/admin/utlxplan.sql
Table created.
SQL> create public synonym plan_table for plan_table;
Synonym created.
SQL> grant select,update,insert,delete on plan_table to public;
Grant succeeded.
SQL> @?/sqlplus/admin/plustrce.sql
SQL>grant plustrace to public.
2. 理解和使用AutoTrace
對于SQL 調整,使用Autotrace是最簡單的方法了,我們只需要做:
SQL>SET AUTOTRACE ON
我們就可以看到我們SQL的執行計劃,執行成本(PHYSICAL READ/CONSISTENT READ...)
加上SET Timing On或者Set Time On,我們可以得到很多我們需要的數據。
SQL> select nvl(title,' ') from punishinfo_cs where ci_id=45672 ;
NVL(TITLE,'')
--------------------------------------------------
閻王令
Elapsed: 00:00:00.00
SQL> set autotrace on
SQL> /
NVL(TITLE,'')
--------------------------------------------------
閻王令
Elapsed: 00:00:00.71
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=32)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'PUNISHINFO_CS' (Cost=2 C
ard=1 Bytes=32)
2 1 INDEX (UNIQUE SCAN) OF 'SYS_C001084' (UNIQUE) (Cost=1 Ca
rd=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
376 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
3.關于使用Autotrace的一些常見疑問:
a.比如我上面的例子,我不用Autotrace,我的時間小于0.01S,但是用了Autotrace,我的執行時間變成了0.71S.
不注重的人往往會認為,或者沒有測試不用Autotrace時候的情況,往往會忽視這個數字,認為時間就是0.71S.
實際上,這個0.7S,是花在Autotrace里面的時間。由于Autotrace需要記錄你的SQL執行的成本,這個本身是往數據庫里面讀取和寫入一定的數據的,需要一定的時間。當你的SQL執行時間足夠短的時候,這個由于Autotrace帶來的時間就變成非常可觀的了。我們就需要通過不用Autotrace的時間,和使用Autotrace的執行成本來結合比較。
我們通過結合Autotrace和Tkprof/SQLTRACE,很輕易知道,AUtotrace就近作了什么:
select nvl(title,' ') from punishinfo_cs where ci_id=45672 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 2 0.00 0.00 0 3 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.00 0.01 0 3 0 1 DELETE FROM PLAN_TABLE WHERE STATEMENT_ID=:1 EXPLAIN PLAN SET STATEMENT_ID='PLUS185025' FOR select nvl(title,' ') from punishinfo_cs where ci_id=45672 insert into plan_table (statement_id, timestamp, Operation, options,
object_node, object_owner, object_name, object_instance, object_type, search_columns, id, parent_id, position, other,optimizer, cost, cardinality, bytes, other_tag, partition_start, partition_stop, partition_id, distribution ) values (:1,SYSDATE,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19, :20,:21,:22) SELECT ID ID_PLUS_EXP,PARENT_ID PARENT_ID_PLUS_EXP,LPAD(' ',2*(LEVEL-1)) OPERATIONDECODE(OTHER_TAG,NULL,'','*')DECODE(OPTIONS,NULL,'',' ('OPTIONS')')DECODE(OBJECT_NAME,NULL,'',' OF '''OBJECT_NAME'''') DECODE(OBJECT_TYPE,NULL,'',' ('OBJECT_TYPE')')DECODE(ID,0, DECODE(OPTIMIZER,NULL,'',' Optimizer='OPTIMIZER))DECODE(COST,NULL,'',' (Cost='COSTDECODE(CARDINALITY,NULL,'',' Card='CARDINALITY) DECODE(BYTES,NULL,'',' Bytes='BYTES)')') PLAN_PLUS_EXP,OBJECT_NODE OBJECT_NODE_PLUS_EXP FROM PLAN_TABLE START WITH ID=0 AND STATEMENT_ID=:1 CONNECT BY PRIOR ID=PARENT_ID AND STATEMENT_ID=:1 ORDER BY ID,POSITION SELECT ID ID_PLUS_EXP,OTHER_TAG OTHER_TAG_PLUS_EXP,OTHER OTHER_PLUS_EXP FROM PLAN_TABLE WHERE STATEMENT_ID=:1 AND OTHER_TAG IS NOT NULL ORDER BY ID
我們看到,由于我們的Autotrace,簡簡單單的一句話,實際上oracle