天天看點

資料庫系統原理——第六章 資料庫的安全與保護 2 知識點總結(自考本)安全性與通路控制事務與并發控制備份與恢複

第六章 資料庫的安全與保護 2

  • 安全性與通路控制
    • 使用者賬号管理
    • 賬戶權限管理
  • 事務與并發控制
    • 事務的概念
    • 事務的特征
    • 并發操作問題
    • 封鎖
  • 備份與恢複
    • 使用 SELECTION…OUTFILE 語句備份資料
    • 使用 LOAD DATA…INFILE 語句恢複資料

安全性與通路控制

使用者賬号管理

MySQL 的使用者賬号及相關資訊都存儲在一個名為 mysql 的 MySQL 資料庫中,這個資料庫裡有一個名為 user 的資料表,包含了所有使用者賬号,并且它用一個名為 user 的列存儲使用者的登入名。 可以使用下面的 SQL 語句檢視 MySQL 資料庫的使用者賬号。

  1. 建立使用者賬号

    常用的文法格式是:

文法格式介紹如下:

(1) 文法項“user”指定建立使用者賬号,其格式為‘user_name‘@’host name’。 其中, user_name 表示使用者名, host_name 表示主機名,即使用者連接配接 MySQL時所在主機的名字。 如果在建立的過程中,隻給出了賬戶中的使用者名,而沒指定主機名,則主機名會預設為是“%”, 其表示一組主機。

(2) 文法項“IDENTIFIED BY 子句”是可選項,用于指定使用者賬号對應的密碼,若該使用者賬号無密碼,則可省略此子句。

(3) 關鍵字“PASSWORD”是可選項,用于指定散列密碼, 即若使用明文設定密碼時,而忽略 PASSWORD 關鍵字; 如果不想以明文設定密碼,且知道PASSWORD()函數傳回給密碼的散列值,則可以在此密碼設定語句中指定此散列值, 但需要加上關鍵字 PASSWORD。

(4) 文法項**“password”指定使用者賬号的密碼**,其在 IDENTIFIED BY 關鍵字或PASSWORD 關鍵字之後。設定的密碼值可以是隻有字母和數字組成的明文,也可以是通過 PASSWORD()函數得到散列值。

在 CREATE USER 語句的使用中,需要注意以下幾點。

(1) 要使用 CREATE USER 語句,必須擁有 MySQL 中 mysql 資料庫的 INSERT 權限或全局 CREATE USER 權限。

(2) 使用 CREATE USER 語句建立一個使用者賬戶後,會在系統自身的 mysql 資料庫的 user 表中添加一條新記錄。如果建立的賬戶已經存在,則語句執行會出現錯誤。

(3) 如果兩個使用者具有相同的使用者和不同的主機名, MySQL 會将他們視為不同的使用者,并允許為這兩個使用者配置設定不同的權限集合。

(4) 如果在 CREATE USER 語句的使用中,沒有為使用者指定密碼,那麼 MySQL 允許該使用者可以不使用密碼登入系統,然而從安全的角度而言,不推薦這種做法。

(5) 新建立的使用者擁有的權限很少。 他們可以登入到 MySQL, 隻允許進行不需要權限的操作, 比如使用 SHOW 語句查詢所有存儲引擎和字元集的清單等,不能使用 USE 語句來讓其他使用者已經建立了的任何資料庫成為目前資料庫,因而無法通路那些資料庫的表。

2. 删除使用者

為了删除一個或多個使用者賬号以及相關的權限,可以使用 DROP USER 語句,其使用的文法格式是:

DORP USER user[, user]…
           

在 DROP USER 語句的使用中,需要注意以下幾點:

(1) DROP USER 語句可用于删除一個或多個 MySQL 賬戶,并消除其權限。

(2) 要使用 DROP USER 語句,必須擁有 MySQL 中 mysql 資料庫的 DELETE 權限或全局 CREATE USER 權限。

(3) 在 DROP USER 語句的使用中,如果沒有明确地給出賬戶的主機名,則該主機名會預設為是%。

(4) 使用者的删除不會影響到他們之前所**建立的表、 索引或其他資料庫對象,**這是因為 MySQL 并沒有記錄是誰建立了這些對象。

3. 修改使用者賬号

可以使用 RENAME USER 語句修改一個或多個已經存在的 MySQL 使用者賬号,其使用的文法格式是:

RENAME USER old_user TO new_user[,old_user TO new_user]…
           

在 RENMAE USER 語句的使用中,需要注意以下幾點。

(1) RENAME USER 語句對于原有 MySQL 賬戶進行重命名。

(2) 要使用 RENAME USER 語句,必須擁有 MySQL 中的 mysql 資料庫的 UPDATE 權限或全局 CREATE USER 權限。

(3) 倘若系統中舊賬戶不存在或者新賬戶已存在,則語句執行會出現錯誤。

4. 修改使用者密碼

可以使用 SET PASSWORD 語句修改一個使用者的登入密碼,其使用的文法格式

是:

SET PASSWORD[FOR user]=
{
PASSWORD(‘new_password’)
|’encrypted password’
} 
           

在SET PASSWORD 語句的使用中,需要注意以下幾點。

(1) 若不加上 FOR 子句,表示修改目前使用者的密碼; 若加上 FOR 子句,表示修改賬 戶為 user 的使用者密碼 , 其 中 user 的 格 式 必 須以*’user_name’@’host_name’*的格式給定, user_name 為賬戶的使用者名,host_name 為賬戶所在的主機名。該賬戶必須在系統中存在,否則語句執行會出現錯誤。

(2) 隻能使用選項 PASSWORD(‘new_password’)和’encrypted password’中的一項,且必須使用其中的某一項。

賬戶權限管理

  1. 權限的授予

    建立的 MySQL 用于必須被授權,可以使用 GRANT 語句來實作,常用的文法格式是:

GRANT
Pri_type[(column_list)]
[,pri_type[(column_list)]]…
ON[object_type]priv_level
TO user_specification[,user_specification]…
[WITH GRANT OPTION]
           

在此文法中:

(1) 文法項“pri_type”用于指定權限的名稱。

(2) 可選文法**“column_list”用于指定權限要授予給表中哪些具體的列。**

(3) 文法項**“ON 子句**”用于指定權限授予的對象和級别。

(4) 可選項“object_type”用于指定權限授予的對象類型,包括表、函數和存儲過程,分别用關鍵字“TABLE”“FUNCTION”和“PROCEDURE”辨別。

(5) 文法項**“priv_level”:用于指定權限的級别**,其可以授予的權限有這樣幾個:列權限、表權限、資料庫權限和使用者權限。相應地,在 GRANT 語句中可用于指定權限級别的值有這樣幾類格式: “*”表示目前資料庫中的所有表;“.”表示所有資料庫中的所有表; “db_name”表示某個資料庫中的所有表, db_name 指定資料庫名*; “db_name.tbl_name”表示某個資料庫中的某個表或視圖, db_name 指定資料庫名, tbl_name 指定表名或視圖名;“tbl_name” 表 示 某 個 表 或 視 圖 , tbl_name 指 定 表 名 或 視 圖 名 “db_name.routine_name”表示某個資料庫中的某個存儲過程或函數,**routine_name 指定存儲過程名或函數名。

(6) 文法項“TO 子句”用來設定使用者的密碼,以及指定被授予權限的使用者 user。若在 TO 子句中給系統中存在的使用者指定密碼,則新密碼會将原密碼覆寫**;如果權限被授予給一個不存在的使用者, MySQL 會自行執行一條 CREATE USER 語句來建立這個使用者, 但同時必須為該使用者指定密碼。 由此可見,GRANT 語句亦可以用于建立使用者賬号。

(7) 文法項**“user_specification”是 TO 子句中的具體描述部分**,其常用的文法格式是:

(8) 文法項**“WITH 子句”為可選項,用于實作權限的轉移或限制。**

關于 GRANT 語句中文法項“priv_type”的使用,需要注意以下幾點。

(1) 授予表權限時,文法項“priv_type”可以指定為以下值。

  • SELECT: 表示授予使用者可以使用 SELECT 語句通路特定表的權限。
  • INSERT: 表示授予使用者使用 INSERT 語句向一個特定表中添加資料行的權限。
  • DELETE: 表示授予使用者可以使用 DELETE 語句向一個特定表中删除資料行的權限。
  • UPDATE: 表示授予使用者可以使用 UPDATE 語句修改特定資料表中值的權限。
  • REFERENCES: 表示授予使用者可以建立一個外鍵來參照特定資料表的權限。
  • CREATE: 表示授予使用者可以使用特定的名字建立一個資料表的權限。
  • ALTER: 表示授予使用者可以使用 ALTER TABLE 語句修改資料表的權限。
  • INDEX:表示授予使用者可以在表上定義索引的權限。
  • DROP: 表示授予使用者可以删除資料表的權限。
  • ALL 或 ALL PRIVILEGES: 表示所有的權限名。

    (2) 授予權限時,文法項**“priv_type**”的值隻能指定為SELECT、INSERT和UPDATE,同時權限的後面需要加上列名清單 column_list。

    (3) 授予資料庫權限時,文法項**“priv_type”**可以指定為以下值。

  • SELECT: 表示授予使用者可以使用 SELECT 語句通路特定資料庫中所有表和視圖的權限。
  • INSERT: 表示授予使用者可以使用 INSERT 語句向特定資料庫中所有表添加資料行的權限。
  • DELETE: 表示授予使用者可以使用 DELETE 語句向删除特定資料庫中所有表的資料行的權限。
  • UPDATE: 表示授予使用者可以使用 UPDATE 語句更新特定資料庫中所有資料表的值的權限。
  • REFERENCES: 表示授予使用者可以建立指向特定的資料庫中的表外鍵的權限。
  • CREATE: 表示授予使用者可以使用 CREATE TABLE 語句在特定資料庫中建立新表的權限。
  • ALTER: 表示授予使用者可以使用 ALTER TABLE 語句修改特定資料庫中所有資料表的權限。
  • INDEX:表示授予使用者可以在特定資料庫中的所有資料表上定義和删除索引的權限。
  • DROP: 表示授予使用者可以删除特定資料庫中所有表和視圖的權限。
  • CREATE TEMPORARY TABLES: 表示授予使用者可以在特定資料庫中建立臨時表的權限。
  • CREATE VIEW: 表示授予使用者可以在特定資料庫中建立新的視圖的權限。
  • SHOW VIEW:表示授予使用者可以檢視特定資料庫中已有視圖的視圖定義的權限。
  • CREATE ROUTINE: 表示授予使用者可以為特定的資料庫建立存儲過程和存儲函數等權限。
  • ALTER ROUTINE: 表示授予使用者可以更新和删除資料庫中已有的存儲過程和存儲函數等權限。
  • EXECUTE ROUTINE: 表示授予使用者可以調用特定資料庫的存儲過程和存儲函數的權限。
  • LOOK TABLES: 表示授予使用者可以鎖定特定資料庫的已有資料表的權限。
  • ALL 或 ALL PRIVILEGES: 表示所有的權限名。

    (4) 最有效率的權限是使用者權限。 授予使用者權限時,文法項**“priv_type”**除了可以指定為授予資料庫權限時的所有值之外,還可以是下面這些值。

  • CREATE USER: 表示授予使用者可以建立和删除新使用者的權限。
  • SHOW DATABASES: 表示授予使用者可以使用 SHOW DATABASES 語句檢視所有已有的資料庫的定義的權限。
  1. 權限的轉移

    權限的轉移可以通過 GRANT 語句中使用 WITH 子句來實作。如果将 WITH 子句指定為關鍵字**“WITH GRANT OPTION”, 則表示 TO 子句中所指定的所有使用者都具有把自己所擁有的權限授予給其他使用者的權利,**而無論那些其他使用者是否擁有該權限。

  2. 使用者的撤銷

    當需要回收某些特定的權限時, 可使用的文法格式是:

REVOKE
priv_type[(column_list)]
[,priv_type[(column_list)]]…
ON[object_type]priv_level
FROM user[,user]…
           

當需要收回特定使用者的所有權限時,可使用的文法格式是:

REVOKE ALL PRIVILEGES,GRANT OPTION FROM user[,user]…
           

事務與并發控制

事務的概念

  1. 所謂事務是使用者定義的一個資料操作序列,這些操作可作為一個完整地工作單元,要麼全部執行,要麼全部不執行,是一個不可分割的工作機關。
  2. 事務與程式的不同:程式是靜止的,事務是動态的,是程式的執行而不是程式本身;同一程式的多個獨立執行可以同時進行,每一步執行則是一個不同的事務。
  3. 在 SQL 中,使用者顯示定義事務的語句一般有三條: BEGIN TRANSACTION、COMMIT 和 ROLLBACK, 且事務通常是以 BEGIN TRANSACTION 語句開始,以 COMMIT 語句或 ROOLBACK 語句結束。
  4. 事務中的操作一般是對資料的更新操作,包括增、删、 改。

事務的特征

  1. 原子性: 事務的原子性保證事務包含的一組更新操作是原子不可分的, 即事務是不可分割的最小工作機關,所包含的這些操作是一個整體。
  2. 一緻性:一緻性要求事務必須滿足資料庫的完整性限制,且事務執行完畢後将資料庫由一個一緻性狀态轉變到另一個一緻性狀态。 其中,資料庫的一緻性狀态是一種以一緻性規則為基礎的邏輯屬性。
  3. 隔離性:隔離性要求事務是彼此獨立的、 隔離的,即一個事務的執行不能被其他事務所幹擾,一個事務對資料庫變更的結果必須在它 COMMIT 後,另一個事務才能存取。
  4. 持續性:持續性也稱為永久性,是指一個事務一旦送出,它對資料庫中資料的改變就應該是永久性的,且接下來的其他操作或故障不應該對其執行結果又任何影響。

并發操作問題

事務是并發控制的基礎機關,保證事務的 ACID 特征是事務處理的重要任務,而事務的 ACID 特征可能遭到破壞的**原因之一是多個事務對資料庫的并發操作造成的。**為了保證事務的隔離性和一緻性, DBMS 需要對并發操作進行正确排程。其中, 完整性檢驗可以保證一個事務單獨執行時,若輸入的資料庫 狀态是正确的,則其輸出的資料庫狀态也是正确的。但當多個事務交錯執行時,可能出現不一緻問題,這也稱為并發操作問題,典型的有如下三種:丢失更新、不可重複讀和讀“髒”資料。

  1. 丢失更新

    設有兩個事務 T1 和 T2, 當它們同時讀入同一資料并加以修改時,事務 T2 的送出結果會破壞事務 T1 送出的結果,由此導緻事務 T1 的修改被丢失。 這就是一種由于對資料的并發操作而帶來的資料不一緻。

  2. 不可重複讀

    不可重複讀包括三種情況:

    (1) 事務 T1 讀取某一資料後,事務 T2 對其做了修改, 當事務 T1 再次讀該資料時,得到與前一次不同的值。

    (2) 事務 T1 按一定條件從資料庫中讀取了某些資料記錄後,事務 T2 删除了其中部分記錄,當事務 T1 再次按相同條件讀取資料時,發現某些記錄神秘地消失了。

    (3) 事務 T1 按一定條件從資料庫中讀取某些資料記錄後,事務 T2 插入了一些記錄,當事務 T1 再次按相同條件讀取資料時,發現多了一些記錄。

  3. 讀“髒”資料

    設有兩個事務 T1 和 T2, 讀“髒”資料是指,事務 T1 修改某一資料,并将其寫回磁盤,事務 T2 讀取同一資料後,事務 T1 由于某種原因被撤銷,這時事務 T1已修改過的資料恢複原值,事務 T2 讀到的資料就與資料庫中的資料不一緻,則事務 T2 讀到的資料就為“髒”資料,即不正确的資料。

解決并發操作所帶來的資料不一緻性問題的方法有鎖、時間戳、樂觀控制法和多版本并發控制等。

封鎖

封鎖是最常用的并發控制技術,它的基本思想是: 需要時,事務通過向系統請求對它所希望的資料對象加鎖,以確定它不被非預期改變。

  1. 一個鎖實際上就是允許或組織一個事務對一個資料對象的存取特權。

    基本的封鎖類型有兩種:排他鎖和共享鎖。

  2. 用封鎖進行并發控制

    工作原理是:

    (1) 若事務 T 對資料 D 加了 X 鎖,則所有别的事務對資料 D 的鎖請求都必須等待直到事務 T 釋放鎖。

    (2) 若事務 T 對資料 D 加了 S 鎖,則别的事務還可對資料 D 請求 S 鎖,而對資料 D 的 X 鎖請求必須等待直到事務 T 釋放鎖。

    (3) 事務執行資料庫操作時都要先請求相應的鎖,即對讀請求 S 鎖,對更新(插入、删除、修改) 請求 X 鎖。這個過程一般是由 DBMS 在執行操作時自動隐含地進行。

    (4) 事務一直占有獲得的鎖直到結束(COMMIT 或 ROLLBACK) 時釋放。是以, 利用封鎖機制可以解決并發操作所帶來的三個不一緻問題。

  3. 封鎖的粒度

    以粒度來描述封鎖的資料單元的大小。 DBMS 可以決定不同粒度的鎖。由最底層的資料元素到最高層的整個資料庫,粒度越細,并發性就越大, 但軟體複雜性和系統開銷也就越大。

  4. 封鎖的級别

    封鎖的級别又稱為一緻性級别或隔離度。

    由各種鎖的類型與其封鎖期限組合可形成不同的封鎖級别:

    (1) 0 級封鎖

    (2) 1 級封鎖

    (3) 2 級封鎖

    (4) 3 級封鎖

  5. 活鎖與死鎖

    **在并發事務處理過程中,由于鎖會使一事務處于等待狀态而排程其他事務處理,因而該事務可能會因優先級低而永遠等待下去,這種現象稱為“活鎖”。**活鎖問題的解決與排程算法有關,一種最簡單的辦法是“先來先服務”。

    兩個以上事務循環等待被同組中另一事務鎖住的資料單元的情形,稱為“死鎖”。 DBMS 需要提供死鎖預防、死鎖檢測和死鎖發生後的處理技術與方法。預防死鎖的辦法在作業系統中已普遍讨論,其中主要有如下幾種:

    (1) 一次性鎖請求

    (2) 鎖請求排序

    (3) 序列化處理

    (4) 資源剝奪

  6. 可串行性

    一組事務的一個排程就是它們的基本操作的一種排序。若在一個排程中,對于任意兩個事務 T1 和 T2, 要麼 T1 的所有操作都在 T2 所有操作之前, 要麼反之,則該排程室串行的,因而是正确的。

    通常,在資料庫系統中,可串行性就是并發執行的正确性準則,即當且僅當一組事務的并發執行排程是可串行化,才認為它們是正确的。

  7. 兩段封鎖法

    采用兩段封鎖法是一種最簡單而有效的保障封鎖其排程是可串行性的方法。

    兩段鎖協定規定在任何一個事務中,所有加鎖操作都必須在所有釋放鎖操作之前。其中, 事務劃分成如下兩個階段。

    (1) 發展(Growing) 或加鎖階段

    (2) 收縮(Shrinking) 或釋放鎖階段

    定理: 遵循兩段鎖協定的事務的任何并發排程都是可串行化的。

備份與恢複

會造成資料庫運作事務異常中斷的因素可能是:

  • 計算機硬體故障
  • 計算機軟體故障
  • 病毒
  • 人為誤操作
  • 自然災害
  • 盜竊

    備份和恢複政策來保證資料庫中資料的可靠性和完整性。

    資料備份是指通過導出資料或者複制表檔案的方式來制作資料庫的複本;資料庫恢複則是當資料庫出現故障或遭到破壞時,将備份的資料庫加載到系統, 進而使資料庫從錯誤狀态恢複到備份時的正确狀态。

    資料庫的恢複是以備份為基礎的,它是與備份相對應的系統維護和管理操作。

使用 SELECTION…OUTFILE 語句備份資料

常用文法格式是:

SELECT*INTO OUTFILE’file_name’export_options
|INTO DUMPFILE’file_name’
           

“export_options”的格式是:

[FIELDS
[TERMINATED BY ‘string’]
[[OPTIONALLY] ENCLOSED BY’char’]
[ESCAPED BY’char’]
]
[LINES TERMINATED BY’string’]
           

在此文法格式中:

(1) 文法項**“file_name”指定資料備份檔案的名稱**。

(2) 導出語句中使用關鍵字“OUTFILE”時,可以在文法項“expert_options”中加入以下兩個自選的子句,即 FIFLDS 子句和 LINES 子句,它們的作用是決定資料行在備份檔案中存儲的格式。 如果 FIELDS 和 LINES 子句都不指定,則默 認 聲 明 的 是 子 句 “FIELDS TERMINATED BY’\t’ENCLOSED BY”ESCAPED

BY’\’LINES TERMINATED BY’\n’”。

(3) 文法項“FIELDS 子句”中有三個亞子句,分别是**“TERMINATED BY 子句”****“ [OPTIONALLY] ENCLOSED BY 子句”和“ESCAPED BY 子句”。 如果指定了FIELDS 子句,則這三個亞子句中至少要求指定一個。其中, TERMINATED BY 子句用來指定字段值之間的符号**。

(4) 在 LINES 子句中使用關鍵字“TERMINATED BY”指定一個資料行結束的标志。

(5) 導出語句中使用的是關鍵字“DUMPFILE”, 而非“OUTFILE”時,導出的備份檔案裡面所有的資料行都會彼此緊挨着放置,即值和行之間沒有任何标記。

使用 LOAD DATA…INFILE 語句恢複資料

常用文法格式是:

LOAD DATA INFILE ‘file_name.txt’
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY ’string’]
[OPTIONALLY] ENCLOSED BY ’char’]
[ESCAPED BY ’char’]
]
[LINES
[STARTING BY ’string’]
[TERMINATED BY ’string’]
] 
           

此文法格式中:

(1) 文法項**“file_name”指定待導入的資料庫備份檔案名**,檔案中保持了待載入資料庫的所有資料行。

(2) 文法項**“tbl_name”指定需要導入資料的表名**。

(3) 此處的 FIELDS 子句和 SELECT…INTO OUTFILE 語句中的 **FIELDS 子句類似,**用于判斷字段之間和資料行之間的符号。

(4) 文法項“LINES子句”中的TERMINATED BY 亞子句用來指定一行結束的标志;STARTING BY 亞子句則指定一個字首,導入資料行時,忽略資料行中的該字首和字首之前的内容。如果某行不包括該字首,則整個資料行被跳過。