Sql Server 性能分析2 –查看数据库的大小以及数据库表的大小(Linked Server)
Sql Server 性能分析2 –查看数据库的大小以及数据库表的大小(Linked Server)
因为业务的需求,需要用Linked Server从当前数据库获取远端数据库的 数据库大小 以及 远端数据库的 表大小
关于Linked Server 连接,请看我的另一篇文档:
http://blog.****.net/zwxrain/archive/2007/01/18/1486304.aspx
在操作中遇到以下几个问题,并都以解决
问题一: 不可以直接对远需数据库操作 sp_spaceused 查看大小(数据库大小和表大小)
sp_spaceused 的操用方法:
查看本地表大小
sp_spaceused ‘TableName’
查看远端数据库大小
Srv_MES.InsiteProdDG.dbo.sp_spaceused ‘TableName’
说明:
Srv_MES 为Linked Server , InsiteProdDG 为Linked Server 远端的数据库名。
查看远端数据大小的错误描述:
Msg 7411, Level 16, State 1, Line 14
Server 'Srv_MES' is not configured for RPC.
解决方法:将Linked Server 的Rpc_Out 设成 True
问题2: 解决第一个问题,我们可以正常查询远端数据库的表大小,但当然们将查询结果保存到表时却出现如下错误。
insert into @tb_size exec Srv_MES.InsiteProdDG.dbo.sp_spaceused ‘tb_name’
错误描述:
OLE DB provider "SQLNCLI" for linked server "Srv_MES" returned message "The transaction manager has disabled its support for remote/network transactions.".
Msg 7391, Level 16, State 2, Line 13
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "Srv_MES" was unable to begin a distributed transaction.
原因:
由于开启了事务,需要分布式事务协调器的支持。打开本机的控制面板 - 管理工具 - 服务,将两台服务器上的 Distributed Transaction Coordinator (MSDTC) 服务开启,注意 MSDTC 服务的登陆名必须选择 NETWORK SERVICE 用户。然后设置高级选项,运行 dcomcnfg.exe ,进入组件服务,选择我的电脑右键属性,MSDTC - 安全配置,勾选:网络DTC访问,允许入站,允许出站,并且不要求进行验证。其他的可以根据需要选择,不是必须选项。
解决:
SQL 代码部分:
---Linked Server 获取远端数据库的大小----
Create procedure [dbo].[Proc_DBA_Database_Size]
as
Declare @l_datetime varchar(20)
set @l_datetime = convert(varchar(20),getdate(),120)
insert into TB_DBA_Database_Size
select -- fileid,
@l_datetime as Date_Time,
'InsiteProdDG' [Database Name] ,
cast(sum(size)*8/1024. as decimal(10,2)) [DB Size],
'MB' Size_Type
-- name logic filename,
-- filename physics filename
from Srv_MES.InsiteProdDG.dbo.sysfiles
---Linked Server 获取远端数据库表的大小----
Create procedure [dbo].[Proc_DBA_MES_Table_Size]
as
Declare @tb_name varchar(50)
Declare @tb_list table
(
tb_name varchar(50)
)
declare @tb_size table
(
name varchar(50),
rows varchar(50),
Reserved varchar(50),
Data varchar(50),
Index_Size varchar(50),
Unused varchar(50)
)
declare cur_tb_list cursor for
select name
from dbo.sysobjects
where objectproperty(id, N'istable') = 1
and name not like N'#%%'
order by name
open cur_tb_list
fetch Next from cur_tb_list
into @tb_name
while @@fetch_status=0
begin
if exists (select * from dbo.sysobjects
where id = object_id(@tb_name)
and objectproperty(id, N'isusertable')=1)
insert into @tb_size exec Srv_MES.InsiteProdDG.dbo.sp_spaceused @tb_name
fetch Next from cur_tb_list
into @tb_name
end
insert into TB_DBA_Database_Table_Size
select convert(varchar(20),getdate(),120) as date_time,*
from @tb_size
close cur_tb_list
deallocate cur_tb_list