一、前提

最近需要将服务器 A 上的数据库全部备份,并在服务器 B 上进行还原,30多个数据库一个一个地用鼠标点,先是 backup,之后时 restore……整个过程实在是太浪费时间了!于是直接写一个小工具来批量备份还原数据库,也可以结合 Windows 的任务计划来做一个自动备份,这里记录一下一些 Tips,方便自己以后查看。

二、写配置文件

首先,我将数据库连接字符串和自动备份的目录路径写在了配置文件里,方便在以后数据库连接或者存储目录变动时,直接修改配置文件里的对应值就可以了。 App.config 具体结构如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<connectionStrings>
<add name="DBConnection" connectionString="Data Source=localhost;Initial Catalog=master;User ID=sa;PassWord=123456"/>
</connectionStrings>
<appSettings>
<add key ="BackupPath" value="C:\dbbackup"/>
</appSettings>
</configuration>

其中,<connectionStrings>里配置了数据库连接,使用了 master 数据库来创建连接;<appSettings>里配置了自动备份路径。

Note:上面的连接字符串使用的是 SQL Server 身份验证,若想使用 Windows 验证,字符串如下:

<connectionStrings>
<add name="DBConnection" connectionString="Data Source=localhost;Initial Catalog=master;integrated security=true"/>
</connectionStrings>

三、读取配置文件

在 C# 里读取 App.config 文件,获取对应的 value,具体代码如下:

using System.Configuration;

//读取config文件里的配置字符串
private static string connStr = ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString; //自动备份的目录
private string autoPath = ConfigurationManager.AppSettings["BackupPath"];

四、获取当前服务器中的所有数据库名称

List<string> list_dataBases = new List<string>();
list_dataBases.Clear();
using (SqlConnection conn = new SqlConnection(connStr))
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select name from sysdatabases"; //查询所有的数据库名称
SqlDataReader dataReader = cmd.ExecuteReader();
while (dataReader.Read())
{
list_dataBases.Add(dataReader.GetString());
}
}
catch (Exception ex)
{
Console.WriteLine("无法连接服务器!\n" + ex.Message);
}
}

五、备份数据库

DirectoryInfo autoDirectoryInfo = new DirectoryInfo(autoPath);
if (!autoDirectoryInfo.Exists)
{
autoDirectoryInfo.Create();
}
foreach(string dbName in list_dataBases)
{
bool bSuccess = false;
try
{
//备份数据库
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = @"backup database " + dbName + " to disk='" + autoPath + @"\" + dbName + ".bak'";
cmd.ExecuteNonQuery();
bSuccess = true;
conn.Dispose();
}
}
catch (Exception ex)
{
Console.WriteLine("数据库:" + dbName + "备份失败!");
Console.WriteLine("Error Message: " + ex.Message);
}
finally
{
if (bSuccess)
{
Console.WriteLine("数据库:" + dbName + "备份成功!");
bSuccess = false;
}
}
}

六、还原数据库

代码跟备份功能基本一致,只需修改下 SQL 语句,将 backup 改成 restore:

cmd.CommandText = @"restore database " + dbName + " from disk='" + savePath + @"\" + dbName + ".bak'"; //savePath 是存放 bak 文件的文件夹路径

七、可能出现的问题

备份数据库时可能会报以下错误:Cannot open backup device ‘<PathFilename>’. Operating system error 3 (The system cannot find the path specified).

解决方案:

参考博客:https://sqlbackupandftp.com/blog/how-to-solve-operating-system-error-3

① win + R -> 输入:services.msc

② 找到 SQL Server 服务,双击:

③ 点击 Log On 选项卡,将 Log on as 改为:Local System account

④ 右键重启服务,再重新运行备份程序,这个时候就不会再报错了,备份完成。

Note:报错原因也有可能是当前用户缺少了对应文件夹的写入权限,可以按照参考博客里写的一步步排查。

关于 SQL Server 数据库批量备份与还原的一些 Tips的更多相关文章

  1. 用分离、附加的方式实现sql server数据库的备份和还原

    一.数据库分离.附加的说明 SQL Server提供了"分离/附加"数据库."备份/还原"数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用 ...

  2. 数据库开发基础 SQL Server 数据库的备份、还原与分离、附加

    认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是 一.在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点 二. ...

  3. 第一章、关于SQL Server数据库的备份和还原(sp_addumpdevice、backup、Restore)

    在sql server数据库中,备份和还原都只能在服务器上进行,备份的数据文件在服务器上,还原的数据文件也只能在服务器上,当在非服务器的机器上启动sql server客户端的时候,也可以通过该客户端来 ...

  4. C#对SQL Server数据库的备份与还原

    备份数据库: string connectionString = "server=服务器名称;database=数据库名;uid=登入名;pwd=登入密码";         // ...

  5. [数据库]Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员”

    在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...

  6. Sql server 数据库的备份和还原数据库提示“ 加载的介质已格式化为支持 1 个介质簇,但根据指定的备份设备,应支持 2 个介质簇”

     数据库备份和还原总结 在 "M:\2017-Pro\company\other\databak_2014-10\anquanbaowei_db_201704300200.BAK" ...

  7. 项目经验——Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员” .

    在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...

  8. SQL Server数据库脚本备份与还原

    use[master]go /*完整--备份* backup 备份 * disk='E:\USERDB.bak' 磁盘,备份文件存放的路径* name='user' 备份显示的文件名称,可随意修改* ...

  9. sql server 数据库代码备份及还原代码

    --备份 BACKUP DATABASE [库名称] TO DISK='E:\qq\ddd.bak' --备份并覆盖 BACKUP DATABASE [库名称] TO DISK='E:\qq\ddd. ...

随机推荐

  1. a标签-伪类

    a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问的链接 */ a:hover {color: #FF00FF ...

  2. linux下anaconda的安装和使用

    1.将python3设置为默认 直接执行这两个命令即可: sudo update-alternatives --install /usr/bin/python python /usr/bin/pyth ...

  3. node.js - 定义全局变量

    1,定义全局变量 app.set('name','八戒') 2,获取全局变量 app.get('name')

  4. Django——优美的Path()函数

    path( )作用:解析URL地址 path( ) 标准语法: (<>为必须的参数,[]为可选参数) path(<route>, <view>, [name=Non ...

  5. javascript中window.open()与window.location.href

    1.window.location是window对象的属性,而window.open是window对象的方法    window.location是你对当前浏览器窗口的URL地址对象的参考!      ...

  6. opencv目录(转)

    github:https://github.com/opencv/opencv OpenCV 3 的源代码文件夹: 3rdparty/: 包含第三方库,如用视频解码用的 ffmpeg.jpg.png. ...

  7. 【转载】WebDriver拾级而上·之零 WebDriver理论

    Selenium2.0 = Selenium1.0 + WebDriver(也就是说Selenium2.0合并了这两个项目)   Selenium1.0可以使用任何编程语言,但是有个先决条件就是必须支 ...

  8. HTML元素 和 CSS (9.23 第十天)

    HTML元素分类:块级元素和内联元素块级元素:标签元素会以新行开始或结束<h1><p><table>等内联元素:显示数据不会以新行开始<a><im ...

  9. mfc 选择文件(可多选)

    CFileDialog dlg( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL ); DWORD MAXFILE = ; //2562 is t ...

  10. 2. Jetson TX2--python3下编译安装opencv3.4

    https://cloud.tencent.com/developer/article/1327273 jetpack3.2自带了opencv3.3,但是只提供了python2.7的编译版本,所以也只 ...