SQL Server 2012 restore数据库时在文件夹下看不到.bak文件的解决办法

来源:互联网 发布:js接口安全域名 个人 编辑:程序博客网 时间:2024/04/28 19:17

问题描述
有两台SQL Server 2012 分别称为ServerA、ServerB,目标是利用backup/restore的方法将ServerA上的数据库db1转移到ServerB上。步骤如下:

  1. 使用sa用户登录到ServerA的Management Studio,选择Object Explorer|ROOT|databases|db1右键单击db1,弹出右键菜单选择Tasks|back up… 将数据库备份到文件db1.bak中。
  2. 将db1.bak复制到ServerB的机器上
  3. 使用sa用户登录到ServerB的Management Studio,选择Object Explorer|ROOT|databases 右键单击databases弹出右键菜单选择Tasks|restore|databases…,弹出对话框,在对话框中加入db1.bak

但是在第3步的时候遇到了一个问题,db1.bak原本copy后放在D:\backups文件夹中,但是restore添加备份文件时在backups文件夹下看不到任何文件。将db1.bak复制到其他目录下就可以看到了。

问题调查
首先我们比较两个文件夹的区别,发现唯一的区别就是backups文件夹局域网中有共享其他文件夹没有共享,初步怀疑问题和这个有关系。于是将backups文件夹的共享属性去掉,再试还是不行。于是一通试验,发现新建的没有共享过的文件夹可以工作,文件夹只要共享过(共享后取消共享也不行)就不行了。问题至此确定了重现的步骤即copy sqlserver的backup文件到一个共享过的文件夹中,则无法使用restore从这个文件夹中读取备份文件。

问题的解决
既然找到了重现的步骤那么解决的办法就很直接了,如下的方法一和方法二都是直接规避“共享过”的文件夹而产生的方法。虽然直接但不够优雅,不够本质,所以有了方法三。
方法一,新建一个没有共享过的文件夹存放备份文件
方法二,将备份文件放到磁盘根目录下
方法三,以上两个方法都可以解决这个问题,但是不够完美。于是继续在网上搜索,果然搜到一个帖子,http://dba.stackexchange.com/questions/47304/bak-file-not-visible-in-any-directory-in-ssms
这个帖子的解决办法是将NT SERVICE\MSSQLSERVER这个用户加入文件的访问列表中并赋予相应的权限,如下图:
这里写图片描述

问题总结
看过这个帖子可以清楚这个问题的本质是MSSQLSERVER这个用户是否有权限访问备份文件所在的文件夹,默认情况下新建的文件夹是可以访问的,但是共享破坏了授权,即使取消共享也无法恢复对MSSQLSERVER用户的授权,所以只要是共享过的文件夹MSSQLSERVER用户都无法访问。解决的办法就是显式将MSSQLSERVER加入文件夹的访问列表中。

0 0
原创粉丝点击