作者:qixian0392_648 | 来源:互联网 | 2023-05-18 04:37
sql备份语句BACKUPDATABASE[databaseName]TODISKD:\mydb.BAK使用者注意,备份后BAK文件是放在了数据库所在机器的路径下,如
sql备份语句BACKUP DATABASE [databaseName] TO DISK ='D:\mydb.BAK'
使用者注意,备份后BAK文件是放在了数据库所在机器的路径下,如果用虚拟主机的话,你的项目是访问不到这个bak文件的。。
注意[databaseName]为你要备份的数据库。
mydb.BAK为你备份数据库生成的Bak文件
sql还原
还原语句
RESTORE DATABASE [databaseName] FROM DISK='D:\mydb.BAK' WITH REPLACE
如果你直接在数据库中新建查询调用这条语句,语句可以顺利执行。
如果是程序中,通常会出现以下错误。
数据库正在使用,所以无法获得对数据库的独占访问权
我是在.netmvc中遇到这个错误的,用的是fluentdata,fluentdata获取了你当前数据库的上下文,从而执
行一系列操作。这个时候你要还原的库是被占用的,不会进行还原。
所以当进行还原时要用 其他数据库的上下文对象,比如master
还原语句应该写成
USE master RESTORE DATABASE [databaseName] FROM DISK='D:\mydb.BAK' WITH REPLACE
当然做这些还是不够的。还要执行以下语句
USE master ALTER DATABASE [databaseName] SET OFFLINE WITH ROLLBACK IMMEDIATE
USE master ALTER database [databaseName] set online
这两个语句的意思是让你的数据库断开所有链接在重新连接,这时候就不会被其他人占用了。
WITH ROLLBACK IMMEDIATE的意思是回滚所有正在运行的错误
注意
如果你在程序中调用以上两条语句的时候,不能用你要还原数据库的上下文对象,因为offline以后就获取不
到这个对象了。所以要使用其他数据库的上下文。比如master
以fluentdata为例。建立master的上下文对象。
粘贴我的代码过来
获取上下文:
public static IDbContext QueryDB()
{
string path = ConfigurationManager.ConnectionStrings["MySqlConnection"].ConnectionString;
IDbContext db = new DbContext().ConnectionString(path, new SqlServerProvider());
return db;
}
public static IDbContext QueryDB2()
{
string path = ConfigurationManager.ConnectionStrings["MySqlConnection2"].ConnectionString;
IDbContext db = new DbContext().ConnectionString(path, new SqlServerProvider());
return db;
}
}
第一个是我当前数据库的上下文,第二个是master的
var dbMaster = DBhelper.QueryDB2();
dbMaster.Sql("ALTER DATABASE [yuanweishiyan2] SET OFFLINE WITH ROLLBACK IMMEDIATE").Execute();
dbMaster.Sql("ALTER database [yuanweishiyan2] set online").Execute();
var db = DBhelper.QueryDB();
string sql = string.Format(@"USE master RESTORE DATABASE yuanweishiyan2 FROM DISK='D:\mydb3.BAK' WITH REPLACE ");
db.Sql(sql).Execute();