关于 SQL Server 数据库批量备份与还原的一些 Tips
一、前提
最近需要将服务器 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的更多相关文章
- 用分离、附加的方式实现sql server数据库的备份和还原
一.数据库分离.附加的说明 SQL Server提供了"分离/附加"数据库."备份/还原"数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用 ...
- 数据库开发基础 SQL Server 数据库的备份、还原与分离、附加
认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是 一.在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点 二. ...
- 第一章、关于SQL Server数据库的备份和还原(sp_addumpdevice、backup、Restore)
在sql server数据库中,备份和还原都只能在服务器上进行,备份的数据文件在服务器上,还原的数据文件也只能在服务器上,当在非服务器的机器上启动sql server客户端的时候,也可以通过该客户端来 ...
- C#对SQL Server数据库的备份与还原
备份数据库: string connectionString = "server=服务器名称;database=数据库名;uid=登入名;pwd=登入密码"; // ...
- [数据库]Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员”
在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...
- Sql server 数据库的备份和还原数据库提示“ 加载的介质已格式化为支持 1 个介质簇,但根据指定的备份设备,应支持 2 个介质簇”
数据库备份和还原总结 在 "M:\2017-Pro\company\other\databak_2014-10\anquanbaowei_db_201704300200.BAK" ...
- 项目经验——Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员” .
在对数据库备份与还原的过程中,我遇到一个问题“介质集有2个介质簇,但只提供了1个.必须提供所有成员”,下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两 ...
- SQL Server数据库脚本备份与还原
use[master]go /*完整--备份* backup 备份 * disk='E:\USERDB.bak' 磁盘,备份文件存放的路径* name='user' 备份显示的文件名称,可随意修改* ...
- sql server 数据库代码备份及还原代码
--备份 BACKUP DATABASE [库名称] TO DISK='E:\qq\ddd.bak' --备份并覆盖 BACKUP DATABASE [库名称] TO DISK='E:\qq\ddd. ...
随机推荐
- CentOs 后台运行jar
1.启动jar包,后台运行 nohup java -jar xxxx.jar & 2.结束运行 查出正在运行的进程 ps -ef | grep java 杀掉进程 kill pid 上面橙色字 ...
- cf 506 A. Mr. Kitayuta, the Treasure Hunter
不知道这个sb题怎么做错了.. /*#include <bits/stdc++.h> #define LL long long using namespace std; inline in ...
- Oracle SQL 异常处理
今天学了异常处理 有预定义异常 与 用户自定义异常 还有 raise_application_error()函数raise_application_error() 只能把异常抛出而不能处理异常. 预定 ...
- redis以服务模式开机启动
第一步 修改redis为后台启动 vim /usr/redis/redis.conf #路径根据实际情况决定 # By default Redis does not run as a daemon. ...
- Ajax学习系列——向服务器发送请求
1.如何发送请求? 如果需要向服务器发送请求,我们使用的是XMLHttpRequest对象中的open()和send()方法. var xhr = new XMLHttpRequest();//具体创 ...
- java流程控制语句要点
java流程控制语句要点 一.java7增强后的switch switch语句后面的控制表达式的数据类型只能是byte.short.char.int四种整数类型,不能是boolean类型,java7以 ...
- 【收藏】收集的各种Python爬虫、暗网爬虫、豆瓣爬虫、抖音爬虫 Github1万+星
收集的各种Python爬虫.暗网爬虫.豆瓣爬虫 Github 1万+星 磁力搜索网站2020/01/07更新 https://www.cnblogs.com/cilisousuo/p/1209954 ...
- 六十五、SAP中通过BREAK-POINT下断点,进行调试
一.代码如下,有2个断点的按钮,可以可以写入BREAK-POINT人工断点 二.运行之后,程序会被断下来, 四个执行按钮,意思分别为:单步进入子程序,单步不进入子程序,返回外面,执行到断点处 三.我们 ...
- 五十、在SAP程序中应用其他单元,INCLUDE的用法
一.在SAP程序中写入以下代码 二.双击引用的单元,会弹出以下窗口 三.点击是 四.点击保存 五.保存在本地 六.此文件被包含进来 七.我们把在GET_DATA和SHOW_DATA写到INCLUDE里 ...
- 162-PHP 文本替换函数str_replace(三)
<?php $str='Hello world!'; //定义源字符串 $search=array('o','l','w'); //定义将被替换的字符数组 $replace='O'; //定义替 ...