sql2005数据库备份与还原

由于软件的需要,组长让我做个数据库备份和还原,刚开始我是备份到软件根目录E:\oms\Web\App_Data下的,后来组长说要根据年月来建文件夹,把备份的数据库文件放到建的文件夹里。就这么小的一点建议,搞得我弄了半天。

现在我把相关代码写在这儿,以备以后再用

数据库备份的存储过程:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE  PROCEDURE [dbo].[databaseBack]
 @backId UNIQUEIDENTIFIER,
 @strPath NVARCHAR(200)
AS

BEGIN

DECLARE @strPaths NVARCHAR(200)

set @strPaths = convert(NVARCHAR(19),getdate(),120)

set @strPaths = REPLACE(@strPaths, ':' , '.')
set @strPaths = REPLACE(@strPaths, ' ' , '.')

set @strPaths = @strPath+'/'+@strPaths + '.bak'

BACKUP DATABASE [oms] TO DISK = @strPaths WITH NOINIT , NOUNLOAD , NOSKIP , STATS = 10, NOFORMAT

EN

表示层后台代码:

  //获取软件的根目录
        string actualServerPath = Server.MapPath(Request.Path);
        int pathindex = actualServerPath.LastIndexOf("\\");
        string path = actualServerPath.Substring(0, pathindex);   

        path += "\\";


        //在软件的根目录下建文件夹
        DateTime time = DateTime.Now;
        string paths = "DataBase/" + time.Year.ToString();

        if (!Directory.Exists(Server.MapPath(paths)))
        {
            Directory.CreateDirectory(Server.MapPath(paths));
        }

        paths += "/" + time.Month.ToString();
        if (!Directory.Exists(Server.MapPath(paths)))
        {
            Directory.CreateDirectory(Server.MapPath(paths));
        } 

          //由于程序中的根目录和建的文件夹路径中的斜杠不一样,所以需要转换(这点特别要注意了)

        path += paths.Replace('/','\\');

        然后直接调用存储过程就ok了。

 

备份要注意的问题:

1、要备份的数据库必须和软件在同一台机器上

2、备份的文件必须加后缀名:.bak

3、软件的根目录和建的文件夹路径中的斜杠要转换一致

 

数据库恢复的表示层后台代码:

//backConnection是web.config中的连接字符串名
        Database db = DatabaseFactory.CreateDatabase("backConnection");
        string sql = "select spid from master..sysprocesses where dbid=db_id(@dbname)";
        DbCommand cmd = db.GetSqlStringCommand(sql);
        db.AddInParameter(cmd, "@dbname", DbType.String, "oms");
        IDataReader dr = db.ExecuteReader(cmd);
        List<string> process = new List<string>();
        try
        {
            while (dr.Read())
            {
                process.Add(dr[0].ToString().Trim());
            }
        }
        catch
        { }
        dr.Close();
        cmd.Parameters.Clear();

//杀死进程
        foreach (string s in process)
        {
            db.ExecuteNonQuery(CommandType.Text, "exec('kill " + s + "') ");
        }

//恢复sql语句

        sql = "restore database oms from disk=@path WITH REPLACE";
        cmd = db.GetSqlStringCommand(sql);

//path是要恢复的文件路径
        db.AddInParameter(cmd, "@path", DbType.String, path);
        db.ExecuteNonQuery(cmd);
        cmd.Connection.Close();
        cmd.Parameters.Clear();
        cmd.Dispose();
        Response.Write("<script>alert('恢复成功!')</script>");

 

恢复数据库要注意的问题:

1、要恢复的数据库跟正在运行的软件所连接的数据库不能是同一个

2、恢复数据库用master系统数据库强制杀死软件正在运行的数据库进程

posted @ 2011-01-16 09:56  awp110  阅读(352)  评论(1编辑  收藏  举报