Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使SQl Server数据库脱机时,连接会发生什么情况?_Sql Server_Database_Transactions - Fatal编程技术网

Sql server 使SQl Server数据库脱机时,连接会发生什么情况?

Sql server 使SQl Server数据库脱机时,连接会发生什么情况?,sql-server,database,transactions,Sql Server,Database,Transactions,我最近尝试了两个数据库的大合并。我们将模式从数据库2重新创建到数据库1中,并创建一个脚本将所有数据从数据库2传输到数据库1中。此脚本大约需要35分钟才能运行并处理以下事务: BEGIN TRANSACTION ... IF(@@error<>0) COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION 开始交易 ... 如果(@@0) 提交事务 其他的 回滚事务 完整脚本有点敏感,但以下是一些具有相同结构的SQL: 我们运行了脚本

我最近尝试了两个数据库的大合并。我们将模式从数据库2重新创建到数据库1中,并创建一个脚本将所有数据从数据库2传输到数据库1中。此脚本大约需要35分钟才能运行并处理以下事务:

BEGIN TRANSACTION
...
IF(@@error<>0)
    COMMIT TRANSACTION
ELSE
    ROLLBACK TRANSACTION
开始交易
...
如果(@@0)
提交事务
其他的
回滚事务
完整脚本有点敏感,但以下是一些具有相同结构的SQL:

我们运行了脚本,所有的数据都传输了,没有错误。我们测试了使用新组合数据库运行的系统(删除了对旧数据库的访问权限)

但作为最后一项任务,我们希望使旧数据库脱机,以确保没有人使用该数据库。为此,我们使用了:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER数据库设置为脱机,立即回滚
这很糟糕。在这行SQL代码之后,我们刚才复制的组合数据库中的所有数据突然消失了。我首先警告它并没有真正完成,所以“立即回滚”听起来像是对我的事务执行了回滚

但是为什么呢?交易是否已准备就绪

我还尝试过几次再次运行同一个脚本,但每次尝试后都没有复制任何数据,即使脚本成功。我不知道为什么。。。它还记得我的离线回滚吗

我的关系到底发生了什么

立即回滚:

所有未完成的交易都将回滚,任何其他 与数据库的连接将被删除 立即断开

听起来好像有人把两个数据库搞混了,或者可能有一笔未完成的交易?。。。。你能发布你的整个脚本吗


不要只检查
@@ERROR
,还要检查
@@TRANCOUNT

我要再次检查以确保没有未完成的事务。检查文件并计算
BEGIN TRANSACTION
vs
COMMIT TRANSACTION
行数,或者在文件末尾添加一条语句,以
SELECT@@tracount
确保没有剩余的打开事务


如果您的数据已经提交,断开您的连接应该不会丢失数据。

听起来您有一个未提交的挂起事务,您强迫它回滚,从而丢失了一些工作。其余部分将通过脚本的结构进行解释。您的脚本不太可能自始至终都有一个事务。只有最后一个事务被回滚,因此数据库现在处于“半复制”状态。您的脚本可能会执行各种检查,而此中间状态会在“ELSE”分支上发送脚本,但在该分支上它不会执行正确的工作(即,显然没有执行任何操作)

不管怎么说,没有发布准确的脚本都是猜测


现在,您需要将数据库恢复到一致状态,即数据拷贝之前的状态。使用您在数据移动之前进行的备份(您确实进行了备份,对吗?)。为了获得额外的信任,请确保您的脚本在一个半更新的数据库上正确运行。

这有点敏感,基本上只是选择/插入:数据库位于两个不同的链接服务器上。我能理解为什么它第一次卷土重来。但当再次将旧数据库联机并重试时,它拒绝复制任何数据,即使它说脚本已成功执行。未完成的事务听起来像是影响重新运行的罪魁祸首。我只有我在问题中发布的开始和提交。但我可能有其他与合并无关的连接,我确实希望强制关闭这些连接。他们会影响合并吗?我会检查@@Transcount谢谢,我想这将是我将得到的最接近的答案。是的,ofc。我确实做了备份,但是数据库服务于2个非常活跃的web系统,所以数据库现在就要恢复了(在维护意味着加载后仅几小时),除非我们真的必须恢复。我将不得不尝试创建一个脚本,它可以在当前状态下处理这个问题。