SQLServer数据库置疑后无法删除问题
今日发现sql server 2005出现异常,文件丢失,在恢复数据库的过程中,使用鼠标->右键,选择删除失败,提示数据库已经配置为发布状态,可是从发布中却无法查看到数据库的发布状态。。
这个时候只能使用语句了,如下语句可以解决问题:
exec sp_removedbreplication 'testdb'
即可清除发布。对于一般的数据库发布与订阅清除可以参考如下步骤:
下面的列表是手动删除复制的必要步骤的摘要。 本文的在"更多信息"部分提供每个步骤的详细信息。
删除所有订阅。删除所有文章和发布。清除任何"非"的事务日志复制交易记录。删除数据库的发布和订阅状态。删除不需要的远程服务器和远程登录。删除服务器的发布服务器、 订阅服务器和分发服务器状态。删除任何剩余的复制任务。删除.sch 和.tmp 文件 repldata 目录中。删除分发数据库。重置 mslast_job_info 表。请验证复制注册表项。
您可能会发现更容易使用 sql enterprise manager 可能要卸载复制,而不是使用存储过程和 transact-sql 命令。
sql server 6.5 中, 可以使用 sql 企业管理器删除通过单击复制配置 / 卸载发布服务器菜单上的复制。 有关详细的信息请参阅第 3 部分的新增 sql server 6.5 简介册中的"卸载复制"。
sql server 6.0 没有一个复制卸载选项,但您可以执行的步骤 1 至 7 使用 sql 企业管理器。 对于 sql server 6.0,仍然需要手动执行步骤 8 至 11。 有关详细信息,请参阅"停止复制"章 14 中 sql server 6.0 管理员的助理。
请注意您不应使用转储和负载的机制将发布和订阅数据库传输到一个不同的服务器。 (在这种情况下"不同服务器"意味着不在最初发布数据库的一个)。 在很多的情况下本文中的过程不会从已从一台服务器转储并加载到另一台服务器上的数据库中删除复制足够。
如果您必须将已发布的数据库移到另一台服务器中,应考虑使用传输管理器或大容量复制程序 (bcp)。 您可以安全地使用转储并加载不同服务器传输已发布的数据库仅当删除所有订阅和所有的出版物已发布数据库中之前转储数据库的机制。
下面是步骤手动删除 (卸载) 复制进行详细说明。 请参阅 sql server 联机丛书有关详细信息在命令和下面讨论的存储的过程。
步骤 1-删除所有订阅
您可以运行 sp_helpsubscription 来确定有任何订阅已发布数据库中。
运行以下命令删除已发布数据库中的所有发布的所有订阅。 已发布并且已订阅的每个数据库中,必须运行此命令。 运行此命令还会删除与断开的订阅关联的该通讯组任务。
sp_dropsubscription 'all', 'all', 'all'
请注意 sp_dropsubscriptions 将只正确才能都满足以下条件:
有是分发数据库安装。
和)发布服务器具有所有的订阅服务器的正确的远程服务器信息。 配置复制时,将自动定义远程服务器的信息。 可以通过运行 sp _ helpserver 验证远程服务器信息。
步骤 2-删除所有文章和发布
您可以运行 sp_helppublication 来确定有任何出版物已发布数据库中。
您可以运行"select * 从 sysarticles"来确定是否有任何文章在发布数据库中。
运行以下命令删除所有文章和已发布数据库中的订阅。 已发布并且已发布的每个数据库中,必须运行此命令。 运行此命令将同时删除与断开的发布,同步任务。
sp_droppublication 'all'
步骤 3-清除事务日志的复制任何"非"
交易记录
无法截断事务日志,只要有任何不分发的复制的事务。 一个"非复制的事务为已标记为已发布的数据库事务日志中复制,但已不被"分发"的日志读取器任务的交易记录。
您可以看到通过运行以下命令是否有任何"非复制的事务,已发布的数据库中:
dbcc opentran() with tableresults
如果该数据库了在某个点必须复制的事务,上面的命令将返回最早的分布式的行 id ("repl_old_dist_rid") 和最早的非分布式的行 id ("repl_old_nondist_rid")。 如果数据库不具有任何复制的事务,并且有没有打开的事务,上面的命令将返回 0 的行。如果上面的命令不会返回最旧分布式和最早非-分布式行 id,和如果这些行 id 不相同,您有或多个 undistributed 复制该数据库中的事务。 如果行 id 相同,您没有任何非复制的事务在数据库中。 详细信息,请参阅 transact-sql 参考书中的 dbcc 语句 (英文)。如果非复制的事务请运行下面的命令,将标记为"分配"的所有复制的事务,以便可以截断日志:
sp_repldone 0, 0, null, 0, 0, 1
sp _ repldone 命令必须运行在每个具有非复制的事务的数据库中。如果数据库被标记为发布只能运行 sp _ repldone 命令。 如有必要,您可以将临时标记数据库为发布的运行以下命令:
sp_dboption , pub, true
在运行 sp _ repldone 之后可以通过运行以下命令来标记不是发布的数据库:
sp_dboption , pub, false
您应该与您的主要支持提供者联系如果您持续看到完成本文中过程后的事务日志中复制的事务中。
步骤 4-删除数据库的"发布"和"订阅"状态
运行 sp _ helpdb 来验证的数据库有状态为"发布"或"已订阅。
运行以下命令从数据库中删除"发布"状态。 运行此命令还会删除数据库的日志读取器任务。
sp_dboption , published, false
运行以下命令从数据库中删除"已订阅"的状态:
sp_dboption , subscribed, false
步骤 5-删除不需要的远程服务器和远程登录
安装复制时,复制会自动定义远程服务器和远程登录。 远程服务器和远程登录是运行远程过程调用所必需的。 如果不需要其他 sql server 应用程序,可以删除远程服务器和远程登录。
注意: 您不应删除本地服务器。
本地服务器是运行 sp _ helpserver 时具有服务器 id 0。 有关远程服务器和远程用户的详细信息,请参阅第 10 章 sql server 管理员助理中。
您可以运行"sp _ helpserver"若要查看远程服务器的列表。 您可以运行"sp_helpremotelogin"若要查看远程登录的列表。 运行以下命令删除远程登录:
sp_dropremotelogin remoteserver_name [, loginame [, remotename]]
运行以下命令以删除远程服务器: 注意: 不删除本地服务器。 本地服务器具有服务器 id 0。
sp_dropserver server_name [, droplogins]
步骤 6-删除服务器的发布者、 订阅服务器和分发服务器状态
运行 sp _ helpserver 以验证服务器的状态。 然后运行下面的命令,若要删除服务器的发布服务器 ("pub") 状态:
sp_serveroption , pub, false
运行以下命令删除服务器的远程发布服务器 ("dpub") 状态:
sp_serveroption , dpub, false
运行以下命令删除服务器的订阅服务器 ("sub") 状态:
sp_serveroption , sub, false
运行以下命令删除服务器的分发服务器 ("分发") 状态:
sp_serveroption , dist, false
步骤 7-删除任何剩余的复制任务
打开在 sql 企业管理器管理计划任务窗口,双击 sql executive 图标。 删除具有类型"日志读取器,"所有任务"通讯组"或"sync"。 同时删除所有复制清除任务。 清除任务具有名称以下列格式:
__cleanup.
步骤 8-删除.sch 和.tmp 文件,repldata directory 中
删除.sch (已发布的表架构脚本) 和 mssql/repldata 目录中分发服务器上的.tmp (同步数据) 文件。
步骤 9-删除分发数据库
运行以下命令删除分发数据库:
drop database distribution
删除分发数据库之后, 需要手动删除数据,然后登录分发数据库的设备文件,; 这要求停止并重新启动该 sql server。
步骤 10-重置 mslast_job_info 表
mslast_job_info 表将存在于每个订阅数据库中,将跟踪最后任务从每个已复制到该数据库的发布数据库。 您订阅了发布后,将由分配任务创建了 mslast_job_info 表。
如果订阅的数据库当前未订阅任何发布数据库,可以每个订阅数据库中删除 mslast_job_info 表,只需使用下面的命令:
drop table mslast_job_info
如果订阅数据库仍然订阅到一个或多个发布的数据库中,您应使用下面的命令删除它不再订阅到该数据库与对应的 mslast_job_info 表中行:
delete mslast_job_info
where publisher = ''
and publisher_db = ''
步骤 11-验证复制注册表项
您可以重新安装复制之前,hkey_local_machine/software/microsoft/mssqlserver/repliction 注册表项下的,"distributiondb 值必须一个空字符串。
可以从 master 数据库将该字符串为空运行以下命令:
xp_regwrite 'hkey_local_machine',
'software/microsoft/mssqlserver/replication', 'distributiondb',
'reg_sz', ''
警告: 错误地使用注册表编辑器可以导致严重问题,可能需要重新安装 sql server。 microsoft 不能保证可以解决因注册表编辑器使用不当导致的问题。 使用注册表编辑器需要您自担风险。也是可以更改此项使用注册表编辑器 (regedt 32 在 windows nt 3.50 和 windows nt 3.51 中) 或 windows nt 4.0 和 windows 95 中的注册表编辑器。 如果您使用注册表编辑器,执行不删除"distributiondb 项本身 ; 而,双击 distributiondb 条目并删除编辑对话框框中的,字符串。
推荐阅读
-
SQLServer乱码问题的分析及解决方法(中文字符被存入数据库后,显示为乱码)
-
关于oracle数据库误删表空间文件后无法登陆sqlplus问题的解决方法
-
完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存
-
ORACLE异常关闭后导致数据库报错无法连接问题解决办法
-
SQLServer数据库无法查询中文的问题怎么解决?
-
sqlServer数据库表无法查询,无法删除。“表发生死锁”。“已超过了锁请求超时时段。”
-
SQLServer数据库置疑后无法删除问题
-
SQLSERVER数据库备份后无法还原的解决办法
-
UAC开启可能引发的问题SQLServer无法附加数据库
-
SQL Server问题之计算机名称更改后无法登陆本地数据库