首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于文件状态的有关问题

2012-01-24 
关于文件状态的问题文件状态和数据库状态的关系还是引用官方文档的一句话:“在 SQL Server 中,数据库文件的

关于文件状态的问题
文件状态和数据库状态的关系
还是引用官方文档的一句话:
“在 SQL Server 中,数据库文件的状态独立于数据库的状态。文件始终处于一个特定状态,例如 ONLINE 或 OFFLINE。若要查看文件的当前状态,请使用 sys.master_files 或 sys.database_files 目录视图。如果数据库处于离线状态,则可以从 sys.master_files 目录视图中查看文件的状态。”
这我就有点疑惑了,难道数据库离线了文件还能在线使用?

[解决办法]
have a test,

SQL code
-- 建测试数据库create database ilovemk-- 查询文件状态,为onlineselect db_name(database_id) database_name,file_id,name,physical_name,state_desc from sys.master_files where database_id=db_id('ilovemk')database_name file_id   name           physical_name             state_desc-----------------------------------------ilovemk            1       ilovemk         E:\SQLDATA\ilovemk.mdf          ONLINEilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE-- 数据库设为 offlinealter database ilovemk set offline-- 再查询文件状态,为onlineselect db_name(database_id) database_name,file_id,name,physical_name,state_desc from sys.master_files where database_id=db_id('ilovemk')database_name file_id   name           physical_name             state_desc-----------------------------------------ilovemk            1       ilovemk         E:\SQLDATA\ilovemk.mdf          ONLINEilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE
[解决办法]
SQL code
-- 建测试数据库create database ilovemk-- 建测试表use ilovemkcreate table tab1(id int,de varchar(10))insert into tab1 select 1,'a' union allselect 2,'b' union allselect 3,'c'select * from tab1id          de----------- ----------1           a2           b3           c-- 查询文件状态,为onlineuse masterselect db_name(database_id) database_name,file_id,name,physical_name,state_desc from sys.master_files where database_id=db_id('ilovemk')database_name file_id   name           physical_name             state_desc-----------------------------------------ilovemk            1       ilovemk         E:\SQLDATA\ilovemk.mdf          ONLINEilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE-- 数据库设为 offlinealter database ilovemk set offline-- 查询数据库状态,为 offlineselect name,state_descfrom sys.databases where database_id=db_id('ilovemk')name     state_desc-------------------ilovemk      OFFLINE-- 再查询文件状态,依然为onlineselect db_name(database_id) database_name,file_id,name,physical_name,state_desc from sys.master_files where database_id=db_id('ilovemk')database_name file_id   name           physical_name             state_desc-----------------------------------------ilovemk            1       ilovemk         E:\SQLDATA\ilovemk.mdf          ONLINEilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE-- 附加为新数据库ilovemk2exec sp_attach_db 'ilovemk2','E:\SQLDATA\ilovemk.mdf','E:\SQLDATA\ilovemk_log.LDF'-- 查询测试表select * from ilovemk2.dbo.tab1id          de----------- ----------1           a2           b3           c
[解决办法]
探讨

引用:

have a test,
SQL code

-- 建测试数据库
create database ilovemk

-- 查询文件状态,为online
select db_name(database_id) database_name,file_id,name,
physical_name,state_desc
from sys……


官方文档的描述文件状态为ONLINE时文件可用于所有操作,那是不是说明数据库offline时可以照常对数据库文件进行存取操作?

[解决办法]
那此时文件在线还有什么意义呢?
--> 可以另外附加为其他数据库,继续使用.

此时文件在线代表的究竟是什么意思?
--> SQL Server把数据库及其文件分开管理,
这个可能与一般的理解可能有些出入,知道就行.
------解决方案--------------------


set offline和detach database有什么区别啊?
--> set offline是离线数据库,在SSMS的数据库列表里还能看到.
detach是卸离数据库,在SSMS的数据库列表里看不到了的.

但是上面的例子没有先sp_detach_db也能执行sp_attach_db,难道set offline会执行sp_detach_db?
--> attach的数据库名不是原来的数据库名ilovemk,注释里特意写了新数据库.

SQL code
-- 附加为新数据库ilovemk2exec sp_attach_db 'ilovemk2','E:\SQLDATA\ilovemk.mdf','E:\SQLDATA\ilovemk_log.LDF' 

热点排行