我正在研究数据库驻留在外部存储设备(如光纤通道驱动器)上的功能。作为关机过程的一部分,我想让存储驱动器脱机。目前我这样做(代码是用C ++编写的,但这只是一个高级描述):
对于磁盘中的每个卷:
将其冲洗(通过调用其句柄调用FlushFileBuffers)
锁定它(通过使用FSCTL_LOCK_VOLUME代码调用DeviceIoControl)
卸下它(通过FSCTL_DISMOUNT_VOLUME代码)
将其脱机(通过IOCTL_VOLUME_OFFLINE代码)
仅当与磁盘关联的所有卷成功完成上述4个步骤的系列时,才会使用IOTCTL_DISK_SET_DISK_ATTRIBUTES和IOCTL_UPDATE_DISK_PROPERTIES控制代码使磁盘脱机。
我遇到的问题是,用户经常通过其他程序(如记事本)打开驻留在外部磁盘上的文件。在这种情况下,步骤2 - 锁定卷 - 将失败,反过来这将使整个关机尝试失败,这会导致程序卡住,因为我不允许在没有锁定成功的情况下完成关机。原因是从我的理解,这是强制将所有未写入的数据完全刷新到磁盘的唯一可靠方法,这对于防止磁盘处于不一致状态(文件最终为半写,等等。)。
所以基本上我想知道是否有一种可靠的方法可以保证在没有锁定卷的情况下将数据完全刷新到磁盘。我注意到,例如MS故障转移群集在共享磁盘脱机时没有锁定任何卷,是否有人碰巧知道它是如何工作的?
谢谢!
阿米特