" 1、同義詞 " " 2、Flashback 技術 " " 3、連接字元串的寫法 " " 4、轉義字元 & 特殊運算符 " " 5、文件類型 " " 6、查看參數 & 修改參數 " " 7、AWR 工具 " " 8、學習方法 & 學習資料 " 1、同義詞 概念 同義詞是資料庫對象的一個別名,常用於 ...
1、同義詞
概念
同義詞是資料庫對象的一個別名,常用於簡化對象訪問及提高對象訪問的安全性。在使用同義詞時,Oracle 資料庫自動將它翻譯成對應模式對象的名字。與視圖類似,同義詞並不占用實際存儲空間,只在數據字典中保存了同義詞的定義。同義詞可以指向的對象有表、視圖、物化視圖、序列、函數、存儲過程、包、同義詞等。Oracle 同義詞有公用同義詞和專用同義詞兩種。普通用戶如果希望創建同義詞,還需要有 CREATE PUBLIC SYNONYM 這個系統許可權。
公用同義詞:由一個特殊的用戶組 PUBLIC 所擁有,顧名思義,資料庫中所有的用戶都可以使用公用同義詞。公用同義詞往往用來標示一些比較普通的資料庫對象,這些對象往往大家都需要引用。
專用同義詞:由創建它的用戶專用,當然,這個同義詞的創建者,也可以通過授權來讓別的用戶訪問自己的專用同義詞。
語法
創建同義詞:
CREATE [PUBLIC] SYNONYM [SCHEMA.]synonym_name FOR [SCHEMA.]object_name[@dblink];
說明:加PUBLIC
表示公用,不能同時指定PUBLIC
和synonym_name
的SCHEMA
,@dblink
表示遠程資料庫連接。
示例:
CREATE PUBLIC SYNONYM staff FOR demo.t_staff;
刪除同義詞:
DROP [PUBLIC] SYNONYM [SCHEMA.]synonym_name; -- 也不能同時指定`PUBLIC`和`synonym_name`的`SCHEMA`
示例:
DROP PUBLIC SYNONYM staff;
用途
1、多用戶協同開發中,可以屏蔽對象的名字及其持有者。如果沒有同義詞,當操作其他用戶的表時,必須通過
schema.object_name
的形式,採用了 Oracle 同義詞之後就可以屏蔽掉 schema,當然這裡要註意的是:PUBLIC 同義詞只是為資料庫對象定義了一個公共的別名,其他用戶能否通過這個別名訪問這個資料庫對象,還要看是否已經為這個用戶授權。2、為用戶簡化 SQ了語句,屏蔽 schema 也是一種簡化 SQL 的體現。同時,如果自己建的表的名字很長,也可以為這個表創建一個 Oracle 同義詞來簡化 SQL 開發。
3、為分散式資料庫的遠程對象提供位置透明性。在分散式資料庫環境中,為了識別一個資料庫對象,必須規定主機名、伺服器名、對象的擁有者和對象名,這無疑增加了訪問者的訪問難度。為了給不同的用戶使用資料庫對象時提供一個簡單的、唯一標識資料庫對象的名稱,可以為資料庫對象創建同義詞。
2、Flashback 技術
當某個錯誤的 UPDATE 或 DELETE 語句被提交之後,如果想要把數據恢復到提交之前的某個時間點,通過邏輯備份或日誌理論上也是可以做到的,但過程往往比較繁瑣,而且需要花費較長時間才能恢復過來。
為了讓資料庫能從任何邏輯誤的操作中迅速地恢復,Oracle 推出了 Flashback(閃回)技術。Flashback 技術是以 undo segment 中的內容為基礎的,因此受限於 UNDO_RETENTON 參數。要使用 Flashback 的特性,就必須啟用自動撤銷管理表空間(預設即開啟)。
Oracle 10g 中的閃回技術主要包含閃回資料庫、閃回刪除、閃回表、閃回事務及閃回查詢等一系列功能,本節將簡要介紹其中比較實用的 3 個功能——閃回查詢、閃回表及閃回刪除。
註意:SCN(System Change Number)是在 Oracle 資料庫更新後,用於定義資料庫事務提交版本的一個數字,由 DBMS 自動維護(自動遞增)。
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL; -- 查詢當前的 SCN
SELECT SCN_TO_TIMESTAMP(2817281) FROM DUAL; -- SCN 轉換成時間點
SELECT TIMESTAMP_TO_SCN('2017-05-20 13:14:51') FROM DUAL; -- 時間點轉換成 SCN
當時間點轉換成 SCN 時可能會失敗,因為那個時間點也許並沒有有效的事務操作。
閃回查詢(Flashback Query)
利用 SCN 號來進行閃回查詢,查詢最近一個事務操作之前t_course
表中的數據:
SELECT * FROM demo.t_course AS OF SCN DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
利用時間點來進行閃回查詢,查詢'2017-05-20 13:14:51'這一秒t_course
表中的數據:
SELECT * FROM demo.t_course AS OF TIMESTAMP TO_TIMESTAMP('2017-05-20 13:14:51','yyyy-mm-dd hh24:mi:ss');
閃回表(Flashback Table)
開啟行轉移功能(必須要開啟行轉移功能,否則將無法閃回表)。
ALTER TABLE demo.t_course ENABLE ROW MOVEMENT; -- 開啟行轉移功能
ALTER TABLE demo.t_course DISABLE ROW MOVEMENT; -- 關閉行轉移功能
利用 SCN 號來進行閃回表操作,將demo.t_course
表的數據恢復到 2869642:
FLASHBACK TABLE demo.t_course TO SCN 2869642;
利用時間點來進行閃回表操作,將demo.t_course
表的數據恢復到'2017-05-22 18:00:00':
FLASHBACK TABLE demo.t_course TO TIMESTAMP TO_TIMESTAMP('2017-05-22 18:00:00','yyyy-mm-dd hh24:mi:ss');
閃回刪除(Flashback Drop)
普通的 DROP TABLE 操作並不會徹底的刪除表,而是把表放入了回收站(RecycleBin)。放入回收站實際上就是保存原表的位置,然後將要刪除的表重新命名為首碼是“BIN$”的表,並將刪除的表信息(包括被刪除表的新名字和原名字)存儲在回收站中。
回收站是一個邏輯結構,不具有物理數據結構。記錄在回收站中信息會保留一段時間,直到回收站空間不足(會自動刪除一些表信息)或者使用 PURGE 指令清除回收站中的記錄。只要被刪除表的信息仍在回收站中,就可以通過閃回技術將這些表恢復。
閃回刪除類似於操作系統的垃圾回收站功能,可以從中恢復被 DROP 的表或者索引。無論是將回收站里的表恢復為原名稱或指定新名稱,表中的數據都不會丟失。可以通過USER_RECYCLEBIN
視圖或DBA_RECYCLEBIN
來查詢回收站中有那些被刪除的表信息。
語法:
FLASHBACK TABLE user_recyclebin.object_name TO BEFORE DROP[RENAME TO new_table_name];
示例:
FLASHBACK TABLE "BIN$/AwWTga9PSHgQKjACgoQJA==$0" TO BEFORE DROP;
FLASHBACK TABLE "BIN$Vm9deG4nRjatKqnWpQ+RBA==$0" TO BEFORE DROP RENAME TO tt;
補充示例:
PURGE DBA_RECYCLEBIN; -- 清空當前資料庫的回收站
PURGE RECYCLEBIN; -- 清空當前用戶的回收站
PURGE TABLE demo.t_course; -- 清空 demo.t_course 表在回收站中的信息
DROP TABLE demo.t_course PURGE; -- 徹底刪除 demo.t_course 表,不進入回收站
3、連接字元串的寫法
在應用程式中連接 Oracle 資料庫的寫法有三種,分別是:TNS Alias(別名寫法)、Connect Descriptor(普通寫法)和 Easy Connect Naming Method(簡易寫法)。
別名寫法:基本上用過 Oracle 的人都知道這種寫法,同時這也是最簡單、最繁瑣的寫法。具體來說就是先在配置文件tnsnames.ora
中配置 TNS Connect String 併為其取一個別名,然後再到應用程式中通過別名來連接資料庫。
一般(Oracle)資料庫管理工具都支持別名寫法,如被廣泛使用的 PL/SQL Developer,配置好tnsnames.ora
、TNS_ADMIN
、Oracle 主目錄及 OCI 庫路徑之後就能根據別名登錄了。在 PL/SQL Developer 登錄界面上的第 3 排——資料庫的備選項就是tnsnames.ora
中配置的別名。如下圖:
TNS Connect String 寫法一:
ORCL_127.0.0.1=(
DESCRIPTION = (
ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)(
CONNECT_DATA = (SERVICE_NAME = orcl)
)
)
TNS Connect String 寫法二:
ORCL_127.0.0.1=(
DESCRIPTION = (
ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)
)(
CONNECT_DATA = (SERVICE_NAME = orcl)
)
)
最終的應用程式連接字元串是:
"Data Source=tns_name;User Id=uid;Password=pwd;" -- 語法
"Data Source=ORCL_127.0.0.1;User Id=demo;Password=test;" -- 實例
普通寫法:在實際開發中,估計還是這種寫法用的比較多,因為方便且可控制,不必用再多餘去配置tnsnames.ora
文件了。如果僅從寫法上看,普通寫法與別名寫法唯一的區別就是,將別名所代表的 TNS Connect String 直接賦值給連接字元串中的 Data Source 參數了。
示例:
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User Id=demo;Password=test;"
簡易寫法:我個人比較喜歡這種寫法,因為它最簡潔!
語法:
"Data Source=host:port/instance_name;User Id=uid;Password=pwd;"
示例:
"Data Source=127.0.0.1:1521/orcl;User Id=demo;Password=test;"
4、轉義字元 & 特殊運算符
常見 Oracle 轉義字元一覽表
序號 | 字元 | 名稱 | 功能 | 類型 |
---|---|---|---|---|
1 | % | 百分號 | 在 WHERE 子句中表示 0 或多個任意字元 | 通配符 |
2 | _ | 下劃線 | 在 WHERE 子句中表示一個任意字元 | 通配符 |
3 | ' | 單引號 | 表示文本、字元和日期 | 定界符 |
4 | " | 雙引號 | 包裹非法字元串或讓列名嚴格區分大小寫 | 定界符 |
5 | & | And | 用來指出一個替代變數 | 特殊符號 |
6 | * | 星號 | 在 SELECT 語句中表示 0 或多個列 | 特殊符號 |
7 | ‖ | 雙豎線 | 連接字元串 | 特殊符號 |
8 | / | 正斜線 | 終止 SQL 語句 | 特殊符號 |
部分轉義字元的特殊用法解析
下劃線:如果 LIKE 後的模式字元串是'_%'
,那麼查詢結果將會是所有非空的數據,只匹配下劃線開頭的數據的正確寫法是'/_%' ESCAPE '/'
。示例(查詢以A_
開頭的數據):
WITH t AS(
SELECT 'AB' f FROM DUAL UNION ALL
SELECT 'A_' FROM DUAL UNION ALL
SELECT 'A_B' FROM DUAL
)
SELECT t.f res FROM t WHERE t.f LIKE 'A/_%' ESCAPE '/';
單引號:要在字元串中包含單引號是比較繁瑣的,基本思路就是拼接。示例:
SELECT '''' res FROM DUAL; -- res: '
SELECT '''''' res FROM DUAL; -- res: ''
SELECT '''1''' res FROM DUAL; -- res: '1'
SELECT ''''||'1'||'''' res FROM DUAL; -- res: '1'
雙引號:在 Oracle 中雙引號主要用於處理非法格式和強制大小寫。
示例一(處理非法日期格式):
SELECT TO_CHAR(fn_now,'yyyy年mm月dd日') res FROM DUAL; -- ORA-01821: 日期格式無法識別
SELECT TO_CHAR(fn_now,'yyyy"年"mm"月"dd"日"') res FROM DUAL; -- res: 2017年01月10日
示例二(處理非法列名):
SQL> SELECT 3*7 "RES VAL" FROM DUAL;
RES VAL(註意這個列名包含空格)
----------
21
示例三(強制列名小寫):
SQL> SELECT 3*7 "res" FROM DUAL;
res(註意這個列名是小寫的)
----------
21
And:預設情況下,如果欄位中包含&
符號就無法正常執行了。例如在 PL/SQL Developer 中執行SELECT 'AB&CD' res FROM DUAL;
時就會被要求提供CD
變數的值,假如你提供一個 1,那查詢結果就會是 AB1。如果想要正常查詢出含&
符號的數據該怎麼辦呢?
如果是在命令視窗,如下執行即可:
SQL> SET DEFINE OFF;
SQL> SELECT 'AB&CD' res FROM DUAL;
RES
-----
AB&CD
如果是 PL/SQL 中,就得寫成:
SELECT 'AB'||'&'||'CD' res FROM DUAL; -- 大概單個 & 符號的時候 Oracle 就不再認為它是轉義字元了吧
-- 或
SELECT 'AB'||CHR(38)||'CD' res FROM DUAL; -- 38 是 & 的 ASCII 碼
Oracle 中的幾個特殊運算符解析
冒號(:
):在 PL/SQL 程式中,冒號是很常見的,冒號主要有兩個作用,分別用於給變數賦值和引用(變數或欄位)。如v_name := 'scott'
表示給v_name
變數賦值為'scott',:NEW.staff_name
表示引用表中的staff_name
欄位。
等於號大於號(=>
):在 PL/SQL 程式中調用存儲過程的時候,可通過=>
符號來指定要給存儲過程中的那些參數賦值。
雙豎線(||
):可能你會說這個符號我太熟了,不就是用來拼接字元串嘛!但在通過雙豎線進行連接運算的時候,往往還伴隨著隱式數據類型轉換,你是否關註到了呢?
以下是進行 SQL 運算時隱式類型轉換的一般規則:
- 連接運算(||、CONCAT):數值類型和日期類型自動轉換為字元類型。
- 算數運算(+、-、*、/、TRUNC 等):字元類型自動轉換為數值類型或日期類型。
- 比較運算(>、<、=、IF、WHEN 等):字元類型自動轉換為數值類型或日期類型。
5、文件類型
Oracle 對資料庫文件做了詳細的劃分,細究起來大概有十幾二十種。本人覺得沒有必要全都瞭解,但簡要瞭解下常見的幾種文件對於 Oracle 的學習和使用還是有一定幫助的。下麵將逐一介紹下 Oracle 中比較常見的 7 種文件。
參數文件(parameter file):主要用於設置資料庫、用戶、進程或資源的限制及調整系統性能。如記錄了控制文件的位置。
控制文件(control file):資料庫的核心文件,每個 Oracle 資料庫都有最少一個控制文件,且一般情況下都會有副本。控制文件是在創建資料庫時自動創建的二進位文件,主要存放資料庫的狀態信息。其中包含資料庫的名稱和編號,數據文件和重做日誌文件的地址等。
數據文件(data file):資料庫中的數據在物理上是保存在操作系統的文件中,這些文件被稱之為數據文件,其尾碼名通常是.dbf。
重做日誌文件(redo log file):存放重做日誌信息的文件就叫做重做日誌文件。用於記錄資料庫中發生的所有變更(如增刪改),變更的每一條信息都叫做重做日誌信息,以便在系統發生故障時,用它對資料庫進行恢復。重做日誌組中包含一個或多個日誌文件,一個資料庫至少有兩個組,一個組至少有一個成員。重做日誌的大小是固定的,寫入方式是按時間順序寫入。切換(一個寫滿往下一個寫),迴圈(都寫滿了就重新回到頭組寫)。
閃回日誌文件(flashback log file):用於存儲數據塊被修改前的映像。
轉存文件(dump file):Oracle 傳統邏輯備份工具 export 和 import 使用的文件。
數據泵文件(data pump file):Oracle 新的邏輯備份工具數據泵使用的文件。
6、查看參數 & 修改參數
語法:
SHOW PARAMETER parameter_name; -- 查看參數
ALTER [SESSION|SYSTEM] SET parameter_name=parameter_value; -- 修改參數
說明:ALTER SESSION
表示修改當前會話的參數值,會話結束,修改即失效。而ALTER SYSTEM
表示修改當前實例的參數值,會對當前資料庫所有用戶永久生效。
常見的參數有:用來指定資料庫預設語言的NLS_LANGUAGE
,用來為實例選擇預設優化行為的OPTIMIZER_MODE
,用來設置排序的最大記憶體的SORT_AREA_SIZE
等等。
對 Oracle 資料庫性能有影響的重要初始化參數主要是以下 8 個:
COMPATIBLE
:用於利用新版本的最新改進。DB_BLOCK_SIZE
:對於 OLTP 為 8192,對於 DSS 為更高的值。SGA_TARGET
:自動調整大小的 SGA 組件。PGA_AGGREGATE_TARGET
:自動 PGA 管理。PROCESSES
:指定可以啟動的最大進程數。SESSIONS
:指定可以在系統中創建的最大會話數,必須用於共用伺服器。UNDO_MANAGEMENT
:建議使用 AUTO 模式。UNDO_TABLESPACE
:指定實例要使用的還原表空間。
7、AWR 工具
Oracle 從 10g 開始提供了一個性能分析工具——自動工作負載信息庫(AWR,Automatic Workload Repository),用來取代早期的 Statspack。AWR 是 Oracle 的內置工具(需要購買許可),在安裝資料庫時已自動安裝完畢,不用像 Statspack 那樣獨立安裝。
AWR 報告的原理是基於 Oracle 資料庫的定時鏡像功能,所有的數據來源於 AWR 視圖,即以DBA_HIST_
開頭的所有系統視圖。AWR 預設採集最近 7 天的統計信息,每 1 個小時採集一次(即每隔 1 小時收集一次系統當前狀態鏡像,並且保存到資料庫中),更早統計信息會被自動清理,這些預設選項都是可以修改的。生成 AWR 報告時,只需要指定進行分析的時間段(開始鏡像編號和結束鏡像編號),就可以生成該時間段的性能分析情況。
查詢到當前採集配置情況:
SELECT * FROM SYS.DBA_HIST_WR_CONTROL;
查詢結果:
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- --------------------------- ---------------------------- ----------
1468800140 +00000 01:00:00.0 +00007 00:00:00.0 DEFAULT
修改示例(修改為 30 分鐘採集一次,保留 14 天):
BEGIN
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval=>30,retention=>14*24*60);
END;
通過 AWR 和 AWR 報告,DBA 可以容易地獲知最近資料庫的活動狀態,資料庫的各種性能指標的變化趨勢曲線,最近資料庫可能存在的異常,分析資料庫可能存在的性能瓶頸從而對資料庫進行優化。通常可以通過 OEM(Oracle Enterprise Manager Console)平臺來生成查看 AWR 報告。
8、學習方法 & 學習資料
考慮到我個人精力有限,《.Net程式員學用Oracle系列》博客寫到本篇就告一段落了。接下來我將把我個人學習 Oracle 的方法和資料分享出來,以供那些有興趣或有需要的朋友參考和進一步學習。
學習方法:簡單來說,我的學習方法就是看書+看手冊+看帖子+練習。
- 為什麼要看書:好的書往往講得比較系統,能讓你在短時間對某一領域的技術有個整體的把握。
- 為什麼要看手冊:尤其是官方手冊,往往會涉及到整個技術的方方面面,最主要的還是手冊方便查詢。畢竟書的紙張有限,一些你有興趣但書上卻沒講的東西可以再看看手冊。
- 為什麼要看帖子:好的帖子往往會深入總結一到多個問題,畢竟書能寫的有限,手冊主要還是全(某些具體的問題並不一定會深入講述)。所以如果遇到書上沒講,而手冊又過於輕描淡寫的問題,可以再上網查查,看看相關深入講解的帖子。
- 為什麼要練習:光看不練假把式!所以說,如果不做練習,看的再多也白看!
好書:Oracle 是著名的老牌關係型資料庫,相關的書籍也非常多。想看書的朋友可以結合自己的興趣點,到主流的售書網站(如噹噹網和亞馬遜)上去搜一下,看看哪些書的銷量大且評價高,符合這兩點的書一般都不錯!
手冊:Oracle 官方文檔的種類繁多,對於初學者或對 Oracle 文檔系統不熟悉的人來說,選擇那些文檔來學習是個難題。
如果要瞭解 Oracle 龐大的知識體系,可以參考一下《Oracle Database Readme》,這個文檔詳細介紹了 Oracle 10g 的知識體系所囊括的全部內容。
- 對開發人員比較有用的官方文檔:
《Oracle Database Concepts》:經典中的經典。這個文檔包含了 Oracle 10g 資料庫的基本概念、體繫結構、事務處理、並行、Oracle 進程等所有重要知識點,最重要的是這個文檔說到某個知識點的時候,在結尾處,一般會提到需要詳細瞭解此知識點的其它文檔名字和鏈接,可做為其它文檔的索引使用。
《Oracle Database SQL Reference》:SQL,資料庫開發之本,所有開發人員都應該要看的文檔。
《Oracle Database Performance Tuning Guide》:這個文檔,對於開發人員,建議看看前面一些與開發相關的章節,如果掌握了開發調優的知識,基本可以解決大部分開發中的調優問題了。
- 非官方手冊:
《TechOnTheNet: Oracle Tutorial》這是一個非官方的 Oracle 技術手冊,它不像官方手冊那麼大而全,但在某些具體的 SQL 或 PL/SQL 方面,比官方手冊講得要好得多。
帖子:在寫作的過程中,我也發現了很多棒極了的帖子,但大部分都沒有記下來。最後我根據記錄整理出如下幾篇我個人覺得還不錯的帖子,供有需要的園友參考。
其它參考鏈接
- ITPUB技術論壇
- ORACLE-BASE
- Oracle FAQ
- Oracle FAQ: Reviewed Software Tools for Developers and DBAs
- Oracle 技術網
- Oracle 10g 即時客戶端
- Oracle Instant Client
- Oracle Database(中文)
- ODAC(中文)
- ODP.NET(中文)
官方文檔檢索功能:
Oracle Help Center - Search:絕大多數 Oracle 10g 的問題在這個上面都能查到相關的文檔,唯一的缺點就是服務不穩定,譬如我經常會遇到查到相關文檔,但點開卻報 404,很多時候來回多點兩次就又 OK 了。當然,如果你不能接受這一點,那麼你也可以通過必應或谷歌來查,一般也能搜到。百度的話查中文資料往往比必應和谷歌的效果好,但要查國外的資料,還是必應和谷歌的效果要好一些。
本文鏈接:http://www.cnblogs.com/hanzongze/p/Oracle-Ending.html
版權聲明:本文為博客園博主 韓宗澤 原創,作者保留署名權!歡迎通過轉載、演繹或其它傳播方式來使用本文,但必須在明顯位置給出作者署名和本文鏈接!本人初寫博客,水平有限,若有不當之處,敬請批評指正,謝謝!