【问题标题】:Check connection details to SQL Server 2000/2005检查与 SQL Server 2000/2005 的连接详细信息
【发布时间】:2018-10-13 09:03:16
【问题描述】:

我想将托管在 SQL 2000/2005 上的一些数据库迁移到 SQL 2014,我没有直接访问数据库的权限,我想知道所有连接到它的应用程序和连接详细信息。有没有最好的方法来获取这些信息?我尝试使用数据库分析,但不允许这样做,因为它占用了托管数据库服务器上的大量空间,从而导致中断。

任何更好的方法,如 SQL 语句或远程连接监控都会有所帮助。

提前感谢您的帮助。

【问题讨论】:

    标签: sql sql-server database sql-server-2005 database-connection


    【解决方案1】:

    要找出在 2000/2005 年连接到数据库服务器的进程的名称,您需要运行一个作业,可能每 30 秒或更频繁。该工作必须将结果存储到临时表中,然后添加新的进程名称和数据库,也许还有登录名。这是一个开始:

    创建一个表来积累信息:

    create table DBUsage_accumulate (
        [id] int identity(1,1) NOT NULL,
        [LoginName] SYSNAME NOT NULL,
        HostName SYSNAME NOT NULL,
        DBName SYSNAME NOT NULL,
        CONSTRAINT PK_DBUSAGE_ACCUMULATE PRIMARY KEY CLUSTERED (id asc));
    

    那你需要对这个表有唯一性约束,使用索引:

    CREATE UNIQUE NONCLUSTERED INDEX 
        IX_ACCUMULATE_LOGIN_DB_HOST
    on DBUsage_Accumulate
    (
        LoginName asc
        ,HostName asc
        ,DBName asc
    );
    

    现在您需要定期对 sp_who2 进行检查:

    CREATE TABLE #temp_sp_who2
        (
          SPID INT,
          Status VARCHAR(1000) NULL,
          [LoginName] SYSNAME NULL,
          HostName SYSNAME NULL,
          BlkBy SYSNAME NULL,
          DBName SYSNAME NULL,
          Command VARCHAR(1000) NULL,
          CPUTime INT NULL,
          DiskIO INT NULL,
          LastBatch VARCHAR(1000) NULL,
          ProgramName VARCHAR(1000) NULL,
          SPID2 INT
          --,RequestID INT NULL --comment out for SQL 2000 databases
        )
    
    INSERT  INTO #temp_sp_who2
    EXEC sp_who2;
    
    CREATE TABLE #temp_sp_who2
        (
          SPID INT,
          Status VARCHAR(1000) NULL,
          [LoginName] SYSNAME NULL,
          HostName SYSNAME NULL,
          BlkBy SYSNAME NULL,
          DBName SYSNAME NULL,
          Command VARCHAR(1000) NULL,
          CPUTime INT NULL,
          DiskIO INT NULL,
          LastBatch VARCHAR(1000) NULL,
          ProgramName VARCHAR(1000) NULL,
          SPID2 INT
          --,RequestID INT NULL --comment out for SQL 2000 databases
        )
    
    INSERT  INTO #temp_sp_who2
    EXEC sp_who2;
    
    delete from #temp_sp_who2
    where exists (
        select 1 from DBUsage_accumulate A
        where A.LoginName = #temp_sp_who2.Loginname
        and A.HostName = #temp_sp_who2.hostName
        and A.DBName = #temp_sp_who2.dbname);
    
    insert into DBUsage_accumulate(LoginName,HostName,DBName)
    select 
    distinct 
        LoginName
        ,HostName
        ,dbname
    from #temp_sp_who2
    where [DBName] is not null
    and [HostName] != '  .';
    

    将最后一段 SQL 放入每 5-30 秒运行一次的作业中,将累积所有主机名、数据库名和登录名的列表。您可以使用它来迁移正确的数据库和登录名以及修改客户端计算机中的连接字符串。

    在 2000 年测试。

    【讨论】:

    • 花了将近 15 次尝试才将这个答案输入 Stack Overflow!错误消息“提交答案时发生错误”没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2010-12-17
    • 1970-01-01
    • 2011-03-14
    • 2010-11-12
    相关资源
    最近更新 更多