一、前提

最近需要将服务器 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. PLC与单片机执行指令区别

    单片机执行指令方式与PLC执行指令方式对比 . 映射 对顺序功能图并行分支的理解.   PLC与单片机都是顺序执行指令方式的. PLC执行指令分为3个阶段. PLC的一个指令周期包括 输入采样 程序执 ...

  2. redmine处理规范

         开发: 1.       研发人员负责更新到的状态共有三个:  “进行中”. ”已解决”. ”需要反馈”. 2.       在开始修复bug的时候,把状态更新为”进行中”,把title更新 ...

  3. Redis 详解 (一) redis的简介和安装

    目录 1.Redis 的简介 2.Redis 下载 3.安装环境 4.编译安装 5.启动Redis 6.关闭Redis 7.注意事项 工作中一直在用 Redis,但是一直没有进行系统的总结,这个系列的 ...

  4. Power BI Desktop 安装环境

    Power BI Desktop 环境 最低要求 Windows 7/Windows Server 2008 R2 或更高版本 .NET 4.5 Internet Explorer 9 或更高版本 内 ...

  5. 如何下载安装python安装包

    1.从360搜索python,找到“python官网”              python官网地址:https://www.python.org/ 2.进入python官网,出现下面的页面 3.点 ...

  6. TD信息通(无课表)使用体验

    首先,在注册账户的时候,TD信息通还是比较严谨的.用户名字符数.密码字符数.邮箱格式等都有要求,我认为,这对App的长远发展来说,是很重要的一个细节.而且,在登陆之前,会有一项关于是否自动登陆的选择, ...

  7. 【Android】家庭记账本手机版开发报告三

    一.说在前面 昨天 对第一天的框架结构进行了四方面的完善 今天 对界面显示和逻辑结构进行完善 问题 无 二.界面展示完善 1.使用可回收的列表recyclerView展示账单的信息,并设置数据项为卡片 ...

  8. AD走圆弧走线

    美式键盘: “shift  +  空格”

  9. 7 ~ express ~ body-parser 模块的使用

    一,安装 : npm install body-parser 二,加载 : var bodyParser = require('body-parser') 三,配置 : https://github. ...

  10. tc: 模拟网络异常的工具

    作者:smallnest Linux Traffic Control (tc)的扩展 Network Emulation (netem)可以很方便的模拟网络不好的情况,一般新的linux内核中(> ...