在 sql2008中 通过sql server 代理实现每天数据库的备份,但是有一个问题 我们每天的备份文件的名字都不一样啊  
  现在卡在这了 ……

解决方案 »

  1.   

    周期性备份数据库代码(保留原来备份的):
    --备份文件名为:原数据库名称+'_'+备份日期.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'
      

  2.   

    问题描述错误 重新更正服务器上有两个一样结构的库 例如 live test 
    现在要利用live备份文件目录下最新的备份文件来还原 test 利用代理实现每天定时还原  
      
      

  3.   


    restore database test from disk='d:\data\live' with replace -- 路径自己改
      

  4.   

    就是路径的问题   live 产生的备份文件都是留存的 所以怎么从目录中提取最新那一份 做为还原的数据源呢?
      

  5.   

    目录怎么设置的,总不可能都在一个路径下,所有的live文件名也一样吧
      

  6.   

    [Quote=引用 10 楼 wxf163 的回复:]
    你是要备份还是要还原呢?我要的是还原
      

  7.   

    --创建表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)
        
      
     declare @f_path1 nvarchar(200);
     exec OutFullfilename @f_path1 output;
     select @f_path1;--到这我就就把文件路径提取了  不过是从表里出来的 下面还原的时候……disk='……' 这里路径能引用 上面通过存储过程放到变量里的字段信息么
    -----------------------
      

  8.   

    declare @f_path1 nvarchar(200);
     exec OutFullfilename @f_path1 output;
     select @f_path1;这个@f_path1 只是路径,没有文件名? 不能一起取出来吗
      

  9.   

    包括明文件名了  提取出来的是全路径包括文件名  就下面还原语句的时候怎么调用这个东东  sql语句有这个功能么  愁人啊
      

  10.   

    declare @f_path1 nvarchar(200);
     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)