附加数据库失败解决办法

上周,我遇到个问题,数据库附加失败。
先重启服务,在命令提示符里敲了netstopmssqlserver,服务停了。
然后又敲了netstartmssqlserver,服务重启了。
接着,我找到SQL数据库程序的快捷方式,右键“以管理员身份运行”。
登录时选了“Windows身份验证”,操作简单。
附加数据库时,还特别注意了文件路径不能有中文。
最后,成功了。
你看着办吧。

SQLServer 附加数据库时出错的问题处理

附加数据库失败,权限问题最常见。

存放数据库文件的文件夹权限要改。

右键文件夹,点属性,安全选项卡。

组或用户名下面点编辑。

点添加,高级,立即查找。

搜Everyone用户组,点确定。

Everyone给完全控制权限。

用SSMS再试附加。

权限别给太多,安全第一。

文件不完整也行不通?

SQLServer附加数据库时,设备激活错误,物理文件名可能有误

哎哟,这事儿我熟啊。
前年我在帮一家小公司搞系统迁移的时候,就碰到过这鬼东西。
当时他们把数据库文件拷过来,直接扔在一个乱七八糟的临时文件夹里,结果SQL Server就炸了,提示这个“设备激活错误,物理文件名可能有误”。

你想啊,数据库文件 (.mdf 和 .ldf) 这玩意儿,它可不是光有文件名就完事儿,还得知道它到底在哪儿。
你把它从一台电脑拷到另一台,路径变了,SQL Server 就懵了,它以为文件丢了或者名字改了,所以直接报错。

解决方法?我给你总结几个我踩过的坑和搞对的招儿:
1 . 把它放回老家: 这是最省事儿也最常见的方法。
SQL Server 默认的数据家在哪儿?一般是 C:\Program Files\Microsoft SQL Server\MSSQL<版本号>.MSSQLSERVER\MSSQL\DATA 这种路径,具体看你的版本。
比如我弄过一次 SQL Server 2 01 6 的,路径就是 C:\Program Files\Microsoft SQL Server\MS SQL Server 2 01 6 \MSSQL\DATA。
你就把 .mdf 和 .ldf 文件,连同那个 .ldf 文件里写的路径也指向同个地方,然后重新附加。
这次我帮那个小公司弄的时候,直接把文件都扔到 C:\SQLData 这个新建的目录下,结果就好了。
省心!
2 . 手写路径: 如果文件不能放回老家,比如客户服务器权限搞得太复杂,或者你不想动,那你就得在附加数据库的时候,手动告诉 SQL Server 它们具体在哪儿。
就用 T-SQL 来搞: sql CREATE DATABASE [你要的名字] ON PRIMARY (NAME = '数据库名.mdf', FILENAME = 'D:\实际路径\数据库名.mdf'), LOG ON (NAME = '数据库名_log', FILENAME = 'D:\实际路径\数据库名.ldf') FOR ATTACH; 注意,这里的 D:\实际路径\ 必须是绝对路径,而且 SQL Server 服务账户(那个 NT SERVICE\MSSQLSERVER 或者别的什么名字,得看你系统怎么设的)必须能在那个路径下读写文件。
如果 .ldf 文件丢了,你可以加个 FOR ATTACH_REBUILD_LOG,但小心点,这可能会把之前没提交的事务全丢了,搞不好就全完蛋。
前年我试过一次,路径写错了,又得重来,挺烦人的。

3 . 权限问题: 这也是个老坑了。
有时候不是路径写错了,就是那个 SQL Server 服务账户没权限去那个地方看文件。
你就得去文件那儿的“属性”->“安全”里看看,是不是 NT SERVICE\MSSQLSERVER 这个账户有“完全控制”的权限。
没有就添加上,给它赋个权限。
我弄过一次,客户服务器管理员把权限搞得太死,结果 SQL Server 进不去,也是这个错误,最后改权限就好了。

4 . 文件坏了? 万一文件在拷来拷去的时候坏了,那也可能会报这种错,但通常还会伴随别的提示。
你可以试试用 DBCC CHECKDB '数据库名' 来检查一下文件是不是还能用。
如果坏了,那只能从备份里恢复了,没辙。

最好的预防措施?
别直接拷贝文件! 特别是数据库分离的时候,用 sp_detach_db 分离完,再拷贝文件。
直接拷贝文件最容易出问题,路径一乱就麻烦。
用备份还原! 能不用文件直接拷贝,就用备份文件 (.bak) 还原数据库。
备份还原最保险,什么路径问题权限问题都没有了,系统自己搞定。
路径统一! 如果你在多台机器上搞数据库,最好事先规划好统一的文件存放路径,别东一台西一台的,到时候迁移麻烦。

总之啊,这个“设备激活错误,物理文件名可能有误”啊,大部分时候就是路径没对上。
要么把它放回 SQL Server 觉得舒服的家,要么就老老实实手动告诉它具体在哪,再要么检查下权限。
前年我帮那个小公司搞定了,就是费了点功夫。
你试试看,应该也行。