⑴ 從dba的角度,有哪些手段進行數據安全性的保障
有人說,資料庫管理員(DBA)有三個基本任務。按照重要性大小的順序進行排列,它們分別是:保護數據、保護數據再保護數據。
雖然數據完整性顯然是DBA的首要職責(如果數據「質量」不好的話,誰在乎資料庫是不是可用的或快速的),不過除此之外,他還有很多其它工作要做。下面就列出了一個DBA日常執行的實際工作。(有些任務是所有DBA通用的,其它的則是需要在某些特殊的資料庫環境才需要完成的)。
DBA的一般任務
◆安裝、配置、升級和遷移
雖然系統管理員通常負責安裝、維護伺服器上的硬體和操作系統,不過資料庫軟體的安裝通常是由DBA負責的。要勝任這一工作需要了解什麼樣的硬體配置才能使一個資料庫伺服器發揮最大的作用,並且還要就這些硬體需求與系統管理員進行溝通。在完成了上述工作之後,DBA就著手安裝資料庫軟體,並從各種不同的產品配置選項中選擇一個與硬體匹配的並且能使資料庫效率最高的方案。當有新版本的資料庫或者補丁包發布時,決定是否要用或者用哪一個升級或補丁包也是DBA的工作之一。如果企業購買了新的資料庫伺服器,那麼DBA也要負責將數據從原有資料庫伺服器中遷移到新的伺服器上來。
◆備份和恢復
DBA負責為他們所管理的資料庫制定、實施並定期測試資料庫備份和恢復方案。即使在一個大型企業中有一個單獨的系統管理員專門負責資料庫的備份工作,不過最終的決定權還是由DBA掌握---他來確保備份工作要如期完成,並且在資料庫出現故障執行恢復工作後,能包含所需要的所有文件。當資料庫故障發生時,DBA需要知道如何使用備份使資料庫返盡快回到正常狀態,會丟失任何所完成的事務。資料庫出現故障的原因可能又很多種,當出現故障時,DBA必須能很快就能判斷出故障所在並採取有效的應對策略。從商業的角度來看,資料庫備份是有成本的,DBA需要讓企業的管理人員知道各種資料庫備份方法的成本和風險。
◆資料庫安全
因為資料庫主要負責集中存儲數據,這些數據有可能是非常機密並且非常有價值的,因此資料庫往往是黑客甚至好奇的員工最感興趣的目標。DBA必須了解所用資料庫產品的詳細安全模型、該資料庫產品的用途、以及如何使用它來有效地控制數據存取。DBA最基本的三個安全任務是驗證(設置用戶帳戶控制用戶登錄資料庫)、授權(對資料庫的各部分設置許可權,防止非法用戶訪問)、審計(跟蹤用戶執行了什麼資料庫操作)。就目前而言,因為監管法規比如Sarbanes-Oxley 和HIPAA的報告要求必須得到滿足,這使得資料庫審計工作尤為重要。
◆存儲和容量規劃
創建資料庫得一個主要目就是存儲和檢索數據,所以規劃需要多少磁碟存儲空間和監測可用的磁碟存儲空間是DBA的關鍵責任。觀察數據的增長趨勢也是非常重要的,因為只有這樣DBA才能向企業的管理層提出一個長遠的存儲容量規劃。
◆性能監控和調整
DBA負責定期監測資料庫伺服器,從而找出資料庫瓶頸(使資料庫性能降低的某些部分)並制定補救措施。對資料庫伺服器的調整工作要在多個層次上完成。資料庫伺服器硬體的性能以及操作系統的配置都可能成為造成資料庫瓶頸的因素,同樣資料庫軟體的配置也是如此。資料庫在磁碟驅動器上的物理安裝方式以及索引的選擇對於資料庫的性能也有影響。資料庫查詢的編碼方式也可能顯著改變查詢結果返回的快慢程度。DBA需要了解在上述各個層次需要用哪些監測工具,以及如何使用它們來調整系統。從應用設計一開始把性能因素考慮在內是積極主動調整的反映,而不是等待問題發生之後再去修復它們。DBA還需要與資料庫應用開發人員緊密合作,以確保應用是按照最佳方式開發出來的,並且能帶來良好的性能。
◆疑難解答
當資料庫伺服器出現某些差錯的時候,DBA需要知道如何快速確定問題所在並正確地解決問題,保證不丟失數據或使情況變得更糟。
特殊環境下DBA的任務
除了上述基本職責外,由於某些特殊的資料庫環境,一些DBA們還需要掌握一些特別的技巧。
◆高可用性
隨著互聯網時代的到來,過去那種資料庫只需要在白天正常運轉的時代已經結束了,現在資料庫必須能夠提供須提供每周7天每天24小時的全天候服務。網站也已經從靜態的、預定義的內容發展成為動態創建的內容---在頁面請求發送過來之後,使用資料庫創建頁面布局。如果網站是全天候可用的,那麼支持網站的基礎資料庫也必須能夠全天候工作。在這種環境下管理資料庫,DBA需要知道哪些類型的維護業務可以在線完成(也就是在不中斷資料庫運行的情況下),以及在資料庫有可能關閉時制定一個維護「期限」。此外,DBA還要規劃為冗餘的資料庫硬體和軟體組件,以便萬一資料庫出現故障時,冗餘系統仍然能夠繼續要用戶提供服務。DBA可以使用在線備份、集群、復制和應急資料庫等技術和工具確保更高的可用性。
◆大型資料庫(VLDB)
隨著企業發現資料庫技術的用途越來越多,他們往往用它來保存更多的數據。此外,資料庫存儲的數據類型也發生了變化,從過去行列整齊的結構化數據發展現在的非結構化數據,比如文件、圖像、聲音、甚至指紋。這兩種趨勢帶來的結果是一樣的:那就是大型資料庫(VLDB)的出現。要管理VLDB,DBA需要特殊的技能。過去被認為是非常簡單的操作比如復制一個表,所需要的時間可能是非常巨大的。為了保證資料庫擴展到非常大的規模時仍然是可管理的,DBA需要了解一些技術,比如表分割(Oracle)、聯合資料庫(sql Server)和復制(MySQL)等等。
◆數據提取、轉化和載入(ETL)
在數據倉庫環境中,一個非常關鍵的任務是如何有效地載入數據倉庫或數據集市中的大量數據,而這些數據是從多個現有的生產系統中提取的。通常情況下,這些生產系統的格式與數據倉庫中的標准化定義是不同的,所以數據在載入之前必須要轉化(或「清洗」)。在一個特定的公司里,提取數據可能是也可能不是DBA的責任,但是DBA需要確定什麼樣的提取是有用的,它是資料庫決策團隊一個關鍵組成部分。
⑵ dba怎麼兼職
DBA(資料庫管理員)是一種特殊的技術職業,可以從事多種兼職工作。
1、資料庫安裝和配置:DBA可以安裝和配置多種資料庫,包括Oracle,MySQL,SQL Server,PostgreSQL等,並能夠局滲根據客戶的需求對資料庫進行優化和定製。
2、資料庫維護:DBA可以定期對資料庫進行掃描,及時發現和修復資料庫中的問題,同時也能夠根據需要定期備份資料庫模臘昌。
3、資料庫優化:DBA可以分析資料庫的工作負載,根據客戶的業務需求,對資料庫進行優化,以提高資料庫性能。
4、資料庫恢復:當資料庫發生故障時,DBA可以根據備份資料,進行數據旦扒庫恢復。
5、咨詢服務:DBA可以提供專業的資料庫咨詢服務,幫助客戶解決資料庫相關的技術問題,並為客戶提供技術指導。
⑶ oracle資料庫經常會出現佔用cpu100%的進程,然後系統就掛了,怎麼找出引起這種故障的sql語句
在故障發生時,嘗試用下面的語句抓取資料庫引起故障的點。
/*********************************************************************************************/
在oracle中監控死鎖
/*********************************************************************************************/
SELECT sn.username,
m.SID,
sn.SERIAL#,
m.TYPE,
DECODE(m.lmode,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
lmode,
LTRIM(TO_CHAR(lmode, '990'))) lmode,
DECODE(m.request,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
request,
LTRIM(TO_CHAR(m.request, '990'))) request,
m.id1,
m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在鎖請求,即被阻塞
OR (sn.SID = m.SID --不存在鎖請求,但是鎖定的對象被其他會話請求鎖定
AND m.request = 0 AND lmode != 4 AND
(id1, id2) IN (SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0
AND s.id1 = m.id1
AND s.id2 = m.id2))
ORDER BY id1, id2, m.request;
/*********************************************************************************************/
定位引起oracle死鎖的sql
/*********************************************************************************************/
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
/*********************************************************************************************/
下面的SQL查詢可以用於確定鎖住資料庫對象的鎖:
/*********************************************************************************************/
select
c.owner,
c.object_name,
c.object_type,
b.sid,
b.serial#,
b.status,
b.osuser,
b.machine
from
v$locked_object a ,
v$session b,
dba_objects c
where
b.sid = a.session_id
and
a.object_id = c.object_id;
/*********************************************************************************************/
顯示哪些會話被鎖住
/*********************************************************************************************/
/* showlock.sql */
COLUMN o_name format a10
COLUMN lock_type format a20
COLUMN object_name format a15
SELECT RPAD (oracle_username, 10) o_name, session_id SID,
DECODE (locked_mode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Execlusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
object_name, xisn, xidslot, xidsqn
FROM v$locked_object, all_objects
WHERE v$locked_object.object_id = all_objects.object_id;
/*********************************************************************************************/
顯示所有的TM和TX鎖
/*********************************************************************************************/
/* showalllock.sql */
SELECT SID, TYPE, id1, id2,
DECODE (lmode,
0, 'None',
1, 'Null',
2, 'Row share',
3, 'Row Exclusive',
4, 'Share',
5, 'Share Row Exclusive',
6, 'Exclusive'
) lock_type,
request, ctime, BLOCK
FROM v$lock
WHERE TYPE IN ('TX', 'TM');
/*********************************************************************************************/
在Oracle資料庫中,可以通過kill session的方式來終止一個進程,其基本語法結構為:
被kill掉的session,狀態會被標記為killed,Oracle會在該用戶下一次touch時清除該進程.
我們發現當一個session被kill掉以後,該session的paddr被修改,如果有多個session被kill,那麼多個session
的paddr都被更改為相同的進程地址:
/*********************************************************************************************/
alter system kill session 'sid,serial#' ;
/*********************************************************************************************/
在oracle中kill掉的進程有時還需要等待pmon回滾資料庫已經佔有的資源
有時候我們需要使用下面的腳本找出那些已經在oracle中kill掉的進程,在操作系統中在kill一次
/*********************************************************************************************/
select p.addr from v$process p where pid <> 1
minus
select s.paddr from v$session s;
$ kill -9 &paddr