我想将SQL 2000/2005上托管的一些数据库迁移到SQL 2014,我没有直接访问数据库,我想知道连接到它的所有应用程序和连接细节。有没有最好的方法来获取这些信息?我尝试使用数据库分析但不允许这样做,因为它占用了托管数据库服务器上的大量空间,导致中断。
任何更好的方式,如SQL语句或远程连接监视都会有所帮助。
提前感谢您的帮助。
答案 0 :(得分:0)
要查找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年测试。