none
不能收缩 ID 为 5 的数据库中 ID 为 1 的文件,因为它正由其他进程收缩或为空。 RRS feed

  • 问题

  • 收缩数据库数据文件时,提示了一下错误: 不能收缩 ID 为 5 的数据库中 ID 为 1 的文件,因为它正由其他进程收缩或为空。

    请问面对这种情况要怎样处理,谢谢!

    2018年2月1日 3:02

全部回复

  • 等之前的进程收缩完成呗。

    另外,一般不推荐收缩数据文件。


    想不想时已是想,不如不想都不想。

    2018年2月1日 3:18
    版主
  • 等待,或者应该是忽略,既然别人已经做做了,应该可以不用管了
    2018年2月1日 3:39
  • 看你的提示:是有其它进程在做相同的收缩操作,这样的情况下,查看进程断进程用Kill,如果麻烦允许的情况下直接断数据库所有连接重新操作,可以断用户连接时,直接重启实例

    正常收缩阻塞通常是由删除数据行版本行为引起,其它操作应该不会影响到收缩,另外需要考虑你收缩时内存资源是否不够用,如果是这样的情况最好是闲时再收缩
    个人建议,数据库占用过大,检查是不是完整模式情况下的日志过大,如果是这样针对自己的应用环境制订备份策略
    如:
    1.每日一备,不考虑恢复每天中途时数据状态时,可用简单模式
    2.要考虑恢复每日做任意时间点,每日一个完整备份+每日日志备份

    数据库文件不建议去做收缩,可参考联机说明:
    • 当您计划收缩数据库时,请考虑以下信息:

      • 在执行会产生许多未使用空间的操作(如截断表或删除表操作)后,执行收缩操作最有效。

      • 大多数数据库都需要一些可用空间,以供常规日常操作使用。
        如果反复收缩数据库并注意到数据库大小变大,则表明收缩的空间是常规操作所必需的。
        在这种情况下,反复收缩数据库是一种无谓的操作。

      • 收缩操作不会保留数据库中索引的碎片状态,通常还会在一定程度上增加碎片。
        这是不要反复收缩数据库的另一个原因。

      • 除非有特定要求,否则不要将 AUTO_SHRINK 数据库选项设置为 ON。

    Roy Wu(吳熹Blog)(微博)



    2018年2月1日 3:55
    版主
  • 邹大神,

    谢谢您的回复,没有发现有收缩数据文件的进程在进行呢,这个是Alwayson的架构.数据库的自动收缩功能也是关闭的,无论何时执行收缩动作都会提示这个错误.

    2018年2月2日 1:08
  • 谢谢吴大神回复, 手动进行收缩的时候没有发现其他收缩进程,数据库的自动收缩功能也是关闭的.高可用时5台服务器搭建的Alwayson环境,无论何时进行收缩都提示这个错误.
    2018年2月2日 1:11
  • 有同步事务时是收缩不了的,停了同步再做收缩,可改简单模式 收缩再改回完整模式,这样可解决,这要根据自己环境决定能不能做这样的操作

    Roy Wu(吳熹Blog)(微博)

    2018年2月2日 2:50
    版主
  • 您的意思是处于Alwayson同步状况下不能收缩嘛?因为设定了作业去收缩数据库,刚开始的时候都是可以收缩的,最近几天就提示这个错误了.如果要改成简单模式,这样的动作太大了.
    2018年2月2日 2:59
  • 是否有事务正在做删除数据行为未提交,这类操作会阻塞,之前没出现,可能是之前数据少,现在数据量大等,造成IO产生过大引起内存不够等 
    有没有设置虚拟内存,没有时可尝试设置合理的虚拟内存减少这类情况

    Roy Wu(吳熹Blog)(微博)

    2018年2月2日 3:16
    版主
  •  alwayson   环境中shink是可以的

    根据错误信息,是两种情况,其他在 shrink 或为空,那考虑一下第2种情况

    查下你要 shrink 文件的使用情况,最简单的是 ssms 的界面操作,右键 收缩文件 的那项,选择收到到 xx MB ,那里会给出你最多能收到到多少,如果和文件大小是相当的,那么是确定没有可收缩的余地了

    如果你收缩的是日志文件,通常是你没有做日志备份( 这个在 sys.database 的 log_reuse_wait 中有明确体现)

    2018年2月2日 3:42