第一篇:sqlserver日志文件總結(jié)及充滿處理
sqlserver日志文件總結(jié)及充滿處理 文章來源:sqlserver論壇 作者:hansbj
交易日志(Transaction logs)是數(shù)據(jù)庫結(jié)構(gòu)中非常重要但又經(jīng)常被忽略的部分。由于它并不像數(shù)據(jù)庫中的schema那樣活躍,因此很少有人關(guān)注交易日志。
交易日志是針對數(shù)據(jù)庫改變所做的記錄,它可以記錄針對數(shù)據(jù)庫的任何操作,并將記錄結(jié)果保存在獨立的文件中。對于任何每一個交易過程,交易日志都有非常全面的記錄,根據(jù)這些記錄可以將數(shù)據(jù)文件恢復(fù)成交易前的狀態(tài)。從交易動作開始,交易日志就處于記錄狀態(tài),交易過程中對數(shù)據(jù)庫的任何操作都在記錄范圍,直到用戶點擊提交或后退后才結(jié)束記錄。每個數(shù)據(jù)庫都擁有至少一個交易日志以及一個數(shù)據(jù)文件。
出于性能上的考慮,SQL Server將用戶的改動存入緩存中,這些改變會立即寫入交易日志,但不會立即寫入數(shù)據(jù)文件。交易日志會通過一個標(biāo)記點來確定某個交易是否已將緩存中的數(shù)據(jù)寫入數(shù)據(jù)文件。當(dāng)SQL Server重啟后,它會查看日志中最新的標(biāo)記點,并將這個標(biāo)記點后面的交易記錄抹去,因為這些交易記錄并沒有真正的將緩存中的數(shù)據(jù)寫入數(shù)據(jù)文件。這可以防止那些中斷的交易修改數(shù)據(jù)文件。
維護交易日志
因為很多人經(jīng)常遺忘交易日志,因此它也會給系統(tǒng)帶來一些問題。隨著系統(tǒng)的不斷運行,日志記錄的內(nèi)容會越來越多,日志文件的體積也會越來越大,最終導(dǎo)致可用磁盤空間不足。除非日常工作中經(jīng)常對日志進行清理,否則日志文件最終會侵占分區(qū)內(nèi)的全部可用空間。日志的默認配置為不限容量,如果以這種配置工作,它就會不斷膨脹,最終也會占據(jù)全部可用空間。這兩種情況都會導(dǎo)致數(shù)據(jù)庫停止工作。
對交易日志的日常備份工作可以有效的防止日志文件過分消耗磁盤空間。備份過程會將日志中不再需要的部分截除。截除的方法是首先把舊記錄標(biāo)記為非活動狀態(tài),然后將新日志覆蓋到舊日志的位置上,這樣就可以防止交易日志的體積不斷膨脹。如果無法對日志進行經(jīng)常性的備份工作,最好將數(shù)據(jù)庫設(shè)置為“簡單恢復(fù)模式”。在這種模式下,系統(tǒng)會強制交易日志在每次記錄標(biāo)記點時,自動進行截除操作,以新日志覆蓋舊日志。
截除過程發(fā)生在備份或?qū)⑴f標(biāo)記點標(biāo)為非活動狀態(tài)時,它使得舊的交易記錄可以被覆蓋,但這并不會減少交易日志實際占用的磁盤空間。就算不再使用日志,它依然會占據(jù)一定的空間。因此在維護時,還需要對交易日志進行壓縮。壓縮交易日志的方法是刪除非活動記錄,從而減少日志文件所占用的物理硬盤空間。
通過使用DBCC SHRINKDATABASE語句可以壓縮當(dāng)前數(shù)據(jù)庫的交易日志文件,DBCC SHRINKFILE語句用來壓縮指定的交易日志文件,另外也可以在數(shù)據(jù)庫中激活自動壓縮操作。當(dāng)壓縮日志時,首先會將舊記錄標(biāo)記為非活動狀態(tài),然后將帶有非活動標(biāo)記的記錄徹底刪除。根據(jù)所使用的壓縮方式的不同,你可能不會立即看到結(jié)果。在理想情況下,壓縮工作應(yīng)該選在系統(tǒng)不是非常繁忙的時段進行,否則有可能影響數(shù)據(jù)庫性能。
恢復(fù)數(shù)據(jù)庫
交易記錄備份可以用來將數(shù)據(jù)庫恢復(fù)到某一指定狀態(tài),但交易記錄備份本身不足以完成恢復(fù)數(shù)據(jù)庫的 任務(wù),還需要備份的數(shù)據(jù)文件參與恢復(fù)工作。恢復(fù)數(shù)據(jù)庫時,首先進行的是數(shù)據(jù)文件的恢復(fù)工作。在整個數(shù)據(jù)文件恢復(fù)完成前,不要將其設(shè)為完成狀態(tài),否則交易日志就不會被恢復(fù)。當(dāng)數(shù)據(jù)文件恢復(fù)完成,系統(tǒng)會通過交易日志的備份將數(shù)據(jù)庫恢復(fù)成用戶希望的狀態(tài)。如果在數(shù)據(jù)庫最后一次備份后,存在多個日志文件的備份,備份程序會按照它們建立的時間依次將其恢復(fù)。
另一種被稱為log shipping的過程可以提供更強的數(shù)據(jù)庫備份能力。當(dāng)log shipping配置好后,它可以將數(shù)據(jù)庫整個復(fù)制到另一臺服務(wù)器上。在這種情況下,交易日志也會定期發(fā)送到備份服務(wù)器上供恢復(fù)數(shù)據(jù)使用。這使得服務(wù)器一直處于熱備份狀態(tài),當(dāng)數(shù)據(jù)發(fā)生改變時它也隨之更新。另一個服務(wù)器被稱作監(jiān)視(monitor)服務(wù)器,可以用來監(jiān)視按規(guī)定時間間隔發(fā)送的shipping信號。如果在規(guī)定時間內(nèi)沒有收到信號,監(jiān)視服務(wù)器會將這一事件記錄到事件日志。這種機制使得log shipping經(jīng)常成為災(zāi)難恢復(fù)計劃中使用的方案。
性能優(yōu)化
交易日志對數(shù)據(jù)庫有重要作用,同時它對系統(tǒng)的整體性能也有一定影響。通過幾個選項,我們可以對交易日志的性能進行優(yōu)化。由于交易日志是一個連續(xù)的磁盤寫入過程,在這當(dāng)中不會發(fā)生讀取動作。因此將日志文件放在一個獨立的磁盤,對優(yōu)化性能有一定作用。
另一項優(yōu)化措施與日志文件的體積有關(guān)。我們可以設(shè)置日志文件的體積不超過硬盤空間的百分之幾,或者確定它的大小。如果將其設(shè)置的過大會浪費磁盤空間,而如果設(shè)置的過小則會強制記錄文件不斷嘗試擴展,導(dǎo)致數(shù)據(jù)庫性能下降。
事務(wù)日志文件Transaction Log File是用來記錄數(shù)據(jù)庫更新情況的文件,擴展名為ldf。
在 SQL Server 7.0 和 SQL Server 2000 中,如果設(shè)置了自動增長功能,事務(wù)日志文件將會自動擴展。
一般情況下,在能夠容納兩次事務(wù)日志截斷之間發(fā)生的最大數(shù)量的事務(wù)時,事務(wù)日志的大小是穩(wěn)定的,事務(wù)日志截斷由檢查點或者事務(wù)日志備份觸發(fā)。
然而,在某些情況下,事務(wù)日志可能會變得非常大,以致用盡空間或變滿。通常,在事務(wù)日志文件占盡可用磁盤空間且不能再擴展時,您將收到如下錯誤消息:
Error:9002, Severity:17, State:2
The log file for database '%.*ls' is full.除了出現(xiàn)此錯誤消息之外,SQL Server 還可能因為缺少事務(wù)日志擴展空間而將數(shù)據(jù)庫標(biāo)記為 SUSPECT。有關(guān)如何從此情形中恢復(fù)的其他信息,請參見 SQL Server 聯(lián)機幫助中的“磁盤空間不足”主題。
另外,事務(wù)日志擴展可能導(dǎo)致下列情形:
· 非常大的事務(wù)日志文件。
· 事務(wù)可能會失敗并可能開始回滾。
· 事務(wù)可能會用很長時間才能完成。
· 可能發(fā)生性能問題。
· 可能發(fā)生阻塞現(xiàn)象。
原因
事務(wù)日志擴展可能由于以下原因或情形而發(fā)生:
· 未提交的事務(wù)
· 非常大的事務(wù)
· 操作:DBCC DBREINDEX 和 CREATE INDEX
· 在從事務(wù)日志備份還原時
· 客戶端應(yīng)用程序不處理所有結(jié)果
· 查詢在事務(wù)日志完成擴展之前超時,您收到假的“Log Full”錯誤消息
· 未復(fù)制的事務(wù)
日志文件滿而造成SQL數(shù)據(jù)庫無法寫入文件時,可用兩種方法:
一種方法:清空日志。
1.打開查詢分析器,輸入命令
DUMP TRANSACTION 數(shù)據(jù)庫名 WITH NO_LOG
2.再打開企業(yè)管理器--右鍵你要壓縮的數(shù)據(jù)庫--所有任務(wù)--收縮數(shù)據(jù)庫--收縮文件--選擇日志文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數(shù),直接輸入這個數(shù),確定就可以了。
另一種方法有一定的風(fēng)險性,因為SQL SERVER的日志文件不是即時寫入數(shù)據(jù)庫主文件的,如處理不當(dāng),會造成數(shù)據(jù)的損失。
1: 刪除LOG
分離數(shù)據(jù)庫 企業(yè)管理器->服務(wù)器->數(shù)據(jù)庫->右鍵->分離數(shù)據(jù)庫
2:刪除LOG文件
附加數(shù)據(jù)庫 企業(yè)管理器->服務(wù)器->數(shù)據(jù)庫->右鍵->附加數(shù)據(jù)庫
此法生成新的LOG,大小只有500多K。
注意:建議使用第一種方法。
如果以后,不想要它變大。
SQL2000下使用:
在數(shù)據(jù)庫上點右鍵->屬性->選項->故障恢復(fù)-模型-選擇-簡單模型。
或用SQL語句:
alter database 數(shù)據(jù)庫名 set recovery simple
另外,數(shù)據(jù)庫屬性有兩個選項,與事務(wù)日志的增長有關(guān):
Truncate log on checkpoint
(此選項用于SQL7.0,SQL 2000中即故障恢復(fù)模型選擇為簡單模型)
當(dāng)執(zhí)行CHECKPOINT 命令時如果事務(wù)日志文件超過其大小的70% 則將其內(nèi)容清除在開發(fā)數(shù)據(jù)庫時時常將此選項設(shè)置為True
Auto shrink
定期對數(shù)據(jù)庫進行檢查當(dāng)數(shù)據(jù)庫文件或日志文件的未用空間超過其大小的25%時,系統(tǒng)將會自動縮減文件使其未用空間等于25% 當(dāng)文件大小沒有超過其建立時的初始大小時不會縮減文件縮減后的文件也必須大于或等于其初始大小對事務(wù)日志文件的縮減只有在對其作備份時或?qū)runcate log on checkpoint 選項設(shè)為True 時才能進行。
注意:一般立成建立的數(shù)據(jù)庫默認屬性已設(shè)好,但碰到意外情況使數(shù)據(jù)庫屬性被更改,請用戶清空日志后,檢查數(shù)據(jù)庫的以上屬性,以防事務(wù)日志再次充滿。
第二篇:日志和文件接入規(guī)范
數(shù)據(jù)接入規(guī)范-日志和文件
修訂歷史
日期
修改說明
部門
修改人
數(shù)據(jù)接入需求
基于數(shù)據(jù)采集需求,初步判斷數(shù)據(jù)的接入源是否可以從日志和文件進行獲取。聯(lián)系技術(shù)研發(fā)部同事,請求數(shù)據(jù)源接入的位置參數(shù),通過配置化方式定期讀取服務(wù)器指定位置的日志和文件,通過程序清洗日志,分割成字段裝載到數(shù)據(jù)倉庫貼源層。
數(shù)據(jù)接入流程
1.數(shù)據(jù)中心分析組接到TAPD數(shù)據(jù)接入需求之后,分析接入數(shù)據(jù)屬于數(shù)據(jù)接口列表的哪個系統(tǒng),在對應(yīng)的系統(tǒng)標(biāo)題下添加模板,參照APP-app_login_log。
和需求發(fā)起人進行溝通,確定提供數(shù)據(jù)的方式(數(shù)據(jù)庫、文件、接口等),讓需求發(fā)起人補充詳細的數(shù)據(jù)口徑,補充到需求要求里面,指定數(shù)據(jù)倉庫組或平臺組的一個人進行轉(zhuǎn)發(fā)。
2.數(shù)據(jù)倉庫組或平臺組根據(jù)需求描述。跟數(shù)據(jù)源提供方(可以是需求發(fā)起方、也可以是技術(shù)研發(fā)部門)溝通,讓其補充模板里的位置參數(shù)。
3.數(shù)據(jù)源提供方根據(jù)模板要求,提供位置配置參數(shù)。
4.數(shù)據(jù)倉庫組或平臺組在接入數(shù)據(jù)后,整理數(shù)據(jù)格式,編寫日志清洗轉(zhuǎn)換腳本,并補充裝載目標(biāo)表信息。
5.數(shù)據(jù)中心分析組對最終接入的數(shù)據(jù)進行驗收,并通知需求發(fā)起人如何獲得接入數(shù)據(jù)。
數(shù)據(jù)源接入模板
需求要求(分析組補充)
tapd需求單號:1002513
提起人:xxx(Richard.chen)
需求單號內(nèi)容:
???
提供數(shù)據(jù)方式:
數(shù)據(jù)庫、文件、接口
詳細的數(shù)據(jù)口徑:???
位置配置參數(shù)(技術(shù)研發(fā)部補充)
配置參數(shù)
參數(shù)取值
服務(wù)器地址
192.168.1.1
端口類型
ftp
端口號
系統(tǒng)用戶名
user
密碼
pwd
日志路徑
日志文件通配符
xxx/yyyymmdd/AppLog
app_login_log_[yyyymmdd].json
日志內(nèi)容分割規(guī)則
文字描述
接入模型字段(倉庫組補充)
字段名
注釋
字段類型
必填
必填
必填
必填
必填
必填
抽取參數(shù)(倉庫組補充)
配置參數(shù)
參數(shù)取值
抽數(shù)周期
每天
抽數(shù)時間
7:00
文件名匹配條件
1:全量匹配抽取(匹配通配符即抽取)
2:日期匹配抽取(僅抽取通配符日期字段匹配數(shù)據(jù)日期條件的文件)
數(shù)據(jù)日期格式
Yyyymmdd
Yyyy-mm-dd
數(shù)據(jù)日期條件
1:上一天日期
2:當(dāng)前時間日期
3:當(dāng)前時間歸屬周周日
4:當(dāng)前時間歸屬月一號
日志清洗轉(zhuǎn)換腳本(倉庫組補填)
補充腳本位置即可,如t8t-bi-dsc\log-app\log-app.py
裝載目標(biāo)表(倉庫組補填)
配置參數(shù)
參數(shù)取值
stg層表名稱
必填
stg層表描述
必填
ods層表名稱
必填
ods層表描述
必填
數(shù)據(jù)接口列表
PC
H5
APP
app_login_log
l
需求單號(分析組補充)
tapd需求單號:xxxxxxx
提起人:xxx(Richard.chen)
l
位置配置參數(shù)(技術(shù)研發(fā)部補充)
配置參數(shù)
參數(shù)取值
服務(wù)器地址
192.168.1.1
端口類型
ftp
端口號
系統(tǒng)用戶名
user
密碼
pwd
日志路徑
日志文件通配符
xxx/yyyymmdd/AppLog
app_login_log_[yyyymmdd].json
日志內(nèi)容分割規(guī)則
文字描述
l
接入模型字段(倉庫組補充)
字段名
注釋
字段類型
必填
必填
必填
必填
必填
必填
l
抽取參數(shù)(倉庫組補充)
配置參數(shù)
參數(shù)取值
抽數(shù)周期
每天
抽數(shù)時間
7:00
文件名匹配條件
1:全量匹配抽取(匹配通配符即抽取)
2:日期匹配抽取(僅抽取通配符日期字段匹配數(shù)據(jù)日期條件的文件)
數(shù)據(jù)日期格式
Yyyymmdd
Yyyy-mm-dd
數(shù)據(jù)日期條件
1:上一天日期
2:當(dāng)前時間日期
3:當(dāng)前時間歸屬周周日
4:當(dāng)前時間歸屬月一號
l
日志清洗轉(zhuǎn)換腳本(倉庫組補填)
補充腳本位置即可,如t8t-bi-dsc\log-app\log-app.py
l
裝載目標(biāo)表(倉庫組補填)
配置參數(shù)
參數(shù)取值
stg層表名稱
必填
stg層表描述
必填
ods層表名稱
必填
ods層表描述
必填
app_diary_log
小程序
第三篇:課題:SQLServer存儲過程返回值總結(jié)
SQLServer存儲過程返回值總結(jié)
1.存儲過程沒有返回值的情況(即存儲過程語句中沒有return之類的語句)
用方法 int count = ExecuteNonQuery(..)執(zhí)行存儲過程其返回值只有兩種情況
(1)假如通過查詢分析器執(zhí)行該存儲過程,在顯示欄中假如有影響的行數(shù),則影響幾行count就是幾
(2)假如通過查詢分析器執(zhí)行該存儲過程,在顯示欄中假如顯示'命令已成功完成。'則count =-1;在顯示欄中假如有查詢結(jié)果,則count =-1
總結(jié):A.ExecuteNonQuery()該方法只返回影響的行數(shù),假如沒有影響行數(shù),則該方法的返回值只能是-1,不會為0。
B.不論ExecuteNonQuery()方法是按照CommandType.StoredProcedure或者CommandType.Text執(zhí)行,其效果和A一樣。
2.獲得存儲過程的返回值--通過查詢分析器獲得
(1)不帶任何參數(shù)的存儲過程(存儲過程語句中含有return)
---創(chuàng)建存儲過程
CREATE PROCEDURE testReturn
AS
return 145
GO
---執(zhí)行存儲過程
DECLARE @RC int
exec @RC=testReturn
select @RC
---說明
查詢結(jié)果為145
(2)帶輸入?yún)?shù)的存儲過程(存儲過程語句中含有return)
---創(chuàng)建存儲過程
create procedure sp_add_table1
@in_name varchar(100), @in_addr varchar(100), @in_tel varchar(100)
as
if(@in_name = '' or @in_name is null)
return 1
else
begin
insert into table1(name,addr,tel)values(@in_name,@in_addr,@in_tel)
return 0
end
---執(zhí)行存儲過程
<1>執(zhí)行下列,返回1
declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count
<2>執(zhí)行下列,返回0
declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count
---說明
查詢結(jié)果不是0就是1
(3)帶輸出參數(shù)的存儲過程(存儲過程中可以有return可以沒有return)
例子A:
---創(chuàng)建存儲過程
create procedure sp_output
@output int output
as
set @output = 121
return 1
---執(zhí)行存儲過程
<1>執(zhí)行下列,返回121
declare @out int
exec sp_output @out output
select @out
<2>執(zhí)行下列,返回1
declare @out int
declare @count int exec @count = sp_output @out output
select @count
---說明
有return,只要查詢輸出參數(shù),則查詢結(jié)果為輸出參數(shù)在存儲過程中最后變成的值;只要不查詢輸出參數(shù),則查詢結(jié)果為return返回的值
例子B:
---創(chuàng)建存儲過程
create procedure sp_output
@output int output
as
set @output = 121
---執(zhí)行存儲過程
<1>執(zhí)行下列,返回121
declare @out int
exec sp_output @out output
select @out
<2>執(zhí)行下列,返回0
declare @out int
declare @count int
exec @count = sp_output @out output
select @count
---說明
沒有return,只要查詢輸出參數(shù),則查詢結(jié)果為輸出參數(shù)在存儲過程中最后變成的值;只要不查詢輸出參數(shù),則查詢結(jié)果為0
總結(jié):
(1)存儲過程共分為3類:
A.返回記錄集的存儲過程---------------------------其執(zhí)行結(jié)果是一個記錄集,例如:從數(shù)據(jù)庫中檢索出符合某一個或幾個條件的記錄
B.返回數(shù)值的存儲過程(也可以稱為標(biāo)量存儲過程)-----其執(zhí)行完以后返回一個值,例如:在數(shù)據(jù)庫中執(zhí)行一個有返回值的函數(shù)或命令
C.行為存儲過程----用來實現(xiàn)數(shù)據(jù)庫的某個功能,而沒有返回值,例如:在數(shù)據(jù)庫中的更新和刪除操作
(2)含有return的存儲過程其返回值為return返回的那個值
(3)沒有return的存儲過程,不論執(zhí)行結(jié)果有無記錄集,其返回值是0
(4)帶輸出參數(shù)的存儲過程:假如有return則返回return返回的那個值,假如要select輸出參數(shù),則出現(xiàn)輸出參數(shù)的值,于有無return無關(guān)
--------------------3.獲得存儲過程的返回值--通過程序獲得
---------------------------SqlParameter[] cmdParms = {..,new SqlParameter(“@return”,SqlDbType.Int)};cmdParms[cmdParms.Length1].Direction = ParameterDirection.Output或者 cmdParms[cmdParms.Length1].Value;
分類: asp.net
第四篇:MDF文件損壞及沒有日志文件恢復(fù)的總結(jié)
MDF文件損壞及沒有日志文件恢復(fù)的總結(jié)
大體思路是這樣的:
1。重建日志
先建一個同名的數(shù)據(jù)庫,并且對應(yīng)的文件名也得相同,停掉數(shù)據(jù)庫,然后到建立的這個數(shù)據(jù)庫的目錄下將對應(yīng)的兩個文件刪除,然后把MDF拷貝到這個目錄下。
啟動數(shù)據(jù)庫,便看到這個數(shù)據(jù)庫處于置疑狀態(tài)。
2。消除置疑狀態(tài) USE MASTER GO
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE--表示可以更改系統(tǒng)表
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的數(shù)據(jù)庫名'--設(shè)置數(shù)據(jù)庫為緊急模式
Go
sp_dboption '置疑的數(shù)據(jù)庫名', 'single user', 'true'--設(shè)置數(shù)據(jù)庫為單用戶模式
Go
DBCC CHECKDB('置疑的數(shù)據(jù)庫名')
--檢查數(shù)據(jù)庫錯誤
Go
update sysdatabases set status =28 where name='置疑的數(shù)據(jù)庫名'--恢復(fù)數(shù)據(jù)庫為正常模式
Go
sp_configure 'allow updates', 0 reconfigure with override Go
sp_dboption '置疑的數(shù)據(jù)庫名', 'single user', 'false' Go 這里是最好的恢復(fù),MDF沒有損壞,上面的語句基本可以滿足
假如MDF有損壞,并且做DBCC里有N多錯誤,數(shù)據(jù)庫無法完整修復(fù)里可以考慮允許丟失數(shù)據(jù)修復(fù),方法如下
use master
declare @databasename varchar(255)
set @databasename='要恢復(fù)的數(shù)據(jù)庫名稱'
exec sp_dboption @databasename, N'single', N'true'--將目標(biāo)數(shù)據(jù)庫置為單用戶狀態(tài)
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS)
dbcc checkdb(@databasename,REPAIR_REBUILD)
exec sp_dboption @databasename, N'single', N'false'--將目標(biāo)數(shù)據(jù)庫置為多用戶狀態(tài)
如果順利的話,應(yīng)該能解決問題。如果運氣實在不好,以上搞完之后DBCC還是出現(xiàn)錯誤,那可以用終極辦法
對表做允許數(shù)據(jù)丟失的修復(fù),具體方法如下
use master
declare @databasename varchar(255)
set @databasename='要恢復(fù)的數(shù)據(jù)庫名稱'
exec sp_dboption @databasename, N'single', N'true'--將目標(biāo)數(shù)據(jù)庫置為單用戶狀態(tài)
exec sp_msforeachtable ?DBCC CHECKTABLE(''?'',REPAIR_ALLOW_DATA_LOSS)?
exec sp_dboption @databasename, N'single', N'false'--將目標(biāo)數(shù)據(jù)庫置為多用戶狀態(tài)
如果你的運氣霉到家了,搞完上面的DBCC還是有問題,那么可以這樣
把數(shù)據(jù)庫導(dǎo)成一個新庫來代替舊庫
企業(yè)管理器--右鍵你的數(shù)據(jù)庫--所有任務(wù)--導(dǎo)出數(shù)據(jù)--目標(biāo)標(biāo)數(shù)據(jù)庫選擇新建
--選擇“在兩個sql數(shù)據(jù)庫之間復(fù)制對象和數(shù)據(jù)”--把“包含擴展屬性”選上,其他的根據(jù)需要選擇--最后完成這幾步一般會出現(xiàn)各種各樣的問題,大致有這么幾種
1。出現(xiàn)“未能在數(shù)據(jù)庫 'approve_new' 中運行 BEGIN TRANSACTION,因為該數(shù)據(jù)庫處于回避恢復(fù)模式。sp_dboption 命令失敗。”
出現(xiàn)這樣問題的解決: 將數(shù)據(jù)庫分離后再附加(或者重啟數(shù)據(jù)庫服務(wù))2。由于文件不可訪問,或者內(nèi)存或磁盤空間不足,所以無法打開數(shù)據(jù)庫 'approve_new'。詳細信息請參閱 SQL Server 錯誤日志。
1)在查詢分析器里執(zhí)行如下語句
sp_configure 'allow updates', 1 go reconfigure with override go use master go update sysdatabases set status = 32768 where name = 'UFDATA_003_2006' go sp_configure 'allow updates', 0 go reconfigure with override
2)再在查詢分析器里執(zhí)行如下語句 use master dbcc rebuild_log('數(shù)據(jù)庫名', '日志物理路徑')--重建日志
第五篇:SQLServer數(shù)據(jù)庫入門學(xué)習(xí)總結(jié)
SQL Server數(shù)據(jù)庫入門學(xué)習(xí)總結(jié)
經(jīng)過一段時間的學(xué)習(xí),也對數(shù)據(jù)庫有了一些認識。
數(shù)據(jù)庫基本是由表,關(guān)系,操作組成;對于初學(xué)者首先要學(xué)的:
1.數(shù)據(jù)庫是如何存儲數(shù)據(jù)的表,約束,觸發(fā)器
2.數(shù)據(jù)庫是如何操作數(shù)據(jù)的
insert,update,delete T-sql 函數(shù) 存儲過程 觸發(fā)器
3.數(shù)據(jù)庫是如何顯示數(shù)據(jù)的select
SQLServer數(shù)據(jù)庫學(xué)習(xí)總結(jié)
1.SQL基礎(chǔ)
SQL Server2000安裝、配置,服務(wù)器啟動、停止,企業(yè)管理器、查詢分析器
第一代數(shù)據(jù)庫--網(wǎng)狀數(shù)據(jù)庫和層次數(shù)據(jù)庫;第二代數(shù)據(jù)庫--關(guān)系數(shù)據(jù)庫
數(shù)據(jù)庫(DB);數(shù)據(jù)庫管理系統(tǒng)(DBMS);數(shù)據(jù)庫系統(tǒng)(DBS)
SQL Server 2000 提供了不同版本:企業(yè)版、標(biāo)準(zhǔn)版、個人版、開發(fā)版
SQL Server中的數(shù)據(jù)類型:整數(shù):int,smallint,tinyint,bigint;浮點數(shù):real,float,decimal;二進制:binary,varbinary;邏輯:bit;字符:char,nchar,varchar,nvarchar;文本和圖形:text,ntext,image;日期和時間:datetime,smalldatetime;貨幣:money,smallmoney
數(shù)據(jù)庫的創(chuàng)建和刪除;數(shù)據(jù)庫表的創(chuàng)建、修改和刪除
數(shù)據(jù)完整性:實體完整性: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中得全部列級和表級約束
SQL Server中有5種約束:主鍵約束(Primary Key Constraint)、默認約束(Default Constraint)、檢查約束(Check Constraint)、唯一性約束(Unique Constraint)、外鍵約束(Foreign Key Constraint).關(guān)系圖
數(shù)據(jù)庫設(shè)計的步驟:需求分析、概念結(jié)構(gòu)設(shè)計、邏輯結(jié)構(gòu)設(shè)計、數(shù)據(jù)庫物理設(shè)計、數(shù)據(jù)庫實施、數(shù)據(jù)庫運行和維護
兩個實體之間的聯(lián)系:一對一(1:1)、一對多(1:n)、多對多(m:n)
實體關(guān)系模型--E-R圖
數(shù)據(jù)庫規(guī)范化:將數(shù)據(jù)庫的結(jié)構(gòu)精簡為最簡單的形式;從表中刪除冗余列;標(biāo)識所有依賴于其他數(shù)據(jù)庫的數(shù)據(jù)。
數(shù)據(jù)庫三范式:第一范式就是無重復(fù)的列;第二范式就是非主屬性非部分依賴于主關(guān)鍵字;第三范式就是屬性不依賴于其他非主屬性
2.SQL語句
SQL全稱是“結(jié)構(gòu)化查詢語言(Structured Query Language)”
SQL的4個部分:
數(shù)據(jù)定義語言DDL(Data Definition Language)用來定義數(shù)據(jù)的結(jié)構(gòu):create、alter、drop。
數(shù)據(jù)控制語言DCL(Data Control Language)用來控制數(shù)據(jù)庫組件的存取許可、存取權(quán)限等得命令:grant、revoke。
數(shù)據(jù)操縱語言DML(Data Manipulation Language)用來操縱數(shù)據(jù)庫中得數(shù)據(jù)的命令:insert、update、delete。
數(shù)據(jù)查詢語言DQL(Data Query Language)用來查詢數(shù)據(jù)庫中得數(shù)據(jù)的命令:select。
SQL中得運算符
:算術(shù)運算符、位運算符、比較運算符、邏輯運算符、通配運算符、字符串連接符、賦值運算符
3.查詢
簡單查詢,使用TOP子句
查詢結(jié)果排序order by
帶條件的查詢where,使用算術(shù)表達式,使用邏輯表達式,使用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
簡單子查詢:嵌套子查詢、相關(guān)子查詢;子查詢的select語句中不能使用order by子句,roder by子句只能對最終查詢結(jié)果排序。type,sum(price),avg(price),count(*)
from
titles
group
by
type
having
type in('business','psycheology')嵌套子查詢:執(zhí)行過程,先執(zhí)行子查詢,子查詢得到的結(jié)果不被顯示,而是傳給外層查詢,作為外層查詢的條件,然后執(zhí)行外層查詢,并顯示結(jié)果。
嵌套子查詢的執(zhí)行不依賴于外層查詢,子查詢只執(zhí)行一次。
帶有比較運算符的子查詢,帶有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語句首先創(chuàng)建一個新表,然后用查詢的結(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ù)
視圖是由一個或多個數(shù)據(jù)表(基本表)導(dǎo)出的虛擬表或者查詢表,是關(guān)系數(shù)據(jù)庫系統(tǒng)提供給用戶以多種角度觀察數(shù)據(jù)庫中數(shù)據(jù)的重要機制。
視圖的好處:能夠簡化用戶的操作;視圖能夠?qū)C密數(shù)據(jù)提供安全保護。
創(chuàng)建視圖時,視圖的名稱存在sysobjects表中。有關(guān)視圖中所定義列的信息添加到syscolumns表中,而有關(guān)視圖相關(guān)性的信息添加到sysdepends表中。另外,create view語句的文本添加到syscomments表中。
在通過視圖向表中插入數(shù)據(jù)時,如果insert語句列表中包含有視圖中沒有選擇的列和不允許為空值的列,這種操作是不允許的。
創(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'
索引提供了一種基于一列或多列的值對表的數(shù)據(jù)行進行快速訪問的方法。索引提供的是表中得邏輯順序。
聚集索引基于數(shù)據(jù)行的鍵值在表內(nèi)排序和存儲這些數(shù)據(jù)行。當(dāng)數(shù)據(jù)表以某列為關(guān)鍵字建立聚集索引時,表中得數(shù)據(jù)行就以該列(聚集索引鍵)的排序次序進行存儲。每個表只能有一個聚集索引。
非聚集索引具有完全獨立于數(shù)據(jù)行的結(jié)構(gòu),一個表可以建立多個非聚集索引。
創(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ù)是一種機制,是一個操作序列,它包含了一組數(shù)據(jù)庫操作命令,并且所有的命令作為一個整體一起向系統(tǒng)提交或撤銷操作請求。
事務(wù)的特性:原子性(Atomicity)、一致性(Consistenty)、隔離性(Isolation)、永久性(Durability)。事務(wù)分類:顯示事務(wù)、隱性事務(wù)、自動提交事務(wù)。
視圖、索引和事務(wù)的創(chuàng)建、使用、修改和刪除
5.Transact—SQL編程
全局變量:由系統(tǒng)定義和維護,其名稱以@@字符開頭
局部變量:由用戶定義和賦值,其名稱以@字符開頭
輸出語句:print
邏輯控制語句: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ù):絕對值abs(n),向上取整ceiling(n),向下取整floor(n),指定次冪power(n,y),四舍五入round(n,length),求符號sign(n),平方根sqrt(n)日期
和
時
間
函
數(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 '價格太高'
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é)果集中每次提取一條記錄的機制。將批操作變成行操作,對結(jié)果集中得某行進行操作。
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--打開游標(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.存儲過程
存儲過程(stored procedure)類似c語言中的函數(shù),是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。用戶通過指定存儲過程的名字餅給出參數(shù)來執(zhí)行它。
常用的系
統(tǒng)
存
儲
過
程
:sp_database,sp_helpdb,sp_renamedb,sp_tables,sp_column,sp_help,sp_helpconstraint,sp_helpindex,sp_stored_procedure,sp_password 創(chuàng)建存儲過程:
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)使用存儲過程:
declare @book_name char(26),@total int
set @book_name='面向?qū)ο蠓治龊驮O(shè)計'
exec book_num @book_name,'2007-01-01','2007-11-01',@total output select @book_name as bookname,@total as num
8.觸發(fā)器
觸發(fā)器是一種特殊類型的存儲過程,主要是通過實踐進行觸發(fā)而被執(zhí)行。
觸發(fā)器的主要作用就是能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。其他功能:強化約束,跟蹤變化,級聯(lián)運行,存儲過程調(diào)用。
SQL Server 2000支持兩種類型觸發(fā)器:
after觸發(fā)器:要求只有執(zhí)行某一操作之后,觸發(fā)器才被執(zhí)行,且只能在表上定義。
instead of觸發(fā)器:表示并不執(zhí)行其所定義的操作,而僅是執(zhí)行觸發(fā)器本身。既可以在表上定義,也可以在視圖上定義,但對同一操作只能定義一個instead of觸發(fā)器。
工作原理:
當(dāng)觸發(fā)insert觸發(fā)器時,新的數(shù)據(jù)行就會被插入到觸發(fā)器表和inserted表中。觸發(fā)器通過檢查inserted表來確定是否執(zhí)行觸發(fā)器動作或如何執(zhí)行。
當(dāng)在定義有觸
發(fā)器的表上執(zhí)行update語句時,原始行被移入到deleted表,更新行被移入inserted表。觸發(fā)器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動作。
當(dāng)觸發(fā)deleted觸發(fā)器后,從受影響的表中刪除的行將被放置到一個特殊的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ù)庫高級管理
SQL Server安全體系結(jié)構(gòu),4個等級:客戶機操作系統(tǒng)的安全性,SQL Server的登錄安全性,數(shù)據(jù)庫的使用安全性,數(shù)據(jù)對象的使用安全性 SQL Server驗證模式:windows身份驗證模式和混合模式(windows身份驗證和SQL Server身份驗證)
登錄賬戶:用戶登錄(連接)SQL Server服務(wù)器的賬戶和密碼。
角色管理:服務(wù)器角色(負責(zé)管理和維護SQL Server的組);數(shù)據(jù)庫角色(是對某個數(shù)據(jù)庫具有相同訪問權(quán)限的用戶賬戶和組的集合)
數(shù)據(jù)庫用戶:對于每個要求訪問數(shù)據(jù)庫的登錄賬戶,必須在要訪問的數(shù)據(jù)庫中建立該數(shù)據(jù)庫的訪問賬戶,且與其登錄賬戶鏈接關(guān)聯(lián),才可進入該數(shù)據(jù)庫訪問。
權(quán)限管理:是指用戶是否能進行訪問數(shù)據(jù)庫資源的相應(yīng)操作。權(quán)限包括:語句權(quán)限、對象權(quán)限和暗示權(quán)限。
授予權(quán)限:
grant 語句 [...] to 安全賬戶[...]
grant 權(quán)限 [...] on 表或視圖[(列[,...])]|on 存儲過程|on用戶自定義函數(shù) to 安全賬戶[,...] 拒絕權(quán)限:
deny 語句 [...] to 安全賬戶[...]
deny 權(quán)限 [...] on 表或視圖[(列[,...])]|on 存儲過程|on用戶自定義函數(shù) to 安全賬戶[,...] 撤銷權(quán)限:
revoke 語句 [...] from 安全賬戶[...]
revoke 權(quán)限 [...] on 表或視圖[(列[,...])]|on 存儲過程|on用戶自定義函數(shù) from 安全賬戶[,...]
備份和恢復(fù):
數(shù)據(jù)庫備份設(shè)備,在進行數(shù)據(jù)庫備份之前,首先要創(chuàng)建備份設(shè)備。包括:磁盤、磁帶和命名管道
SQL Server 備份策略:只備份數(shù)據(jù)庫、備份數(shù)據(jù)庫和事務(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ù)。使用戶可以將來自完全不同數(shù)據(jù)源的數(shù)據(jù)析取、轉(zhuǎn)換并合并到單個或多個目的。
分離與附加:創(chuàng)建可移動的數(shù)據(jù)庫。