SQL Server 数据库还原

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文 http://www.cnblogs.com/ynbt/archive/2013/04/04/2999850.html ---恢复内容开始---   对于一个优秀的应用程序来说,具有数据恢复功能尤为重要。

原文 http://www.cnblogs.com/ynbt/archive/2013/04/04/2999850.html

---恢复内容开始---

  对于一个优秀的应用程序来说,具有数据恢复功能尤为重要。因为数据恢复功能可以在数据找到破坏时,将数据恢复到系统中,保证系统重新正常运转,从而避免因数据找到异常丢失所带来的损失。本实例将演示怎样在C#中还原数据库。

  还原数据库是使用数据库的备份文件对数据库进行还原操作。由于病毒的破坏、磁盘损坏或操作失误等原因会导致数据丢失、不完整或数据错误,此时,需要对数据库进行还原,将数据还原到某一天,前提是必须存在数据备份。

  SQL Server数据库恢复支持4种类型,分别应用于不同的场合,下面进行简要介绍。

  (1)还原整个数据库的完整数据库还原。

  (2)完整数据库还原和差异数据库还原。通过使用RESTORE DATABASE语句还原差异备份。

  (3)事务日志还原。

  (4)个别文件和文件组还原。文件和文件组的还原既可以通过文件或文件组备份操作完成,也可以通过完整数据库备份操作完成。在还原文件或文件组时,必须应用事务日志。此外,文件差异备份可以在完成完整文件还原后还原。

注意:还原数据库备份将重新创建数据库和备份完成时数据库中存在的所有相关文件。但是,自创建备份文件后所做的任何数据库修改丢将丢失。若要还原创建数据库备份后所发生的事务,必须使用事务日志备份或差异备份。

本实例运用SQLDMO.Restore对象还原使用BACKUP命令所做的整个数据库备份。

RESTORE的语法格式如下:

复制代码
RESTORE DATABASE{database_name|@database_name_var} 
[FROM<backup_device>[,...n]]
[WITH
    [RESTRICTED_USER]
    [[,]FILE={file_number|@file_number}]
    [[,]PASSWORD={password|@password_variable}]
    [[,]MEDIANAME={media_name|@media_name_variable}]
    [[,]MEDIAPASSWORD={mediapassword|@mediapassword_variable}]
    [[,]MOVE 'logical_file_name' TO 'operating_system_file_name']
        [,...n]
    [[,]KEEP_REPLICATION]
    [[,]{NORECOVERY|RECOVERY|STANDBY=undo_file_name}] 
    [[,]{NOREWIND|REWIND}]
    [[,]{NOUNLOAD|UNLOAD}]
    [[,]REPLACE]
    [[,]RESTART]
    [[,]STATS[=percentage]] 
]
复制代码

  还原数据库参数及说明如下:

还原数据库参数及说明 参  数 说  明 DATABASE 指定从备份还原整个数据库。如果指定了文件盒文件组列表,则只还原那些文件和文件组 {database_name|@database_name_var} 是将日志或整个数据库还原到的数据库。如果将其作为变量(@database_name_var)提供,则可将该名称指定为字符串常量(@database_name_var=database name)或字符串数据类型(ntexttext数据类型除外)的变量 FROM

指定从中还原备份的备份设备。如果没有指定FROM子句,则不会发生备份还原,而是恢复数据库。可用省略FROM子句的办法尝试恢复通过NORECOVERY选项还原的数据库,或切换到一台备用服务器上。如果省略FROM子句,则必须指定

NORECOVERY、RECOVERY或STANDBY

 <backup_device>

 指定备份操作时要使用的逻辑或物理备份设备。可以是下列一种或多种形式。

{'logical_bakcup_device_name'|@logical_backup_device_name_var}: 是由sp_addumpdevice创建的备份设备(数据库将从该备份设备还原)的逻辑名称,该名称必须符合标识符规则。如果作为变量 (@logical_backup_device_name_var)

提供,则可以指定字符串常量(@logical_backup_device_name_var=logical_backup_device_name)或字符串数据类型(ntext或text数据类型除外)的变量作为备份设备名。

{DISK|TYPE}='physical_backup_device_name' @physical_backup_device_name_var:允许从命名磁盘或磁带设备还原备份。磁盘或磁带的设备类型应该用设备的真实名称(如 完整的路径和文件名)来指定:DISK='C:\Program Files\Microsoft

SQL Server\MSSQL\BACKUP\Mybackup.dat' 或TYPE='\\.\TAPE0'。如果指定为变量(@physical_backup_device_name_var),则设备名称可以是字符串常 量(@physical_backup_device_name_var = 'physical_backup_device_name')或字

串数据类型(ntext或text数据类型除外)的变量

   本实例主要应用还原数据库的代码如下:

string SqlStr2 = "use master restore database " + dbname + " from disk ='" + path +"'";

程序主要代码如下:

Frm_Main.cs:

View Code
复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Text;
 7 using System.Windows.Forms;
 8 using System.Linq;
 9 using System.Data.SqlClient;
10 
11 
12 namespace RevertDataBase
13 {
14     public partial class Frm_Main : Form
15     {
16         public Frm_Main()
17         {
18             InitializeComponent();
19         }
20 
21         private void Form1_Load(object sender, EventArgs e)
22         {
23             using (SqlConnection con = new SqlConnection(//创建数据库连接对象
24 @"server=.;pwd=123;uid=sa;database=master"))
25             {
26                 DataTable dt = new DataTable();//创建数据表
27                 SqlDataAdapter da = new SqlDataAdapter(//创建数据适配器
28                     "select name from sysdatabases", con);
29                 da.Fill(dt);//填充数据表
30                 this.cbox_DataBase.DataSource = dt.DefaultView;//设置数据源
31                 this.cbox_DataBase.DisplayMember = "name";//设置显示属性
32                 this.cbox_DataBase.ValueMember = "name";//设置实际值
33             }
34         }
35 
36         private void button2_Click(object sender, EventArgs e)
37         {
38             if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
39             {
40                 this.txt_Path.Text = this.openFileDialog1.FileName;//显示备份文件路径信息
41             }
42         }
43 
44         private void button1_Click(object sender, EventArgs e)
45         {
46             Restore();//还原数据库
47         }
48 
49         private void Restore()
50         {
51             string path = this.txt_Path.Text; //得到备份路径及数据库名称
52             string dbname = this.cbox_DataBase.Text;//得到将要还原的数据库名称
53             string SqlStr1 = //创建数据库连接字符串
54 @"Server=.;database='" + this.cbox_DataBase.Text + "';Uid=sa;Pwd=123";
55             string SqlStr2 =//创建SQL查询语句
56                 "use master restore database " + dbname + " from disk='" + path + "' with replace ";
57             using (SqlConnection con = new SqlConnection(SqlStr1))//创建数据库连接对象
58             {
59                 con.Open();//打开数据库连接
60                 try
61                 {
62                     SqlCommand cmd = new SqlCommand(SqlStr2, con);//创建命令对象
63                     cmd.Connection = con;//设置连接属性
64                     cmd.ExecuteNonQuery();//执行SQL命令
65                     MessageBox.Show("还原数据成功");//弹出消息对话框
66                 }
67                 catch (Exception ex)
68                 {
69                     MessageBox.Show(ex.Message,//弹出消息对话框
70                         "还原失败,请确保还原项与库对应");
71                 }
72                 finally
73                 {
74                     con.Close();//关闭数据库连接
75                 }
76             }
77         }
78     }
79 }
复制代码

Frm_Main.designer.cs:

View Code
复制代码
  1 namespace RevertDataBase
  2 {
  3     partial class Frm_Main
  4     {
  5         /// <summary>
  6         /// 必需的设计器变量。
  7         /// </summary>
  8         private System.ComponentModel.IContainer components = null;
  9 
 10         /// <summary>
 11         /// 清理所有正在使用的资源。
 12         /// </summary>
 13         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
 14         protected override void Dispose(bool disposing)
 15         {
 16             if (disposing && (components != null))
 17             {
 18                 components.Dispose();
 19             }
 20             base.Dispose(disposing);
 21         }
 22 
 23         #region Windows 窗体设计器生成的代码
 24 
 25         /// <summary>
 26         /// 设计器支持所需的方法 - 不要
 27         /// 使用代码编辑器修改此方法的内容。
 28         /// </summary>
 29         private void InitializeComponent()
 30         {
 31             this.label3 = new System.Windows.Forms.Label();
 32             this.txt_Path = new System.Windows.Forms.TextBox();
 33             this.cbox_DataBase = new System.Windows.Forms.ComboBox();
 34             this.label1 = new System.Windows.Forms.Label();
 35             this.btn_Revert = new System.Windows.Forms.Button();
 36             this.btn_path = new System.Windows.Forms.Button();
 37             this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
 38             this.SuspendLayout();
 39             // 
 40             // label3
 41             // 
 42             this.label3.AutoSize = true;
 43             this.label3.Location = new System.Drawing.Point(50, 43);
 44             this.label3.Name = "label3";
 45             this.label3.Size = new System.Drawing.Size(41, 12);
 46             this.label3.TabIndex = 10;
 47             this.label3.Text = "路径:";
 48             // 
 49             // txt_Path
 50             // 
 51             this.txt_Path.Enabled = false;
 52             this.txt_Path.Location = new System.Drawing.Point(97, 40);
 53             this.txt_Path.Name = "txt_Path";
 54             this.txt_Path.Size = new System.Drawing.Size(172, 21);
 55             this.txt_Path.TabIndex = 9;
 56             // 
 57             // cbox_DataBase
 58             // 
 59             this.cbox_DataBase.FormattingEnabled = true;
 60             this.cbox_DataBase.Location = new System.Drawing.Point(98, 15);
 61             this.cbox_DataBase.Name = "cbox_DataBase";
 62             this.cbox_DataBase.Size = new System.Drawing.Size(171, 20);
 63             this.cbox_DataBase.TabIndex = 8;
 64             // 
 65             // label1
 66             // 
 67             this.label1.AutoSize = true;
 68             this.label1.Location = new System.Drawing.Point(14, 18);
 69             this.label1.Name = "label1";
 70             this.label1.Size = new System.Drawing.Size(77, 12);
 71             this.label1.TabIndex = 7;
 72             this.label1.Text = "操作数据库:";
 73             // 
 74             // btn_Revert
 75             // 
 76             this.btn_Revert.Location = new System.Drawing.Point(194, 66);
 77             this.btn_Revert.Name = "btn_Revert";
 78             this.btn_Revert.Size = new System.Drawing.Size(75, 23);
 79             this.btn_Revert.TabIndex = 6;
 80             this.btn_Revert.Text = "恢复";
 81             this.btn_Revert.UseVisualStyleBackColor = true;
 82             this.btn_Revert.Click += new System.EventHandler(this.button1_Click);
 83             // 
 84             // btn_path
 85             // 
 86             this.btn_path.Location = new System.Drawing.Point(113, 66);
 87             this.btn_path.Name = "btn_path";
 88             this.btn_path.Size = new System.Drawing.Size(75, 23);
 89             this.btn_path.TabIndex = 11;
 90             this.btn_path.Text = "浏览";
 91             this.btn_path.UseVisualStyleBackColor = true;
 92             this.btn_path.Click += new System.EventHandler(this.button2_Click);
 93             // 
 94             // openFileDialog1
 95             // 
 96             this.openFileDialog1.FileName = "openF";
 97             this.openFileDialog1.Filter = "备份文件 (*.bak)|*.bak|所有文件 (*.*)|*.*";
 98             // 
 99             // Frm_Main
100             // 
101             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
102             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
103             this.ClientSize = new System.Drawing.Size(302, 104);
104             this.Controls.Add(this.btn_path);
105             this.Controls.Add(this.label3);
106             this.Controls.Add(this.txt_Path);
107             this.Controls.Add(this.cbox_DataBase);
108             this.Controls.Add(this.label1);
109             this.Controls.Add(this.btn_Revert);
110             this.Name = "Frm_Main";
111             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
112             this.Text = "还原SQL Server数据库";
113             this.Load += new System.EventHandler(this.Form1_Load);
114             this.ResumeLayout(false);
115             this.PerformLayout();
116 
117         }
118 
119         #endregion
120 
121         private System.Windows.Forms.Label label3;
122         private System.Windows.Forms.TextBox txt_Path;
123         private System.Windows.Forms.ComboBox cbox_DataBase;
124         private System.Windows.Forms.Label label1;
125         private System.Windows.Forms.Button btn_Revert;
126         private System.Windows.Forms.Button btn_path;
127         private System.Windows.Forms.OpenFileDialog openFileDialog1;
128     }
129 }
复制代码

源代码:http://dl.vmall.com/c0fj9eivdp

  

 

作者: Crazy大象
出处: http://www.cnblogs.com/ynbt/
关于作者:专注于.Net、WCF和移动互联网开发。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过ffy_wang@qq.com联系我,非常感谢。 。
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
78 6
|
1天前
|
SQL 关系型数据库 MySQL
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
6 0
|
2天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
2天前
|
SQL 缓存 数据库
sql 数据库优化
SQL数据库优化是一个复杂且关键的过程,涉及多个层面的技术和策略。以下是一些主要的优化建议: 查询语句优化: 避免全表扫描:在查询时,尽量使用索引来减少全表扫描,提高查询速度。 使用合适的子查询方式:子查询可能降低查询效率,但可以通过优化子查询的结构或使用连接(JOIN)替代子查询来提高性能。 简化查询语句:避免不必要的复杂查询,尽量使SQL语句简单明了。 使用EXISTS替代IN:在查询数据是否存在时,使用EXISTS通常比IN更快。 索引优化: 建立合适的索引:对于经常查询的列,如主键和外键,应创建相应的索引。同时,考虑使用覆盖索引来进一步提高性能。 避免过多的索引:虽然索引可以提高查询
|
2天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
8天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
19 0
|
9天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
9天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
35 3
|
12天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
45 0
|
5天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
35 2

热门文章

最新文章