处理数据库镜像问题的一个案例——数据库主体与镜像断开连接

时间:2022-12-11 18:22:24
背景:今天检查一个服务器上实例中镜像数据库的状态,发现主库这边所有被镜像的数据库的状态均为:Principal/Disconnected,而从库那边除了镜像数据库Tfs_TFS2005Collection 之外,其他镜像数据库的状态为Mirror/Recovering/Pending.
处理方法:
第一步:首先检查两边数据库服务器是否可以相互Ping---确认OK
第二步:相互telnet 数据库监听端口(我们这里使用1433)----确认OK
第三步:相互telnet数据库镜像端点的端口(我们这里使用5022)-----确认OK
第四步:在主实例和镜像实例上重启数据库镜像所使用的端点:
use master 

GO 
alter endpoint Endpoint_Name state = stopped; 
GO 
alter endpoint Endpoint_Name  state = started; 
GO

之后除开A数据库之外,其他数据库镜像恢复正常.


之后开始解决Tfs_TFS2005Collection 数据库镜像的问题.Tfs_TFS2005Collection 镜像数据库之前的状态不是Mirror/Recovering/Pending,而是类似于正常数据库那种(后面不包含任何状态),但是当我们访问这个数据库的时候,提示该数据库不能被访问.

执行select * from sys.databases中该数据库的state_desc为Recovery_Pending.也就是说该数据库的Recovering被阻挡.

查看镜像数据库中的数据库日志:

Unable to open the physical file "D:\DATA\Tfs_TFS2005Collection\LOG\TfsVersionControl.LDF". Operating system error 32: "32(The process cannot access the file because it is being used by another process.)".

A file activation error occurred. The physical file name 'D:\DATA\Tfs_TFS2005Collection\LOG\TfsVersionControl.LDF' may be incorrect. Diagnose and correct additional errors, and retry the operation.

之后尝试了以下的方法:

另外,已经尝试了的方法有如下:

1:alter database Tfs_TFS2005Collection  set partner resume------无效

2:

alter endpoint endponitname state=stopped 

alter endpoint endponitname state=started -----无效

3:ALTER DATABASE  Tfs_TFS2005Collection  SET PARTNER='TCP://Principal:5022'---无效

并且报错

Msg 945, Level 14, State 2, Line 1 

Database 'Tfs_TFS2005Collection' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.

我们发现Tfs_TFS2005Collection 数据库的数据文件和日志文件居然可以被复制,在正常情况下,移动一个online数据库的数据文件和日志文件是会报错的(提示该文件被占用,不能被复制或者移动).后来采用ProcessExplorer来检查是什么程式在占用Tfs_TFS2005Collection数据库的数据或者日志文件,也没有任何返回结果.
最后只得重启镜像实例的服务器,启动之后,检查数据库Tfs_TFS2005Collection的镜像恢复正常.

奇异的事件.怀疑是OS由于某种不得而知的原因不能访问到Tfs_TFS2005Collection数据库的数据和日志文件,然后导致镜像失败.