日期:2014-05-18  浏览次数:20571 次

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

------解决方案--------------------
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.master_files 
where database_id=db_id('ilovemk')

database_name file_id   name           physical_name             state_desc
-----------------------------------------
ilovemk            1       ilovemk         E:\SQLDATA\ilovemk.mdf          ONLINE
ilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE


-- 数据库设为 offline
alter database ilovemk set offline

-- 再查询文件状态,为online
select 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          ONLINE
ilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE

------解决方案--------------------
SQL code

-- 建测试数据库
create database ilovemk

-- 建测试表
use ilovemk

create table tab1(id int,de varchar(10))

insert into tab1 
select 1,'a' union all
select 2,'b' union all
select 3,'c'

select * from tab1

id          de
----------- ----------
1           a
2           b
3           c


-- 查询文件状态,为online
use master

select 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          ONLINE
ilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE


-- 数据库设为 offline
alter database ilovemk set offline

-- 查询数据库状态,为 offline
select name,state_desc
from sys.databases 
where database_id=db_id('ilovemk')

name     state_desc
-------------------
ilovemk      OFFLINE

-- 再查询文件状态,依然为online
select 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          ONLINE
ilovemk            2       ilovemk_log     E:\SQLDATA\ilovemk_log.LDF      ONLINE

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

-- 查询测试表
select * from ilovemk2.dbo.tab1

id          de
----------- ----------
1           a
2           b
3           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把数据库及其文件分开管理,
这个可能与一般的理解可能有些出入,知道就行.
------解决方案--------------------