首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Replace选项还原SQL数据库

问使用Replace选项还原SQL数据库
EN

Stack Overflow用户
提问于 2016-08-25 16:24:45
回答 2查看 45.4K关注 0票数 7

我正在尝试从不同的来源了解替换选项,并且没有澄清自己。我使用的是SQL Server 2014版本。

下面两个查询的区别是什么?这两个都在完成,没有任何错误。使用替换和不使用替换。

代码语言:javascript
复制
USE [master]
RESTORE DATABASE [Test] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\MyDatabase.bak'
WITH FILE = 3,  NOUNLOAD,  STATS = 5
GO

Vs

代码语言:javascript
复制
USE [master]
RESTORE DATABASE [Test] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\MyDatabase.bak'
WITH REPLACE, FILE = 3,  NOUNLOAD,  STATS = 5
GO

当我尝试用现有数据库(Test2)的.mdf和.ldf替换时,我得到一个错误。到目前为止,我的理解是,我可以恢复名为Test2的Test1数据库的备份。

我得到了REPLACE语句"Restoring over a existing database with a backup of another database taken“。来自其中一个Microsoft Link。

代码语言:javascript
复制
USE [master]
RESTORE DATABASE [Test2] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\MyDatabase.bak'
WITH REPLACE, FILE = 3,  NOUNLOAD,  STATS = 5
GO

错误:

代码语言:javascript
复制
Msg 1834, Level 16, State 1, Line 2
The file 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\test1.mdf' cannot be overwritten.  It is being used by database 'test1'.
Msg 3156, Level 16, State 4, Line 2
 'test1' cannot be restored to 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\test1.mdf'. Use WITH MOVE to identify a valid location for the file.
Msg 1834, Level 16, State 1, Line 2

替换选项的目的是什么,以及它在幕后替换了什么。有没有人能举个例子解释一下?

EN

回答 2

Stack Overflow用户

发布于 2018-07-29 11:45:18

REPLACE选项的用途是允许您覆盖数据库名称(使用与备份名称不同的名称损坏现有数据库)。您的错误是由于您试图覆盖您要求恢复的另一个数据库的文件而导致的。因此,通过Test2数据库进行恢复,但要清除Test1数据库文件(Test1.MDB和Test1.LDB)。如果不使用MOVE子句,那么RESTORE命令将使用与备份相同的文件名。这可能不是一个好主意,否则事情会变得非常混乱。(指向Test1.mdb和Test1.ldb的Test2数据库)

我下面的脚本演示了这个问题。我创建了数据库Test1。我把它备份了。我尝试使用REPLACE将其恢复为Test2。它失败了,因为Test1数据库正在使用Test1.mdb和Test1.ldb。我删除了Test1数据库。我尝试使用REPLACE将其恢复为Test2,现在它可以工作了。(但使用的是Test1.mdb和Test1.ldb)。

代码语言:javascript
复制
CREATE DATABASE [Test1]
 ON  PRIMARY 
( NAME = N'Test1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Test1.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'Test1_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Test1_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
BACKUP DATABASE [Test1] TO  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\Test1.bak' WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N'Test1-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
--Fails... It is being used by database 'Test1'.
RESTORE DATABASE [Test2] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\Test1.bak'
WITH REPLACE,   NOUNLOAD,  STATS = 5
GO
DROP DATABASE Test1
GO
--Now works, but the files are Test1.mdf and Test1.ldf
RESTORE DATABASE [Test2] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\Test1.bak'
WITH REPLACE,   NOUNLOAD,  STATS = 5
GO
DROP DATABASE Test2
GO
CREATE DATABASE [Test2]
 ON  PRIMARY 
( NAME = N'Test1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Test2.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'Test1_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Test2_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
--Now the same command works,  because Test1.mdf and Test1.ldf are not in use.
RESTORE DATABASE [Test2] FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\Test1.bak'
WITH REPLACE,   NOUNLOAD,  STATS = 5
GO

这是微软对REPLACE选项的解释:

https://docs.microsoft.com/en-us/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-2017#REPLACEoption

REPLACE选项Impact REPLACE应该很少使用,并且只有在仔细考虑之后才能使用。Restore通常可以防止意外地用不同的数据库覆盖数据库。如果RESTORE语句中指定的数据库已存在于当前服务器上,并且指定的数据库系列GUID与备份集中记录的数据库系列GUID不同,则不会还原该数据库。这是一个重要的保障。

REPLACE选项会覆盖几个重要的安全检查,这些检查是还原通常执行的。覆盖的检查如下所示:

使用另一个数据库的备份在现有数据库上进行恢复。

使用REPLACE选项,restore允许您使用备份集中的任何数据库覆盖现有数据库,即使指定的数据库名称与备份集中记录的数据库名称不同。这可能会导致不同的数据库意外覆盖数据库。

在未执行结尾日志备份且未使用STOPAT选项的情况下,使用完整或大容量日志恢复模式通过数据库进行恢复。

使用REPLACE选项时,您可能会丢失已提交的工作,因为最近写入的日志尚未备份。

覆盖现有文件。

例如,错误可能允许覆盖错误类型的文件,如.xls文件,或正在由另一个未联机的数据库使用的文件。尽管恢复的数据库是完整的,但如果覆盖现有文件,则可能会丢失任意数据。

票数 5
EN

Stack Overflow用户

发布于 2019-03-07 00:27:41

我找到的方式如下:

  • 使您的数据库离线->任务->使其离线在Windows资源管理器中转到您的数据库并删除mdf
  • log.ldf
    • C:\Program Files\Microsoft

​

  • 让您的Sql脚本运行

就这样。

总的来说,我认为最好是创建一个备份并恢复它。在数据库中。

click on >用鼠标右键单击数据库和任务,然后单击数据库任务和恢复文件,然后在device

  • Select a
  • -> Options -> ->下选择您的文件-> Overwrite the existing -> ( -> replace)
  • 让它运行
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39140202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档