求助:restore database命令问题

猪哈哈 2013-10-14 10:30:49
最近在做一个在java服务中从硬盘上备份文件还原数据库的功能,语句如下:
restore database ncdb_1034 from disk = 'D:\bak\20130906.bak' WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY , REPLACE 执行后报错如图:

用with move 命令重新指定物理位置之后可以成功还原,但是由于生产环境中可能存在服务器与数据库不在同一台机器上的情况无法明确指定磁盘位置的情况,这条路走不通。请教各位大牛有什么方法可以进行还原。另外还有几点疑问:
1.我的数据文件如下:

NDF文件的作用到底是什么,为什么每个库都有自己的mdf主文件和ldf日志文件,而NDF文件公用一个;
2.当时我已经使用kill命令终止所有用户进程,甚至关掉了java服务,只开了一个Management studio,为什么 我的报错信息里还说ndf文件被ncdb_0912这个库占用?



...全文
513 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-10-14
  • 打赏
  • 举报
回复
mdf是数据库的主文件,而ndf是次要数据文件,你上面说的ndf公用文件一个。 应该是你要还原的数据库包含了一个xxx.ndf文件,而在相应的目录里已经有一个文件了,而这个已经存在的xxx.ndf文件被数据库ncdb_0912占用了, 现在的关键是这个数据库ncdb_0912,能不能先把里面的.ndf文件修改一下文件名呢,这样再还原那个.bak文件就不会报错了。 修改文件的名称: ALTER DATABASE ncdb_0912 MODIFY FILE ( NAME = 你要修改的文件的逻辑名, FILENAME = 'D:\路径\1234.NDF' )
唐诗三百首 2013-10-14
  • 打赏
  • 举报
回复
不建议在生产环境在线覆盖还原数据库,这样做的目的是什么? ndf是次要数据文件,是相当于主要数据文件(mdf: master data file)而言的.
發糞塗牆 2013-10-14
  • 打赏
  • 举报
回复
如果多文件还原,restore的时候要用Norecovery
唐诗三百首 2013-10-14
  • 打赏
  • 举报
回复
如果被还原的数据库是固定的,可以在其他服务器数据库中建一个配置表,专门存放数据库还原的文件路径. 还原时读取当前服务器配置表中的信息,来确定with move文件的路径.
猪哈哈 2013-10-14
  • 打赏
  • 举报
回复
引用 10 楼 ap0405140 的回复:
[quote=引用 4 楼 sr_hnsmx 的回复:] [quote=引用 2 楼 ap0405140 的回复:] 不建议在生产环境在线覆盖还原数据库,这样做的目的是什么? ndf是次要数据文件,是相当于主要数据文件(mdf: master data file)而言的.
并不是覆盖现有的数据库。是在当前服务中动态的从一些备份文件重新还原出来若干新的数据库(存放了一些财会专业数据),当前服务使用的数据库会跟这些新库通信。[/quote] 还原时用with move变更文件的路径,有什么问题? [/quote] 服务和数据库如果在同一台电脑上可以确定变更之后的路径,这时候用with move变更路径是没有问题的,难处是服务器有可能使用别的电脑上的数据库,这样的话确定不了变更路径了。
LongRui888 2013-10-14
  • 打赏
  • 举报
回复
在with move时,你不用修改路径,只要把文件名改一改就行了,这样就不至于和已存在的.ndf冲突
LongRui888 2013-10-14
  • 打赏
  • 举报
回复
引用 6 楼 sr_hnsmx 的回复:
[quote=引用 3 楼 yupeigu 的回复:] mdf是数据库的主文件,而ndf是次要数据文件,你上面说的ndf公用文件一个。 应该是你要还原的数据库包含了一个xxx.ndf文件,而在相应的目录里已经有一个文件了,而这个已经存在的xxx.ndf文件被数据库ncdb_0912占用了, 现在的关键是这个数据库ncdb_0912,能不能先把里面的.ndf文件修改一下文件名呢,这样再还原那个.bak文件就不会报错了。 修改文件的名称: ALTER DATABASE ncdb_0912 MODIFY FILE ( NAME = 你要修改的文件的逻辑名, FILENAME = 'D:\路径\1234.NDF' )
在我本机备份文件中次要数据文件的物理名称确实是被ncdb_0912占用的,不过在生产环境中拿到这个库名就不一定是ncdb_0912了,所以没法修改这个ndf文件的路径。现在纳闷的就是我kill掉了跟ncdb_0912通信的所有进程,显示文件还是被他占用了。[/quote] 哦 ,是因为,你kill的只是普通的会话,不可能kill掉系统的会话的。 要重命名备份文件中的ndf物理地址该怎么操作? 不能实现重命名备份文件中的ndf文件,备份文件的中的文件名,是没办法更改的,只能是你第1条中说的,通过还原的时候通过move选项,来指定。 你可以先看看,备份文件中的物理路径名:

--查看PhysicalName 物理文件名
restore filelistonly 
from disk = 'd:\wc1.bak'
發糞塗牆 2013-10-14
  • 打赏
  • 举报
回复
那你还原的时候需要指定新的数据库名,你可以先用图形界面,操作,然后在点OK之前,界面上方有一个【脚本】的按钮,点一下脚本就出来了
唐诗三百首 2013-10-14
  • 打赏
  • 举报
回复
引用 4 楼 sr_hnsmx 的回复:
[quote=引用 2 楼 ap0405140 的回复:] 不建议在生产环境在线覆盖还原数据库,这样做的目的是什么? ndf是次要数据文件,是相当于主要数据文件(mdf: master data file)而言的.
并不是覆盖现有的数据库。是在当前服务中动态的从一些备份文件重新还原出来若干新的数据库(存放了一些财会专业数据),当前服务使用的数据库会跟这些新库通信。[/quote] 还原时用with move变更文件的路径,有什么问题?
猪哈哈 2013-10-14
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
你是想保留原有数据库的情况下还原新库?
是的
發糞塗牆 2013-10-14
  • 打赏
  • 举报
回复
你是想保留原有数据库的情况下还原新库?
猪哈哈 2013-10-14
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
那要重命名,不然会冲突
版主,重命名备份文件中的ndf物理地址该怎么操作?
猪哈哈 2013-10-14
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
mdf是数据库的主文件,而ndf是次要数据文件,你上面说的ndf公用文件一个。 应该是你要还原的数据库包含了一个xxx.ndf文件,而在相应的目录里已经有一个文件了,而这个已经存在的xxx.ndf文件被数据库ncdb_0912占用了, 现在的关键是这个数据库ncdb_0912,能不能先把里面的.ndf文件修改一下文件名呢,这样再还原那个.bak文件就不会报错了。 修改文件的名称: ALTER DATABASE ncdb_0912 MODIFY FILE ( NAME = 你要修改的文件的逻辑名, FILENAME = 'D:\路径\1234.NDF' )
在我本机备份文件中次要数据文件的物理名称确实是被ncdb_0912占用的,不过在生产环境中拿到这个库名就不一定是ncdb_0912了,所以没法修改这个ndf文件的路径。现在纳闷的就是我kill掉了跟ncdb_0912通信的所有进程,显示文件还是被他占用了。
發糞塗牆 2013-10-14
  • 打赏
  • 举报
回复
那要重命名,不然会冲突
猪哈哈 2013-10-14
  • 打赏
  • 举报
回复
引用 2 楼 ap0405140 的回复:
不建议在生产环境在线覆盖还原数据库,这样做的目的是什么? ndf是次要数据文件,是相当于主要数据文件(mdf: master data file)而言的.
并不是覆盖现有的数据库。是在当前服务中动态的从一些备份文件重新还原出来若干新的数据库(存放了一些财会专业数据),当前服务使用的数据库会跟这些新库通信。

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧