【发布时间】:2016-09-21 00:31:55
【问题描述】:
一年前,当我们开始使用 RavenDB 时,我们很快在生产中遇到了这个错误:
操作失败:无法访问文件,文件被锁定或正在使用中
我们通过一些论坛发现,我们可以通过不将 RavenDB 作为 IIS 网站运行,而是作为服务运行来摆脱这种情况。我们做到了,并且再也没有看到错误。
直到现在:我正在设置一个新环境并想,我会尝试在 IIS 之外运行 RavenDB,但错误很快再次出现。
事实和我的尝试:
- 在商业许可证上运行 v.30155
- 使用自定义 AppPool(称为 RavenApplicationPool)
- 将数据文件夹与 IIS 目录分开(通过
Raven/WorkingDirAppSetting) - RavenApplicationPool 用户对 IIS 文件夹和数据文件夹拥有“完全控制”权限
- 为网站安装并启用了 Windows 身份验证
- overlapped recycle disabled 应用程序池
- webdav-publishing 未安装(在setup docs 中要求)
- 敲我的键盘(运气不好)
当站点运行了几分钟后,错误随机发生。尝试使用以下命令还原备份时也会发生这种情况:
C:\RavenDBExecutables\Server\raven.Server.exe --restore-source=c:\SOME_PATH\my-db-backup.raven --restore-database-name=my-db --restore-database= http://localhost:8080
(RavenDBExecutables 文件夹只是二进制文件/可执行文件等的 zip - 它不与 IIS 网站文件夹重叠)
运行还原时,会创建以下文件夹:
- IndexDefinitions(包含大量以 .index 结尾的文件)
- 索引(大量文件夹名称为整数)
- 日志(空)
- 系统(空)
- 温度(空)
- 根文件夹(my-db)为空,即没有Data文件、.resource.database或raven-data .ico 与工作数据库一样
导入失败后,如果我访问http://localhost:8080/docs/Raven/Restore/Status,我会得到
*很多行,例如“复制 PATH_TO_INDEX_FILE”,*
"Esent 还原:失败!无法还原数据库!", "Microsoft.Isam.Esent.Interop.EsentFileAccessDeniedException: 无法访问文件,文件已锁定或正在使用\r\n at Microsoft.Isam.Esent.Interop.Api.Check(Int32 err)\r\n at Microsoft.Isam.Esent.Interop.Api.JetRestoreInstance(JET_INSTANCE 实例,字符串源,字符串目标,JET_PFNSTATUS statusCallback)\r\n 在 Raven.Database.Storage.Esent.Backup.RestoreOperation.Execute()", “无法恢复数据库无法访问文件,文件被锁定或正在使用”
那会是什么?
【问题讨论】:
-
检查你的系统事件日志,我昨晚确实遇到了这个错误,结果发现应用程序池没有对数据目录的权限。
标签: ravendb