第一篇:SQL Server 2008之?dāng)?shù)據(jù)庫(kù)大型應(yīng)用解決方案總結(jié)
SQL Server 2008之?dāng)?shù)據(jù)庫(kù)大型應(yīng)用解決方案總結(jié)
本教案需配合視頻教程學(xué)習(xí),視頻教程地址為:http://004km.cn/eschool/SQLxin3721/ 隨著互聯(lián)網(wǎng)應(yīng)用的廣泛普及,海量數(shù)據(jù)的存儲(chǔ)和訪問(wèn)成為了系統(tǒng)設(shè)計(jì)的瓶頸問(wèn)題。對(duì)于一個(gè)大型的互聯(lián)網(wǎng)應(yīng)用,每天百萬(wàn)級(jí)甚至上億的PV無(wú)疑對(duì)數(shù)據(jù)庫(kù)造成了相當(dāng)高的負(fù)載。對(duì)于系統(tǒng)的穩(wěn)定性和擴(kuò)展性造成了極大的問(wèn)題。
一、負(fù)載均衡技術(shù)
負(fù)載均衡集群是由一組相互獨(dú)立的計(jì)算機(jī)系統(tǒng)構(gòu)成,通過(guò)常規(guī)網(wǎng)絡(luò)或?qū)S镁W(wǎng)絡(luò)進(jìn)行連接,由路由器銜接在一起,各節(jié)點(diǎn)相互協(xié)作、共同負(fù)載、均衡壓力,對(duì)客戶端來(lái)說(shuō),整個(gè)群集可以視為一臺(tái)具有超高性能的獨(dú)立服務(wù)器。
1、實(shí)現(xiàn)原理
實(shí)現(xiàn)數(shù)據(jù)庫(kù)的負(fù)載均衡技術(shù),首先要有一個(gè)可以控制連接數(shù)據(jù)庫(kù)的控制端。在這里,它截?cái)嗔藬?shù)據(jù)庫(kù)和程序的直接連接,由所有的程序來(lái)訪問(wèn)這個(gè)中間層,然后再由中間層來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。這樣,我們就可以具體控制訪問(wèn)某個(gè)數(shù)據(jù)庫(kù)了,然后還可以根據(jù)數(shù)據(jù)庫(kù)的當(dāng)前負(fù)載采取有效的均衡策略,來(lái)調(diào)整每次連接到哪個(gè)數(shù)據(jù)庫(kù)。
2、實(shí)現(xiàn)多據(jù)庫(kù)數(shù)據(jù)同步
對(duì)于負(fù)載均衡,最重要的就是所有服務(wù)器的數(shù)據(jù)都是實(shí)時(shí)同步的。這是一個(gè)集群所必需的,因?yàn)?,如果?shù)不據(jù)實(shí)時(shí)、不同步,那么用戶從一臺(tái)服務(wù)器讀出的數(shù)據(jù),就有別于從另一臺(tái)服務(wù)器讀出的數(shù)據(jù),這是不能允許的。所以必須實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)同步。這樣,在查詢的時(shí)候就可以有多個(gè)資源,實(shí)現(xiàn)均衡。比較常用的方法是Moebius for SQL Server集群,Moebius for SQL Server集群采用將核心程序駐留在每個(gè)機(jī)器的數(shù)據(jù)庫(kù)中的辦法,這個(gè)核心程序稱為Moebius for SQL Server 中間件,主要作用是監(jiān)測(cè)數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)的變化并將變化的數(shù)據(jù)同步到其他數(shù)據(jù)庫(kù)中。數(shù)據(jù)同步完成后客戶端才會(huì)得到響應(yīng),同步過(guò)程是并發(fā)完成的,所以同步到多個(gè)數(shù)據(jù)庫(kù)和同步到一個(gè)數(shù)據(jù)庫(kù)的時(shí)間基本相等;另外同步的過(guò)程是在事務(wù)的環(huán)境下完成的,保證了多份數(shù)據(jù)在任何時(shí)刻數(shù)據(jù)的一致性。正因?yàn)镸oebius 中間件宿主在數(shù)據(jù)庫(kù)中的創(chuàng)新,讓中間件不但能知道數(shù)據(jù)的變化,而且知道引起數(shù)據(jù)變化的SQL語(yǔ)句,根據(jù)SQL語(yǔ)句的類型智能的采取不同的數(shù)據(jù)同步的策略以保證數(shù)據(jù)同步成本的最小化。
數(shù)據(jù)條數(shù)很少,數(shù)據(jù)內(nèi)容也不大,則直接同步數(shù)據(jù) 數(shù)據(jù)條數(shù)很少,但是里面包含大數(shù)據(jù)類型,比如文本,二進(jìn)制數(shù)據(jù)等,則先對(duì)數(shù)據(jù)進(jìn)行壓縮然后再同步,從而減少網(wǎng)絡(luò)帶寬的占用和傳輸所用的時(shí)間。
數(shù)據(jù)條數(shù)很多,此時(shí)中間件會(huì)拿到造成數(shù)據(jù)變化的SQL語(yǔ)句,然后對(duì)SQL語(yǔ)句進(jìn)行解析,分析其執(zhí)行計(jì)劃和執(zhí)行成本,并選擇是同步數(shù)據(jù)還是同步SQL語(yǔ)句到其他的數(shù)據(jù)庫(kù)中。此種情況應(yīng)用在對(duì)表結(jié)構(gòu)進(jìn)行調(diào)整或者批量更改數(shù)據(jù)的時(shí)候非常有用。
3、優(yōu)缺點(diǎn)
(1)擴(kuò)展性強(qiáng):當(dāng)系統(tǒng)要更高數(shù)據(jù)庫(kù)處理速度時(shí),只要簡(jiǎn)單地增加數(shù)據(jù)庫(kù)服務(wù)器就 可以得到擴(kuò)展。
(2)可維護(hù)性:當(dāng)某節(jié)點(diǎn)發(fā)生故障時(shí),系統(tǒng)會(huì)自動(dòng)檢測(cè)故障并轉(zhuǎn)移故障節(jié)點(diǎn)的應(yīng)用,保證數(shù)據(jù)庫(kù)的持續(xù)工作。(3)安全性:因?yàn)閿?shù)據(jù)會(huì)同步的多臺(tái)服務(wù)器上,可以實(shí)現(xiàn)數(shù)據(jù)集的冗余,通過(guò)多份數(shù)據(jù)來(lái)保證安全性。另外它成功地將數(shù)據(jù)庫(kù)放到了內(nèi)網(wǎng)之中,更好地保護(hù)了數(shù)據(jù)庫(kù)的安全性。(4)易用性:對(duì)應(yīng)用來(lái)說(shuō)完全透明,集群暴露出來(lái)的就是一個(gè)IP(1)不能夠按照Web服務(wù)器的處理能力分配負(fù)載。
(2)負(fù)載均衡器(控制端)故障,會(huì)導(dǎo)致整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)癱瘓。
二、數(shù)據(jù)庫(kù)的讀寫分離
1,實(shí)現(xiàn)原理:讀寫分離簡(jiǎn)單的說(shuō)是把對(duì)數(shù)據(jù)庫(kù)讀和寫的操作分開(kāi)對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)服務(wù)器,這樣能有效地減輕數(shù)據(jù)庫(kù)壓力,也能減輕io壓力。主數(shù)據(jù)庫(kù)提供寫操作,從數(shù)據(jù)庫(kù)提供讀操作,其實(shí)在很多系統(tǒng)中,主要是讀的操作。當(dāng)主數(shù)據(jù)庫(kù)進(jìn)行寫操作時(shí),數(shù)據(jù)要同步到從的數(shù)據(jù)庫(kù),這樣才能有效保證數(shù)據(jù)庫(kù)完整性。
(ebay的讀寫比率是260:1,ebay的讀寫分離)(微軟數(shù)據(jù)庫(kù)分發(fā))
2,實(shí)現(xiàn)方法:在MS Sql server中可以使用發(fā)布定義的方式實(shí)現(xiàn)數(shù)據(jù)庫(kù)復(fù)制,實(shí)現(xiàn)讀寫分離,復(fù)制是將一組數(shù)據(jù)從一個(gè)數(shù)據(jù)源拷貝到多個(gè)數(shù)據(jù)源的技術(shù),是將一份數(shù)據(jù)發(fā)布到多個(gè)存儲(chǔ)站點(diǎn)上的有效方式。使用復(fù)制技術(shù),用戶可以將一份數(shù)據(jù)發(fā)布到多臺(tái)服務(wù)器上。復(fù)制技術(shù)可以確保分布在不同地點(diǎn)的數(shù)據(jù)自動(dòng)同步更新,從而保證數(shù)據(jù)的一致性。SQL SERVER復(fù)制技術(shù)類型有三種,分別是:快照復(fù)制、事務(wù)復(fù)制、合并復(fù)制。SQL SERVER 主要采用出版物、訂閱的方式來(lái)處理復(fù)制。源數(shù)據(jù)所在的服務(wù)器是出版服務(wù)器,負(fù)責(zé)發(fā)表數(shù)據(jù)。出版服務(wù)器把要發(fā)表的數(shù)據(jù)的所有改變情況的拷貝復(fù)制到分發(fā)服務(wù)器,分發(fā)服務(wù)器包含有一個(gè)分發(fā)數(shù)據(jù)庫(kù),可接收數(shù)據(jù)的所有改變,并保存這些改變,再把這些改變分發(fā)給訂閱服務(wù)器。3,優(yōu)缺點(diǎn)
(1)數(shù)據(jù)的實(shí)時(shí)性差:數(shù)據(jù)不是實(shí)時(shí)同步到自讀服務(wù)器上的,當(dāng)數(shù)據(jù)寫入主服務(wù)器后,要在下次同步后才能查詢到。(2)數(shù)據(jù)量大時(shí)同步效率差:?jiǎn)伪頂?shù)據(jù)量過(guò)大時(shí)插入和更新因索引,磁盤IO等問(wèn)題,性能會(huì)變的很差。(3)同時(shí)連接多個(gè)(至少兩個(gè))數(shù)據(jù)庫(kù):至少要連接到兩個(gè)數(shù)據(jù)數(shù)據(jù)庫(kù),實(shí)際的讀寫操作是在程序代碼中完成的,容易引起混亂
(4)讀具有高性能高可靠性和可伸縮:只讀服務(wù)器,因?yàn)闆](méi)有寫操作,會(huì)大大減輕磁盤IO等性能問(wèn)題,大大提高效率;只讀服務(wù)器可以采用負(fù)載均衡,主數(shù)據(jù)庫(kù)發(fā)布到多個(gè)只讀服務(wù)器上實(shí)現(xiàn)讀操作的可伸縮性。
三、數(shù)據(jù)庫(kù)拆分(分布式)
通過(guò)某種特定的條件,將存放在同一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)分散存放到多個(gè)數(shù)據(jù)庫(kù)上,實(shí)現(xiàn)分布存儲(chǔ),通過(guò)路由規(guī)則路由訪問(wèn)特定的數(shù)據(jù)庫(kù),這樣一來(lái)每次訪問(wèn)面對(duì)的就不是單臺(tái)服務(wù)器了,而是N臺(tái)服務(wù)器,這樣就可以降低單臺(tái)機(jī)器的負(fù)載壓力。
垂直(縱向)拆分:是指按功能模塊拆分,比如分為訂單庫(kù)、商品庫(kù)、用戶庫(kù)...這種方式多個(gè)數(shù)據(jù)庫(kù)之間的表結(jié)構(gòu)不同。水平(橫向)拆分:將同一個(gè)表的數(shù)據(jù)進(jìn)行分塊保存到不同的數(shù)據(jù)庫(kù)中,這些數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)完全相同。
(縱向拆分)
(橫向拆分)
1,實(shí)現(xiàn)原理:使用垂直拆分,主要要看應(yīng)用類型是否合適這種拆分方式,如系統(tǒng)可以分為,訂單系統(tǒng),商品管理系統(tǒng),用戶管理系統(tǒng)業(yè)務(wù)系統(tǒng)比較明的,垂直拆分能很好的起到分散數(shù)據(jù)庫(kù)壓力的作用。業(yè)務(wù)模塊不明晰,耦合(表關(guān)聯(lián))度比較高的系統(tǒng)不適合使用這種拆分方式。但是垂直拆分方式并不能徹底解決所有壓力問(wèn)題,例如 有一個(gè)5000w的訂單表,操作起來(lái)訂單庫(kù)的壓力仍然很大,如我們需要在這個(gè)表中增加(insert)一條新的數(shù)據(jù),insert完畢后,數(shù)據(jù)庫(kù)會(huì)針對(duì)這張表重新建立索引,5000w行數(shù)據(jù)建立索引的系統(tǒng)開(kāi)銷還是不容忽視的,反過(guò)來(lái),假如我們將這個(gè)表分成100個(gè)table呢,從table_001一直到table_100,5000w行數(shù)據(jù)平均下來(lái),每個(gè)子表里邊就只有50萬(wàn)行數(shù)據(jù),這時(shí)候我們向一張只有50w行數(shù)據(jù)的table中insert數(shù)據(jù)后建立索引的時(shí)間就會(huì)呈數(shù)量級(jí)的下降,極大了提高了DB的運(yùn)行時(shí)效率,提高了DB的并發(fā)量,這種拆分就是橫向拆分
2,實(shí)現(xiàn)方法:垂直拆分,拆分方式實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,根據(jù)表名訪問(wèn)不同的數(shù)據(jù)庫(kù)就可以了。橫向拆分的規(guī)則很多,這里總結(jié)前人的幾點(diǎn),(1)順序拆分:如可以按訂單的日前按年份才分,2003年的放在db1中,2004年的db2,以此類推。當(dāng)然也可以按主鍵標(biāo)準(zhǔn)拆分。優(yōu)點(diǎn):可部分遷移
缺點(diǎn):數(shù)據(jù)分布不均,可能2003年的訂單有100W,2008年的有500W。
(2)hash取模分: 對(duì)user_id進(jìn)行hash(或者如果user_id是數(shù)值型的話直接使用user_id的值也可),然后用一個(gè)特定的數(shù)字,比如應(yīng)用中需要將一個(gè)數(shù)據(jù)庫(kù)切分成4個(gè)數(shù)據(jù)庫(kù)的話,我們就用4這個(gè)數(shù)字對(duì)user_id的hash值進(jìn)行取模運(yùn)算,也就是user_id%4,這樣的話每次運(yùn)算就有四種可能:結(jié)果為1的時(shí)候?qū)?yīng)DB1;結(jié)果為2的時(shí)候?qū)?yīng)DB2;結(jié)果為3的時(shí)候?qū)?yīng)DB3;結(jié)果為0的時(shí)候?qū)?yīng)DB4,這樣一來(lái)就非常均勻的將數(shù)據(jù)分配到4個(gè)DB中。
優(yōu)點(diǎn):數(shù)據(jù)分布均勻
缺點(diǎn):數(shù)據(jù)遷移的時(shí)候麻煩;不能按照機(jī)器性能分?jǐn)倲?shù)據(jù)。(3)在認(rèn)證庫(kù)中保存數(shù)據(jù)庫(kù)配置
就是建立一個(gè)DB,這個(gè)DB單獨(dú)保存user_id到DB的映射關(guān)系,每次訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候都要先查詢一次這個(gè)數(shù)據(jù)庫(kù),以得到具體的DB信息,然后才能進(jìn)行我們需要的查詢操作。
優(yōu)點(diǎn):靈活性強(qiáng),一對(duì)一關(guān)系
缺點(diǎn):每次查詢之前都要多一次查詢,會(huì)造成一定的性能損失。
第二篇:SQLServer數(shù)據(jù)庫(kù)入門學(xué)習(xí)總結(jié)
SQL Server數(shù)據(jù)庫(kù)入門學(xué)習(xí)總結(jié)
經(jīng)過(guò)一段時(shí)間的學(xué)習(xí),也對(duì)數(shù)據(jù)庫(kù)有了一些認(rèn)識(shí)。
數(shù)據(jù)庫(kù)基本是由表,關(guān)系,操作組成;對(duì)于初學(xué)者首先要學(xué)的:
1.數(shù)據(jù)庫(kù)是如何存儲(chǔ)數(shù)據(jù)的表,約束,觸發(fā)器
2.數(shù)據(jù)庫(kù)是如何操作數(shù)據(jù)的
insert,update,delete T-sql 函數(shù) 存儲(chǔ)過(guò)程 觸發(fā)器
3.數(shù)據(jù)庫(kù)是如何顯示數(shù)據(jù)的select
SQLServer數(shù)據(jù)庫(kù)學(xué)習(xí)總結(jié)
1.SQL基礎(chǔ)
SQL Server2000安裝、配置,服務(wù)器啟動(dòng)、停止,企業(yè)管理器、查詢分析器
第一代數(shù)據(jù)庫(kù)--網(wǎng)狀數(shù)據(jù)庫(kù)和層次數(shù)據(jù)庫(kù);第二代數(shù)據(jù)庫(kù)--關(guān)系數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)(DB);數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS);數(shù)據(jù)庫(kù)系統(tǒng)(DBS)
SQL Server 2000 提供了不同版本:企業(yè)版、標(biāo)準(zhǔn)版、個(gè)人版、開(kāi)發(fā)版
SQL Server中的數(shù)據(jù)類型:整數(shù):int,smallint,tinyint,bigint;浮點(diǎn)數(shù):real,float,decimal;二進(jìn)制:binary,varbinary;邏輯:bit;字符:char,nchar,varchar,nvarchar;文本和圖形:text,ntext,image;日期和時(shí)間:datetime,smalldatetime;貨幣:money,smallmoney
數(shù)據(jù)庫(kù)的創(chuàng)建和刪除;數(shù)據(jù)庫(kù)表的創(chuàng)建、修改和刪除
數(shù)據(jù)完整性:實(shí)體完整性:Primary Key,Unique Key,Unique Index,Identity Column;域完整性:Default,Check,Foreign Key,Data type,Rule;參照完整性:Foreign Key,Check,Triggers,Procedure;用戶定義完整性:Rule,Triggers,Procedure;Create Table中得全部列級(jí)和表級(jí)約束
SQL Server中有5種約束:主鍵約束(Primary Key Constraint)、默認(rèn)約束(Default Constraint)、檢查約束(Check Constraint)、唯一性約束(Unique Constraint)、外鍵約束(Foreign Key Constraint).關(guān)系圖
數(shù)據(jù)庫(kù)設(shè)計(jì)的步驟:需求分析、概念結(jié)構(gòu)設(shè)計(jì)、邏輯結(jié)構(gòu)設(shè)計(jì)、數(shù)據(jù)庫(kù)物理設(shè)計(jì)、數(shù)據(jù)庫(kù)實(shí)施、數(shù)據(jù)庫(kù)運(yùn)行和維護(hù)
兩個(gè)實(shí)體之間的聯(lián)系:一對(duì)一(1:1)、一對(duì)多(1:n)、多對(duì)多(m:n)
實(shí)體關(guān)系模型--E-R圖
數(shù)據(jù)庫(kù)規(guī)范化:將數(shù)據(jù)庫(kù)的結(jié)構(gòu)精簡(jiǎn)為最簡(jiǎn)單的形式;從表中刪除冗余列;標(biāo)識(shí)所有依賴于其他數(shù)據(jù)庫(kù)的數(shù)據(jù)。
數(shù)據(jù)庫(kù)三范式:第一范式就是無(wú)重復(fù)的列;第二范式就是非主屬性非部分依賴于主關(guān)鍵字;第三范式就是屬性不依賴于其他非主屬性
2.SQL語(yǔ)句
SQL全稱是“結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)”
SQL的4個(gè)部分:
數(shù)據(jù)定義語(yǔ)言DDL(Data Definition Language)用來(lái)定義數(shù)據(jù)的結(jié)構(gòu):create、alter、drop。
數(shù)據(jù)控制語(yǔ)言DCL(Data Control Language)用來(lái)控制數(shù)據(jù)庫(kù)組件的存取許可、存取權(quán)限等得命令:grant、revoke。
數(shù)據(jù)操縱語(yǔ)言DML(Data Manipulation Language)用來(lái)操縱數(shù)據(jù)庫(kù)中得數(shù)據(jù)的命令:insert、update、delete。
數(shù)據(jù)查詢語(yǔ)言DQL(Data Query Language)用來(lái)查詢數(shù)據(jù)庫(kù)中得數(shù)據(jù)的命令:select。
SQL中得運(yùn)算符
:算術(shù)運(yùn)算符、位運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、通配運(yùn)算符、字符串連接符、賦值運(yùn)算符
3.查詢
簡(jiǎn)單查詢,使用TOP子句
查詢結(jié)果排序order by
帶條件的查詢where,使用算術(shù)表達(dá)式,使用邏輯表達(dá)式,使用between關(guān)鍵字,使用in關(guān)鍵字,模糊查詢like
在查詢中使用聚合函數(shù):sum(x),avg(x),min(x),max(x),count(x),count(*)使用分組查詢group by,having子句
distinct關(guān)鍵字
列別名
select top 6 * from sales order by qty desc select au_id,au_fname,au_lname
from
authors
where
state in('ks','ca','mi')
select au_fname,au_lname,phone from authors where au_id like '72[234]-%' select
簡(jiǎn)單子查詢:嵌套子查詢、相關(guān)子查詢;子查詢的select語(yǔ)句中不能使用order by子句,roder by子句只能對(duì)最終查詢結(jié)果排序。type,sum(price),avg(price),count(*)
from
titles
group
by
type
having
type in('business','psycheology')嵌套子查詢:執(zhí)行過(guò)程,先執(zhí)行子查詢,子查詢得到的結(jié)果不被顯示,而是傳給外層查詢,作為外層查詢的條件,然后執(zhí)行外層查詢,并顯示結(jié)果。
嵌套子查詢的執(zhí)行不依賴于外層查詢,子查詢只執(zhí)行一次。
帶有比較運(yùn)算符的子查詢,帶有in和not in的子查詢,帶有any或all的子查詢
相關(guān)子查詢:子查詢?yōu)橥鈱硬樵兊拿恳恍袌?zhí)行一次,外層查詢將子查詢引用的列的值傳給了子查詢。
相關(guān)子查詢的執(zhí)行依賴于外層查詢,子查詢需要重復(fù)的執(zhí)行。
帶有exists和not exists的相關(guān)子查詢。
多表聯(lián)接查詢:內(nèi)聯(lián)接(inner join)、外聯(lián)接((left、right、full)outer join)、自聯(lián)接(self join)和交叉聯(lián)接(cross join)
在查詢上創(chuàng)建新表:select into語(yǔ)句首先創(chuàng)建一個(gè)新表,然后用查詢的結(jié)果填充新表。
表別名
select coursename from course where courseid in(select distinct courseid from grade where grade>10)
select studname from student where sudbirthday > any(select studbirthday from student where class = '信息系')and class<>'信息系'
select studname from student where exists(select * from grade where studid = student.studid and courseid = '01')
select stud1.* from student as stud1 join student as stud2 on stud2.studname = 'mm' and stud1.studsex = stud2.studsex
select * into girls from student where studsex='m'
4.視圖、索引和事務(wù)
視圖是由一個(gè)或多個(gè)數(shù)據(jù)表(基本表)導(dǎo)出的虛擬表或者查詢表,是關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)提供給用戶以多種角度觀察數(shù)據(jù)庫(kù)中數(shù)據(jù)的重要機(jī)制。
視圖的好處:能夠簡(jiǎn)化用戶的操作;視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)。
創(chuàng)建視圖時(shí),視圖的名稱存在sysobjects表中。有關(guān)視圖中所定義列的信息添加到syscolumns表中,而有關(guān)視圖相關(guān)性的信息添加到sysdepends表中。另外,create view語(yǔ)句的文本添加到syscomments表中。
在通過(guò)視圖向表中插入數(shù)據(jù)時(shí),如果insert語(yǔ)句列表中包含有視圖中沒(méi)有選擇的列和不允許為空值的列,這種操作是不允許的。
創(chuàng)建視圖:create view view_employee as select emp_id,fname,lname from employee 使用視圖:select * from view_employee
修改視圖:alter view view_employee as select emp_id,fname,job_id from employee where job_id>10
刪除視圖:drop veiw view_employee 查看視圖結(jié)構(gòu):exec sp_help view_employee
查看視圖定義信息:exec sp_helptext 'view_employee'
索引提供了一種基于一列或多列的值對(duì)表的數(shù)據(jù)行進(jìn)行快速訪問(wèn)的方法。索引提供的是表中得邏輯順序。
聚集索引基于數(shù)據(jù)行的鍵值在表內(nèi)排序和存儲(chǔ)這些數(shù)據(jù)行。當(dāng)數(shù)據(jù)表以某列為關(guān)鍵字建立聚集索引時(shí),表中得數(shù)據(jù)行就以該列(聚集索引鍵)的排序次序進(jìn)行存儲(chǔ)。每個(gè)表只能有一個(gè)聚集索引。
非聚集索引具有完全獨(dú)立于數(shù)據(jù)行的結(jié)構(gòu),一個(gè)表可以建立多個(gè)非聚集索引。
創(chuàng)建聚集索引:create clustered index studid_ind on stud(studid)
創(chuàng)建非聚集索引:create unique index studfullname_ind on stud(fname desc,lname)刪除索引:drop index stud.studid_ind 查看stud表上得索引:exec sp_helpindex stud
事務(wù)是一種機(jī)制,是一個(gè)操作序列,它包含了一組數(shù)據(jù)庫(kù)操作命令,并且所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐng)求。
事務(wù)的特性:原子性(Atomicity)、一致性(Consistenty)、隔離性(Isolation)、永久性(Durability)。事務(wù)分類:顯示事務(wù)、隱性事務(wù)、自動(dòng)提交事務(wù)。
視圖、索引和事務(wù)的創(chuàng)建、使用、修改和刪除
5.Transact—SQL編程
全局變量:由系統(tǒng)定義和維護(hù),其名稱以@@字符開(kāi)頭
局部變量:由用戶定義和賦值,其名稱以@字符開(kāi)頭
輸出語(yǔ)句:print
邏輯控制語(yǔ)句:begin...end;break;case;continue;goto;if...else;return;while 常用函數(shù):行集函數(shù),聚合函數(shù),標(biāo)量函數(shù)
轉(zhuǎn)換函數(shù):convert(dt,e,s),cast()
數(shù)學(xué)函數(shù):絕對(duì)值abs(n),向上取整ceiling(n),向下取整floor(n),指定次冪power(n,y),四舍五入round(n,length),求符號(hào)sign(n),平方根sqrt(n)日期
和
時(shí)
間
函
數(shù)
:dateadd(datepart,num,date),datediff(datepart,date1,date2),datename(datepart,date),datepart(datepart,date),getdate(),year(date),month(date),day(date)
字符串函數(shù):lower(e),upper(e),left(e,i),right(e,i),replace(s1,s2,s3)用3替換1中的2,replicate(e,i)重復(fù)指定次數(shù),stuff(s1,start,length,s2)用2替換1中指定位置,substring(expression,start,length)元數(shù)
據(jù)
函
數(shù)
:db_id('database_name'),db_name(datebase_id),object_id('obj_name'),object_name(obj_id),col_length('table','column'),col_name(table_id,col_id)聚合函數(shù):avg(expr),count(expr),count(*),max(expr),min(expr),sum(expr)select au_lname,au_fname,contory = case state when 'u
t' then 'utah' when 'ca' then 'california' else 'world'
end,city from authors order by state desc
while(select avg(price)from titles)<30 begin
update titles set price = price * 2
if(select max(price)from titles)>50 break else continue end
print '價(jià)格太高'
begin
insert into jobs values('a',80,234)if @@error<>0 print '數(shù)據(jù)插入失敗' else goto M end
M:print '數(shù)據(jù)插入成功'
6.游標(biāo)
游標(biāo)是一種能從包含多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。將批操作變成行操作,對(duì)結(jié)果集中得某行進(jìn)行操作。
declare author_csr cursor read_only for--定義只讀游標(biāo)
select au_fname,au_lname from authors where state = 'ca' order by au_fname,au_lname declare @lname varchar(20),@fname varchar(20)--定義變量
open author_csr--打開(kāi)游標(biāo)
fetch next from author_csr into @lname,@fname--執(zhí)行一次數(shù)據(jù)讀取操作
while @@fetch_status=0--循環(huán)游標(biāo)讀取數(shù)據(jù)
begin
print 'author name:'+@lname+''+@fname fetch next from author_csr into @lname,@fname end
close author_csr--關(guān)閉游標(biāo)
deallocate author_csr--釋放游標(biāo)
7.存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程(stored procedure)類似c語(yǔ)言中的函數(shù),是一組為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中。用戶通過(guò)指定存儲(chǔ)過(guò)程的名字餅給出參數(shù)來(lái)執(zhí)行它。
常用的系
統(tǒng)
存
儲(chǔ)
過(guò)
程
:sp_database,sp_helpdb,sp_renamedb,sp_tables,sp_column,sp_help,sp_helpconstraint,sp_helpindex,sp_stored_procedure,sp_password 創(chuàng)建存儲(chǔ)過(guò)程:
create as
select @total=count(jy.askbookid)from book,jyls jy where bookname like @book_name and book.isbn=jy.isbn and jy.starttime>=@starttime and endtime<=@endtime procedure book_num
(@book_name
varchar(26),@starttime
datetime,@endtime datetime,@total int output)使用存儲(chǔ)過(guò)程:
declare @book_name char(26),@total int
set @book_name='面向?qū)ο蠓治龊驮O(shè)計(jì)'
exec book_num @book_name,'2007-01-01','2007-11-01',@total output select @book_name as bookname,@total as num
8.觸發(fā)器
觸發(fā)器是一種特殊類型的存儲(chǔ)過(guò)程,主要是通過(guò)實(shí)踐進(jìn)行觸發(fā)而被執(zhí)行。
觸發(fā)器的主要作用就是能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。其他功能:強(qiáng)化約束,跟蹤變化,級(jí)聯(lián)運(yùn)行,存儲(chǔ)過(guò)程調(diào)用。
SQL Server 2000支持兩種類型觸發(fā)器:
after觸發(fā)器:要求只有執(zhí)行某一操作之后,觸發(fā)器才被執(zhí)行,且只能在表上定義。
instead of觸發(fā)器:表示并不執(zhí)行其所定義的操作,而僅是執(zhí)行觸發(fā)器本身。既可以在表上定義,也可以在視圖上定義,但對(duì)同一操作只能定義一個(gè)instead of觸發(fā)器。
工作原理:
當(dāng)觸發(fā)insert觸發(fā)器時(shí),新的數(shù)據(jù)行就會(huì)被插入到觸發(fā)器表和inserted表中。觸發(fā)器通過(guò)檢查inserted表來(lái)確定是否執(zhí)行觸發(fā)器動(dòng)作或如何執(zhí)行。
當(dāng)在定義有觸
發(fā)器的表上執(zhí)行update語(yǔ)句時(shí),原始行被移入到deleted表,更新行被移入inserted表。觸發(fā)器檢查deleted表和inserted表以及被更新的表,來(lái)確定是否更新了多行以及如何執(zhí)行觸發(fā)器動(dòng)作。
當(dāng)觸發(fā)deleted觸發(fā)器后,從受影響的表中刪除的行將被放置到一個(gè)特殊的deleted表中。
create trigger update_smoke_t_sale on smoke_t_sale for update as
declare @newsalenum int,@smokeproductname varchar(40)select @newsalenum= salenum from inserted
select @smokeproductname=smokeproductname from inserted if update(salenum)--判斷是否更新
begin update smoke_t_sale
set
saletotalprice=@newsalenum
*
saleprice
where smokeproductname=@smokeproductname
insert into smoke_log(logContent)values('更新成功')end else
print '未更新'
9.數(shù)據(jù)庫(kù)高級(jí)管理
SQL Server安全體系結(jié)構(gòu),4個(gè)等級(jí):客戶機(jī)操作系統(tǒng)的安全性,SQL Server的登錄安全性,數(shù)據(jù)庫(kù)的使用安全性,數(shù)據(jù)對(duì)象的使用安全性 SQL Server驗(yàn)證模式:windows身份驗(yàn)證模式和混合模式(windows身份驗(yàn)證和SQL Server身份驗(yàn)證)
登錄賬戶:用戶登錄(連接)SQL Server服務(wù)器的賬戶和密碼。
角色管理:服務(wù)器角色(負(fù)責(zé)管理和維護(hù)SQL Server的組);數(shù)據(jù)庫(kù)角色(是對(duì)某個(gè)數(shù)據(jù)庫(kù)具有相同訪問(wèn)權(quán)限的用戶賬戶和組的集合)
數(shù)據(jù)庫(kù)用戶:對(duì)于每個(gè)要求訪問(wèn)數(shù)據(jù)庫(kù)的登錄賬戶,必須在要訪問(wèn)的數(shù)據(jù)庫(kù)中建立該數(shù)據(jù)庫(kù)的訪問(wèn)賬戶,且與其登錄賬戶鏈接關(guān)聯(lián),才可進(jìn)入該數(shù)據(jù)庫(kù)訪問(wèn)。
權(quán)限管理:是指用戶是否能進(jìn)行訪問(wèn)數(shù)據(jù)庫(kù)資源的相應(yīng)操作。權(quán)限包括:語(yǔ)句權(quán)限、對(duì)象權(quán)限和暗示權(quán)限。
授予權(quán)限:
grant 語(yǔ)句 [...] to 安全賬戶[...]
grant 權(quán)限 [...] on 表或視圖[(列[,...])]|on 存儲(chǔ)過(guò)程|on用戶自定義函數(shù) to 安全賬戶[,...] 拒絕權(quán)限:
deny 語(yǔ)句 [...] to 安全賬戶[...]
deny 權(quán)限 [...] on 表或視圖[(列[,...])]|on 存儲(chǔ)過(guò)程|on用戶自定義函數(shù) to 安全賬戶[,...] 撤銷權(quán)限:
revoke 語(yǔ)句 [...] from 安全賬戶[...]
revoke 權(quán)限 [...] on 表或視圖[(列[,...])]|on 存儲(chǔ)過(guò)程|on用戶自定義函數(shù) from 安全賬戶[,...]
備份和恢復(fù):
數(shù)據(jù)庫(kù)備份設(shè)備,在進(jìn)行數(shù)據(jù)庫(kù)備份之前,首先要?jiǎng)?chuàng)建備份設(shè)備。包括:磁盤、磁帶和命名管道
SQL Server 備份策略:只備份數(shù)據(jù)庫(kù)、備份數(shù)據(jù)庫(kù)和事務(wù)日志、差異備份。
backup database medicaldb to disk='medical_bk1' with name='medicaldb backup' description='medicaldb fullbackup' init restore database medicaldb from medical_bk1
導(dǎo)入導(dǎo)出:
DTS(Data Transformation Service)是SQL Server提供的數(shù)據(jù)傳輸服務(wù)。使用戶可以將來(lái)自完全不同數(shù)據(jù)源的數(shù)據(jù)析取、轉(zhuǎn)換并合并到單個(gè)或多個(gè)目的。
分離與附加:創(chuàng)建可移動(dòng)的數(shù)據(jù)庫(kù)。
第三篇:銀行通用大型數(shù)據(jù)庫(kù)
銀行通用大型數(shù)據(jù)庫(kù)---Db2 日常實(shí)用操作 收藏
怎么沒(méi)人發(fā)DB2啊,我記得我剛參加工作時(shí)面試,有一個(gè)問(wèn)題是“你用過(guò)什么大型數(shù)據(jù)庫(kù)?”,我當(dāng)時(shí)還搞不清什么叫大型,就順便說(shuō)了FOX,ACCESS,主考的人看著我的,用一句歌詞來(lái)形容就是”得意的笑,他得意的笑“,也幸好去面試的只有一個(gè)人說(shuō)了個(gè)INFORMIX,我才在公司學(xué)了DB2,學(xué)了 INFORMIX,學(xué)了SOCKET,哈,看著公司一年有十億RMB的進(jìn)賬,看著我每月薪水都在一把(一把是一百?gòu)垼粡埵且话僭?,哈)以上,真是感慨良多??!哈,幸好是走過(guò)來(lái)了!
先貼點(diǎn)基礎(chǔ)的,可別小看,這是你以后的基礎(chǔ),就像現(xiàn)在IBM搞培訓(xùn),不到一周時(shí)間,會(huì)講600M的文檔,知識(shí)點(diǎn)也就講個(gè)名字,要不老師會(huì)累死,哈!
以下是正文:
1、Load 方法裝入數(shù)據(jù):
export to tempfile of del select * from TABLENAME where not 清理?xiàng)l件; load from tempfile of del modified by delprioritychar replace into TABLENAME nonrecoverable;
說(shuō)明:
在不相關(guān)的數(shù)據(jù)表export數(shù)據(jù)時(shí),可以采取并發(fā)的形式,以提高效率;
TABLENAME指待清理table的名稱;
modified by delprioritychar防止數(shù)據(jù)庫(kù)記錄中存在換行符,導(dǎo)致數(shù)據(jù)無(wú)法裝入的情況;replace into對(duì)現(xiàn)數(shù)據(jù)庫(kù)中的內(nèi)容進(jìn)行替換,即將現(xiàn)行的數(shù)據(jù)記錄清理,替換為數(shù)據(jù)文件內(nèi)容;
nonrecoverable無(wú)日志方式裝入;
2、查找當(dāng)前的應(yīng)用:
db2 list application |grep DBSNAME;
3、刪除當(dāng)前正在使用的application:
db2 “force application(Id1,Id2,Id3)”
Id1,Id2,Id3 是List顯示的應(yīng)用號(hào);
4、查看當(dāng)前應(yīng)用號(hào)的執(zhí)行狀態(tài):
db2 get snapshot for application agentid 299 |grep Row5、查看數(shù)據(jù)庫(kù)參數(shù):
db2 get db cfg for
6、修改數(shù)據(jù)庫(kù)的Log數(shù)據(jù):
db2 update db cfg using <參數(shù)名> <參數(shù)值>、Db2Stop Force的用法:
在進(jìn)行Bind的時(shí)候出現(xiàn)如下錯(cuò)誤:
SQL0082C An error has occurred which has terminated processing.SQL0092N No package was created because of previous errors.SQL0091N Binding was ended with “3” errors and “0” warnings.主要是表文件被加鎖,不能繼續(xù)使用;
在進(jìn)行stop的時(shí)候報(bào)錯(cuò):db2stop
8/03/2005 21:46:53 0 0SQL1025N The database manager was not stopped because databases are still active.SQL1025N The database manager was not stopped because databases are still active.需要使用如下命令可以解決這個(gè)問(wèn)題: db2stop force
08/03/2005 21:47:4900SQL1064N DB2STOP processing was successful.SQL1064N DB2STOP processing was successful.然后啟動(dòng)數(shù)據(jù)庫(kù)db2start,連接數(shù)據(jù)庫(kù)db2s后,重新進(jìn)行bind即可。
8、緩沖池參數(shù)修改:
db2 alter bufferpool ibmdefaultbp size 10240
查看本表的數(shù)據(jù)內(nèi)容如下:
db2 “select * from syscat.bufferpools”;
9、DB2 日志處理:
DB2日志是以文件的形式存放在文件系統(tǒng)中,分為兩種模式:循環(huán)日志和歸檔日志。當(dāng)創(chuàng)建新數(shù)據(jù)庫(kù)時(shí),日志的缺省模式是循環(huán)日志。在這種模式下,只能實(shí)現(xiàn)數(shù)據(jù)庫(kù)的脫機(jī)備份和恢復(fù)。如果要實(shí)現(xiàn)聯(lián)機(jī)備份和恢復(fù),必須設(shè)為歸檔日志模式。目前在綜合業(yè)務(wù)系統(tǒng)中,設(shè)置的均是歸檔日志模式;其它系統(tǒng)(如事后監(jiān)督、經(jīng)營(yíng)決策、中間業(yè)務(wù)等)一般都設(shè)置為循環(huán)日志模式。至于采用何種模式,可以通過(guò)修改數(shù)據(jù)庫(kù)配置參數(shù)(LOGRETAIN)來(lái)實(shí)現(xiàn): 歸檔日志模式:db2 update db cfg for
必須按照以下正確的步驟進(jìn)行操作:要求必須使用DB2命令PRUNE進(jìn)行清理,不建議使用rm命令刪除。刪除前應(yīng)保證應(yīng)用已停止(即聯(lián)機(jī)已下來(lái))。查看當(dāng)前使用的日志文件目錄及第一活動(dòng)日志文件用 “db2 get db cfg for
$ db2 connect to
$ db2 prune logfile prior to S???.LOG
注:S???.LOG為查看到的第一活動(dòng)日志文件。此命令可以將當(dāng)前第一活動(dòng)日志文件之前的歸檔日志文件全部刪除。
11、如何清理db2diag.log文件
db2diag.log,是用來(lái)記錄DB2數(shù)據(jù)庫(kù)運(yùn)行中的信息的文件??梢酝ㄟ^(guò)此文件,查看記錄的有關(guān)DB2數(shù)據(jù)庫(kù)詳細(xì)的錯(cuò)誤信息。此文件也是不斷增大的,需要定期進(jìn)行清理??梢酝ㄟ^(guò)查看實(shí)例的配置參數(shù)DIAGPATH,來(lái)確定db2diag.log文件是放在哪個(gè)目錄下:db2 get dbm cfg 如果Diagnostic data directory path(DIAGPATH)= /home/db2inst1/sqllib/db2dump,則此文件是放在/home/db2inst1/sqllib/db2dump目錄下。當(dāng)文件系統(tǒng)/home的使用率達(dá)到80%-90%左右時(shí),應(yīng)及時(shí)刪除db2diag.log文件。請(qǐng)按以下正確步驟操作:確認(rèn)應(yīng)用(如BTP)、DB2已經(jīng)停止。將原db2diag.log文件備份到其它文件系統(tǒng)下。刪除db2diag.log文件。刪除后,DB2會(huì)自動(dòng)創(chuàng)建一個(gè)新的文件。
12、Load 操作
在進(jìn)行l(wèi)oad的時(shí)候
db2 “l(fā)oad from acmmst.txt of del modified by coldel| replace into acmmst nonrecoverable ”
由于數(shù)據(jù)不規(guī)范出現(xiàn)錯(cuò)誤,強(qiáng)行中斷以后,進(jìn)行操作的時(shí)候出現(xiàn)如下錯(cuò)誤:
SQL0668N Operation not allowed for reason code ”3“ on table ”BTP.ACMMST“.SQLSTATE=57016
此時(shí),進(jìn)行反方向操作即可:
db2 ”load from /dev/null of del terminate into acmmst nonrecoverable“。
如果沒(méi)有使用參數(shù)nonrecoverable,則會(huì)出現(xiàn)數(shù)據(jù)庫(kù)狀態(tài)不正確的情況,使用:
db2 list tablesapces show detail 查看狀態(tài),如果不是正常狀態(tài),則脫機(jī)狀態(tài)進(jìn)行備份即可。
兩個(gè)表文件之間UPDATE的方法:
db2 ”update cdmcrd set offset =(select cdmlsl.offset from cdmlsl where cdmlsl.crdno=cdmcrd.crdno)where cdmcrd.crdno in(select cdmlsl.crdno from cdmlsl)
13、多字段條件查詢和修改:
表A中的字段有actno, cnlno,bal,pwd;表B中的字段為Actno,Cnlno,TxnAmt;目的是將A表中的bal修改為B表中的TxnAmt,命令:
db2 “update A set bal=(select txnamt from B where actno=A.actno and cnlno=A.Cnlno)where A.actno||A.cnlno in(select Actno||cnlno from B);
14、多條件匹配查詢
查詢某個(gè)表中條件是B?AAA的記錄:
db2 ”select * from A where actno like 'B_AAA%'“.查詢數(shù)據(jù)中存在某些字符的記錄:
db2 ”select * from A where actno like '%-AAA%“.15/數(shù)據(jù)庫(kù)恢復(fù)的處理
進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)的時(shí)候使用以下的命令:
restore db db1 to /tstdb2/catalog into db newlogpath /tstdb2/db2log buffer 2048
replace existing redirect parallelism 16;
set tablespace containers for 1 using(path '/tstdb2/db2tmp');
set tablespace containers for 2 using
(device '/dev/rtstcontlv00' 2621440, device '/dev/rtstcontlv01' 2621440,device '/dev/rtstcontlv02' 2621440, device '/dev/rtstcontlv03' 2621440);
restore db db1 continue;
恢復(fù)完成以后執(zhí)行命令db2s時(shí)報(bào)如下的錯(cuò)誤:
P570:>db2s
SQL1117N A connection to or activation of database ”DB" cannot be made because of ROLL-FORWARD PENDING.SQLSTATE=57019
DB21034E The command was processed as an SQL statement because it
was not a
valid Command Line Processor command.During SQL processing it returned:
SQL1024N A database connection does not exist.SQLSTATE=08003 解決辦法如下:
P570:>db2 rollforward db db to end of logs and complete
Rollforward Status
Input database alias= db
Number of nodes have returned status= 1
Node number= 0
Rollforward status= not pending
Next log file to be read=
Log files processed=-
Last committed transaction= 2005-11-20-10.59.23.000000
DB20000I The ROLLFORWARD command completed successfully.
第四篇:數(shù)據(jù)庫(kù)原理-理論教學(xué)-SQLServer數(shù)據(jù)完整性
SQL Server數(shù)據(jù)完整性
一、完整性的概念
之所以要引入數(shù)據(jù)完整性是為了在數(shù)據(jù)的添加、刪除、修改等操作中不出現(xiàn)數(shù)據(jù)的破壞或多個(gè)表數(shù)據(jù)不一致
數(shù)據(jù)完整性是指存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)正確無(wú)誤并且相關(guān)數(shù)據(jù)具有一致性
二、完整性的類型 1)實(shí)體完整性
實(shí)體:表中的記錄,一個(gè)實(shí)體就是指表中的一條記錄。實(shí)體完整性:在表中不能存在完全相同的記錄,且每條記錄都要具有一個(gè)非空且不重復(fù)的主鍵值。
實(shí)現(xiàn)實(shí)體完整性的方法:設(shè)置主鍵、惟一索引、惟一約束 2)域完整性
域完整性:向表中添加的數(shù)據(jù)必須與數(shù)據(jù)類型、格式及有效的數(shù)據(jù)長(zhǎng)度相匹配。
實(shí)現(xiàn)域完整性的方法:CHECK約束、外鍵約束、默認(rèn)約束、非空定義、規(guī)則以及在建表時(shí)設(shè)置的數(shù)據(jù)類型
3)參照完整性 參照完整性:又稱為引用完整性。是指通過(guò)主鍵與外鍵相聯(lián)系的兩個(gè)表或兩個(gè)以上的表,相關(guān)字段的值要保持一致。
實(shí)現(xiàn)實(shí)體完整性的方法:外鍵約束 4)用戶定義的完整性 用戶定義的完整性:是根據(jù)具體的應(yīng)用領(lǐng)域所要遵循的約束條件由用戶自己定義的特定的規(guī)則。
三、約束的類型
約束:SQL Server提供的自動(dòng)強(qiáng)制數(shù)據(jù)完整性的一種方法。它通過(guò)定義列的取值規(guī)則來(lái)維護(hù)數(shù)據(jù)的完整性。
常用約束:NOT NULL,CHECK、UNIQUE、PRIMARY KEY、FOREIGN KEY、DEFAULT 1)主鍵約束:在表中定義一個(gè)主鍵來(lái)惟一標(biāo)識(shí)表中的每行記錄
特點(diǎn):每個(gè)表中只能有一個(gè)主鍵,主鍵可是一列,也可是多列;主鍵不能為空;主鍵值不能重復(fù)
2)UNIQUE約束:它主要用來(lái)限制表的非主鍵列中的值不能重復(fù)。特點(diǎn):一個(gè)表中可以定義多個(gè)惟一約束
3)NOT NULL約束:它用來(lái)設(shè)定某列值不能為空。
特點(diǎn):如果設(shè)定某列為NOT NULL,則在添加記錄時(shí),則此列必須插入數(shù)據(jù)。4)CHECK約束:它使用邏輯表達(dá)式來(lái)限制表中的列可以接受哪些數(shù)據(jù)值。
例如:成績(jī)值應(yīng)該在0-100之間,則可以為成績(jī)字段創(chuàng)建CHECK約束,使取值在正常范圍內(nèi)。
5)DEFAULT約束:它為表中某列建立一個(gè)默認(rèn)值,當(dāng)為表中添加記錄時(shí),如果沒(méi)有提供輸入值,則自動(dòng)以默認(rèn)值賦給該列。
特點(diǎn):默認(rèn)值可以為常量、函數(shù)或表達(dá)式。使用默認(rèn)值可以提高數(shù)據(jù)輸入的速度。6)FOREIGN KEY約束
外鍵:是指一個(gè)表中的一列或列組合,它雖不是該表的主鍵,但是另一個(gè)表的主鍵。特點(diǎn):實(shí)現(xiàn)兩表之間相關(guān)數(shù)據(jù)的一致性。
第五篇:醫(yī)院數(shù)據(jù)庫(kù)備份解決方案
1醫(yī)院數(shù)據(jù)庫(kù)備份解決方案提出的背景
隨著電子化進(jìn)程的飛速發(fā)展和信息技術(shù)的廣泛應(yīng)用,數(shù)據(jù)越來(lái)越成為企業(yè)、事業(yè)單位日常運(yùn)作中不可缺少的部分和領(lǐng)導(dǎo)決策的依據(jù)。但是,計(jì)算機(jī)的使用有時(shí)也會(huì)造成隱患,那就是計(jì)算機(jī)數(shù)據(jù)非常容易丟失和遭到破壞。有專業(yè)機(jī)構(gòu)的研究數(shù)據(jù)表明:丟失300MB的數(shù)據(jù)對(duì)于市場(chǎng)營(yíng)銷部門意味著13萬(wàn)元人民幣的損失,對(duì)財(cái)務(wù)部門意味著16萬(wàn)的損失,對(duì)工程部門來(lái)說(shuō)損失可達(dá)80萬(wàn)。而丟失的關(guān)鍵數(shù)據(jù)如果15d內(nèi)仍得不到恢復(fù),企業(yè)就有可能被淘汰出局。
隨著計(jì)算機(jī)系統(tǒng)越來(lái)越成為企業(yè)不可或缺的數(shù)據(jù)載體,如何利用數(shù)據(jù)備份來(lái)保證數(shù)據(jù)安全也成為我們迫切需要研究的一個(gè)課題。數(shù)據(jù)遭到破壞,有可能是人為的因素。也可能是由于各種不可預(yù)測(cè)的因素,主要包括以下幾個(gè)方面:①計(jì)算機(jī)硬件故障。計(jì)算機(jī)是一個(gè)機(jī)器,其硬件是整個(gè)系統(tǒng)的基礎(chǔ)。由于使用不當(dāng)或者計(jì)算機(jī)產(chǎn)品質(zhì)量不佳、配件老化等原因,計(jì)算機(jī)的硬件可能被損壞而不能使用。例如,硬盤的磁道損壞。②計(jì)算機(jī)軟件系統(tǒng)的不穩(wěn)定。由于用戶使用不當(dāng)或者系統(tǒng)的可靠性不穩(wěn)定等原因,計(jì)算機(jī)軟件系統(tǒng)有可能癱瘓,無(wú)法使用。③誤操作。這是人為的事故,不可能完全避免。例如,在使用DELETE語(yǔ)句的時(shí)候,不小心刪除了有用的數(shù)據(jù)。④破壞性病毒。病毒是系統(tǒng)可能遭到破壞的一個(gè)非常重要的原因。隨著信息技術(shù)的發(fā)展,各種病毒也隨之泛濫?,F(xiàn)在,病毒不僅僅能破壞軟件系統(tǒng),還可能破壞計(jì)算機(jī)的硬件系統(tǒng),例如當(dāng)前流行的每月26日發(fā)作的CIH病毒,就是一個(gè)典型的破壞計(jì)算機(jī)硬件系統(tǒng)的病毒。⑤自然災(zāi)害,例如大火、洪水、地震等。這是一種人力無(wú)法抗拒的原因。
2醫(yī)院數(shù)據(jù)庫(kù)備份與恢復(fù)的重要性與必要性
摩根斯坦利作為一家大型投資銀行,當(dāng)紐約世貿(mào)中心許多大公司的商務(wù)數(shù)據(jù)一瞬間“灰飛煙滅”時(shí),該中心最大的主顧之一摩根斯坦利卻在災(zāi)后的第二天就恢復(fù)了正常工作狀態(tài)。危機(jī)時(shí)刻,摩根斯坦利花費(fèi)巨資添置的遠(yuǎn)程數(shù)據(jù)防災(zāi)系統(tǒng)忠實(shí)地工作到大樓倒塌前的最后一秒鐘,將重要的業(yè)務(wù)信息完好無(wú)損地傳送到了幾英里以外另一個(gè)辦事處。在這次大劫難中,摩根斯坦利幾年前就制定的數(shù)據(jù)安全戰(zhàn)略發(fā)揮了極大作用,將突發(fā)危機(jī)的不利影響下降到最低程度。
目前,國(guó)際上對(duì)電腦安全技術(shù)越來(lái)越重視,人們的安全意識(shí)越來(lái)越高,體現(xiàn)在電腦安全技術(shù)的應(yīng)用從個(gè)別的特殊行業(yè)發(fā)展到各行各業(yè);從對(duì)電腦設(shè)備的重視發(fā)展到對(duì)核心數(shù)據(jù)安全的重視,這已經(jīng)是一個(gè)不可逆轉(zhuǎn)的趨勢(shì)。而醫(yī)院信息管理系統(tǒng)HIS(Hospital information System)應(yīng)用已經(jīng)非常廣泛,深入到醫(yī)院管理的各個(gè)環(huán)節(jié):門診掛號(hào)、門診收費(fèi)、門診擺藥、取藥、藥品出入庫(kù)、病人入院、住院醫(yī)囑信息、押金、結(jié)帳等等數(shù)據(jù)都存放在服務(wù)器的數(shù)據(jù)庫(kù)中,實(shí)時(shí)性要求非常高,而系統(tǒng)中的數(shù)據(jù),更是核心中的核心,數(shù)據(jù)的安全性關(guān)系到整個(gè)系統(tǒng)能否正常的運(yùn)行,最終關(guān)系到能否為患者提供正常的服務(wù)。在看病難、看病貴的當(dāng)下,顯得尤為重要。所以對(duì)整個(gè)系統(tǒng)的數(shù)據(jù)做好數(shù)據(jù)保護(hù)是至關(guān)重要的,是醫(yī)院保證提供正常服務(wù)的最后一道防線。所以,服務(wù)器的備份、數(shù)據(jù)庫(kù)的實(shí)時(shí)備份尤其必要和迫切。
服務(wù)器的硬件備份方案很多,而且已經(jīng)比較成熟,數(shù)據(jù)庫(kù)的熱備份軟件國(guó)外有幾種,國(guó)內(nèi)還剛剛起步。各大公司紛紛加入這個(gè)行列,筆者所知就有如EMC,賽門鐵克等都在做數(shù)據(jù)備份的解決方案,這些公司高端產(chǎn)品非常好,對(duì)一個(gè)大型企業(yè)來(lái)說(shuō)可能這樣的投資是必要的,但對(duì)于我們中小企業(yè)來(lái)說(shuō),一定要考慮它的性價(jià)比,動(dòng)輒十幾萬(wàn)、幾十萬(wàn)的投資,這于我們
中小醫(yī)院來(lái)說(shuō)更是捉襟見(jiàn)肘。所以確定適合本院實(shí)情情況的備份方案顯得尤為重要。下面筆者結(jié)合工作實(shí)際,對(duì)我院現(xiàn)有的備份方案做如下介紹:
3服務(wù)器系統(tǒng)現(xiàn)狀
目前,我院信息管理系統(tǒng)即HIS。核心服務(wù)器1臺(tái),型號(hào):HP惠普PROU570,內(nèi)存2G,4個(gè)SCIS72.5G硬盤,雙CPU,做RAID0+1。操作系統(tǒng):WINDOWS2000SERVER。數(shù)據(jù)庫(kù):SQL2000SERVER。軟件開(kāi)發(fā)商:廣州安易醫(yī)療軟件公司。應(yīng)用系統(tǒng):HIS(醫(yī)院信息管理系統(tǒng))包括門診管理系統(tǒng):門診掛號(hào),門診收費(fèi),門診藥房及病房管理系統(tǒng)(采用護(hù)士工作站模式),醫(yī)技管理系統(tǒng),藥庫(kù)藥房系統(tǒng),字典維護(hù)及綜合查詢。
4我院基要本狀況
我院是二級(jí)甲等醫(yī)院,日門診量1300人次左右,床位400張,年平均住院人次為5000人次左右,醫(yī)院各個(gè)業(yè)務(wù)流程對(duì)后臺(tái)數(shù)據(jù)庫(kù)的增加、修改多達(dá)上萬(wàn)次。服務(wù)器要求24h連續(xù)不間斷工作,即365×12×24h。
5我院目前的備份與恢復(fù)的幾個(gè)層次
5.1用筆記本電腦解決雙機(jī)熱備問(wèn)題:我們做了RAID0+1,但它只能解決硬盤的問(wèn)題,并不能解決數(shù)據(jù)庫(kù)的問(wèn)題。一般都考慮雙機(jī)熱備方案,但雙機(jī)熱備勢(shì)必要增加一臺(tái)服務(wù)器,增大投資,一般服務(wù)器都價(jià)格不菲。我院的HIS可分為病房和門診,病房的實(shí)時(shí)性并不是很高,即可容忍幾個(gè)小時(shí),半天甚至于一天的延時(shí),而門診的實(shí)時(shí)性非常高,即不能容忍延時(shí),哪怕是半小時(shí)。針對(duì)門診的實(shí)時(shí)性,我們應(yīng)用了用筆記本電腦安裝門診各應(yīng)用程序包括門診掛號(hào)、門診收費(fèi)等應(yīng)用程序,相當(dāng)于小服務(wù)器,數(shù)據(jù)庫(kù)和應(yīng)用程序和主服務(wù)器一致,每天下班前用應(yīng)用程序——系統(tǒng)管理員Adminsys將所有公共字典導(dǎo)出備用,確保所有字典都是最新字典包括收費(fèi)項(xiàng)目和藥品字典。一但主服務(wù)器有問(wèn)題,門診可用筆記本收費(fèi)與劃價(jià),藥房可根據(jù)處方拿藥,確保了門診的實(shí)時(shí)性。我院去年機(jī)房搬遷切斷光纖幾小時(shí),門診就使用此種方法,保證了連續(xù)不間斷收費(fèi)劃價(jià)與發(fā)藥,確保了門診病人不受影響。
5.2利用SQL數(shù)據(jù)庫(kù)的計(jì)劃作業(yè)進(jìn)行備份和異地備份與恢復(fù):利用SQL數(shù)據(jù)庫(kù)的計(jì)劃作業(yè)進(jìn)行多個(gè)備份計(jì)劃,比如在工作量比較少的時(shí)候,每天夜里24點(diǎn)進(jìn)行備份,在凌晨3點(diǎn)時(shí)做異地備份計(jì)劃,即將備份文件儲(chǔ)存在局域網(wǎng)中的其它臺(tái)計(jì)算機(jī)的硬盤上。確保服務(wù)器硬盤壞掉時(shí)有一份脫機(jī)的備份數(shù)據(jù)。然后可利用SQL的還原功能進(jìn)行還原數(shù)據(jù)庫(kù)。它的優(yōu)點(diǎn)是可對(duì)整個(gè)數(shù)據(jù)庫(kù)進(jìn)行還原,且速度比較快。
5.3利用應(yīng)用數(shù)據(jù)庫(kù)的數(shù)據(jù)文件和日志文件直接用命令進(jìn)行備份與恢復(fù)://恢復(fù)數(shù)據(jù)庫(kù)XXX代表數(shù)據(jù)庫(kù)名:EXEC sp_attach_db @dbname = N'xxx', @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\xxx.mdf',@filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\xxx.ldf'GO//創(chuàng)建有戶IF NOT EXISTS(SELECT NAME FROM master..SYSLOGINS WHERE NAME='HIS')EXEC SP_ADDLOGINS 'HIS',MANAGER GO //恢復(fù)用戶使用權(quán)限exec dbo.sp_configure 'allow update','1'reconfigure with overridego update a set sid =(select sid from syslogins where name = 'His')from XXX sysusers a where name = 'His'update a set sid =(select sid from syslogins where name = 'His')from XXX sysusers a where name = 'His'goexec dbo.sp_configure 'allow update','0'reconfigure with override go
此種方法的優(yōu)點(diǎn)是恢復(fù)的速度比較快,簡(jiǎn)單實(shí)用。缺點(diǎn)是對(duì)管理員要求比較高。
5.4利用應(yīng)用程序?qū)С鰧?dǎo)入進(jìn)行備份與恢復(fù):利用應(yīng)用程序的系統(tǒng)管理員模塊Sysadmin中的導(dǎo)出功能,每天下班之前將所有數(shù)據(jù)導(dǎo)出。即導(dǎo)出所有的表(table),需要時(shí)將表導(dǎo)回,它的優(yōu)點(diǎn)是比較靈活,可針對(duì)表進(jìn)行恢復(fù),如果只是某一個(gè)表有問(wèn)題,比如誤操作,誤刪除,只需要將前一天備份的表導(dǎo)回即可。當(dāng)我們LIS(檢驗(yàn)信息系統(tǒng))剛投入使用時(shí),檢驗(yàn)人員對(duì)操作還不熟悉,誤將檢驗(yàn)項(xiàng)目編碼搞亂,無(wú)法出檢驗(yàn)報(bào)告,我們就是利用這個(gè)功能將檢驗(yàn)字典導(dǎo)回,問(wèn)題就迎刃而解。
總之,醫(yī)院信息管理系統(tǒng)中的數(shù)據(jù)備份和恢復(fù)非常重要。尤其現(xiàn)在醫(yī)患關(guān)系緊張、醫(yī)保物價(jià)部門對(duì)醫(yī)院的要求非常嚴(yán)格的情況下,數(shù)據(jù)一旦丟失,對(duì)醫(yī)院、社會(huì)都會(huì)造成無(wú)法估量的損失。這就要求我們的計(jì)算機(jī)管理人員做好充分的準(zhǔn)備,能夠及時(shí)進(jìn)行數(shù)據(jù)的備份,一旦數(shù)據(jù)庫(kù)出現(xiàn)故障,要能夠及時(shí)進(jìn)行恢復(fù)。