數據庫筆記
本文參考學習自《數據庫系統概論第五版》
第一章緒論
1.1數據庫系統概述
數據庫的四個基本概念
數據
數據庫中存儲的基本對象,描述事物的符號記錄,是現象,而信息更反映實質
數據庫(DB, Database)
長期存儲在計算機內,有組織,可共享的大量數據的集合
數據庫系統DBS
DBS是實現有組織的、動態的存儲大量關聯數據、方便多用戶訪問的計算機硬件、軟件和數據資源組成的系統,即采用數據庫技術的計算機系統
根本目標是解決數據的共享問題
數據庫系統的構成
1.數據庫(DB)
2.數據庫管理系統(DBMS)
3.應用程序
4.數據庫管理員(DBA):從事管理和維護數據庫管理系統
數據庫管理系統(DBMS)
是位於用戶和操作系統之間的一層管理軟件,專門管理數據庫的計算機系統軟件,作為一個門,通過它才能訪問DBS
常見的DBMS:
MySQL:適用於所有平台,便宜
Oracle:適用於所有平台,非常昂貴,安全性高,性能最好
SQL Server : 適用於windows,昂貴
主要功能
1.數據庫定義:定義數據庫中Table的名稱,標題等
2.數據庫操縱:對數據進行增刪查改
3.數據庫控制:控制數據的使用權
數據庫語言(標准的:SQL語言)
使用者通過數據庫語言利用DBMS操作數據庫
DDL:數據定義語言,用於改變數據庫結構,包括創建、更改和刪除數據庫對象
DML:數據操縱語言,增刪查改
DCL:數據控制語言,對數據訪問權進行控制
數據管理系統的產生和發展
數據管理的發展:人工管理階段,文件系統階段,數據庫系統階段
好壞標准:1)數據冗余,2)數據共享,3)數據獨立性
數據庫系統特點
1.數據結構化
整體數據的結構化,數據最小存取單位是數據項,數據的結構用數據模型描述
2.數據的共享性高,冗余度低且易擴充
3.數據獨立性
由數據管理系統的二級映像功能來保證
物理/邏輯獨立性:數據的物理存儲/邏輯結構改變,應用程序不用變
4.數據由數據管理系統統一管理和控制
1.數據的安全性保護:主動安全(安全機制)和被動安全(備份恢復)
2.數據完整性檢查:保證數據的正確性,有效性和相容性
3.並發控制
1.2數據模型
數據模型是對現實世界中數據特征的抽象,是數據庫系統的核心和基礎
數據庫中的數據是按一定的方式存儲在一起的,其組織結構又稱數據模型,它決定了數據庫中數據之間聯系的表達方式。分為兩種:
1.概念模型(信息模型)
2.數據模型(邏輯模型和物理模型)
數據模型的三要素:數據結構,數據操作,數據的完整性約束
兩類數據模型
1.概念模型(信息模型)
反映關系,常用實體-聯系方法
ER圖,長方形-實體,橢圓-屬性,棱形-聯系,線上得標出1對1,1對n和n對m;屬性可以添加在實體和聯系上
2.數據模型(邏輯模型和物理模型)
現實世界=>信息世界(概念模型)=>機器世界(邏輯模型=>物理模型)
前兩個轉換由數據庫設計人員完成,后面由DBMS完成
三大經典模型
1.層次模型(樹形結構)
1.結點雙親唯一
2.只能處理1對n
3.無獨立個體
2.網狀模型(有向圖)
1.允許多個結點無雙親
2.允許一個結點又多個雙親
3.允許兩結點間多種聯系
3.關系模型(主流)
存取路徑隱蔽,用戶只要說明做什么。
關系模型的數據結構
- 關系:一個關系對應一張表
- 元組:表中一行為一個元組
- 屬性:表中一列為一個屬性
- 主碼:也稱碼鍵,某個屬性組,可以唯一確定一個元組
- 分量:元組中的一個屬性值,必須是不可再分的
完整性約束條件
-
實體完整性
- 簡單來說就是關系中主屬性值不允許為空
-
參照完整性
- 要求關系中不允許引用不存在的實體
-
用戶定義的完整性
在關系模式中,任何關系都必須滿足實體完整性和參照完整性兩個條件
1.3數據庫系統的結構
基本概念
- 型:對某一類數據的結構和屬性的說明
- 值:是型的一個具體賦值
- 模型:是數據管理基本特征的抽象,是數據庫的核心和基礎
- 模式:是對給定模型的具體數據的描述,是全體數據的邏輯結構和特征的描述
1.3.2數據庫系統的三級模式
外模式(一對多用戶) -> 模式(一對多外模式) -> 內模式
- 外模式(用戶模式/子模式)
- 數據庫用戶使用的局部數據的邏輯結構和特征的描述
- 保證數據庫安全性的有利措施(封裝)
- 獨立於存儲模式和存儲設備
- 模式(邏輯模式)
- 全體數據的邏輯結構和特征的描述
- 一個數據庫只有一個模式,是數據庫系統模式結構的中間層
- 內模式(存儲模式)
- 數據物理結構和存儲方式的描述
- 一個數據庫只有一個內模式,是數據在數據庫內部的表示方式
- 依賴於它的全局邏輯結構,獨立於具體的存儲設備
1.3.3數據庫的二級映像和數據獨立性
從以程序為中心發展到以數據為中心
外模式:描述數據的局部邏輯結構
模式:描述數據的全局邏輯結構
1.外模式/模式映像:保證數據與程序的邏輯獨立性,可多個
當模式改變時,DBA對該映像作出相應改變,使外模式不變,應用程序是依據數據的外模式編寫的,從而應用程序不必修改
2.模式/內模式映像:保證數據的物理獨立性,只唯一
當數據庫的存儲結構改變時,DBA對該映像作出相應改變,使模式不變,應用程序也不受影響
數據庫系統怎樣實現數據物理獨立性和邏輯獨立性?
數據庫管理系統在三級模式之間提供的兩層映像保證了數據庫系統中的數據能夠具有較高的邏輯獨立性和物理獨立性
1.4數據庫系統的組成
第二章 關系數據庫
2.1 關系數據結構及形式化定義
單一的數據結構--關系,數據的邏輯結構--二維表
-
域:一組具有相同數據類型的值的集合,二維表中的一列
-
笛卡爾積:D1 x D2 x ......Dn={(d1,d2,......dn)|di屬於Di ,i=1,2,......n}
笛卡爾積基數(元組數)=各集合元素數相乘。
笛卡兒積中許多元組是無視意義的
元組的每個分量di是按序排列的,如(1,3,2)!=(1,2,3)
關系中的元素是沒有排序次序的
-
關系:笛卡爾積的子集,表示為R(D1,D2......Dn)
-
屬性:關系中不同列字段可以對應相同的域
-
候選碼:若關系中的某一屬性組能唯一地標識一個元組,而其子集不能,則稱該屬性組為候選碼
-
主碼:若一個關系有多個候選碼,則選定其中一個為主碼,
一個關系表中的主碼只能有一個
主碼可以是單個屬性,也可以是屬性組
-
候選碼的諸屬性稱為主屬性,不包含在任何候選碼中的屬性稱為非主屬性或非碼屬性
-
全碼:一個關系模式中所有屬性構成碼
-
邏輯模型
特征:數據結構,操作,約束條件
候選碼:可唯一確定某一行,不一定只有一種
關系模式
關系模式:對關系的描述,靜態穩定,可形式化地表示為R(U,D,DOM,F),通常可以簡記為:
R(U) 或R(A1,A2......An)
A1,A2......An:屬性名
例:一個表示學生的關系可簡記為:
學生(學號,姓名,性別,年齡,班級,系別)
關系數據庫:所有實體及實體之間聯系的關系的集合構成
2.2關系操作
對關系可以執行的操作包括:查詢,插入,刪除和更新
關系數據庫語音分類
關系代數語言,關系演算語言,及介於兩者的SQL
2.3關系完整性
-
實體完整性規則
若屬性A是基本關系R的主屬性,則A不能取空值(即是不知道,不存在或無意義的值)
-
參照完整性規則
設有R(...F...) , S(F...)兩個基本關系,F是S的主碼,則稱F是R的外碼,R是參照關系,S是被參照關系
對於R中每個元組在F上的值要么為空值,要么等於S中某個元組的主碼
-
用戶定義完整性
針對某一具體關系數據庫的約束條件
2.4關系代數
關系代數的運算
傳統集合運算
-
並,交,差
-
關系R,S進行上述運算前提
- 兩個關系的屬性數目必須相同,即列相同
- 對於每個i,R的第i個屬性的域必須和S的第i個屬性的域相同
R∩S = R - (R - S) = S - (S - R)
-
-
廣義笛卡爾積R*S
屬性個數=a+b,元組個數=a*b
若有重名的,需重新命名,如R.A,S.A
專門的關系運算
-
選擇σ:選擇給定條件的元組----行,對應Where
-
投影π:關系R上的投影是從R中選中若干屬性列----列,避免重復行,對應SELECT
-
連接 :從兩個關系的笛卡爾積中選擇屬性間滿足一定條件的元組。
-
自身連接當與自身連接時,采用更名操作
-
等值連接
-
自然連接:特殊的等值連接,相等的分量(重復)為公共屬性,將重復的屬性列其去掉
-
外連接,在R,S自然連接時,對不匹配的元組用空置來匹配,有左外連接,右外連接和全外連接
注意有關聯左右的放中間
-
-
除運算
最基本五種運算
並(∪)、差(-)、投影(π)、選擇(σ)和笛卡兒積(×)
其他3種運算均可以用5種基本運算來表達
多個字符串用+連接起來
第三章 SQL
SQL概述
結構化查詢語言,是關系數據庫的標准語言
特點
-
綜合統一
集數據定義語言(DDL),數據操縱語言(DML),數據控制語言(DCL)功能於一體
-
高度非過程化
SQL只要提出做什么,無需了解存取路徑
-
面向集合的操作方式
-
以同一種語法結構提供多種使用方式
-
語言簡潔易學易用
SQL支持關系數據庫三級模式結構
SQL
/
外模式 視圖 視圖 (虛表)
| |
模式 基本表 基本表 基本表
| / |
內模式 存儲文件 存儲文件
SQL數據定義語句
操作方式:創建CREATE 刪除DROP 修改ALTER
操作對象:模式 SCHEMA 表 TABLE 視圖 VIEW 索引 INDEX
除了視圖和模式沒有修改語句外,其他操作方式都可對應四種對象
實例=>數據庫=>模式=>表,視圖和索引 [箭頭皆為可一對多的關系,由一個建立多個]
創建數據庫
CREATE DATABASE 數據庫名稱
ON PRIMARY
{數據文件}
LOG ON
{日志文件}
3.3數據定義
模式
定義模式(命名空間)
CREATE SCHEMA 模式名 AUTHORIZATION (用戶名) //AUTHORIZATION授權
創建模式的用戶必須擁有DBA權限,或獲得DBA授予的創建模式的權限
刪除模式
DROP SCHEMA 模式名 CASCADE|RESTRICT
-
CASCADE 級聯
刪除模式同時把該模式中的所有數據庫對象全部刪除
-
RESTRICT 限制
如果該模式定義了下屬數據庫對象,則拒絕該刪除語句的執行(保護下屬)
-
NULLFIES 置空值
基本表
數據類型表
定義基本表
CREATE TABLE 表名
( 列名 數據類型 列級完整性約束條件,
。。。。。。
表級完整性約束條件
)
表級完整性約束條件
-
UNIQUE 唯一性約束
-
PRIMARY KEY 定義主碼,保證唯一性和非空性
用法:PRIMARY KEY (列名,列名。。。)
-
對於單屬性構成碼,既可以列級,也可以表級
-
對於多個屬性構成的碼只有表級
-
-
FOREIGN KEY 用於定義參照完整
用法:FOREIGN KEY (外碼列名) REFERENCES 被參照表名(被參照列名)
模式與表,一個模式包含多個基本表
定義基本表所屬模式
-
在表名明顯給出模式名
Create table “模式名”. 表名()
-
在創建模式語句中同時創建表
-
設置所屬的模式
SET search_path TO "模式名",PUBLIC; Create table 表名 ()
修改基本表
- ADD 用於增加新列或約束條件
- DROP COLUMN 用於刪除表中的列
- DROP CONSTRAINT 用於刪除指定的完整性約束條件
- ALTER COLUMN 用於修改列定義(列名和數據類型)
索引
一個指向表中數據的指針
建立目的:加快查詢速度
DBA或建立表的人可以建立索引
DBMS會自動建立PRIMARY KEY和UNIQUE上的索引,會自動維護索引,自動選擇是否使用及使用哪些索引
分類
- 按存儲方式分:聚集索引和非聚集索引
- 按維護與管理索引分:唯一索引和組合索引等
建立索引
CREATE (UNIQUE) (CLUSTER) INDEX 索引名
ON 表名 (列名 次序,列名 次序。。。)
- 次序:指定索引值的排列次序
- 升序:ASC 降序:DESC 缺省值:ASC
- CLUSTER:表示要建立的索引是聚簇索引
修改索引
ALTER INDEX 舊索引名 RENAME TO 新索引名
刪除索引
DROP INDEX 索引名
3.4數據查詢
SELECT [ALL|DISTINCT] 目標列表達式[AS]別名,... //DISTINCT:去重 ALL:不去重,默認
FROM 表名或視圖名,...
[WHERE 條件表達式] //WHERE分組前進行先篩選,HAVING在分組后對生成的組進行篩選
[GROUP BY 列名 [ HAVING 條件表達式] ]
[ORDER BY 列名 [ ASC | DESC] ]
[COMPUTE 聚集函數] //GROUP只能顯示統計結果,COMPUTE可以顯示詳細數據和統計結果
投影運算(選擇列):SELECT 投影(π)
選擇運算(選擇行):WHERE 選擇(σ)
分類匯總:GROUP BY
對分類匯總進行篩選:HAVING
排序:ORDER BY
單表查詢
選擇若干列
全部列
- SELECT 所有列名
- SELECT *
說明文字串用單引號括起來' '
補:TOP: 返回表中前面一定數量的數據
SELECT [TOP 行數|TOP 百分比 PERCENT]
FROM table_name
選擇若干元組
<> 等價於!= ,一般用前者
IN <值表>,NOT IN <值表> //確定集合
當查詢的字符串本身就含有%或_時,用ESCAPE '換碼字符'進行轉義
WHERE name LIKE '[^李]%'; //表示不姓李的
WHERE name LIKE '[李,張]%'; //姓李和姓張的
=name LIKE'李%'OR name LIKE'張%';
=name IN ('李%','張%');
WHERE Cname LIKE 'DB\_design' ESCAPE '\'; //表示查詢課程名為DB_design
空值查詢:IS NULL或IS NOT NULL,IS不能用=代替
排序ORDER BY
只影響表的邏輯順序,不影響真正的物理順序
升序排序:ASC 降序排序:DESC ,默認升序排序
多個排序列,先按第一列排序,遇到相同按第二列排序
主要聚集函數
COUNT ([DISTINCT|ALL] *) //1.計數 除了COUNT(*),其它聚集函數忽略空值
COUNT ([DISTINCT|ALL] <列名>)
SUM ([DISTINCT|ALL] <列名>) //2.總和
AVG ([DISTINCT|ALL] <列名>) //3.平均值
MAX ([DISTINCT|ALL] <列名>) //4.最大值
MIN ([DISTINCT|ALL] <列名>) //5.最小值
//WHERE子句不能出現聚集函數作為條件,這時應用HAVING子句
GROUP BY
使用GROUP BY 進行分組,SELECT子句只可能:
- 列名應用了聚集函數
- 未應用聚集函數的列包含於GROUP BY子句中
連接查詢
一般格式:
[<表名1>.]<列名1> <比較運算符> [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
1.等值與非等值連接查詢
連接運算符:=
- 嵌套循環法
- 排序合並法
- 索引連接法
當單個查詢引用多個表時,里面同名的列需加上表名修飾:表名. 列名
2.自身連接
一個表與自己進行連接,需起別名以區別,一旦使用別名代替原名,則不能使用原名
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno
3.外連接
普通連接只輸出滿足連接條件的元組,外連接以指定表為主體表,其不滿足連接條件的元組一並輸出,分為
-
左外連接
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno)
連接運算符左邊的Student在SC里找不到滿足的全部設為NULL一並輸出,左邊為主表
-
右外連接
-
完全外連接
4.多表連接
嵌套查詢
一個SELECT-FROM-WHERE語句稱為一個查詢塊,將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件的查詢稱為嵌套查詢
1.帶有IN謂詞的子查詢
構造嵌套查詢:1.先構造子查詢(父查詢條件) 2.再構造父查詢
不相關子查詢:子查詢查詢條件不依賴於父查詢,由內向外逐層處理
子查詢結果是集合,可嵌套於:WHERE,HAVING,FROM ,不能使用ORDER BY子句
2.帶有比較運算符的子查詢
當能確切知道內層查詢返回單值時,可用比較運算符(>,<,=,>=,<=,!=或<>)
3.帶有ANY(SOME)或ALL謂詞的子查詢
必須同時使用比較運算符
4.帶有EXISTS謂詞的子查詢
EXISTS:子查詢若非空,返回真;若為空,返回假。
NOT EXISTS :子查詢若非空,返回假;若為空,返回真 (用法:雙重否定)
所有帶IN,比較運算符,ANY和ALL的子查詢都能用帶EXISTS的子查詢等價替換
集合查詢
-
並操作 UNION(自動去重),類似 OR 保留重復的:UNION ALL
-
交操作 INTERSECT 類似 AND
-
差操作 EXCEPT
參與集合操作的各查詢結果的列數必須相同,對應項的數據類型也必須相同
基於派生表的查詢
子查詢不僅可以出現在WHERE子句中,還可以出現在FROM子句,此時子查詢生成的臨時派生表成為主查詢的查詢對象
補充:
year(時間) : 獲取指定日期年份
year(getdate()-year(出生年月)) //求年齡
3.5數據更新
DBAS在執行插入,修改,刪除語句時,會檢測所插元組是否破壞表上已定義的完整性規則
插入數據
-
插入元組
INSERT INTO <表名> [(<屬性列1>...)] VALUES (<常量1>...)
- 屬性列的順序可與表定義的順序不一致
- 沒有指定屬性列說明插入的是完整的,且屬性列屬性與表定義中的順序一致的元組
- 指定部分屬性列,其余屬性列取空值
- 常量個數和類型必須與屬性列匹配
-
插入子查詢結果(即多個元組)
INSERT INTO <表名> [(<屬性列1>...)] 子查詢
常量個數和類型必須與屬性列匹配
修改數據
UPDATE <表名>
SET <列名>=<表達式>[,<列名>=<表達式>]...
[WHERE <條件>]
如果省略WHERE子句,表示要修改表中的所有元組
刪除數據
DELETE
FROM <表名>
[WHERE<條件>]
如果省略WHERE子句,表示要刪除表中的所有元組,表的定義仍在字典中
空值處理
空值判斷
IS NULL或 IS NOT NULL
空值約束條件
- 有NOT NULL約束條件的不可取空
- 加了UNIQUE限制的不可取空
- 碼屬性不可取空
空值運算
- 空值與另一個值的算術運算結果為空值
- 空值與另一個值的比較運算結果為UNKNOWN
3.6視圖
虛表,只存放視圖的定義,不存放視圖對應的數據
視圖主要為了簡化用戶操作,提供安全服務
建立視圖
CREATE VIEW <視圖名> [(<列名>[,<列名>])] //將視圖定義放入數據字典
AS<子查詢>
[WITH CHECK OPTION] //對視圖進行更新,插入和刪除時需進行謂詞條件檢測
屬性列名只能全部省略或全部指定
由單個基本表導出,且只去掉了基本表中某些行和某些列,保留了主碼。稱這類視圖為行列子集視圖
刪除視圖
DROP VIEW <視圖名>[CASCADE]
- 從數據字典中刪除指定的視圖定義,撤銷一個視圖,但不消除數據,在基礎表中的數據仍然保留
- 如果該視圖導出其他視圖,需用CASCADE級聯刪除語句一同刪除
- 刪除基表時,由其導出的所有視圖定義需顯示地用DROP VIEW語句刪除
查詢視圖
用戶角度:查詢視圖和查詢基本表相同
DBMS實現視圖查詢方法
視圖消解法
- 進行有效性檢查
- 轉換為等價的對基本表的查詢
- 執行修正后的查詢
更新視圖
有些視圖不允許被更新,更新視圖一般對行列子集視圖
對視圖進行更新操作,其限制條件比較多,盡量不要進行更新操作
視圖作用
-
簡化用戶操作
-
對機密數據提供安全保護
為不同用戶定義不同視圖,使其只能看到權限內的數據
-
使用戶以多種角度看待同一數據
-
對重構數據庫提供了一定程度的邏輯獨立性
GRANT INSERT
ON TABLE SC
TO U5
WITH G
CREATE USER
有三種權限:CONNECT RESOURCE DBA
角色是權限的集合
CREATE ROLE<角色名>
第四章 數據庫安全性
概述
數據庫的數據保護
- 數據庫安全性
- 保護數據庫防止惡意破壞和非法存取
- 防范對象:非法用戶和非法操作
- 數據庫完整性
- 防止錯誤信息的輸入和輸出所造成的無效操作和錯誤結果
- 防范對象:不合語義的數據
4.1計算機安全性概述
數據庫安全性
指保護數據庫,防止用戶非法使用數據庫造成數據泄露,更改和破壞
數據庫系統安全保護措施是否有效是數據庫系統主要的性能指標之一
數據庫不安全因素
-
非授權用戶對數據庫的惡意存取和破壞
提供的安全措施主要包括:用戶身份鑒別,存取控制和視圖等技術
-
數據庫中重要或敏感的數據被泄漏
提供的主要技術有:強制存取控制,數據加密存儲和加密傳輸等
-
安全環境的脆弱性
4.2安全性控制
存取控制機制的功能
- 定義用戶權限
- 合法權限檢查
常用存取控制方法
- 自主存取控制DAC
- 強制存取控制MAC
自主存取控制DAC
通過SQL的GRANT和REVOKE語句實現,定義用戶存取權限(授權)
用戶權限組成:數據對象,操作類型
SQL Server的安全機制
建立在身份驗證和訪問許可兩種安全機制
主要包括三個等級
- 服務器級別的安全性
- 數據庫級別的安全性
- 數據對象級別的安全性
兩種身份驗證模式
-
Windows身份驗證
-
混合驗證
windows+SQL Server
添加一個Windows NT用戶或用戶組
CREATE LOGIN [WTQ-PC\Test] //用戶:WTQ-PC\Test
FROM WINDOWS
WITH DEFAULT_DATABASE=DBS //數據庫:DBS
添加一個SQL Server用戶
CREATE LOGIN sql //用戶名:sql
WITH PASSWORD = 'pwd' //密碼:pwd
DEFAULT_DATABASE=DBS //數據庫:DBS
刪除登錄賬號
DROP LOGIN [WTQ-PC\Test]
DROP LOGIN sql
授權:授予與回收
授予
GRANT <權限>[,<權限>]...
ON <對象類型> <對象名>[,<對象類型> <對象名>]...//如table
TO <用戶>[,<用戶>]...
[WITH GRANT OPTION]; //指定:可再授予 未指定:不能傳播 不允許循環授權
發出者:數據庫管理員,數據庫對象創建者,擁有該權限的用戶
接收者:一個或多個具體用戶,PUBLIC(全體用戶)
GRANT ALL PRIVILEGES //授予全部權限
ON XXX XX
TO PUBLIC; //授予所有用戶
GRANT UPDATE(Sno) //對屬性列的授權時必須明確指出相應屬性列名
回收
由數據庫管理員或其他授權者用REVOKE收回
REVOKE <權限>[,<權限>]...
ON <對象類型> <對象名>[,<對象類型> <對象名>]...
FROM <用戶>[,<用戶>]...[CASCADE|RESTRICT] //系統只收回直接或間接從U5獲得的權限
例子
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION
- 此時若回收U5的INSERT權限時應該使用CASCADE來同時回收U6,U7的INSERT權限,否則拒絕執行該語句
- 若U5,U6還從其他用戶處獲得對SC表的任何權限,則他們仍然具有該權限。
SQL具有靈活的授權機制
- 數據庫管理員
- 擁有所有對象的所有權限
- 可將不同權限授予不同用戶
- 用戶
- 擁有自己建立的對象的全部的操作權限
- 可以使用GRANT將權限授予其他用戶
- 被授權用戶
- 擁有被授權的特定對象的特定權限
- 如果具有再授權許可,可再授權
數據庫管理員創建用戶時
CREATE USER <username>
[WITH][DBA|RESOURCE|CONNECT]
權限名 | 創建新用戶 | 創建基本表和視圖 | 創建新模式 | 登錄數據庫,執行數據查詢和操縱 |
---|---|---|---|---|
CONNECT(默認) | 否 | 否 | 否 | 是,但需擁有相應權限 |
RESOURCE | 否 | 是 | 否 | 是 |
DBA(超級用戶) | 是 | 是 | 是 | 是 |
數據庫角色
角色是權限的集合,可為一組具有相同權限的用戶創建一個角色
CREATE ROLE <角色名> //創建角色
GRANT <角色1>[,<角色2>]...//將角色授予其他角色或用戶
TO <角色3>[,<用戶1>]...
[WITH ADMIN OPTION] //=全部權限+可再授予權限
強制存取控制MAC
自主存取控制
可能存在數據"無意泄漏",數據本身無安全性標記
保證更高的安全性,適用於對數據有嚴格而固定密級分類的部門
管理的全部實體分為
- 主體是系統中活動實體
- 實際用戶
- 代表用戶的各進程
- 客體是系統中被動實體,受主體操縱
- 文件,基本表,索引,視圖
敏感度標記(Label)
- 絕密 (Top Secret, TS)
- 機密 (Secret, S)
- 可信 (Confidential,C)
- 公開 (Public, P)
- TS>=S>=C>=P
主體敏感度標記稱為許可證級別;客體稱為密級
MAC規則:當主體許可證級別>=客體密級,可讀;當主體許可證級別<=客體密級,可寫
4.3視圖機制
4.4審計Audit
啟用一個專用的審計日志,將用戶對數據庫的所有操作記錄在上面
作用:審計員利用審計日志,找出非法存取數據的人,時間和內容
可選性:由於審計費時間空間,所以主要用於安全性較高要求的部門,且可靈活打開或關閉審計功能
審計事件
- 服務器事件
- 系統權限
- 語句事件
- 模式對象事件
審計功能
- 基本功能:提供多種審計查閱方式
- 提供審計分析和報表功能
- 審計日志管理功能
- 提供審計設置及記錄信息的專門視圖
AUDIT ALTER
ON SC;
NOAUDIT ALTER
ON SC;
4.5數據加密
作用:防止數據庫中數據在存儲和傳輸中失密的有效手段
基本思想:原始數據明文通過算法變換位不可直接識別的格式-密文
加密方式
- 存儲加密
- 透明存儲加密
- 內核級加密方法:性能好,安全完備性高
- 非透明存儲加密
- 透明存儲加密
- 傳輸加密
- 鏈路加密:鏈路層加密,報文報頭均加密
- 端到端加密:只加密報文,不加密報頭
4.6其他安全性保護
- 推理控制
- 避免用戶利用能訪問的數據推知更高密級的數據
- 常用方法:基於函數依賴或敏感關聯
- 隱蔽信道
- 數據隱私保護
第五章數據庫完整性
-
數據的完整性
防范對象:不合語義,不正確的數據
-
數據的安全性
防范對象:非法用戶和非法操作
數據庫完整性
-
完整性約束條件定義機制
實體完整性,參照完整性,用戶定義完整性
-
完整性檢查機制
一般在插入,更新,刪除語句執行后開始檢查
-
違約反應
- 拒絕(NO ACTION)執行該操作
- 級聯(CASCADE)執行其他操作
實體完整性違約處理
進行插入或更新操作時自動進行完整性檢查
-
檢查主碼是否唯一,不唯一則拒絕插入或修改
檢查方法
- 全表掃描:費時
- B+樹索引
-
檢查主碼各個屬性是否為空,只要有一個位空就拒絕插入或修改
參照完整性違約處理
-
拒絕(NO ACTION)執行
-
級聯(CASCADE)操作
當刪除或修改被參照表的一個元組時造成了不一致,則將參照表中所有不一致元組刪除或修改
-
設置為空值(SET-NULL)
當刪除或修改被參照表的一個元組時造成了不一致,則將參照表中所有不一致元組的對應屬性設置為空值
FOREIGN KEY (外碼列名) REFERENCES 被參照表名(被參照列名)
ON UPDATE/DELETE CASCADE, //級聯更新/刪除。。。
ON DELETE NO ACTION //拒絕刪除
用戶定義完整性
針對某一具體應用的數據必須滿足的語義要求
- 列值約束條件
-
列值非空(NOT NULL)
-
列值唯一(UNIQUE):可為空值
-
檢查列值是否滿足某個條件表達式(CHECK)
CHECK 條件表達式
-
列值缺省值(DEFAULT)
DEFAULT 缺省值
-
元組約束條件
用CHECK短語可以設置不同屬性之間取值的相互約束條件
完整性約束命名子句
CONSTRAINT <完整性約束條件名><完整性約束條件>
DROP CONSTRAINT xx
斷言
可以定義涉及多個表的或聚集操作的比較復雜的完整性約束
斷言創建以后,任何涉及斷言的相關操作都會進行檢查,任何使斷言不為真值的操作都會被拒絕執行
CREATE ASSERTION<斷言名><CHECK子句> //創建
DROP ASSERTION<斷言名>; //刪除
觸發器Trigger
用戶定義在關系表上的一類由事件驅動的特殊過程
觸發器是建立在某個表上的一系列能有系統自動執行對數據庫修改的SQL語句的集合即程序,經過預編譯后存儲於數據庫中
也稱為主動規則或事件-條件-動作規則
CREATE TRIGGER <觸發器名>
{BEFORE|AFTER}<觸發事件>(OF <觸發列...>) ON <表名> //事件:插入,刪除,修改等操作
REFERENCING NEW|OLD ROW AS<變量>
FOR EACH {ROW|STATEMENT}
{WHEN <觸發條件>} <觸發動作體>
觸發器只能定義在基本表上,不能定義在視圖上.表的擁有者才可以在表上創建觸發器
觸發器類型
-
行級觸發器
該表有多少行,觸發動作執行多少次
-
語句級觸發器
執行某語句后觸發動作只執行一次
p72
第六章關系數據理論
關系模式由五部分組成,是一個五元組
R(U,D,DOM,F)
- 關系名R是符號化的元組語義
- U為一組屬性
- D為U中屬性所來自的域
- DOM為屬性到域的映射
- F為U上的一組數據依賴
由於D,DOM與模式設計關系不大,因此本章將關系模式看作三元組:R<U,F>
6.1 數據依賴
- 關系內部屬性與屬性之間的一種約束關系
- 通過屬性間值的相等與否體現出來的數據間相互聯系
- 是現實世界屬性間相互聯系的抽象
- 是語義的體現
主要類型
- 函數依賴 FD
- 多值依賴 MVD
例:Sname=f(Sno),Sdept=f(Sno)
- Sno函數決定Sname,Sno
- 記作:Sno->Sname, Sno->Sdept
不合適的函數依賴會導致存在
- 數據冗余 后者出現重復性
- 更新異常 修改后者可能需要修改每個相關的前者
- 插入異常 沒有前者就無法存入后者
- 刪除異常 前者刪除,后者消息丟失
解決方法:用規范化理論改造關系模式來消除其中不合適的數據依賴
6.2 規范化
函數依賴
A->B
簡單來說就是一對一,不會出現一對多或多對一
平凡函數依賴與非平凡函數依賴
- X->Y, 但Y不屬於X,則稱X->Y是非平凡函數依賴
- X->Y, 但Y屬於X,則稱X->Y是平凡函數依賴
綜上所述,函數依賴分為:完全函數依賴,部分函數依賴,傳遞函數依賴
碼與候選碼
候選碼的求解算法!!!
求解步驟
推論2很好用!!!
主屬性與非主屬性
范式
符合某一級別的關系模式的集合
- 第一范式 1NF
- 第二范式 2NF
- 第三范式 3NF
- BC范式 BCNF
- 第四范式 4NF
- 第五范式 5NF
大小按從上往下排,上包含下,一個低一級的范式通過模式分解可以轉換為若干個高一級范式的關系模式的集合,這個過程就叫規范化
1NF:關系模式R的所有屬性值域不可再分
2NF:R屬於1NF,且每個非主屬性都完全函數依賴於任何一個候選碼,則R屬於2NF
3NF:R屬於3NF,則R的每一個非主屬性既不部分函數依賴於候選碼,也不傳遞函數依賴於候選碼
BCNF:模式的徹底分解,達到了最高的規范化程度
- 所有非主屬性都完全函數依賴於每個候選碼
- 所有主屬性都完全函數依賴於每個不包含它的候選碼
- 沒有任何屬性完全函數依賴於非碼的任何一組屬性
多值依賴:X,Y,Z為R(U)子集,且Z=U-X-Y. X->->Y,每個X對應一組Y值,而不論Z取何值
設R(U)是屬性集U上的一個關系模式,X,Y,Z是U的子集,並且Z=U-X-Y。關系模式R(U)中多值依賴X->->Y成立,當且僅當對R(U)的任一關系r,給定的一對(x,z)值,有一組Y值僅決定於x值而與z值無關
- 若X->->Y,而Z為空集,則稱X->->Y為平凡的多值依賴
- 否則稱X->->Y為非平凡的多值依賴
4NF:若R<U,F>屬於1NF,如果對於R的每個非平凡多值依賴
X->->Y(Y不屬於X),X都含有碼,則R<U,F>屬於4NF
小結
在關系數據庫中,基本要求是滿足第一范式
規范化的基本思想:
- 逐步消除數據依賴中不合適的部分,使各關系模式達到某種程度的"分離"
- 即采用"一事一地"的模式設計原則
- 讓一個關系描述一個概念,一個實體或者實體間的一種聯系
- 若多於一個概念則分離
- 規范化實質上是概念的單一化
並非規范化程度越高的關系模式越好
6.3 Armstrong公理系統
設U為屬性集總體,F是U上的一組函數依賴,於是有關系模式R<U,F>,對R<U,F>來說有以下的推理規則:
-
自反律
-
增廣律
-
傳遞律
-
合並規則:由X→Y,X→Z,得X→YZ
-
偽傳遞規則:由X→Y,WY→Z,有XW→Z
-
分解規則:由X→Y,Z屬於Y,有X→Z
閉包!!
在關系模式R<U,F>中為F所邏輯蘊涵的函數依賴的全體叫做F的閉包,記作F+
即:F+是所有能從F中推導出來的函數依賴的集合
閉包求法:
最小依賴集
每個函數依賴集F均等價於一個極小函數依賴集Fm,此Fm稱為F的最小依賴集
最小依賴集求解步驟!!!
-
將所有函數依賴的右邊化為單一屬性
-
去掉所有冗余的函數依賴
-
去掉所有函數依賴左邊的冗余屬性
找左邊多於1個屬性,分別檢查是否多余
G為去掉考察的剩余關系集
如:當檢查AB→C,G為F-{AB→C}={AB→D,A→D}
屬性在G的閉包至少等於它本身
判斷是否冗余,需要刪除的依據是,看這個檢查的推出的是否屬於它的閉包,如:AB→C, C不屬於(AB)G+=ABD,則AB→C不冗余,不可刪
6.4模式分解
- 關系模式的規范化過程是通過對關系模式的分解來實現的
三種模式分解的等價定義
- 分解具有無損連接性
- 分解要保持函數依賴
- 分解既要保持函數依賴,又要具有無損連接性
無損連接分解判斷!!!
算法
① 建立一張n列k行的表,每一列對應一個屬性,每一行對應分解中的一個關系模式。若屬性Aj Ui,則在j列i行上真上aj,否則填上bij;
② 對於每一個FDi做如下操作:找到Xi所對應的列中具有相同符號的那些行。考察這些行中li列的元素,若其中有aj,則全部改為aj,否則全部改為bmli,m是這些行的行號最小值。
如果在某次更改后,有一行成為:a1,a2,...,an,則算法終止。且分解ρ具有無損連接性,否則不具有無損連接性。
對F中p個FD逐一進行一次這樣的處理,稱為對F的一次掃描。
③ 比較掃描前后,表有無變化,如有變化,則返回第② 步,否則算法終止。如果發生循環,那么前次掃描至少應使該表減少一個符號,表中符號有限,因此,循環必然終止。
保持函數依賴分解!!!
-
先逐一對分解后的集合進行判斷包含原集合的哪些函數依賴
如上面那道題:
對於R1(AD),F1=空集,對於R4(CDE),F4={C->D,DE->C};
函數依賴的左右兩邊都得包含於分解的集合中才算是它保持了這個函數依賴
-
把各個集合包含的函數依賴並起來,看是否等於原集合的全部函數依賴
-
若是,則 保持了函數依賴
練習題:https://blog.csdn.net/qq_37915248/article/details/104765697
最佳分解算法!!!
有R<U,F>,將關系模式R保持依賴地且無損地分解成3NF
-
求得候選碼X
-
算法6.3保持依賴地分解成3NF
- 計算F的最小函數依賴集
- 找出不在F中的屬性,將它們單獨構成一個關系模式,並從R的U中消去這些屬性
- 對F按具有相同左部原則分組
-
判斷候選碼X是否在分解后的子關系模式的屬性集中出現
- 如果出現,算法已完成
- 如果沒有出現,就把X作為子關系模式加入屬性集
習題分析:
- L:CE,N:ABD,(CE)G+=ABCDE,所以CE為唯一候選碼
- 求最小函數依賴集F1={A→D,A→B,E→D,D→BA,BC→D},刪除了DC→A
- 沒有不在F中的屬性
- 按左部分組:ABD,ED,BCD
- 加入CE得p
重要事實
- 若要求分解保持函數依賴,則分解可以達到3NF,但不一定能達到BCNF
- 若要求分解既保持函數依賴,又具有無損連接,則可達到3NF,不一定到達BCNF
- 若只要求分解無損連接性,那一定可以達到4NF
第七章數據庫設計
概述
數據庫設計目標是為用戶和各種應用系統提供一個信息基礎設施和高效率運行環境
設計方法
- 手工試湊法
- 規范設計方法
- 基本思想:過程迭代和逐步求精
- 典型方法:
- 新奧爾良方法
- 基於ER模型的數據庫設計方法
- 3NF設計方法
- UML方法
數據庫設計基本步驟
數據庫設計分為五個階段:
- 需求分析:主要是准確收集用戶信息需求和處理需求,並對收集的結果進行整理和分析,形成需求說明。
- 概念結構設計:對用戶需求進行綜合、歸納、抽象,形成一個與與具體的DBMS無關概念模型(一般為ER模型)。
- 邏輯結構設計:將概念結構設計的概念模型轉化為某個特定的DBMS所支持的數據模型,建立數據庫邏輯模式,並對其進行優化,同時為各種用戶和應用設計外模式。
- 物理結構設計:為設計好的邏輯模型選擇物理結構,包括存儲結構和存取方法等,建立數據庫物理模式。
- 實施和維護:實施就是使用DLL語言建立數據庫模式,將實際數據載入數據庫,建立真正的數據庫。維護階段是對運行中的數據庫進行評價、調整和修改
概念結構設計
描述概念模型的工具:E-R模型
實體用矩形,屬性用橢圓,關系用棱形
E-R圖之間的沖突
-
屬性沖突
- 屬性域沖突,即是類型,取值范圍,取值集合
- 取值單位
-
命名沖突
- 同名異義
- 異名同義
-
命名沖突
-
結構沖突
- 同一對象在不同應用中具有不同抽象(實體/屬性)
- 統一實體在不同子系統E-R圖中所包含的屬性個數和屬性排列次序不完全相同
第九章關系查詢處理和查詢優化
查詢步驟
-
查詢分析
- 詞法分析:識別正確的語音符號
- 語法分析:進行語法檢查
-
查詢檢查
- 合法權檢查
- 視圖轉換
- 安全性檢查
- 完整性初步檢查
-
查詢優化
分類
- 代數優化/邏輯優化:關系代數表達式的優化
- 物理優化:存取路徑和底層操作算法的選擇
選擇依據
- 基於規則
- 基於代價
- 基於語義
-
查詢執行
- 自頂向下
- 自底向上
實現查詢操作的算法
-
選擇操作的實現
-
全表掃描方法:適合小表
-
索引掃描方法:適合選擇條件中屬性上有索引(如B+樹索引或Hash索引)
同過索引先找到滿足條件的元組主碼或指針,再通過元組指針直接在查詢的基本表中找到元組
-
-
連接操作的實現(最費時)
- 嵌套循環算法
- 排序合並算法
- 先對兩個表進行排序
- 依次取A表的每個連接屬性,然后對應掃描B表具有相同連接屬性元組,A(1一個)對應B(多個)連接
- 循環執行
- 索引連接算法
- Hash Join算法
- 包含較少元組的表先進行散列到Hash
- 再將剩下的表按相同hash函數散列
- 將與之匹配的進行連接
查詢優化
影響着關系數據庫管理系統性能的關鍵因素也是關系系統的優點,有着非常重要的地位
用戶不必考慮最好地表達查詢以獲得好效率,系統可以優化得更好
- 集中式數據庫
- 執行開銷主要包括
- 磁盤存取塊數(I/O代價)
- 處理機時間(CPU代價)
- 查詢的內存開銷
- 執行開銷主要包括
- 分布式數據庫
- 總代價=I/O代價+CPU代價+內存代價+通信代價
代數優化
關系代數表達式等價變換規則
-
規則1:連接,笛卡爾積的交換律
-
規則2:連接,笛卡爾積的結合律
-
規則3:投影的串接定律
-
規則4:選擇的串接定律
-
規則5:選擇和投影的交換律
若與B1,B2也有關,需補上
-
規則6:選擇與笛卡兒積的交換律
哪一部分涉及哪些屬性,拆分出來時就對應選擇哪些屬性
-
規則7,8,9:選擇 和 並/差/自然連接的分配律:都一樣
-
規則10:投影與笛卡爾積/並的分配律,同上6
查詢樹的啟發式優化!!!
典型的啟發式規則
SELECT 投影(π)
WHERE 選擇(σ)
-
選擇運算盡可能先做:減少中間運算結果
-
投影運算和選擇運算同時進行:避免重復掃描關系
-
合並連接的選擇與投影操作,減少掃描次數
-
把某些選擇同它前面要執行的笛卡爾積結合成連接運算:等值連接運算優於笛卡爾積
-
找出公共子表達式,先計算一次並寫入中間文件,減少計算量
物理優化
-
基於規則的啟發式優化
大多數情況適用的規則
-
基於代價估算的優化
-
兩者結合的優化方法
- 通常先用啟發式規則縮小范圍,再用代價估算選出最優
基於啟發式規則的存取路徑選擇優化
- 選擇操作的啟發式規則
- 對於小關系,使用全表順序掃描
- 對於大關系,啟發式規則
- 對於選擇條件是主碼=值的查詢
- 查詢結果最多是一個元組,可用選擇主碼索引
- 對於選擇條件是非主屬性=值的查詢,或者是屬性上的非等值查詢或者范圍查詢,並且選擇列上有索引
- 要估算查詢結果的元組數目,比例<10%,可使用索引掃描法
- 否則采用全表順序掃描
- 對於用AND連接的合取選擇條件
- P125
- 對於選擇條件是主碼=值的查詢
笛卡爾積的選擇最好選有公共屬性的放在一起下移
第十章 數據庫恢復技術
事務
基本解釋
事務是用戶定義的一個數據庫操作序列,要么全做,要么全不做,是不可分割的工作單位
事務與程序
- 一個事務可以是一條SQL語句,一組SQL語句或整個程序
- 一個程序通常包含多個事務
事務是恢復和並發控制的基本單位
事務結束
- COMMIT
- 事務正常結束
- 提交事務所有操作(讀+更新)
- 更新寫回磁盤上的物理數據庫中
- ROLLBACK
- 事務異常終止
- 事務運行過程發生故障,不能繼續執行
- 將所有已完成操作全部撤銷,事務回滾到開始狀態
事務的特性(ACID特性)-事務處理的任務
- 原子性
- 事務是數據庫的邏輯工作單位
- 一致性
- 事務執行的結果必須使數據庫從一個一致性狀態變成另一個一致性狀態
- 一致性狀態(COMMIT):數據庫中只包含成功事務提交的結果
- 隔離性
- 事務執行不能受其他事務干擾
- 持續性
- 一個事務一旦提交,接下來的其他操作或故障都不應對其結果有影響
故障恢復涉及如何保證原子性和持久性
數據庫恢復
指將數據庫從錯誤狀態恢復到某一已知的正確狀態的功能
恢復技術是衡量系統優劣的重要指標
故障種類
-
事務內部的故障
事務故障:僅指非預期的故障
- 某個程序(事務)自身運行錯誤所引起的故障
- 影響該程序本身
事務故障的恢復:事務撤銷UNDO
- 強行回滾該事務
- 撤銷該事務已作出的任何對數據庫的修改
-
系統故障
稱為軟故障,指造成系統停止運轉的任何事件,使得系統要重啟
原因
- 硬件錯誤,操作系統故障,數據庫管理系統代碼錯誤,系統斷電
系統故障的恢復
讓所有非正常終止的事務回滾,強行撤銷(UNDO)所有未完成事務,重做(REDO)所有已經提交的事務
-
介質故障(影響最嚴重)
稱為硬故障,指外存故障,影響正在存取這部分數據的所有事務
-
計算機病毒
稱為人為故障
各類故障對數據庫影響有兩種
- 數據庫本身被破壞
- 數據庫沒被破壞,但數據不正確
恢復
恢復操作基本原理:冗余
恢復的基本原理:利用存儲在系統別處(后備副本,日志文件,數據庫鏡像)的冗余數據來重建數據庫中不正確的數據
恢復的實現技術:復雜
恢復技術能保證事務的原子性,一致性和持續性
恢復的實現技術
關鍵問題
- 如何建立冗余數據
- 數據轉儲
- 登記日志文件
- 如何利用這些數據來恢復
數據轉儲
指數據庫管理員定期地將整個數據庫復制到存儲介質上保存起來的過程
備用數據文本稱為后備副本或后援副本
轉儲辦法
- 靜態轉儲
- 系統中無運行事務
- 轉儲期間不允許對數據庫的任何存取修改
- 動態轉儲
- 轉儲操作和用戶事務並發
- 轉儲期間允許對數據庫存取或修改
- 海量轉儲
- 每次轉儲全部數據庫
- 增量轉儲
- 只轉儲上次轉儲后更新過的數據
日志文件
格式和內容
含義:用於記錄事務對數據庫的更新操作的文件
格式:
- 以記錄為單位
- 各個事務的開始標記BEGIN TRANSACTION
- 結束標記COMMIT ROLLBACK
- 所有更新操作
- 每條記錄內容
- 事務標識
- 操作類型
- 操作對象
- 更新前數據值,更新后數據值
- 以數據塊為單位
- 每條日志記錄的內容
- 事務標識
- 被更新的數據塊
- 每條日志記錄的內容
登記日志原則
- 登記次序嚴格按並發事務執行的時間次序
- 必須先寫日志文件,后寫數據庫
- 先寫日志文件為保證數據庫的可恢復性
- 如果先寫了數據庫修改,而在運行記錄中沒有登記下這個修改,則以后就無法恢復這個修改了。
- 如果先寫日志,但沒有修改數據庫,按日志文件恢復時只不過是多執行一次不必要的UNDO操作,並不會影響數據庫的正確性。
恢復策略
事務故障恢復(系統自動完成)
由恢復子系統利用日志文件撤銷(UNDO)此時五已對數據庫進行的修改
恢復步驟
- 反向掃描文件日志
- 對該事務的更新操作執行逆操作
- 繼續反復上述操作
- 直到讀到此事務的開始標記
系統故障恢復(系統自動完成)
造成不一致狀態的原因
- 未完成事務對數據庫的更新可能已寫入數據庫
- 已提交事務對數據庫的更新可能還留在緩沖區沒來得及寫入數據庫
恢復方法
- Undo故障發生時未完成的事務
- Redo已完成的事務
恢復步驟
- 正向掃描日志文件
- 重做REDO隊列:故障發生前已經提交的事務
- 撤銷UNDO隊列:故障發生時尚未完成的事務
- 對撤銷UNDO隊列事務進行撤銷處理
- 反向掃描日志文件,對每個撤銷事務的更新操作執行逆操作
- 即是將更新前的值寫入數據庫
- 對重做REDO隊列事務進行重做處理
- 正向掃描日志文件,對每個重做事務重新執行登記的操作
- 即是將更新后的值寫入數據庫
介質故障恢復(管理員介入)
恢復步驟
- 重裝數據庫:裝入最小的后備數據庫副本,使數據庫恢復到最近一次轉儲時的一致性狀態
- 重做已完成事務
- 掃描日志文件,將已提交事務記入重做隊列
- 正向掃描日志文件,對重做隊列所有事務進行重做
具有檢查點的恢復技術
- 在日志文件增加檢查點記錄
- 增加重新開始文件
- 恢復子系統在登錄日志文件期間動態地維護日志
檢查點記錄的內容
- 建立檢查點時刻所有正在執行的事務清單
- 這些事務最近一個日志記錄的地址
重新開始文件的內容
- 記錄各個檢查點記錄在日志文件中的地址
數據庫鏡像
提高數據庫可用性的解決方案:數據庫鏡像
第十一章並發控制
多事務執行方式
- 事務串行執行
- 每個時刻只有一個事務允許,其他食物必須等到該事務結束后方能允許
- 交叉並發方式
- 單處理機系統中,事務的並行執行是指這些並行事務的並行操作輪流交叉運行
- 並非真正並行運行,但能減少處理機的空閑時間
- 同時並發方式
- 多處理機中,每個處理機可運行一個事務
事務並發執行帶來的問題=>並發控制機制
- 多個事務同時存取同一數據的情況
- 可能會存取不正確的數據,破壞事務隔離性和一致性
並發控制機制的任務
- 對並發操作進行正確調度
- 保證事務隔離性和數據庫一致性
並發操作帶來的數據不一致性
-
丟失修改
-
不可重復讀
-
T1讀取某數據,T2對其更新(修改,刪除,插入);T1再讀取該數據時該數據已經變化
- 重新讀取了前一事務已提交的數據
-
讀臟數據
- T1修改某數據R1,T2讀取R1后T1又撤銷原來操作,數據庫中的的R1恢復原來T1未修改前的值,此時T2讀取到的R1是修改后的,和數據庫中的不一致
- 讀取了前一事務未提交的臟數據
並發控制的主要技術
- 封鎖
- 時間戳
- 樂觀控制法
- 多版本並發控制
封鎖
封鎖就是事務T對某數據對象操作前,先向系統發出請求,對其加鎖,加鎖后T對其有一定控制,在T釋放該對象的鎖前,其他事務不能更新該數據對象
基本封鎖類型
-
排它鎖-X鎖-寫鎖
當T對某數據對象A加上X鎖后,只有T可以進行讀取和修改,其他任何事務都不能對A加鎖和操作
-
共享鎖-S鎖-讀鎖
當T對某數據對象A加上S鎖后,T可以進行讀取,其他任何事務只可以對A加S鎖和讀取
封鎖協議
在運用X鎖和S鎖對數據對象加鎖時,需要約定一些規則,稱為封鎖協議,形成了三級封鎖協議,在不同程度上保證了數據一致性
- 何時申請X鎖或S鎖
- 持鎖時間
- 何時釋放
一級封鎖協議
- 事務T在修改數據R之前必須先對其加X鎖直到事務結束才釋放
- 正常結束COMMIT
- 非正常結束ROLLBACK
- 一級封鎖協議可防止丟失修改,保證事務T是可恢復的
- 若僅讀數據,不需要加鎖,所以無法保證重復讀和讀臟數據
二級封鎖協議
- 事務T在讀取數據R之前必須先對其加S鎖,讀完即可釋放
- 可以防止丟失修改和讀臟數據
- 讀完即釋放,所以無法保證可重復讀
三級封鎖協議
- 事務T在讀取數據R之前必須先對其加S鎖,直到事務結束才可釋放
- 可以防止丟失修改和讀臟數據,不可重復讀
活鎖和死鎖
活鎖
- 由於后來的事務先給予了請求批准,導致它前面的某個事務永遠處於等待狀態,得不到封鎖的機會
- 避免活鎖的方法:采用先來先服務的策略
死鎖
- 事務T1封鎖了數據R1,事務T2封鎖了數據R2
- 事務T1請求封鎖數據R2,事務T2請求封鎖數據R1
- 都在等待,形成死鎖
- 死鎖的預防:破壞死鎖的產生條件
- 一次封鎖法
- 要求每個事務必須一次性將所需數據全部加鎖,否則就不能繼續執行
- 難於事先精確確定封鎖對象
- 順序封鎖法
- 預先對數據對象規定一個封鎖順序,所有事務按照該順序封鎖
- 成本高,難以實現
- 一次封鎖法
- 死鎖的診斷:DBMS普遍采用
- 超時法
- 一個事務等待時間超過規定時限,認為發生死鎖
- 等待圖法
- 用事務等待圖動態反映所有事務等待情況,若發生回路,則表示出現死鎖
- 有向圖G=(T,U)
- T為結點集合,結點表示正運行的事務
- U為邊集合,邊表示事務等待情況
- T1等待T2,則從T1畫一條有向邊指向T2
- 用事務等待圖動態反映所有事務等待情況,若發生回路,則表示出現死鎖
- 超時法
- 死鎖解除:選擇代價最小的事務撤銷,釋放它所持有的鎖
並發調度的可串行性
可串行化調度
- 多個事務的並發執行是正確的,當且僅當其結果與按某一次序串行執行后的結果相同
可串行性
- 並發事務正確調度准則/正確性的准則
- 一個給定的並發調度,當且僅當它是可串行化的,才認為是正確調度
沖突可串行化調度
- 沖突操作,指不同事務對同一數據的讀寫操作和寫寫操作
- 一個調度S在保證沖突操作次序不變的情況下,通過交換兩個事務不沖突操作的次序得到另一個調度S',若S'為串行的,則S為沖突可串行化調度
- 一個調度是沖突可串行化,則一定是可串行化的調度(充分條件)
兩段鎖協議
- DBMS普遍采用兩段鎖協議的方法來實現並發調度的可串行性,保證並發調度的正確性
- 若並發事務都遵守兩段鎖協議,則對這些事務的任何並發調度策略都是可串行化的
- 兩段鎖協議指:所有事務必須分為兩個階段對數據加鎖和解鎖
- 獲得封鎖,又稱擴展階段
- 事務可以申請獲得任何數據項上任何類型的鎖,但不能釋放任何鎖
- 釋放封鎖,又稱收縮階段
- 事務可以釋放任何數據項上任何類型的鎖,但不能再申請任何鎖
- 獲得封鎖,又稱擴展階段
遵守第三級封鎖協議必然遵守兩端協議
封鎖粒度
- 封鎖對象的大小稱為封鎖粒度
- 封鎖對象
- 邏輯單元:屬性值,元組,關系,索引項
- 物理單元:頁(數據頁/索引頁),物理記錄
- 例:
- 若封鎖粒度為數據頁,事務T修改元組L,需要等待
- 若封鎖粒度為元組,事務T修改元組L,不需要等待
選擇封鎖粒度的原則
- 考慮封鎖對象和並發度兩個因素
- 多粒度封鎖:同一系統同時支持多種封鎖粒度供選擇
- 多粒度樹
- 根節點是整個數據庫,表示最大的數據粒度
- 葉節點表示最小的數據粒度
- 多粒度樹
- 多粒度封鎖協議
- 允許多粒度樹中每個結點單獨被加鎖
- 對一個結點加鎖意味着它后裔結點加同一鎖
- 一個數據對象可有兩種封鎖方式
- 顯式封鎖:直接加到數據對象上的封鎖
- 隱式封鎖:該對象沒有獨立加鎖,是由於上級加鎖導致加鎖
- 系統檢查封鎖沖突時
- 該數據對象,檢查顯式封鎖
- 搜索下級結點,
- 本事務的隱式封鎖與下級結點的顯式封鎖是否發生沖突
- 搜索上級結點
- 本事務的顯式封鎖是否與該數據對象上的隱式封鎖沖突
- 意向鎖
- 提高對某數據對象加鎖時系統的檢查效率
- 一個結點加意向鎖,說明該結點下層結點被加鎖
- 以強鎖代替弱鎖是安全的,反之不然
- 分類
- 意向共享鎖IS
- 對一個數據對象加IS鎖,則后裔加S鎖,反之
- 意向排它鎖IX
- 對一個數據對象加IX鎖,則后裔加X鎖,反之
- 共享意向排它鎖SIX
- 對一個數據對象加SIX鎖,則表示對它加S鎖,再加IX鎖
- 意向共享鎖IS