数据库备份与还原

来源:互联网 发布:java redis缓存list 编辑:程序博客网 时间:2024/05/02 05:54

      在开发和数据库有关的应用程序的时候,很多时候我们做的操作就是和数据库打交道,而用户最关心的也是数据,而一旦数据库出现故障,我们事先又没有做任何的预防措施,带来的将会是灾难性的错误。虽然数据库本身提供备份和还原的功能,也可设置定期备份数据库的操作,但是很多时候用户并不知道怎样操作,特别是还原。所以如果我们设计程序的时候,把数据库的备份与还原放入到程序中,这将会为你的程序加分。

      题外话:当我们把数据库还原的功能放入程序中的时候,特别要注意的是权限的控制。要不然都来还原数据库,一旦出现问题,带来的也是灾难性的错误。很多时候,我们的程序出现了一些错误,只要通过修改数据就可以改正这个错误,如果客户又不懂数据库的操作,这就需要我们到现场去处理,如果客户现场很远,来去都要耗费时间,如果我们能在程序中提供一个执行数据库操作语句的功能界面,只需把数据库操作语句发给客户,然客户自己在程序中执行,既方便又快捷。

      数据库的备份和还原实际上还是执行数据库操作语句,所以并没有什么难点。

      数据库备份:

        //strFile:数据库备份路径及文件名

        //strDataBaseName:数据库名

        private void BackUpSQLServer(string strFile,string strDataBaseName)
        {
            string strConnectstring = "Server=.;Database=Master;User ID=sa;Password=sa;";
            SqlConnection conn = new SqlConnection(strConnectstring);

            SqlCommand cmdBK = new SqlCommand();
            cmdBK.CommandType = CommandType.Text;
            cmdBK.Connection = conn;
            cmdBK.CommandText = @"backup database " + strDataBaseName+ " to disk='" + strFile+ "' with init";

            try
            {
                conn.Open();
                cmdBK.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }

     数据库还原比较麻烦一点,首先要找到待还原的数据库的各个使用进程,关闭后才可以还原。

       //strFile:数据库还原路径及文件名

        //strDataBaseName:数据库名

       private void RestoreSQLServer(string strFile,string strDataBaseName)
        {
            string strConnectstring = "Server=.;Database=Master;User ID=sa;Password=sa;";
            SqlConnection conn = new SqlConnection(strConnectstring);
            conn.Open();

            //KILL DataBase Process
            SqlCommand cmd = new SqlCommand("SELECT spid FROM dbo.sysprocesses ,dbo.sysdatabases WHERE dbo.sysprocesses.dbid=dbo.sysdatabases.dbid AND dbo.sysdatabases.Name='" + strDataBaseName+ "'", conn);
            SqlDataReader dr;
            dr = cmd.ExecuteReader();
            ArrayList list = new ArrayList();
            while (dr.Read())
            {
                list.Add(dr.GetInt16(0));
            }
            dr.Close();
            for (int i = 0; i < list.Count; i++)
            {
                cmd = new SqlCommand(string.Format("KILL {0}", list[i]), conn);
                cmd.ExecuteNonQuery();
            }

            SqlCommand cmdRT = new SqlCommand();
            cmdRT.CommandType = CommandType.Text;
            cmdRT.Connection = conn;
            cmdRT.CommandText = @"restore database " +strDataBaseName + "  from disk='" + strFile+ "'";

            try
            {
                cmdRT.ExecuteNonQuery();
            
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }

       无论是备份还是还原数据库我们操作的都是Master数据库。

       以上说的是SQL Server的备份和还原,Oracle数据库的备份和还原比较简单,主要是在进程里面执行exp和imp的命令

       数据库备份:string strexp = "exp 数据库用户名/密码@数据库TNS full=y log=  '日志文件路径 ' file= '备份文件路径 '" 
       数据库还原:string stremp = "imp 数据库用户名/密码@数据库TNS full=y file= '还原文件路径 '"

       .Net里面开启进程的一般过程:

           ProcessStartInfo psi = new ProcessStartInfo("cmd");
            Process p = Process.Start(psi);
            p.StandardInput.WriteLine(strexp);
            p.StandardInput.WriteLine(@"exit");

 

原创粉丝点击