Oracle資料庫RMAN的自動備份腳本簡介
各位同學知道Oracle資料庫RMAN如何自動備份腳本嘛?下面我為大家整理了關於Oracle資料庫RMAN的自動備份腳本文章,希望能為你提供幫助:
1、資料庫設置為歸檔方式
2、資料庫的備份腳本
db_full_backup.sh :資料庫全備腳本
db_l0_backup.sh :資料庫0級備份腳本
db_l1_backup.sh :資料庫1級備份腳本
ftp.sh :數據FTP上傳腳本
ftp_del.sh :數據FTP清理腳本
rman_bak.sh :數據備份主程序
3、備份原理
每周1、3、6進行0級備份
每周日、2、4、5進行1級備份
備份文件上傳到FTP伺服器
FTP伺服器每周清理一次,但是清理後將周六和周日的備份進行保留(6.bak和0.bak)
所有工作防暑crontab中自動執行備份
4、備份目錄含義
arc :資料庫歸檔目錄
rmanbak :資料庫備份文件的保存目錄
rmanscripts :資料庫腳本存放路徑
5、FTP目錄
ftp上必須手動建立目錄
L0:
---1
---3
---6
---6.bak
L1:
---2
---4
---5
---0
---0.bak
rman_bak.sh腳本主程序
#!/bin/bash
#--------------------------------------------
# Oracle auto backup using rman
#
# author:songrh
# week:1,3,6 Level 0 backup
# 2,4,5,0 Level 1 backup
# Copyright by ChenLong Tec
#--------------------------------------------
#
#
export ORACLE_BASE=/u02/oracle
export ORACLE_HOME=/u02/oracle/proct/9.2.4
export ORACLE_SID=PROD
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export NLS_LANG=american_america.ZHS16GBK
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NL33=$ORACLE_HOME/ocommon/nls/admin/data
export PATH=/bin:/usr/bin:/usr/sbin:$ORACLE_HOME/bin:$PATH
export PATH=$PATH:/opt/local/bin
#
SH_PATH=/u02/rmanscripts
ARC_PATH=/u02/arch
RMAN_BAK_PATH=/u02/rmanbak
#
#FULL_PATH=$RMAN_BAK_PATH/full
L0_PATH=$RMAN_BAK_PATH/L0
L1_PATH=$RMAN_BAK_PATH/L1
#
#DAY_TAG=`date "%Y-%m-%d"`
LOG_TAG=`date "%Y-%m-%d"`
#FIRST_DAY=`date %e`
WEEK=`date %w`
#WEEK=1
#
# FTP configure
IP="122.120.150.155"
FTPUSER="ftpbak"
FTPPASS="******"
FTPROOT0="L0"
FTPROOT1="L1"
#
DISK_USE=`df -k |sed -n '/u02/'p | awk '{print $5}' |sed 's/%//'`
####check path function
############
if [[ $DISK_USE -ge 90 ]]; then
rm -rf $L0_PATH/*
rm -rf $L1_PATH/*
fi
if [ "$WEEK" = "6" -o "$WEEK" = "3" -o "$WEEK" = "1" ]; then
if [ ! -d $L0_PATH ]; then
mkdir $L0_PATH
fi
if [ "$WEEK" = "1" ]; then
rm -rf $L0_PATH/*
rm -rf $L1_PATH/*
mkdir $L0_PATH/$WEEK
$SH_PATH/db_l0_backup.sh $L0_PATH/$WEEK
cd $L0_PATH/$WEEK
$SH_PATH/ftp_del.sh $IP $FTPUSER $FTPPASS $FTPROOT0 $WEEK $WEEK_$LOG_TAG.log
else
if [ ! -d $L0_PATH/$WEEK ]; then
mkdir $L0_PATH/$WEEK
$SH_PATH/db_l0_backup.sh $L0_PATH/$WEEK
cd $L0_PATH/$WEEK
$SH_PATH/ftp.sh $IP $FTPUSER $FTPPASS $FTPROOT0 $WEEK $WEEK_$LOG_TAG.log
else
;
2. asp怎麼進行資料庫備份
要加分哦
我可是把整個代碼都貼出來了
用著可好用 我正用的
有兩個
一個簡單的下面是代碼
<form name="form1" method="post" action="?action=bf">
備份原資料庫路徑:
<input name="text1" type="text" id="text1">
<p>備份目標資料庫路徑:
<input name="text2" type="text" id="text2">
</p>
<p>
<label>
<input type="submit" name="Submit" value="備份">
</label>
</p>
</form>
<%
Function CopyFiles(TempSource,TempEnd)
Dim FSO
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
IF FSO.FileExists(TempEnd) then
Response.Write "目標備份文件 <b>" & TempEnd & "</b> 已存在,請先刪除!"
Set FSO=Nothing
Exit Function
End IF
IF FSO.FileExists(TempSource) Then
Else
Response.Write "要復制的源資料庫文件 <b>"&TempSource&"</b> 不存在!"
Set FSO=Nothing
Exit Function
End If
FSO.CopyFile TempSource,TempEnd
Response.Write "已經成功復制文件 <b>"&TempSource&"</b> 到 <b>"&TempEnd&"</b>"
Set FSO = Nothing
End Function
if request("action")="bf" then
ff=server.MapPath(request("text1"))
aa=server.MapPath(request("text2"))
call CopyFiles(ff,aa)
end if
%>
**************************************我是分割線************************
還有復雜的
<http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>資料庫備份系統</title>
<style type="text/css">
<!--
body {
background-color: #F4FFD2;
margin-left:5px;
margin-top: 15px;
margin-right: 5px;
margin-bottom: 10px;
}
html{
font-size:12px;
scrollbar-face-color:#99cc66;
scrollbar-arrow-color:#000000;
scrollbar-track-color:#F4FFD2;
scrollbar-3dlight-color:#FFFFFF;
scrollbar-highlight-color:#fcfcfc;
scrollbar-shadow-color:#99cc00;
scrollbar-darkshadow-color:#99cc66;
}
input{background-color:#FFFFFF;
border-color:#333333;
border:1px;
font-style:normal;
}
.title {
FONT-SIZE: 18px; COLOR: #010000; FONT-FAMILY: "黑體"
}
A:hover {
COLOR: #f18b01; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
TD {
FONT-SIZE: 9pt; COLOR: #666666; WORD-BREAK: break-all; LINE-HEIGHT: 170%; TEXT-DECORATION: none
}
.白字 {
COLOR: #ffffff
}
.company {
FONT-SIZE: 12px; COLOR: #2b2b2b; LINE-HEIGHT: 22px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.dot {
FONT-SIZE: 12px; COLOR: #aeaeae; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.news {
FONT-SIZE: 12px; COLOR: #515151; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.word {
FONT-SIZE: 12px; COLOR: #6f6f6f; LINE-HEIGHT: 18px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.caption_dark {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.caption_simple {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #ffffff; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.button {
FONT-SIZE: 12px; COLOR: #666666; TEXT-DECORATION: none
}
.date {
FONT-SIZE: 10px; COLOR: #acacac; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.doman {
FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #0a52af; FONT-FAMILY: Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.form {
BORDER-RIGHT: #e0e0e0 1px solid; BORDER-TOP: #e0e0e0 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #e0e0e0 1px solid; COLOR: #333333; BORDER-BOTTOM: #e0e0e0 1px solid; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #f7f7f7
}
.web_button {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #616e43; TEXT-DECORATION: none
}
.bbs_user {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #ff6600; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.bbs_user_simple {
FONT-SIZE: 12px; COLOR: #575757; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.menu {
FONT-SIZE: 12px; COLOR: #e4e4e4; TEXT-DECORATION: none
}
.copright {
FONT-SIZE: 12px; COLOR: #333333; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.bt_word {
FONT-SIZE: 12px; COLOR: #333333; LINE-HEIGHT: 18px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.list {
FONT-SIZE: 12px; COLOR: #424242; FONT-FAMILY: "??"; TEXT-DECORATION: none
}
.list_class {
FONT-SIZE: 12px; COLOR: #808080; FONT-FAMILY: "???"; TEXT-DECORATION: none
}
.page {
FONT-SIZE: 12px; COLOR:#000000; TEXT-DECORATION: none
}
.bbs_bt {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #000000; TEXT-DECORATION: none
}
.bbs_bt_simple {
FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #545454; TEXT-DECORATION: none
}
.bbs_list_word {
FONT-SIZE: 12px; COLOR: #171717; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.case {
FONT-SIZE: 12px; COLOR: #5a5e61; LINE-HEIGHT: 18px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.date_simple {
FONT-SIZE: 10px; COLOR: #666666; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.proct_bt {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #333333; LINE-HEIGHT: 16px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.prodcut {
FONT-SIZE: 12px; COLOR: #505050; LINE-HEIGHT: 16px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.form2 {
BORDER-RIGHT: #989898 1px solid; BORDER-TOP: #989898 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #989898 1px solid; COLOR: #333333; BORDER-BOTTOM: #989898 1px solid; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #f6f6f6
}
.button3 {
FONT-SIZE: 12px; COLOR: #7b7b7b; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; TEXT-DECORATION: none
}
.bt1 {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #717171
}
.bt_line {
FONT-SIZE: 14px; COLOR: #547db2; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.bt2 {
FONT-WEIGHT: bold; FONT-SIZE: 12px; COLOR: #ff9501; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
A.nav:link {
FONT-SIZE: 12px; COLOR: #ffffff; TEXT-DECORATION: none
}
A.nav:visited {
FONT-SIZE: 12px; COLOR: #ffffff; TEXT-DECORATION: none
}
A.nav:hover {
FONT-SIZE: 12px; COLOR: #ffff00; TEXT-DECORATION: none
}
<font face="Verdana, Arial, Helvetica, sans-serif">
.sb{color:#000000;font-size:13px;text-decoration:none}
a.sb:visited{color:#6699FF;font-size:13}
a.sb:link{color:#3399CC;font-size:13px}
.tomg { color: #666666; font-size:12px; text-decoration:none}
a.tomg:link {color: #666666; text-decoration:none}
a.tomg:visited {color: #666666; text-decoration:none}
a.tomg:hover { color:#FF3300; font-size:14px;text-decoration:none}
.00 { color:#333333; font-size:12px; text-decoration:none}
a.00:hover { color: #FF6666; text-decoration:underline}
a.00:link {color: #666666; text-decoration:none}
a.00:visited {color: #000000; text-decoration:none}
a.bb:link {color:#666666; text-decoration:none;cursor:hand;font-weight:bold}
a.bb:visited {color: #666666; text-decoration:none;cursor:hand;font-weight:bold}
a.bb:hover {color: #CC0000; text-decoration:underline;cursor:hand;font-weight:bold}
.cc{color:#FFFFFF;font-size:12px;text-decoration:none}
.tomg1 { color: #000000; font-size:12px;letter-spacing:1.5; word-spacing:1;line-height:2;text-decoration:none}
a.tomg1:link {color: #000000; text-decoration:none}
a.tomg1:visited {color: #000000; text-decoration:none}
a.tomg1:hover { color:#99CC33 ; text-decoration:none}
.style1 {color: #000000}
.style2 {
color: #FF0000;
font-weight: bold;
}
-->
</style></head>
<body>
<table width="98%" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#99CC00">
<form name="form1" id="form1" method="post" action="?action=bf">
<tr>
<td height="71" bgcolor="#FFFFFF"><table width="100%" height="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
<td height="29" colspan="2" align="center" background="afterimage/line2.jpg" class="proct_bt">::資料庫備份::</td>
</tr>
<tr>
<td height="25" colspan="2" background="afterimage/titleline.gif"></td>
</tr>
<tr>
<td width="18%" height="25" align="center" bgcolor="#F9F9F9"><span class="style1">數據路徑:
</span></td>
<td width="82%" bgcolor="#F9F9F9"><input name="text1" type="text" id="text1" size="50" /> </td>
</tr>
<tr>
<td height="25" align="center" bgcolor="#EEEEEE"><span class="style1">備份資料庫路徑:</span></td>
<td height="25" bgcolor="#EEEEEE"><input name="text2" type="text" id="text2" size="50" />
<input type="submit" name="Submit" value=" 備份資料庫 " /></td>
</tr>
<tr>
<td height="25" colspan="2" align="center" bgcolor="#F3F3F3"><%
Function CopyFiles(TempSource,TempEnd)
Dim FSO
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
IF FSO.FileExists(TempEnd) then
Response.Write "目標備份文件 <b>" & TempEnd & "</b> 已存在,請先刪除!"
Set FSO=Nothing
Exit Function
End IF
IF FSO.FileExists(TempSource) Then
Else
Response.Write "要復制的源資料庫文件 <b>"&TempSource&"</b> 不存在!"
Set FSO=Nothing
Exit Function
End If
FSO.CopyFile TempSource,TempEnd
Response.Write "已經成功復制文件 <b>"&TempSource&"</b> 到 <b>"&TempEnd&"</b>"
Set FSO = Nothing
End Function
if request("action")="bf" then
ff=server.MapPath(request("text1"))
aa=server.MapPath(request("text2"))
ss=split(request("text2"),"/")
CreateFolder(ss(0))
call CopyFiles(ff,aa)
end if
Sub CreateFolder(strFolder)
'首選判斷要建立的文件夾是否已經存在
strTestFolder = Server.Mappath(strFolder)
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 檢查文件夾是否存在
If objFSO.FolderExists(strTestFolder) Then
response.write "該文件夾已經存在!"
Else
Dim strTestFolder, objFSO
strTestFolder = Server.Mappath(strFolder)
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 建立文件夾
objFSO.CreateFolder(strTestFolder)
Set objFSO = Nothing
End If
End Sub
%></td>
</tr>
</table></td>
</tr></form>
</table>
</body>
</html>
3. 用sql語句備份資料庫
利用T-SQL語句,實現資料庫的備份和還原的功能
體現了SQL Server中的四個知識點:
1. 獲取SQL Server伺服器上的默認目錄
2. 備份SQL語句的使用
3. 恢復SQL語句的使用,同時考慮了強制恢復時關閉其他用戶進程的處理
4. 作業創建SQL語句的使用
/*1.--得到資料庫的文件目錄
@dbname 指定要取得目錄的資料庫名
如果指定的數據不存在,返回安裝SQL時設置的默認數據目錄
如果指定NULL,則返回默認的SQL備份目錄名
*/
/*--調用示例
select 資料庫文件目錄=dbo.f_getdbpath(』tempdb』)
,[默認SQL SERVER數據目錄]=dbo.f_getdbpath(』』)
,[默認SQL SERVER備份目錄]=dbo.f_getdbpath(null)
--*/
if exists (select * from dbo.sysobjects where id = object_id(N』[dbo].[f_getdbpath]』) and xtype in (N』FN』, N』IF』, N』TF』))
drop function [dbo].[f_getdbpath]
GO
create function f_getdbpath(@dbname sysname)
returns nvarchar(260)
as
begin
declare @re nvarchar(260)
if @dbname is null or db_id(@dbname) is null
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=』master』
else
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
if @dbname is null
set @re=reverse(substring(@re,charindex(』\』,@re)+5,260))+』BACKUP』
else
set @re=reverse(substring(@re,charindex(』\』,@re),260))
return(@re)
end
go
/*2.--備份資料庫
*/
/*--調用示例
--備份當前資料庫
exec p_backupdb @bkpath=』c:\』,@bkfname=』db_\DATE\_db.bak』
--差異備份當前資料庫
exec p_backupdb @bkpath=』c:\』,@bkfname=』db_\DATE\_df.bak』,@bktype=』DF』
--備份當前資料庫日誌
exec p_backupdb @bkpath=』c:\』,@bkfname=』db_\DATE\_log.bak』,@bktype=』LOG』
--*/
if exists (select * from dbo.sysobjects where id = object_id(N』[dbo].[p_backupdb]』) and OBJECTPROPERTY(id, N』IsProcere』) = 1)
drop procere [dbo].[p_backupdb]
GO
create proc p_backupdb
@dbname sysname=』』, --要備份的資料庫名稱,不指定則備份當前資料庫
@bkpath nvarchar(260)=』』, --備份文件的存放目錄,不指定則使用SQL默認的備份目錄
@bkfname nvarchar(260)=』』, --備份文件名,文件名中能用\DBNAME\代表資料庫名,\DATE\代表日期,\TIME\代表時間
@bktype nvarchar(10)=』DB』, --備份類型:』DB』備份資料庫,』DF』 差異備份,』LOG』 日誌備份
@appendfile bit=1 --追加/覆蓋備份文件
as
declare @sql varchar(8000)
if isnull(@dbname,』』)=』』 set @dbname=db_name()
if isnull(@bkpath,』』)=』』 set @bkpath=dbo.f_getdbpath(null)
if isnull(@bkfname,』』)=』』 set @bkfname=』\DBNAME\_\DATE\_\TIME\.BAK』
set @bkfname=replace(replace(replace(@bkfname,』\DBNAME\』,@dbname)
,』\DATE\』,convert(varchar,getdate(),112))
,』\TIME\』,replace(convert(varchar,getdate(),108),』:』,』』))
set @sql=』backup 』+case @bktype when 』LOG』 then 』log 』 else 』database 』 end +@dbname
+』 to disk=』』』+@bkpath+@bkfname
+』』』 with 』+case @bktype when 』DF』 then 』DIFFERENTIAL,』 else 』』 end
+case @appendfile when 1 then 』NOINIT』 else 』INIT』 end
print @sql
exec(@sql)
go
/*3.--恢復資料庫
*/
/*--調用示例
--完整恢復資料庫
exec p_RestoreDb @bkfile=』c:\db_20031015_db.bak』,@dbname=』db』
--差異備份恢復
exec p_RestoreDb @bkfile=』c:\db_20031015_db.bak』,@dbname=』db』,@retype=』DBNOR』
exec p_backupdb @bkfile=』c:\db_20031015_df.bak』,@dbname=』db』,@retype=』DF』
--日誌備份恢復
exec p_RestoreDb @bkfile=』c:\db_20031015_db.bak』,@dbname=』db』,@retype=』DBNOR』
exec p_backupdb @bkfile=』c:\db_20031015_log.bak』,@dbname=』db』,@retype=』LOG』
--*/
if exists (select * from dbo.sysobjects where id = object_id(N』[dbo].[p_RestoreDb]』) and OBJECTPROPERTY(id, N』IsProcere』) = 1)
drop procere [dbo].[p_RestoreDb]
GO
create proc p_RestoreDb
@bkfile nvarchar(1000), --定義要恢復的備份文件名
@dbname sysname=』』, --定義恢復後的資料庫名,默認為備份的文件名
@dbpath nvarchar(260)=』』, --恢復後的資料庫存放目錄,不指定則為SQL的默認數據目錄
@retype nvarchar(10)=』DB』, --恢復類型:』DB』完事恢復資料庫,』DBNOR』 為差異恢復,日誌恢復進行完整恢復,』DF』 差異備份的恢復,』LOG』 日誌恢復
@filenumber int=1, --恢復的文件號
@overexist bit=1, --是否覆蓋已存在的資料庫,僅@retype為
@killuser bit=1 --是否關閉用戶使用進程,僅@overexist=1時有效
as
declare @sql varchar(8000)
--得到恢復後的資料庫名
if isnull(@dbname,』』)=』』
select @sql=reverse(@bkfile)
,@sql=case when charindex(』.』,@sql)=0 then @sql
else substring(@sql,charindex(』.』,@sql)+1,1000) end
,@sql=case when charindex(』\』,@sql)=0 then @sql
else left(@sql,charindex(』\』,@sql)-1) end
,@dbname=reverse(@sql)
--得到恢復後的資料庫存放目錄
if isnull(@dbpath,』』)=』』 set @dbpath=dbo.f_getdbpath(』』)
--生成資料庫恢復語句
set @sql=』restore 』+case @retype when 』LOG』 then 』log 』 else 』database 』 end+@dbname
+』 from disk=』』』+@bkfile+』』』』
+』 with file=』+cast(@filenumber as varchar)
+case when @overexist=1 and @retype in(』DB』,』DBNOR』) then 』,replace』 else 』』 end
+case @retype when 』DBNOR』 then 』,NORECOVERY』 else 』,RECOVERY』 end
print @sql
--添加移動邏輯文件的處理
if @retype=』DB』 or @retype=』DBNOR』
begin
--從備份文件中獲取邏輯文件名
declare @lfn nvarchar(128),@tp char(1),@i int
--創建臨時表,保存獲取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--從備份文件中獲取信息
insert into #tb exec(』restore filelistonly from disk=』』』+@bkfile+』』』』)
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+』,move 』』』+@lfn+』』』 to 』』』+@dbpath+@dbname+cast(@i as varchar)
+case @tp when 』D』 then 』.mdf』』』 else 』.ldf』』』 end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
end
--關閉用戶進程處理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec(』kill 』+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end
--恢復資料庫
exec(@sql)
go
/*4.--創建作業
*/
/*--調用示例
--每月執行的作業
exec p_createjob @jobname=』mm』,@sql=』select * from syscolumns』,@freqtype=』month』
--每周執行的作業
exec p_createjob @jobname=』ww』,@sql=』select * from syscolumns』,@freqtype=』week』
--每日執行的作業
exec p_createjob @jobname=』a』,@sql=』select * from syscolumns』
--每日執行的作業,每天隔4小時重復的作業
exec p_createjob @jobname=』b』,@sql=』select * from syscolumns』,@fsinterval=4
--*/
if exists (select * from dbo.sysobjects where id = object_id(N』[dbo].[p_createjob]』) and OBJECTPROPERTY(id, N』IsProcere』) = 1)
drop procere [dbo].[p_createjob]
GO
create proc p_createjob
@jobname varchar(100), --作業名稱
@sql varchar(8000), --要執行的命令
@dbname sysname=』』, --默認為當前的資料庫名
@freqtype varchar(6)=』day』, --時間周期,month 月,week 周,day 日
@fsinterval int=1, --相對於每日的重復次數
@time int=170000 --開始執行時間,對於重復執行的作業,將從0點到23:59分
as
if isnull(@dbname,』』)=』』 set @dbname=db_name()
--創建作業
exec msdb..sp_add_job @job_name=@jobname
--創建作業步驟
exec msdb..sp_add_jobstep @job_name=@jobname,
@step_name = 』數據處理』,
@subsystem = 』TSQL』,
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, --重試次數
@retry_interval = 5 --重試間隔
--創建調度
declare @ftype int,@fstype int,@ffactor int
select @ftype=case @freqtype when 』day』 then 4
when 』week』 then 8
when 』month』 then 16 end
,@fstype=case @fsinterval when 1 then 0 else 8 end
if @fsinterval<>1 set @time=0
set @ffactor=case @freqtype when 』day』 then 0 else 1 end
EXEC msdb..sp_add_jobschele @job_name=@jobname,
@name = 』時間安排』,
@freq_type=@ftype , --每天,8 每周,16 每月
@freq_interval=1, --重復執行次數
@freq_subday_type=@fstype, --是否重復執行
@freq_subday_interval=@fsinterval, --重復周期
@freq_recurrence_factor=@ffactor,
@active_start_time=@time --下午17:00:00分執行
go
/*--應用案例--備份方案:
完整備份(每個星期天一次)+差異備份(每天備份一次)+日誌備份(每2小時備份一次)
調用上面的存儲過程來實現
--*/
declare @sql varchar(8000)
--完整備份(每個星期天一次)
set @sql=』exec p_backupdb @dbname=』』要備份的資料庫名』』』
exec p_createjob @jobname=』每周備份』,@sql,@freqtype=』week』
--差異備份(每天備份一次)
set @sql=』exec p_backupdb @dbname=』』要備份的資料庫名』』,@bktype=』DF』』
exec p_createjob @jobname=』每天差異備份』,@sql,@freqtype=』day』
--日誌備份(每2小時備份一次)
set @sql=』exec p_backupdb @dbname=』』要備份的資料庫名』』,@bktype=』LOG』』
exec p_createjob @jobname=』每2小時日誌備份』,@sql,@freqtype=』day』,@fsinterval=2
/*--應用案例2
生產數據核心庫:PRODUCE
備份方案如下:
1.設置三個作業,分別對PRODUCE庫進行每日備份,每周備份,每月備份
2.新建三個新庫,分別命名為:每日備份,每周備份,每月備份
3.建立三個作業,分別把三個備份庫還原到以上的三個新庫。
目的:當用戶在proce庫中有所有的數據丟失時,均能從上面的三個備份庫中導入相應的TABLE數據。
--*/
declare @sql varchar(8000)
--1.建立每月備份和生成月備份資料庫的作業,每月每1天下午16:40分進行:
set @sql=』
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=』』PRODUCE_』』+convert(varchar(10),getdate(),112)+』』_m.bak』』
set @path=dbo.f_getdbpath(null)+@fname
--備份
exec p_backupdb @dbname=』』PRODUCE』』,@bkfname=@fname
--根據備份生成每月新庫
exec p_RestoreDb @bkfile=@path,@dbname=』』PRODUCE_月』』
--為周資料庫恢復准備基礎資料庫
exec p_RestoreDb @bkfile=@path,@dbname=』』PRODUCE_周』』,@retype=』』DBNOR』』
--為日資料庫恢復准備基礎資料庫
exec p_RestoreDb @bkfile=@path,@dbname=』』PRODUCE_日』』,@retype=』』DBNOR』』
』
exec p_createjob @jobname=』每月備份』,@sql,@freqtype=』month』,@time=164000
--2.建立每周差異備份和生成周備份資料庫的作業,每周日下午17:00分進行:
set @sql=』
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=』』PRODUCE_』』+convert(varchar(10),getdate(),112)+』』_w.bak』』
set @path=dbo.f_getdbpath(null)+@fname
--差異備份
exec p_backupdb @dbname=』』PRODUCE』』,@bkfname=@fname,@bktype=』』DF』』
--差異恢復周資料庫
exec p_backupdb @bkfile=@path,@dbname=』』PRODUCE_周』』,@retype=』』DF』』
』
exec p_createjob @jobname=』每周差異備份』,@sql,@freqtype=』week』,@time=170000
--3.建立每日日誌備份和生成日備份資料庫的作業,每周日下午17:15分進行:
set @sql=』
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=』』PRODUCE_』』+convert(varchar(10),getdate(),112)+』』_l.bak』』
set @path=dbo.f_getdbpath(null)+@fname
--日誌備份
exec p_backupdb @dbname=』』PRODUCE』』,@bkfname=@fname,@bktype=』』LOG』』
--日誌恢復日資料庫
exec p_backupdb @bkfile=@path,@dbname=』』PRODUCE_日』』,@retype=』』LOG』』
』
exec p_createjob @jobname=』每周差異備份』,@sql,@freqtype=』day』,@time=171500
4. mysql資料庫備份
在資料庫表丟失或損壞的情況下,備份你的資料庫是很重要的。如果發生系統崩潰,你肯定想能夠將你的表盡可能丟失最少的數據恢復到崩潰發生時的狀態。有時,正是MySQL管理員造成破壞。管理員已經知道表以破壞,用諸如vi或Emacs等編輯器試圖直接編輯它們,這對表絕對不是件好事!
備份資料庫兩個主要方法是用mysqlmp程序或直接拷貝資料庫文件(如用cp、cpio或tar等)。每種方法都有其優缺點:
• mysqlmp與MySQL伺服器協同操作。直接拷貝方法在伺服器外部進行,並且你必須採取措施保證沒有客戶正在修改你將拷貝的表。如果你想用文件系統備份來備份資料庫,也會發生同樣的問題:如果資料庫表在文件系統備份過程中被修改,進入備份的表文件主語不一致的狀態,而對以後的恢復表將失去意義。文件系統備份與直接拷貝文件的區別是對後者你完全控制了備份過程,這樣你能採取措施確保伺服器讓表不受干擾。
• mysqlmp比直接拷貝要慢些。
• mysqlmp生成能夠移植到其它機器的文本文件,甚至那些有不同硬體結構的機器上。直接拷貝文件不能移植到其它機器上,除非你正在拷貝的表使用MyISAM存儲格式。ISAM表只能在相似的硬體結構的機器上拷貝。在MySQL 3.23中引入的MyISAM表存儲格式解決了該問題,因為該格式是機器無關的,所以直接拷貝文件可以移植到具有不同硬體結構的機器上。只要滿足兩個條件:另一台機器必須也運行MySQL 3.23或以後版本,而且文件必須以MyISAM格式表示,而不是ISAM格式。
不管你使用哪種備份方法,如果你需要恢復資料庫,有幾個原則應該遵守,以確保最好的結果:
• 定期實施備份。建立一個計劃並嚴格遵守。
• 讓伺服器執行更新日誌。當你在崩潰後需要恢復數據時,更新日誌將幫助你。在你用備份文件恢復數據到備份時的狀態後,你可以通過運行更新日誌中的查詢再次運用備份後面的修改,這將資料庫中的表恢復到崩潰發生時的狀態。
• 以文件系統備份的術語講,資料庫備份文件代表完全傾倒(full mp),而更新日誌代表漸進傾倒(incremental mp)。
• 使用一種統一的和易理解的備份文件命名機制。象backup1、buckup2等不是特別有意義。當實施你的恢復時,你將浪費時間找出文件里是什麼東西。你可能發覺用資料庫名和日期構成備份文件名會很有用。例如:
• %mysqlmp samp_db >/usr/archives/mysql/samp_db.1999-10-02
• %mysqlmp menagerie >/usr/archives/mysql/menagerie.1999-10-02
• 你可能想在生成備份後壓縮它們。備份一般都很大!你也需要讓你的備份文件有過期期限以避免它們填滿你的磁碟,就象你讓你的日誌文件過期那樣。
• 用文件系統備份備份你的備份文件。如果遇上了一個徹底崩潰,不僅清除了你的數據目錄,也清除了包含你的資料庫備份的磁碟驅動器,你將真正遇上了麻煩。也要備份你的更新日誌。
• 將你的備份文件放在不同於用於你的資料庫的文件系統上。這將降低由於生成備份而填滿包含數據目錄的文件系統的可能性。
用於創建備份的技術同樣對拷貝資料庫到另一台機器有用。最常見地,一個資料庫被轉移到了運行在另一台主機上的伺服器,但是你也可以將數據轉移到同一台主機上的另一個伺服器。
1 使用mysqlmp備份和拷貝資料庫
當你使用mysqlmo程序產生資料庫備份文件時,預設地,文件內容包含創建正在傾倒的表的CREATE語句和包含表中行數據的INSERT語句。換句話說,mysqlmp產生的輸出可在以後用作mysql的輸入來重建資料庫。
你可以將整個資料庫傾倒進一個單獨的文本文件中,如下:
%mysqlmp samp_db >/usr/archives/mysql/samp_db.1999-10-02
輸出文件的開頭看起來象這樣:
# MySQL Dump 6.0# # Host: localhost Database: samp_db#---------------------------------------# Server version 3.23.2-alpha-log## Table structure for table 'absence'#CREATE TABLE absence( student_id int(10) unsigned DEFAULT '0' NOT NULL, date date DEFAULT '0000-00-00' NOT NULL, PRIMARY KEY (student_id,date));## Dumping data for table 'absence'#INSERT INTO absence VALUES (3,'1999-09-03');INSERT INTO absence VALUES (5,'1999-09-03');INSERT INTO absence VALUES (10,'1999-09-08');......
文件剩下的部分有更多的INSERT和CREATE TABLE語句組成。
如果你想壓縮備份,使用類似如下的命令:
%mysqlmp samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz
如果你要一個龐大的資料庫,輸出文件也將很龐大,可能難於管理。如果你願意,你可以在mysqlmp命令行的資料庫名後列出單獨的表名來傾到它們的內容,這將傾倒文件分成較小、更易於管理的文件。下例顯示如何將samp_db資料庫的一些表傾到進分開的文件中:
%mysqlmp samp_db student score event absence >grapbook.sql
%mysqlmp samp_db member president >hist-league.sql
如果你生成准備用於定期刷新另一個資料庫內容的備份文件,你可能想用--add-drop-table選項。這告訴伺服器將DROP TABLE IF EXISTS語句寫入備份文件,然後,當你取出備份文件並把它裝載進第二個資料庫時,如果表已經存在,你不會得到一個錯誤。
如果你倒出一個資料庫以便能把資料庫轉移到另一個伺服器,你甚至不必創建備份文件。要保證資料庫存在於另一台主機,然後用管道傾倒資料庫,這樣mysql能直接讀取mysqlmp的輸出。例如:你想從主機pit-viper.snake.net拷貝資料庫samp_db到boa.snake.net,可以這樣很容易做到:
%mysqladmin -h boa.snake.net create samp_db
%mysqlmp samp_db | mysql -h boa.snake.net samp_db
以後,如果你想再次刷新boa.snake.net上的資料庫,跳過mysqladmin命令,但要對mysqlmp加上--add-drop-table以避免的得到表已存在的錯誤:
%mysqlmp --add-drop-table samp_db | mysql -h boa.snake.net samp_db
mysqlmp其它有用的選項包括:
• --flush-logs和--lock-tables組合將對你的資料庫檢查點有幫助。--lock-tables鎖定你正在傾倒的所有表,而--flush-logs關閉並重新打開更新日誌文件,新的更新日誌將只包括從備份點起的修改資料庫的查詢。這將設置你的更新日誌檢查點位備份時間。(然而如果你有需要執行個更新的客戶,鎖定所有表對備份期間的客戶訪問不是件好事。)
• 如果你使用--flush-logs設置檢查點到備份時,有可能最好是傾倒整個資料庫。如果你傾倒單獨的文件,較難將更新日誌檢查點與備份文件同步。在恢復期間,你通常按資料庫為基礎提取更新日誌內容,對單個表沒有提取更新的選擇,所以你必須自己提取它們。
• 預設地,mysqlmp在寫入前將一個表的整個內容讀進內存。這通常確實不必要,並且實際上如果你有一個大表,幾乎是失敗的。你可用--quick選項告訴mysqlmp只要它檢索出一行就寫出每一行。為了進一步優化傾倒過程,使用--opt而不是--quick。--opt選項打開其它選項,加速數據的傾倒和把它們讀回。
• 用--opt實施備份可能是最常用的方法,因為備份速度上的優勢。然而,要警告你,--opt選項確實有代價,--opt優化的是你的備份過程,不是其他客戶對資料庫的訪問。--opt選項通過一次鎖定所有表阻止任何人更新你正在傾倒的任何錶。你可在一般資料庫訪問上很容易看到其效果。當你的資料庫一般非常頻繁地使用,只是一天一次地調節備份。
• 一個具有--opt的相反效果的選項是--dedayed。該選項使得mysqlmp寫出INSERT DELAYED語句而不是INSERT語句。如果你將數據文件裝入另一個資料庫並且你想是這個操作對可能出現在該資料庫中的查詢的影響最小,--delayed對此很有幫助。
• --compress選項在你拷貝資料庫到另一台機器上時很有幫助,因為它減少網路傳輸位元組的數量。下面有一個例子,注意到--compress對與遠端主機上的伺服器通信的程序才給出,而不是對與本地主機連接的程序:
%mysqlmp --opt samp_db | mysql --compress -h boa.snake.net samp_db
• mysqlmp有很多選項,詳見《MySQL參考手冊》。
2 使用直接拷貝資料庫的備份和拷貝方法
另一種不涉及mysqlmp備份資料庫和表的方式是直接拷貝資料庫表文件。典型地,這用諸如cp、tar或cpio實用程序。本文的例子使用cp。
當你使用一種直接備份方法時,你必須保證表不在被使用。如果伺服器在你則正在拷貝一個表時改變它,拷貝就失去意義。
保證你的拷貝完整性的最好方法是關閉伺服器,拷貝文件,然後重啟伺服器。如果你不想關閉伺服器,要在執行表檢查的同時鎖定伺服器。如果伺服器在運行,相同的制約也適用於拷貝文件,而且你應該使用相同的鎖定協議讓伺服器「安靜下來」。
假設伺服器關閉或你已經鎖定了你想拷貝的表,下列顯示如何將整個samp_db資料庫備份到一個備份目錄(DATADIR表示伺服器的數據目錄):
%cdDATADIR%cp -r samp_db /usr/archive/mysql
單個表可以如下備份:
%cdDATADIR/samp_db%cp member.* /usr/archive/mysql/samp_db%cp score.* /usr/archive/mysql/samp_db ....
當你完成了備份時,你可以重啟伺服器(如果關閉了它)或釋放加在表上的鎖定(如果你讓伺服器運行)。
要用直接拷貝文件把一個資料庫從一台機器拷貝到另一台機器上,只是將文件拷貝到另一台伺服器主機的適當數據目錄下即可。要確保文件是MyIASM格式或兩台機器有相同的硬體結構,否則你的資料庫在另一台主機上有奇怪的內容。你也應該保證在另一台機器上的伺服器在你正在安裝資料庫表時不訪問它們。
3 復制資料庫(Replicating Database)
復制(Replication)類似於拷貝資料庫到另一台伺服器上,但它的確切含義是實時地保證兩個資料庫的完全同步。這個功能將在3.23版中出現,而且還不很成熟,因此本文不作詳細介紹。
4 用備份恢復數據
資料庫損壞的發生有很多原因,程度也不同。如果你走運,你可能僅損壞一兩個表(如掉電),如果你倒霉,你可能必須替換整個數據目錄(如磁碟損壞)。在某些情況下也需要恢復,比如用戶錯誤地刪除了資料庫或表。不管這些倒霉事件的原因,你將需要實施某種恢復。
如果表損壞但沒丟失,嘗試用myisamchk或isamchk修復它們,如果這樣的損壞可有修復程序修復,你可能根本不需要使用備份文件。關於表修復的過程,見《資料庫維護與修復》。
恢復過程涉及兩種信息源:你的備份文件和個更新日誌。備份文件將表恢復到實施備份時的狀態,然而一般表在備份與發生問題之間的時間內已經被修改,更新日誌包含了用於進行這些修改的查詢。你可以使用日誌文件作為mysql的輸入來重復查詢。這已正是為什麼要啟用更新日誌的原因。
恢復過程視你必須恢復的信息多少而不同。實際上,恢復整個資料庫比單個表跟容易,因為對於資料庫運用更新日誌比單個表容易。
4.1 恢復整個資料庫
首先,如果你想恢復的資料庫是包含授權表的mysql資料庫,你需要用--skip-grant-table選項運行伺服器。否則,它會抱怨不能找到授權表。在你已經恢復表後,執行mysqladmin flush-privileges告訴伺服器裝載授權標並使用它們。
• 將資料庫目錄內容拷貝到其它某個地方,如果你在以後需要它們。
• 用最新的備份文件重裝資料庫。如果你用mysqlmp產生的文件,將它作為mysql的輸入。如果你用直接從資料庫拷貝來的文件,將它們直接拷回資料庫目錄,然而,此時你需要在拷貝文件之前關閉資料庫,然後重啟它。
使用更新日誌重復做備份以後的修改資料庫表的查詢。對於任何可適用的更新日誌,將它們作為mysql的輸入。指定--one-database選項使得mysql只執行你有興趣恢復的資料庫的查詢。如果你知道你需要運用所有更新日誌文件,你可以在包含日誌的目錄下使用這條命令:
% ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-databasedb_name
ls命令生成更新日誌文件的一個單列列表,根據伺服器產生它們的次序排序(主意:如果你修改任何一個文件,你將改變排序次序,這導致更新日誌一錯誤的次序被運用。)
很可能你會是運用某幾個更新日誌。例如,自從你備份以來產生的更新日誌被命名為update.392、update.393等等,你可以這樣重新運行:
%mysql --one-database db_name < update.392
%mysql --one-database db_name < update.393
.....
如果你正在實施恢復且使用更新日誌恢復由於一個錯誤建議的DROP DATABASE、DROP TABLE或DELETE語句造成丟失的信息,在運用更新日誌之前,要保證從其中刪除這些語句。
4.2 恢復單個表
恢復單個表較為復雜。如果你用一個由mysqlmp生成的備份文件,並且它不包含你感興趣的表的數據,你需要從相關行中提取它們並將它們用作mysql的輸入。這是容易的部分。難的部分是從只運用於該表的更新日誌中拉出片斷。你會發覺mysql_find_rows實用程序對此很有幫助,它從更新日誌中提取多行查詢。
另一個可能性是使用另一台伺服器恢復整個資料庫,然後拷貝你想要的表文件到原資料庫中。這可能真的很容易!當你將文件拷回資料庫目錄時,要確保原資料庫的伺服器關閉。
至於用php語句寫mysql備份,涉及一些php課程,我也不是太懂,不好意思~~
5. asp +access 怎樣實現資料庫備份
<% dim action dim admin_flag Function finddir(filepath) finddir="" for i=1 to len(filepath) if left(right(filepath,i),1)="/" or left(right(filepath,i),1)="\" then abc=i exit for end if next if abc <> 1 then finddir=left(filepath,len(filepath)-abc+1) end if end Function action=trim(request("action")) dim dbpath,bkfolder,bkdbname,fso,fso1 Dim uploadpath '備份數據 select case action case "BackupData" '備份數據 if request("act")="Backup" then call updata() else call BackupData() end if case "RestoreData" '恢復數據 dim backpath if request("act")="Restore" then Dbpath=request.form("Dbpath") backpath=request.form("backpath") if dbpath="" then response.write "請輸入您要恢復成的資料庫全名" else Dbpath=server.mappath(Dbpath) end if backpath=server.mappath(backpath) Set Fso=server.createobject("scripting.filesystemobject") if fso.fileexists(dbpath) then fso.file Dbpath,Backpath response.write "<br>" response.write "<br>" response.write "<br>" response.write "<center>成功恢復數據!" response.write "</center>" else response.write "備份目錄下並無您的備份文件!" end if else call RestoreData() end if end select '====================備份資料庫========================= sub BackupData() If IsSqlDataBase = 1 Then SQLUserReadme() Exit Sub End If %>
6. 資料庫備份與還原功能的實現
傳統方法用SQL Server作資料庫後台時,一般採用手工的方式利用SQL Server自身提供的可視化工具或SQL語言進行數據的備份還原功能(余正濤等,2003),但是由於SQL Server 的復雜性,操作比較繁瑣,就使得普通用戶對數據的備份與還原有一定的困難,並且容易造成錯誤,可能造成數據丟失等災難性的後果。考慮到系統完整性和可靠性,可在VB 6.0環境下實現SQL Server資料庫的備份與還原工作。
(一)實現思路
為了通過程序實現資料庫備份與還原工作,必須在VB環境下引用SQLDMO,SQLDMO(SQL Distributed Management Objects,SQL 分布式管理對象)封裝了Microsoft SQL Server資料庫中的對象。SQLDMO是Microsoft SQL Server中企業管理器所使用的應用程序介面(包括備份和恢復),允許用支持自動化或COM 的語言編寫應用程序。SQLDMO 對象來自SQLDMO.dll,SQLDMO.dll 是隨 SQL Server 2000 一起發布的。並通過CreateObject("SQLD MO.SQLServer")函數創建新對象,使用SQLServ er.Connect函數經密碼校驗可連接伺服器,再創建備份核心對象SQLDMO.Backup,同時指定備份文件等參數即可實現資料庫備份與還原。具體的備份處理流程如圖8-10所示。
特別注意SQL Server 2000 所安裝的硬碟分區格式是否是NTFS格式,NTFS是最適合安裝SQL Serv⁃er的文件系統。它比FAT文件系統更穩定且更容易恢復。而且它還包括一些安全選項,例如文件和目錄ACL,以及文件加密(EFS)。如果是Fat32格式建議將它改成NTFS格式,因為Fat32支持最大文件為4G,資料庫超過4G通常會提示日誌文件太大之類的錯誤。
圖8-10 資料庫備份處理流程圖
(二)關鍵代碼
'************資料庫備份操作*************
Set gSQLServer=getSQLServer(ServerName,UserName,password)
Private Function BackUpData(gDatabaseName As String,gBkupRstrFileName As String,Server⁃Name As String,UserName As String,password As String)As String
On Error GoTo ErrHandler:
Dim oBackup As SQLDMO.Backup
Dim gSQLServer As SQLDMO.SQLServer
Set tprg=New CProgress
tprg.Title ="正在執行資料庫備份......"
ServerName為伺服器名稱;serName為用戶名;password為超級密碼
'連接伺服器
Set oBackup=New SQLDMO.Backup
Set oBackupEvent=oBackup
gDatabaseName為所要備份數據名稱;gBkupRstrFileName為備份文件名
oBackup.Database=gDatabaseName
oBackup.Files=gBkupRstrFileName
已存在gBkupRstrFileName備份文件名,則覆蓋
If Len(Dir(gBkupRstrFileName))>0 Then
Kill(gBkupRstrFileName)
End If
oBackup.PercentCompleteNotification=1
Screen.MousePointer=vbHourglass
oBackup.SQLBackup gSQLServer
DoEvents
Screen.MousePointer=vbDefault
'清空內存、關閉連接
Set oBackupEvent=Nothing
Set oBackup=Nothing
gSQLServer.Close
Set gSQLServer=Nothing
Set tprg=Nothing
Exit Function
ErrHandler:
m_str狀態=Err.Description
Resume Next
Set tprg=Nothing
End Function
'************資料庫還原操作*************
Private Function RestoreData(gDatabaseName As String,gBkupRstrFileName As String,Server⁃Name As String,UserName As String,password As String)As String
On Error GoTo ErrHandler:
Dim oRestore As SQLDMO.Restore
Dim msg As String
Dim Response As String
Set tprg=New CProgress
tprg.Title ="正在執行資料庫還原......"
Dim gSQLServer As SQLDMO.SQLServer
'ServerName為伺服器名稱;serName為用戶名;password為超級密碼
'連接伺服器
Set gSQLServer=getSQLServer(ServerName,UserName,password)
Set oRestore=New SQLDMO.Restore
Set oRestoreEvent=oRestore
'gDatabaseName為所要還原數據名稱;gBkupRstrFileName為還原文件名
oRestore.Database=gDatabaseName
oRestore.Files=gBkupRstrFileName
Screen.MousePointer=vbHourglass
oRestore.PercentCompleteNotification=1
oRestore.SQLRestore gSQLServer
Screen.MousePointer=vbDefault
'清空內存、關閉連接
Set oRestoreEvent=Nothing
Set oRestore=Nothing
gSQLServer.Close
Set gSQLServer=Nothing
Set tprg=Nothing
Exit Function
ErrHandler:
m_str狀態=Err.Description
Resume Next
Set tprg=Nothing
End Function
'************顯示備份進度*************
'************顯示還原進度*************
End Sub
Private Sub oBackupEvent_PercentComplete(ByVal Message As String,ByVal Percent As Long)
DoEvents
tprg.Value=Percent
End Sub
Private Sub oRestoreEvent_PercentComplete(ByVal Message As String,ByVal Percent As Long)
DoEvents
tprg.Value=Percent
7. 怎樣正確備份SQL7.0 數據
SQL SERVER2000資料庫備份和恢復存儲過程,過程和函數的詳細說明在代碼中
/*備份資料庫的過程*/
if exists(
select * from sysobjects
where name='pr_backup_db' and xtype='p'
)
begin
drop proc pr_backup_db
end
go
create proc pr_backup_db
@flag varchar(20) out,
@backup_db_name varchar(128),
@filename varchar(1000) --路徑+文件名字
as
declare @sql nvarchar(4000),@par nvarchar(1000)
if not exists(
select * from master..sysdatabases
where name=@backup_db_name
)
begin
select @flag='db not exist' /*資料庫不存在*/
return
end
else
begin
if right(@filename,1)<>'\' and charindex('\',@filename)<>0
begin
select @par='@filename varchar(1000)'
select @sql='BACKUP DATABASE '+@backup_db_name+' to disk=@filename with init'
execute sp_executesql @sql,@par,@filename
select @flag='ok'
return
end
else
begin
select @flag='file type error' /*參數@filename輸入格式錯誤*/
return
end
end
GO
說明:pr_backup_db過程是備份你的資料庫
/*創建函數,得到文件得路徑*/
if exists(
select * from sysobjects
where name='fn_GetFilePath' and xtype='fn'
)
begin
drop function fn_GetFilePath
end
go
create function fn_GetFilePath(@filename nvarchar(260))
returns nvarchar(260)
as
begin
declare @file_path nvarchar(260)
declare @filename_reverse nvarchar(260)
select @filename_reverse=reverse(@filename)
select @file_path=substring(@filename,1,len(@filename)+1-charindex('\',@filename_reverse))
return @file_path
end
GO
/*恢復資料庫的過程*/
if exists(
select * from sysobjects
where name='pr_restore_db' and xtype='p'
)
begin
drop proc pr_restore_db
end
go
CREATE proc pr_restore_db
@flag varchar(20) out, /*過程運行的狀態標志,是輸入參數*/
@restore_db_name nvarchar(128), /*要恢復的數據名字*/
@filename nvarchar(260) /*備份文件存放的路徑+備份文件名字*/
as
declare @proc_result tinyint /*返回系統存儲過程xp_cmdshell運行結果*/
declare @loop_time smallint /*循環次數*/
declare @max_ids smallint /*@tem表的ids列最大數*/
declare @file_bak_path nvarchar(260) /*原資料庫存放路徑*/
declare @flag_file bit /*文件存放標志*/
declare @master_path nvarchar(260) /*資料庫master文件路徑*/
declare @sql nvarchar(4000),@par nvarchar(1000)
declare @sql_sub nvarchar(4000)
declare @sql_cmd nvarchar(100)
declare @sql_kill nvarchar(100)
/*
判斷參數@filename文件格式合法性,以防止用戶輸入類似d: 或者 c:\a\ 等非法文件名
參數@filename裡面必須有'\'並且不以'\'結尾
*/
if right(@filename,1)<>'\' and charindex('\',@filename)<>0
begin
select @sql_cmd='dir '+@filename
EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
IF (@proc_result<>0) /*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
begin
select @flag='not exist' /*備份文件不存在*/
return /*退出過程*/
end
/*創建臨時表,保存由備份集內包含的資料庫和日誌文件列表組成的結果集*/
create table #tem(
LogicalName nvarchar(128), /*文件的邏輯名稱*/
PhysicalName nvarchar(260) , /*文件的物理名稱或操作系統名稱*/
Type char(1), /*數據文件 (D) 或日誌文件 (L)*/
FileGroupName nvarchar(128), /*包含文件的文件組名稱*/
[Size] numeric(20,0), /*當前大小(以位元組為單位)*/
[MaxSize] numeric(20,0) /*允許的最大大小(以位元組為單位)*/
)
/*
創建表變數,表結構與臨時表基本一樣
就是多了兩列,
列ids(自增編號列),
列file_path,存放文件的路徑
*/
declare @tem table(
ids smallint identity, /*自增編號列*/
LogicalName nvarchar(128),
PhysicalName nvarchar(260),
File_path nvarchar(260),
Type char(1),
FileGroupName nvarchar(128)
)
insert into #tem
execute('restore filelistonly from disk='''+@filename+'''')
/*將臨時表導入表變數中,並且計算出相應得路徑*/
insert into @tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)
select LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
from #tem
if @@rowcount>0
begin
drop table #tem
end
select @loop_time=1
select @max_ids=max(ids) /*@tem表的ids列最大數*/
from @tem
while @loop_time<=@max_ids
begin
select @file_bak_path=file_path
from @tem where ids=@loop_time
select @sql_cmd='dir '+@file_bak_path
EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
/*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
IF (@proc_result<>0)
select @loop_time=@loop_time+1
else
BREAK /*沒有找到備份前數據文件原有存放路徑,退出循環*/
end
select @master_path=''
if @loop_time>@max_ids
select @flag_file=1 /*備份前數據文件原有存放路徑存在*/
else
begin
select @flag_file=0 /*備份前數據文件原有存放路徑不存在*/
select @master_path=dbo.fn_GetFilePath(filename)
from master..sysdatabases
where name='master'
end
select @sql_sub=''
/*type='d'是數據文件,type='l'是日誌文件 */
/*@flag_file=1時新的資料庫文件還是存放在原來路徑,否則存放路徑和master資料庫路徑一樣*/
select @sql_sub=@sql_sub+'move '''+LogicalName+''' to '''
+case type
when 'd' then case @flag_file
when 1 then File_path
else @master_path
end
when 'l' then case @flag_file
when 1 then File_path
else @master_path
end
end
+case type
when 'd' then @restore_db_name
+'_DATA'
+convert(sysname,ids) /*給文件編號*/
+'.'
+right(PhysicalName,3) /*給文件加入後綴名,mdf or ndf*/
+''','
when 'l' then @restore_db_name
+'_LOG'
+convert(sysname,ids) /*給文件編號*/
+'.'
+right(PhysicalName,3) /*給文件加入後綴名,mdf or ndf*/
+''','
end
from @tem
select @sql='RESTORE DATABASE @db_name FROM DISK=@filename with '
select @sql=@sql+@sql_sub+'replace'
select @par='@db_name nvarchar(128),@filename nvarchar(260)'
/*關閉相關進程,把相應進程狀況導入臨時表中*/
select identity(int,1,1) ids, spid
into #temp
from master..sysprocesses
where dbid=db_id(@restore_db_name)
if @@rowcount>0 --找到相應進程
begin
select @max_ids=max(ids)
from #temp
select @loop_time=1
while @loop_time<=@max_ids
begin
select @sql_kill='kill '+convert(nvarchar(20),spid)
from #temp
where ids=@loop_time
execute sp_executesql @sql_kill
select @loop_time=@loop_time+1
end
end
drop table #temp
execute sp_executesql @sql,@par,@db_name=@restore_db_name,@filename=@filename
select @flag='ok' /*操作成功*/
end
else
begin
SELECT @flag='file type error' /*參數@filename輸入格式錯誤*/
end
GO
--run
--備份資料庫test_database
declare @fl varchar(10)
execute pr_backup_db @fl out,'test_database','c:\test_database.bak'
select @fl
--恢復資料庫,輸入的參數錯誤
declare @fl varchar(20)
exec pr_restore_db @fl out,'sa','c:\'
select @fl
--恢復資料庫,即創建資料庫test_database的復本test_db
declare @fl varchar(20)
exec pr_restore_db @fl out,'test_db','c:\test_database.bak'
select @fl
以上過程和函數在MS SQL2000運行成功,由於MS SQL7不支持用戶自定義函數和表變數,要在MS SQL7下使用可以把函數fn_GetFilePath改寫成過
程,把過程pr_restore_db中的表變數改寫為臨時表即可運行,有興趣的朋友可以試試!
8. sql server 怎麼備份存儲過程
轉:
利用T-SQL語句,實現資料庫的備份與還原的功能
體現了SQL Server中的四個知識點:
1. 獲取SQL Server伺服器上的默認目錄
2. 備份SQL語句的使用
3. 恢復SQL語句的使用,同時考慮了強制恢復時關閉其他用戶進程的處理
4. 作業創建SQL語句的使用
/*1.--得到資料庫的文件目錄
@dbname 指定要取得目錄的資料庫名
如果指定的數據不存在,返回安裝SQL時設置的默認數據目錄
如果指定NULL,則返回默認的SQL備份目錄名
*/
/*--調用示例
select 資料庫文件目錄=dbo.f_getdbpath('tempdb')
,[默認SQL SERVER數據目錄]=dbo.f_getdbpath('')
,[默認SQL SERVER備份目錄]=dbo.f_getdbpath(null)
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getdbpath]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_getdbpath]
GO
create function f_getdbpath(@dbname sysname)
returns nvarchar(260)
as
begin
declare @re nvarchar(260)
if @dbname is null or db_id(@dbname) is null
select @re=rtrim(reverse(filename)) from master..sysdatabases where name='master'
else
select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname
if @dbname is null
set @re=reverse(substring(@re,charindex('\',@re)+5,260))+'BACKUP'
else
set @re=reverse(substring(@re,charindex('\',@re),260))
return(@re)
end
go
/*2.--備份資料庫
*/
/*--調用示例
--備份當前資料庫
exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_db.bak'
--差異備份當前資料庫
exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_df.bak',@bktype='DF'
--備份當前資料庫日誌
exec p_backupdb @bkpath='c:\',@bkfname='db_\DATE\_log.bak',@bktype='LOG'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_backupdb]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_backupdb]
GO
create proc p_backupdb
@dbname sysname='', --要備份的資料庫名稱,不指定則備份當前資料庫
@bkpath nvarchar(260)='', --備份文件的存放目錄,不指定則使用SQL默認的備份目錄
@bkfname nvarchar(260)='', --備份文件名,文件名中可以用\DBNAME\代表資料庫名,\DATE\代表日期,\TIME\代表時間
@bktype nvarchar(10)='DB', --備份類型:'DB'備份資料庫,'DF' 差異備份,'LOG' 日誌備份
@appendfile bit=1 --追加/覆蓋備份文件
as
declare @sql varchar(8000)
if isnull(@dbname,'')='' set @dbname=db_name()
if isnull(@bkpath,'')='' set @bkpath=dbo.f_getdbpath(null)
if isnull(@bkfname,'')='' set @bkfname='\DBNAME\_\DATE\_\TIME\.BAK'
set @bkfname=replace(replace(replace(@bkfname,'\DBNAME\',@dbname)
,'\DATE\',convert(varchar,getdate(),112))
,'\TIME\',replace(convert(varchar,getdate(),108),':',''))
set @sql='backup '+case @bktype when 'LOG' then 'log ' else 'database ' end +@dbname
+' to disk='''+@bkpath+@bkfname
+''' with '+case @bktype when 'DF' then 'DIFFERENTIAL,' else '' end
+case @appendfile when 1 then 'NOINIT' else 'INIT' end
print @sql
exec(@sql)
go
/*3.--恢復資料庫
*/
/*--調用示例
--完整恢復資料庫
exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db'
--差異備份恢復
exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
exec p_backupdb @bkfile='c:\db_20031015_df.bak',@dbname='db',@retype='DF'
--日誌備份恢復
exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
exec p_backupdb @bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_RestoreDb]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_RestoreDb]
GO
create proc p_RestoreDb
@bkfile nvarchar(1000), --定義要恢復的備份文件名
@dbname sysname='', --定義恢復後的資料庫名,默認為備份的文件名
@dbpath nvarchar(260)='', --恢復後的資料庫存放目錄,不指定則為SQL的默認數據目錄
@retype nvarchar(10)='DB', --恢復類型:'DB'完事恢復資料庫,'DBNOR' 為差異恢復,日誌恢復進行完整恢復,'DF' 差異備份的恢復,'LOG' 日誌恢復
@filenumber int=1, --恢復的文件號
@overexist bit=1, --是否覆蓋已經存在的資料庫,僅@retype為
@killuser bit=1 --是否關閉用戶使用進程,僅@overexist=1時有效
as
declare @sql varchar(8000)
--得到恢復後的資料庫名
if isnull(@dbname,'')=''
select @sql=reverse(@bkfile)
,@sql=case when charindex('.',@sql)=0 then @sql
else substring(@sql,charindex('.',@sql)+1,1000) end
,@sql=case when charindex('\',@sql)=0 then @sql
else left(@sql,charindex('\',@sql)-1) end
,@dbname=reverse(@sql)
--得到恢復後的資料庫存放目錄
if isnull(@dbpath,'')='' set @dbpath=dbo.f_getdbpath('')
--生成資料庫恢復語句
set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname
+' from disk='''+@bkfile+''''
+' with file='+cast(@filenumber as varchar)
+case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end
+case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end
print @sql
--添加移動邏輯文件的處理
if @retype='DB' or @retype='DBNOR'
begin
--從備份文件中獲取邏輯文件名
declare @lfn nvarchar(128),@tp char(1),@i int
--創建臨時表,保存獲取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--從備份文件中獲取信息
insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar)
+case @tp when 'D' then '.mdf''' else '.ldf''' end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f
end
--關閉用戶進程處理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end
--恢復資料庫
exec(@sql)
go
/*4.--創建作業
*/
/*--調用示例
--每月執行的作業
exec p_createjob @jobname='mm',@sql='select * from syscolumns',@freqtype='month'
--每周執行的作業
exec p_createjob @jobname='ww',@sql='select * from syscolumns',@freqtype='week'
--每日執行的作業
exec p_createjob @jobname='a',@sql='select * from syscolumns'
--每日執行的作業,每天隔4小時重復的作業
exec p_createjob @jobname='b',@sql='select * from syscolumns',@fsinterval=4
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_createjob]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_createjob]
GO
create proc p_createjob
@jobname varchar(100), --作業名稱
@sql varchar(8000), --要執行的命令
@dbname sysname='', --默認為當前的資料庫名
@freqtype varchar(6)='day', --時間周期,month 月,week 周,day 日
@fsinterval int=1, --相對於每日的重復次數
@time int=170000 --開始執行時間,對於重復執行的作業,將從0點到23:59分
as
if isnull(@dbname,'')='' set @dbname=db_name()
--創建作業
exec msdb..sp_add_job @job_name=@jobname
--創建作業步驟
exec msdb..sp_add_jobstep @job_name=@jobname,
@step_name = '數據處理',
@subsystem = 'TSQL',
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, --重試次數
@retry_interval = 5 --重試間隔
--創建調度
declare @ftype int,@fstype int,@ffactor int
select @ftype=case @freqtype when 'day' then 4
when 'week' then 8
when 'month' then 16 end
,@fstype=case @fsinterval when 1 then 0 else 8 end
if @fsinterval<>1 set @time=0
set @ffactor=case @freqtype when 'day' then 0 else 1 end
EXEC msdb..sp_add_jobschele @job_name=@jobname,
@name = '時間安排',
@freq_type=@ftype , --每天,8 每周,16 每月
@freq_interval=1, --重復執行次數
@freq_subday_type=@fstype, --是否重復執行
@freq_subday_interval=@fsinterval, --重復周期
@freq_recurrence_factor=@ffactor,
@active_start_time=@time --下午17:00:00分執行
go
/*--應用案例--備份方案:
完整備份(每個星期天一次)+差異備份(每天備份一次)+日誌備份(每2小時備份一次)
調用上面的存儲過程來實現
--*/
declare @sql varchar(8000)
--完整備份(每個星期天一次)
set @sql='exec p_backupdb @dbname=''要備份的資料庫名'''
exec p_createjob @jobname='每周備份',@sql,@freqtype='week'
--差異備份(每天備份一次)
set @sql='exec p_backupdb @dbname=''要備份的資料庫名'',@bktype='DF''
exec p_createjob @jobname='每天差異備份',@sql,@freqtype='day'
--日誌備份(每2小時備份一次)
set @sql='exec p_backupdb @dbname=''要備份的資料庫名'',@bktype='LOG''
exec p_createjob @jobname='每2小時日誌備份',@sql,@freqtype='day',@fsinterval=2
/*--應用案例2
生產數據核心庫:PRODUCE
備份方案如下:
1.設置三個作業,分別對PRODUCE庫進行每日備份,每周備份,每月備份
2.新建三個新庫,分別命名為:每日備份,每周備份,每月備份
3.建立三個作業,分別把三個備份庫還原到以上的三個新庫。
目的:當用戶在proce庫中有任何的數據丟失時,均可以從上面的三個備份庫中導入相應的TABLE數據。
--*/
declare @sql varchar(8000)
--1.建立每月備份和生成月備份資料庫的作業,每月每1天下午16:40分進行:
set @sql='
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_m.bak''
set @path=dbo.f_getdbpath(null)+@fname
--備份
exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname
--根據備份生成每月新庫
exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_月''
--為周資料庫恢復准備基礎資料庫
exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DBNOR''
--為日資料庫恢復准備基礎資料庫
exec p_RestoreDb @bkfile=@path,@dbname=''PRODUCE_日'',@retype=''DBNOR''
'
exec p_createjob @jobname='每月備份',@sql,@freqtype='month',@time=164000
--2.建立每周差異備份和生成周備份資料庫的作業,每周日下午17:00分進行:
set @sql='
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_w.bak''
set @path=dbo.f_getdbpath(null)+@fname
--差異備份
exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname,@bktype=''DF''
--差異恢復周資料庫
exec p_backupdb @bkfile=@path,@dbname=''PRODUCE_周'',@retype=''DF''
'
exec p_createjob @jobname='每周差異備份',@sql,@freqtype='week',@time=170000
--3.建立每日日誌備份和生成日備份資料庫的作業,每周日下午17:15分進行:
set @sql='
declare @path nvarchar(260),@fname nvarchar(100)
set @fname=''PRODUCE_''+convert(varchar(10),getdate(),112)+''_l.bak''
set @path=dbo.f_getdbpath(null)+@fname
--日誌備份
exec p_backupdb @dbname=''PRODUCE'',@bkfname=@fname,@bktype=''LOG''
--日誌恢復日資料庫
exec p_backupdb @bkfile=@path,@dbname=''PRODUCE_日'',@retype=''LOG''
'
exec p_createjob @jobname='每周差異備份',@sql,@freqtype='day',@time=171500
9. 請教各位大神,VB中怎樣備份正在使用中的Access資料庫
當資料庫打開時是不允許用file ,如果你想可以用
Private Declare Function SHFileOperation Lib "shell32.dll " Alias "SHFileOperationA " (lpFileOp As SHFILEOPSTRUCT) As Long
還有一個API函數可以達到這個要求,好像是下面的函數:
Public Declare Function CopyFile Lib "kernel32 " Alias "CopyFileA " (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
可以拷貝已經打開的資料庫文件。
10. 跪求vb+access資料庫的備份代碼及步驟
這是我的資料庫備份文件 可以參考一下
<!--#include file="session1.asp"-->
<%
DvaspDataname=request("DvaspDataname")
DvaspDatanameNew=request("DvaspDatanameNew")
Action=trim(request("Action"))
mdb="database_name.asp"
Bkmdb="databackup_name.asp"
%>
<html>
<head>
<title>管理中心</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<div align="center">
<%
select case Action
case "Rename" '數劇庫更名
call DataRename()
case "Backup" '備份數劇庫
call DataBackup()
case "Restore" '資料庫恢復
call DataRestore()
case "Compress" '資料庫壓縮
call DataCompress()
case else
call main()
end select
if FoundErr=True then
call Error_Msg(ErrMsg)
end if
sub DataRename() '###數劇庫更名
Founderr=False
if DvaspDatanameNew="" then
FoundErr=True
ErrMsg=ErrMsg+"<li>數劇庫名稱不能為空!</li>"
end if
if DvaspDataname=DvaspDatanameNew then
FoundErr=True
ErrMsg=ErrMsg+"<li>數劇庫名稱沒有改呢!!</li>"
end if
if FoundErr=True then
call Error_Msg(ErrMsg)
response.end
end if
if founderr=false then
Set fs=Server.CreateObject("Scripting.FileSystemObject")
fs.CopyFile Server.MapPath("..\database\"&DvaspDataname&""),Server.MapPath("..\database\"&DvaspDatanameNew&"")
Set TS1 = fs.CreateTextFile(Server.MapPath(""&mdb&""), True)
TS1.write "<"&chr(37)&"Dataname="&chr(34)&DvaspDatanameNew&chr(34)&chr(37)&">"
Set TS1 = Nothing
fs.DeleteFile Server.MapPath("..\database\"&DvaspDataname&""),True
Set fs=nothing
call Succeed_Msg("已經成功將資料庫文件名<font color=red>"&DvaspDataname&"</font>改為<font color=red>"&DvaspDatanameNew&"</font>!")
end if
end sub
sub DataRestore() '###資料庫恢復
dim backpath
Dbpath=request.form("Dbpath")
backpath=request.form("backpath")
if dbpath="" then
ErrMsg=ErrMsg+ "請輸入您要恢復成的資料庫全名"
call Error_Msg(ErrMsg)
response.end
else
Dbpath=server.mappath(Dbpath)
end if
backpath=server.mappath(backpath)
Set Fso=server.createobject("scripting.filesystemobject")
if fso.fileexists(dbpath) then
fso.file Dbpath,Backpath
call Succeed_Msg( "成功恢復數據!")
else
ErrMsg=ErrMsg+ "備份目錄下並無您的備份文件!"
call Error_Msg(ErrMsg)
response.end
end if
end sub
sub DataCompress() '###資料庫壓縮
dim dbpath,boolIs97
dbpath = request("dbpath")
boolIs97 = request("boolIs97")
If dbpath <> "" Then
dbpath = server.mappath(dbpath)
response.write(CompactDB(dbpath,boolIs97))
end if
end sub
'=====================壓縮參數=========================
Function CompactDB(dbPath, boolIs97)
Dim fso, Engine, strDBPath,JET_3X
strDBPath = left(dbPath,instrrev(DBPath,"\"))
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(dbPath) Then
Set Engine = CreateObject("JRO.JetEngine")
If boolIs97 = "True" Then
Engine.Compactdatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath, _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath & "temp.mdb;" _
& "Jet OLEDB:Engine Type=" & JET_3X
Else
Engine.Compactdatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbpath, _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath & "temp.mdb"
End If
fso.CopyFile strDBPath & "temp.mdb",dbpath
fso.DeleteFile(strDBPath & "temp.mdb")
Set fso = nothing
Set Engine = nothing
call Succeed_Msg("你的資料庫, " & dbpath & ", 已經壓縮成功!" )
Else
ErrMsg = ErrMsg+ "資料庫名稱或路徑不正確. 請重試!" & vbCrLf
call Error_Msg(ErrMsg)
End If
End Function
sub main()
ErrMsg=ErrMsg+ "數劇庫操作錯誤!"
call Error_Msg(ErrMsg)
response.end
end sub
sub DataBackup() '###備份數劇庫
Dbpath=request.form("Dbpath")
Dbpath=server.mappath(Dbpath)
bkfolder=request.form("bkfolder")
bkdbname=request.form("bkdbname")
Set Fso=server.createobject("scripting.filesystemobject")
if fso.fileexists(dbpath) then
If CheckDir(bkfolder) = True Then
fso.file dbpath,bkfolder& "\"& bkdbname
Set TS1 = fso.CreateTextFile(Server.MapPath(""&Bkmdb&""), True)
TS1.write "<"&chr(37)&"BackupName="&chr(34)&bkDBname&chr(34)&chr(37)&">"
Set TS1 = Nothing
else
MakeNewsDir bkfolder
fso.file dbpath,bkfolder& "\"& bkdbname
Set TS1 = fso.CreateTextFile(Server.MapPath(""&Bkmdb&""), True)
TS1.write "<"&chr(37)&"BackupName="&chr(34)&bkDBname&chr(34)&chr(37)&">"
Set TS1 = Nothing
end if
call Succeed_Msg( "<li>備份資料庫成功,您備份的資料庫路徑為" &bkfolder& "\"& bkdbname)
else
ErrMsg=ErrMsg+"<li>沒有找到備份目錄!</li>"
call Error_Msg(ErrMsg)
response.end
end if
end sub
'------------------檢查某一目錄是否存在-------------------
Function CheckDir(FolderPath)
folderpath=Server.MapPath(".")&"\"&folderpath
Set fso1 = CreateObject("Scripting.FileSystemObject")
If fso1.FolderExists(FolderPath) then
'存在
CheckDir = True
Else
'不存在
CheckDir = False
End if
Set fso1 = nothing
End Function
'-------------根據指定名稱生成目錄-----------------------
Function MakeNewsDir(foldername)
dim f
Set fso1 = CreateObject("Scripting.FileSystemObject")
Set f = fso1.CreateFolder(foldername)
MakeNewsDir = True
Set fso1 = nothing
End Function
dim errmsg,sucmsg
sub Error_Msg(ErrMsg)
response.write "<br><br><br><br><br><br><br><br>"& vbCrLf
response.write "<TITLE>錯誤報告! Error Information</TITLE>"& vbCrLf
response.write "<META http-equiv=Content-Type content=""text/html; charset=gb2312"">"& vbCrLf
response.write "<LINK href=""style.css"" type=text/css rel=stylesheet>"& vbCrLf
response.write "<BR><BR>"& vbCrLf
response.write " <TABLE align=center bgColor=#DEDFDE cellpadding=""2"" cellspacing=""0"" border=0 style=""border: outset 2px;width:65%;"">"& vbCrLf
response.write " <TR> "& vbCrLf
response.write " <TD height=18 style=""FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#294184', endColorStr='#A5CBF7', gradientType='1')""><b><font color=#FFFFFF>錯誤報告! Error Information</FONT></b></td>"& vbCrLf
response.write " <TD align=right bgColor=#A5CBF7><a href=javascript:window.close()><img src=""../admin/images/close2.gif"" width=""18"" height=""15"" border=0 align=""absmiddle""></a></td>"& vbCrLf
response.write " </tr>"& vbCrLf
response.write " <TR>"& vbCrLf
response.write " <TD colSpan=2>"& vbCrLf
response.write " <FIELDSET><LEGEND accessKey=F align=left>產生錯誤的可能原因:</LEGEND>"& vbCrLf
response.write " <TABLE align=center cellSpacing=2 cellPadding=2 width=""90%"" border=0>"& vbCrLf
response.write " <TR>"& vbCrLf
response.write " <TD>"&ErrMsg&"</TD>"& vbCrLf
response.write " </TD></TR>"& vbCrLf
response.write " <TR>"& vbCrLf
response.write " <TD height=25 align=middle colSpan=2><BR><INPUT onclick=javascript:history.go(-1) type=submit value="" 確 定 "" name=submit></TD></TR></TABLE></FIELDSET> "& vbCrLf
response.write " </TD></TR></TABLE></TD></TR></TABLE>"& vbCrLf
end sub
'********成功提示信息****************
sub Succeed_Msg(SucMsg)
response.write "<br><br><br><br><br><br><br><br>"& vbCrLf
response.write "<TITLE>成功信息! Success Information</TITLE>"& vbCrLf
response.write "<META http-equiv=Content-Type content=""text/html; charset=gb2312"">"& vbCrLf
response.write "<LINK href=""style.css"" type=text/css rel=stylesheet>"& vbCrLf
response.write "<BR><BR>"& vbCrLf
response.write " <TABLE align=center bgColor=#DEDFDE cellpadding=""2"" cellspacing=""0"" border=0 style=""border: outset 2px;width:65%;"">"& vbCrLf
response.write " <TR>"& vbCrLf
response.write " "& vbCrLf
response.write " <TD height=18 style=""FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#102873', endColorStr='#A5CBF7', gradientType='1')""><b><font color=#FFFFFF>成功信息! Success Information</FONT></b></td>"& vbCrLf
response.write " <TD align=right bgColor=#A5CBF7><a href=javascript:window.close()><img src=""../admin/images/close2.gif"" width=""18"" height=""15"" border=0 align=""absmiddle""></a></td>"& vbCrLf
response.write " </tr>"& vbCrLf
response.write " <TR>"& vbCrLf
response.write " <TD colSpan=2>"& vbCrLf
response.write " <FIELDSET><LEGEND accessKey=F align=left>操作成功!</LEGEND>"& vbCrLf
response.write " <TABLE align=center cellSpacing=2 cellPadding=2 width=""90%"" border=0>"& vbCrLf
response.write " <TR>"& vbCrLf
response.write " <TD>"&SucMsg&"</TD>"& vbCrLf
response.write " </TD></TR>"& vbCrLf
response.write " <TR>"& vbCrLf
response.write " <TD height=25 align=middle colSpan=2><BR><INPUT onclick=javascript:location.href='"&Request.ServerVariables("HTTP_REFERER")&"' type=submit value="" 確 定 "" name=submit></TD></TR></TABLE></FIELDSET> "& vbCrLf
response.write " </TD></TR></TABLE></TD></TR></TABLE><BR><BR>"& vbCrLf
end sub
%>
</div>
<!--#include file="right.asp"-->
</body>
</html>