背景:
今天检查一个服务器上实例中镜像数据库的状态,发现主库这边所有被镜像的数据库的状态均为:Principal/Disconnected,而从库那边除了镜像数据库DB_A 之外,其他镜像数据库的状态为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
之后除开DB_A数据库之外,其他数据库镜像恢复正常.
之后开始解决 DB_A 数据库镜像的问题.DB_A 镜像数据库之前的状态不是Mirror/Recovering/Pending,而是类似于正常数据库那种(后面不包含任何状态),但是当我们访问这个数据库的时候,提示该数据库不能被访问.
执行select * from sys.databases中该数据库的state_desc为Recovery_Pending.也就是说该数据库的Recovering被阻挡.
查看镜像数据库中的数据库日志:
Unable to open the physical file "D:\DATA\DB_A\LOG\TB_A_Log.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\DB_A\LOG\TB_A_Log.LDF' may be incorrect. Diagnose and correct additional errors, and retry the operation.
之后尝试了以下的方法:
另外,已经尝试了的方法有如下:
1:alter database DB_A set partner resume------无效
2:alter endpoint endponitname state=stopped
alter endpoint endponitname state=started -----无效
3:ALTER DATABASE DB_A SET PARTNER='TCP://Principal:5022'---无效
并且报错
Msg 945, Level 14, State 2, Line 1
Database 'DB_A' cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.
我们发现DB_A数据库的数据文件和日志文件居然可以被复制,在正常情况下,移动一个online数据库的数据文件和日志文件是会报错的(提示该文件被占用,不能被复制或者移动).后来采用ProcessExplorer来检查是什么程式在占用DB_A数据库的数据或者日志文件,也没有任何返回结果.
最后只得重启镜像实例的服务器,启动之后,检查数据库DB_A的镜像恢复正常.
奇异的事件.怀疑是OS由于某种不得而知的原因不能访问到DB_A数据库的数据和日志文件,然后导致镜像失败.