Sql Server 性能分析2 –查看数据库的大小以及数据库表的大小(Linked Server)

 

Sql Server 性能分析2 –查看数据库的大小以及数据库表的大小(Linked Server)

 

因为业务的需求,需要用Linked Server从当前数据库获取远端数据库的 数据库大小 以及 远端数据库的 表大小

 

关于Linked Server 连接,请看我的另一篇文档:

http://blog.csdn.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

 

 

 

 

 

posted on 2009-09-03 22:24  封起De日子  阅读(147)  评论(0编辑  收藏  举报

导航