周期性备份数据库代码(保留原来备份的): --备份文件名为:原数据库名称+'_'+备份日期.bak IF OBJECT_ID('sp_backupdatabase') IS NOT NULL DROP PROC sp_backupdatabase GO CREATE PROC sp_backupdatabase @path NVARCHAR(100)--路径 AS --路径名格式标准化 IF RIGHT(@path,1)<>'\' SET @path=@path+'\' --获取文件夹信息 DECLARE @t TABLE(id INT IDENTITY,a INT,b INT,c INT) DECLARE @fpath NVARCHAR(3) SET @fpath=LEFT(@path,3) INSERT @t EXEC master..xp_fileexist @fpath INSERT @t EXEC master..xp_fileexist @path --如果指定盘符有误不存在,则返回错误提示: IF EXISTS(SELECT 1 FROM @t WHERE id=1 AND c=0) BEGIN RAISERROR(N'输入的盘符不存在,请重新输入!',16,1) RETURN END --如果不存在指定的文件夹,则创建: ELSE IF EXISTS(SELECT 1 FROM @t WHERE b=0 AND id=2) BEGIN DECLARE @mddir NVARCHAR(100) SET @mddir='md '+@path EXEC master..xp_cmdshell @mddir END --开始备份数据库到指定的目录 DECLARE @s nvarchar(4000) SELECT @s=ISNULL(@s+';','') +N'BACKUP database ['+name+'] TO DISK = ''' +@path+name+'_'+CONVERT(NVARCHAR(8),getdate(),112)+N'.bak''' FROM master..sysdatabases WHERE name NOT IN('master','tempdb','model','msdb','pubs')--这里筛选不参加备份的数据库 EXEC(@S) GO --调用方法: EXEC sp_backupdatabase 'f:\Backup\tony'
问题描述错误 重新更正服务器上有两个一样结构的库 例如 live test 现在要利用live备份文件目录下最新的备份文件来还原 test 利用代理实现每天定时还原
restore database test from disk='d:\data\live' with replace -- 路径自己改
就是路径的问题 live 产生的备份文件都是留存的 所以怎么从目录中提取最新那一份 做为还原的数据源呢?
目录怎么设置的,总不可能都在一个路径下,所有的live文件名也一样吧
[Quote=引用 10 楼 wxf163 的回复:] 你是要备份还是要还原呢?我要的是还原
--创建表filesUSE test go-- 存储过程FillfilesPro的定义 CREATE PROCEDURE FillfilesPro @path nvarchar(200) AS CREATE TABLE files ( id int identity(1,1) PRIMARY KEY, -- 主键 ptime smalldatetime, -- 创建时间 FullFileName nvarchar(200) UNIQUE, -- 路径 FileNam nvarchar(100), -- 文件名 Extension nvarchar(8), -- 扩展名);
DECLARE @tmpFileName2 TABLE --定义表变量(临时)含计算列 ( FullFileName nvarchar(200), FileNam AS RIGHT(FullFileName,CHARINDEX(' ',REVERSE(FullFileName))), Extension AS RIGHT(FullFileName,LEN(FullFileName)-CHARINDEX(N'.',FullFileName,1)), ptime As LEFT(FullFileName,CHARINDEX(' ',FullFileName)+6) ); DECLARE @tmpFileName TABLE -- 定义表变量(临时) ( FullFileName nvarchar(200), FileNam nvarchar(200), Extension nvarchar(200), ptime nvarchar(200) ); INSERT INTO @tmpFileName2 EXEC('xp_cmdshell ''dir '+@path+'\*.*'''); --执行命令dir将结果插入到临时表@tmpFileName INSERT INTO @tmpFileName select * from @tmpFileName2 DELETE FROM @tmpFileName WHERE FullFileName is NULL; -- 过滤 DELETE FROM @tmpFileName WHERE FileNam NOT LIKE '%.bak' -- 过滤 UPDATE @tmpFileName SET FullFileName = @path+'\'+LTRIM(FileNam) -- 在FullFileName中形成完成路径 BEGIN TRANSACTION INSERT INTO files(FullFileName,FileNam,Extension,ptime) -- 将临时表记录插入到表files SELECT FullFileName,FileNam,Extension,ptime FROM @tmpFileName; exec FillfilesPro @path='e:\backup_test'; --测试提取备份文件路径 use test go CREATE PROCEDURE OutFullfilename @f_path nvarchar(200) output AS select @f_path=FullFileName from files where ptime = (select MIN(ptime) from files)
--备份文件名为:原数据库名称+'_'+备份日期.bak
IF OBJECT_ID('sp_backupdatabase') IS NOT NULL
DROP PROC sp_backupdatabase
GO
CREATE PROC sp_backupdatabase
@path NVARCHAR(100)--路径
AS
--路径名格式标准化
IF RIGHT(@path,1)<>'\' SET @path=@path+'\'
--获取文件夹信息
DECLARE @t TABLE(id INT IDENTITY,a INT,b INT,c INT)
DECLARE @fpath NVARCHAR(3)
SET @fpath=LEFT(@path,3)
INSERT @t EXEC master..xp_fileexist @fpath
INSERT @t EXEC master..xp_fileexist @path
--如果指定盘符有误不存在,则返回错误提示:
IF EXISTS(SELECT 1 FROM @t WHERE id=1 AND c=0)
BEGIN
RAISERROR(N'输入的盘符不存在,请重新输入!',16,1)
RETURN
END
--如果不存在指定的文件夹,则创建:
ELSE IF EXISTS(SELECT 1 FROM @t WHERE b=0 AND id=2)
BEGIN
DECLARE @mddir NVARCHAR(100)
SET @mddir='md '+@path
EXEC master..xp_cmdshell @mddir
END
--开始备份数据库到指定的目录
DECLARE @s nvarchar(4000)
SELECT @s=ISNULL(@s+';','')
+N'BACKUP database ['+name+'] TO DISK = '''
+@path+name+'_'+CONVERT(NVARCHAR(8),getdate(),112)+N'.bak'''
FROM master..sysdatabases
WHERE name NOT IN('master','tempdb','model','msdb','pubs')--这里筛选不参加备份的数据库
EXEC(@S)
GO
--调用方法:
EXEC sp_backupdatabase 'f:\Backup\tony'
现在要利用live备份文件目录下最新的备份文件来还原 test 利用代理实现每天定时还原
restore database test from disk='d:\data\live' with replace -- 路径自己改
你是要备份还是要还原呢?我要的是还原
go-- 存储过程FillfilesPro的定义
CREATE PROCEDURE FillfilesPro
@path nvarchar(200)
AS CREATE TABLE files
(
id int identity(1,1) PRIMARY KEY, -- 主键
ptime smalldatetime, -- 创建时间
FullFileName nvarchar(200) UNIQUE, -- 路径
FileNam nvarchar(100), -- 文件名
Extension nvarchar(8), -- 扩展名);
DECLARE @tmpFileName2 TABLE --定义表变量(临时)含计算列
(
FullFileName nvarchar(200),
FileNam AS RIGHT(FullFileName,CHARINDEX(' ',REVERSE(FullFileName))),
Extension AS RIGHT(FullFileName,LEN(FullFileName)-CHARINDEX(N'.',FullFileName,1)),
ptime As LEFT(FullFileName,CHARINDEX(' ',FullFileName)+6)
);
DECLARE @tmpFileName TABLE -- 定义表变量(临时)
(
FullFileName nvarchar(200),
FileNam nvarchar(200),
Extension nvarchar(200),
ptime nvarchar(200)
);
INSERT INTO @tmpFileName2 EXEC('xp_cmdshell ''dir '+@path+'\*.*'''); --执行命令dir将结果插入到临时表@tmpFileName
INSERT INTO @tmpFileName
select * from @tmpFileName2
DELETE FROM @tmpFileName WHERE FullFileName is NULL; -- 过滤
DELETE FROM @tmpFileName WHERE FileNam NOT LIKE '%.bak' -- 过滤
UPDATE @tmpFileName SET FullFileName = @path+'\'+LTRIM(FileNam) -- 在FullFileName中形成完成路径
BEGIN TRANSACTION
INSERT INTO files(FullFileName,FileNam,Extension,ptime) -- 将临时表记录插入到表files
SELECT FullFileName,FileNam,Extension,ptime FROM @tmpFileName;
exec FillfilesPro @path='e:\backup_test';
--测试提取备份文件路径
use test
go CREATE PROCEDURE OutFullfilename
@f_path nvarchar(200) output
AS
select @f_path=FullFileName
from files
where ptime = (select MIN(ptime) from files)
declare @f_path1 nvarchar(200);
exec OutFullfilename @f_path1 output;
select @f_path1;--到这我就就把文件路径提取了 不过是从表里出来的 下面还原的时候……disk='……' 这里路径能引用 上面通过存储过程放到变量里的字段信息么
-----------------------
exec OutFullfilename @f_path1 output;
select @f_path1;这个@f_path1 只是路径,没有文件名? 不能一起取出来吗
exec OutFullfilename @f_path1 output;
select @f_path1;
declare @s varchar(200)
set @s='
restore database test from disk='''+@f_path1+''' with replace'exec(@s)