2012年SQL Server复制数据库时,“作业失败”

31
我正在尝试复制数据库。在执行“复制数据库向导”时,我遇到了一个“执行 SQL Server 代理作业”错误。错误说明如下:
作业失败。请检查目标服务器上的事件日志以获取详细信息。
操作步骤:
- 添加包日志(成功) - 添加传输数据库对象任务(成功) - 创建包(成功) - 启动 SQL Server 代理作业(成功) - 执行 SQL Server 代理作业(错误)
错误信息:
作业失败。请检查目标服务器上的事件日志以获取详细信息。(复制数据库向导)
我无法找到导致此问题的原因。我是否使用了正确的方法?我只需要复制这个数据库。提前感谢您的帮助。

请使用备份/还原而不是复制数据库“向导”或分离/附加。 - Aaron Bertrand
感谢Aaron Bertrand。我的问题已解决,我使用了备份/恢复方法。 - mohammad_hasan
5个回答

33

如果您正在尝试在同一台服务器上克隆您的数据库,请尝试以下步骤:

  1. 创建要复制的数据库的备份
  2. 右键单击 Databases,并选择 还原数据库
  3. 恢复源 部分的 From Database 下拉列表中选择要复制的数据库
  4. 目标还原 部分的 To database 字段中输入新数据库的名称 - 这不能是现有数据库的名称。
  5. 点击确定

4
为使此操作成功,我还需要更改“另存为”文件名并勾选“覆盖”选项,即使这些文件并不存在。 - nuander
这只是一个解决方法,虽然对我们有用,但我们真正需要的是一个解决方案,而不仅仅是一个解决方法。仍在寻找中。 - Eric Shawn
这个对我有用。有人知道为什么这样行得通吗?当我使用向导时,即使我的驱动器上有足够的空间,它仍然会给我错误提示,这也是最初导致我的错误的原因。 - Python Developer
“复制数据库”从未对我起作用,事件日志中也没有错误原因,因此找到解决方案是不可能的。这让我使用SSMS 2017创建了一个本地数据库副本。谢谢! - Marcell

13

通常情况下,这是因为您的帐户(NT Service\SQLSERVERAGENT)在数据文件夹(..Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA)上没有权限。将其设置为完全控制即可。

上述帐户是默认帐户,如果您想检查运行代理的帐户,请转到 services.msc 并检查帐户登录


这指引我朝着正确的方向前进。然而,我是通过 SQL Mgt Studio Server 2017 远程尝试进行操作的。当我在我们的(非常古老的)SQL 2005 服务器上设置权限时,用户账户显示为“SQLServer2005...”,因此最终我不得不登录到那台服务器并使用 Mgt Studio 2005 进行操作。在那之后,终于实现了。 - deebs

11

检查Windows事件日志。

  1. 事件查看器
  2. Windows日志
  3. 应用程序
  4. 查找与以下任何内容相关的警告/错误消息:
    • SQLAgent
    • SQLISPackage
  5. 阅读错误信息。

这里有一个例子。

SQLAgent Related Errror

以下是我们遇到的一些错误和解决方案。

无法确定作业...的所有者(...)是否具有服务器访问权限(原因:无法获取有关Windows NT组/用户“...”的信息,错误代码0x54b。 [SQLSTATE 42000](错误15404))。

我们需要确保在复制数据库向导期间,我们登录到目标服务器的帐户具有适当的特权,并且这些特权是可获取的(我们最终使用了sa账户)。这解决了上述警告。

访问被拒绝

我们需要确保本地SQL Server Agent在本地服务器上具有适当的特权。所以,我们将SQL Server Agent登录为本地系统。这有效,因为本地系统是我们的SQL Server实例中的sysadmin。

无法读取元数据,可能由于访问权限不足。

我们需要为本地系统帐户提供更多特权。

  • 从SSMS
  • 右键单击服务器名称,然后单击属性
  • 点击权限标签页
  • 点击用户本地系统
  • 在明确权限中的最底部有“查看任何定义”授予权限。看看那是否有效。

xp_regread()返回错误5,“拒绝访问”。

这让我们感到困惑,于是我们提出另一个问题:xp_regread()返回错误代码 5,“拒绝访问”。


1
对于我的拷贝数据库向导问题:错误:值不能为空。参数名称:database StackTrace: 在Microsoft.SqlServer.Dts.Tasks.TransferObjectsTask.TransferObjectsTask.CheckLocalandDestinationStatus处检查本地和目标状态。
我尝试了一切办法来让我的拷贝数据库向导通过SQL 2012到SQL2017的计划工作: 1. 我已将SQL代理帐户设置为管理员,即使我已经设置了一个sysadmin代理。 2. 我进入数据工具,并尝试将最大错误更改为超过一个。
最终我采取的步骤如下: A. 我在2017服务器上安装了数据工具(以防需要它们)。 B. 我在2017服务器上添加了一个虚拟数据库,这样我就可以从SSMS内部访问拷贝数据库向导。 C. 我从我的最新系统中的虚拟数据库启动了opY数据库向导,但将源更改为源服务器(而不是默认的本地SQL实例),并分别将目标更改为我的本地机器SQL实例。

D. 我为每个项目都经过向导(在我的情况下,是使用SSMS的复制和替换选项,而不是分离和重新附加,因为我无法关闭生产环境中的源),并在更改目标目录后单击每个数据库复制向导屏幕上的“刷新”按钮。

(如果在SSMS 2017上迁移数据库,请注意确保SQL版本的最新累积更新:https://support.microsoft.com/en-us/help/4342123与查询中的select @@version进行比较)

此外,请确保您的SQL代理和SQL服务器帐户具有对目标目录的权限。

接下来,我的脚本终于能够从SQL2017服务器运行,并已添加到SQL代理作业中。


1

对我来说,我正在将一个数据库复制到我的本地主机。

  1. 我将代理服务更改为以我的身份运行。
  2. 在我的本地主机上添加了一个缺失的角色,因为事件日志显示“无法修改服务器角色'Developer',因为它不存在或您没有权限”
  3. 看到这个“InnerException -> The procedure 'sys.sp_procoption' cannot be executed within a transaction.”。因此,我将向导设置更改为不复制存储过程。
  4. 接下来的错误是“属性HasMemoryOptimizedObjects对于数据库'[TCCPortal_UAT]'不可用。此属性可能不存在于该对象中,或由于权限不足而无法检索。” 我自己无法快速轻松地修复它。

在那时,我放弃并使用了SQL Server导入和导出向导,这似乎对我所需的工作正常运行。 https://learn.microsoft.com/en-us/sql/integration-services/import-export-data/import-and-export-data-with-the-sql-server-import-and-export-wizard?view=sql-server-2017

请注意,使用导入和导出向导可以很好地处理表格。我必须通过右键单击数据库->任务->生成脚本将视图、存储过程和函数分别复制,然后向导会指导您选择哪些对象。
祝你好运,希望这能帮助到某些人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接