例28.1 查看数据库所在机器操作系统参数(xp_msver)
查看数据库所在机器操作系统参数的存储过程如下
EXEC master..xp_msver
例28.2 查看当前数据库服务器名(xp_getnetname、HOST_NAME())
EXEC master..xp_getnetname
或者:
SELECT HOST_NAME()
例28.3 查看服务器上所有Windows本地组(xp_enumgroups)
查看服务器上所有Windows本地组的存储过程如下
EXEC master..xp_enumgroups
例28.4 查看服务器上安装的所有代码页(xp_enumcodepages)
查看服务器上安装的所有代码页的存储过程如下
EXEC master..xp_enumcodepages
嘿嘿,是不是报没开启错误啊~~没错误略过
先执行下面语句
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
RECONFIGURE
EXEC sp_configure 'Web Assistant Procedures',1
RECONFIGURE
EXEC sp_configure
例28.5 查看指定目录的所有下一级子目录(xp_subdirs)
查看C:\WINDOWS\Drivers目录所有下一级子目录的存储过程如下
EXEC [master].[dbo].[xp_subdirs] 'C:\WINDOWS\Drivers'
查看磁盘信息的存储过程如下
EXEC [master].[dbo].[xp_availablemedia]
或者采用下列语句
EXEC master..xp_fixeddrives
请注意:其中,low free为以字节为单位的空闲空间,media type为驱动器类型,软驱为1,硬盘为2,CD-ROM为8。
例28.8 查看硬盘文件信息(xp_dirtree)
查看C盘文件信息的存储过程如下
EXEC master..xp_dirtree 'c:'
查看C盘深度为1的文件信息的存储过程如下
EXEC master..xp_dirtree 'c:',1
查看C盘深度为1、是否为的信息的存储过程如下
EXEC master..xp_dirtree 'c:',1,1
查看“C:\WINDOWS\Web”目录中的文件信息的存储过程如下
EXEC master..xp_dirtree 'C:\WINDOWS\Web'
例28.9 查看服务器提供的OLEDB程序(xp_enum_oledb_providers)
查看服务器提供的OLEDB程序的存储过程如下
EXEC master..xp_enum_oledb_providers
例28.10 查看数据库服务名(@@SERVERNAME)
print 'SQL Server数据库服务名: ' +
convert(varchar(30),@@SERVERNAME)
查看结果如下:
SQL Server数据库服务名: SZX\SQLS2008
例28.11 查看数据库实例名(@@SERVICENAME)
PRINT 'SQL Server数据库实例名: ' +
convert(varchar(30),@@SERVICENAME)
查看结果如下:
SQL Server数据库实例名: MSSQLSERVER
例28.12 查看DBMS数据库的版本(@@version、sp_msgetversion)
查看DBMS版本的命令如下
SELECT @@version SQL_Server版本
或者
EXEC master..sp_msgetversion
例28.13 查看数据库配置参数(sp_configure)
查看数据库配置参数的存储过程如下
EXEC sp_configure
例28.14 查看所有数据库名称、容量等信息(sp_helpdb、sp_databases)
sp_helpdb
或sp_databases
查看单个数据库的容量:如sql92_exam_xjgl
sp_helpdb sql92_exam_xjgl
例28.15 查看所有数据库名称及大小(sp_helpdb)
查看所有数据库名称及大小的存储过程如下
EXEC sp_helpdb
例28.16 修改数据库的名称(sp_renamedb)
EXEC sp_renamedb 'old_dbname', 'new_dbname'
例28.17 查看当前数据库的启动时间(sysprocesses)
SELECT convert(varchar(30),login_time,120)启动时间
FROM master..sysprocesses
WHERE spid=1
例28.18 查看当前数据库文件路径等信息(sp_helpfile)
sp_helpfile
例28.19 查看AdventureWorks数据库文件路径(sysfiles)
SELECT ltrim(rtrim(filename))
FROM AdventureWorks..sysfiles
WHERE charindex('MDF',filename)>0
查看结果如下:
C:\Program Files\Microsoft SQL Server\100\Tools\Samples\
AdventureWorks_Data.mdf
例28.20 查看当前数据库文件组名(sp_helpfilegroup)
sp_helpfilegroup
例28.21 查看当前数据库中所有的存储过程(sysobjects)
查看当前数据库中所有存储过程的命令如下
SELECT name as存储过程名称FROM sysobjects WHERE xtype='P'
例28.22 查看数据库里所有的存储过程和函数(sp_stored_procedures)
查看某个数据库里所有存储过程和函数的命令如下
use AdventureWorks
GO
EXEC sp_stored_procedures
例28.23 查看所有数据库日志文件大小(dbcc sqlperf())
查看所有数据库日志文件大小的命令如下
dbcc sqlperf(logspace)
例28.24 查看SQL Server错误日志(xp_enumerrorlogs、xp_readerrorlog)
(1)查看SQL Server错误日志信息
EXEC master..xp_enumerrorlogs
(2)查看当前错误日志具体内容
EXEC [master].[dbo].[xp_readerrorlog]
例28.25 查看数据库角色信息(sp_helpRole)
查看数据库角色信息的存储过程如下
EXEC sp_helpRole
例28.26 查看所有数据库用户所属的角色信息(sp_helpsrvrolemember)
查看所有数据库用户所属角色信息的存储过程如下
EXEC sp_helpsrvrolemember
例28.27 查看角色成员用户信息(sp_helpRoleMember)
查看角色成员用户信息的存储过程如下
EXEC sp_helpRoleMember 'db_owner'
例28.28 查看当前数据库所有用户信息(sp_helpUser)
查看数据库用户信息的存储过程如下
EXEC sp_helplogins
例28.29 查看本地数据库用户登录信息(sp_helplogins)
查看本地数据库用户登录信息的存储过程如下
EXEC sp_helplogins
例28.30 查看远端数据库用户登录信息(sp_helpremotelogin )
查看远端数据库用户登录信息的存储过程如下
EXEC sp_helpremotelogin
例28.31 查看链接服务器的登录信息(sp_helplinkedsrvlogin)
查看链接服务器信息的存储过程如下
EXEC sp_helplinkedsrvlogin
例28.32 将用户账户添加到数据库中(sp_grantdbaccess)
将guest用户账户添加到数据库中的命令如下:
USE sql92_exam_xjgl
GO
EXEC sp_grantdbaccess guest
例28.33 查看数据库下对象级用户权限(sp_helprotect)
查看数据库下对象级用户权限的存储过程如下
EXEC sp_helprotect
例28.34 获得当前数据库所有用户表的名称(sysobjects)
获得当前数据库所有用户表名称的命令如下
SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0
例28.36 查询单个用户创建的所有数据库(sysdatabases)
查询sa用户创建的所有数据库的命令如下
SELECT name,dbid,filename
FROM master..sysdatabases D
WHERE sid not in(SELECT sid FROM master..syslogins WHERE name='sa')
或者通过以下命令实现:
SELECT dbid, name AS DB_NAME,filename
FROM master..sysdatabases
WHERE sid <> 0x01
例28.37 查看一个表上相关的对象(sysobjects、syscomments)
查询一个表上相关对象的命令如下
SELECT a.* FROM sysobjects a, syscomments b
WHERE a.id = b.id and b.text like '%teacher%'
例28.38 获取某一个表的所有字段(syscolumns、sp_mshelpcolumns)
获取某一个表的所有字段的命令如下
SELECT name FROM syscolumns WHERE id=object_id('teacher')
或者通过以下存储过程实现
EXEC sp_mshelpcolumns 'teacher'
例28.39 获得指定表上所有的索引名称(sysindexes)
通过系统表sysindexes获得指定表上所有索引名称的命令如下
SELECT name FROM sysindexes
WHERE id = OBJECT_ID ('dept') AND indid > 0
例28.40 查询某一个表的字段和数据类型(information_schema.columns)
查询某一个表的字段和数据类型的命令如下
SELECT column_name,data_type
FROM information_schema.columns
WHERE table_name = N'teacher'
例28.41 获取某一个表的基本信息(sp_MShelpcolumns)
获取某一个表的基本信息的存储过程如下
EXEC sp_MShelpcolumns N'teacher'
例28.42 获取某一个表的主键、外键信息(sp_pkeys、sp_fkeys)
获取表teacher的主键信息的存储过程如下
EXEC sp_pkeys N'teacher'
获取表teacher的外键信息的存储过程如下:
EXEC sp_fkeys N'teacher'
例28.43 判断某一个表是否存在某一字段(syscolumns)
通过系统表syscolumn判断某一个表是否存在某一字段的命令如下:
if exists(SELECT 1 FROM syscolumns
WHERE id=object_id(N'teacher') and name=N'tname')
print N'存在'
else
print N'不存在'
例28.44 查看单个存储过程和函数的源代码(sp_helptext)
查看单个存储过程和函数源代码的存储过程如下
USE AdventureWorks
GO
EXEC sp_helptext 'dbo.uspLogError'
例28.45 查看数据库里用户和进程的信息(sp_who)
(1)查看数据库里用户和进程信息
EXEC sp_who
其中,spid是进程编号,进程号1--50是SQL Server系统内部用的,进程号大于50的是用户的连接进程。
(2)查看活动用户和进程信息的存储过程如下
EXEC sp_who 'active'
例28.46 清除sleeping进程(Kill__Sleeping_Processes)
Sleeping进程是系统中处于睡眠状态尚未活动的进程,这部分进程可以杀掉。
CREATE PROCEDURE dbo.Kill__Sleeping_Processes @dbname varchar(50)
AS
BEGIN
SET NOCOUNT ON
DECLARE @spid INT,
@cnt INT,
@sql VARCHAR(255)
SELECT @spid = MIN(spid),@cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname) AND spid != @@SPID AND status = 'sleeping'
WHILE @spid IS NOT NULL
BEGIN
SET @sql = 'KILL ' + RTRIM(@spid)
EXEC ( @sql )
SELECT @spid = MIN(spid),@cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname) AND spid != @@SPID AND status = 'sleeping'
END
END
GO
运行改存储过程后杀掉sleeping进程:
Kill__Sleeping_Processes SQLS2008
清除前后可以用EXEC sp_who 'active '进行查看。
例28.47 查看进程正在执行的SQL语句(dbcc inputbuffer ())
查看进程正在执行的SQL语句:dbcc inputbuffer (spid)
其中spid是用sp_who查询出来的spid号,如:56。
查看56号进程正在执行的SQL语句实例如下
dbcc inputbuffer (56)
例28.48 查看数据库锁(sp_lock)
查看SQL Server数据库里锁的情况的存储过程如下
EXEC sp_lock
其中,spid是进程编号,dbid是数据库编号,Objid是数据对象编号。
例28.49 查看数据库死锁的进程(proc_who_lock)
用proc_ find _lock过程查看数据库死锁的进程。
if exists (SELECT *
FROM dbo.sysobjects
WHERE id = object_id(N'[dbo].[proc_find_lock]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_find_lock]
GO
use master
go
create procedure proc_find_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #temp_lock (
id int identity(1,1),
spid smallint,
bl smallint)
IF @@ERROR<>0 RETURN @@ERROR
insert into #temp_lock(spid,bl)
SELECT 0 ,blocked
FROM (SELECT * FROM sysprocesses WHERE blocked>0 ) a
WHERE not exists(SELECT *
FROM (SELECT *
FROM sysprocesses
WHERE blocked>0 ) b
WHERE a.blocked=spid)
union SELECT spid,blocked
FROM sysprocesses
WHERE blocked>0
IF @@ERROR<>0 RETURN @@ERROR
SELECT @intCountProperties = Count(*),@intCounter = 1 --找到临时表的记录数
FROM #temp_lock
IF @@ERROR<>0 RETURN @@ERROR
if @intCountProperties=0
SELECT '没有阻塞和死锁信息' as 提示
while @intCounter <= @intCountProperties
begin
SELECT @spid = spid,@bl = bl
FROM #temp_lock WHERE Id = @intCounter
begin
if @spid =0
SELECT '引起数据库死锁的进程号是: '+ CAST(@bl AS VARCHAR(10))
+ ',其执行的SQL语句为:'
else
SELECT '进程号SPID:'+ CAST(@spid AS VARCHAR(10))
+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10))
+'阻塞,其当前进程执行的SQL语句为:'
DBCC INPUTBUFFER (@bl )
end
set @intCounter = @intCounter + 1
end
drop table #temp_lock
return 0
end
运行过程proc_find_lock
proc_find_lock
例28.50 备份当前数据库(backup database)
(1)完全备份
declare @a sysname,@s nvarchar(4000)
SELECT @a=db_name(),@s='e:\sql_db_bak_full' backup database @a to disk=@s WITH format
已为数据库'sql92_exam_xjgl',文件'sql92_example'(位于文件1上)处理了240页。
已为数据库'sql92_exam_xjgl',文件'sql92_example_log'(位于文件1上)处理了1页。
BACKUP DATABASE成功处理了241页,花费0.101秒(19.547 MB/秒)。
(2)差异备份
declare @a sysname,@s nvarchar(4000)
SELECT @a=db_name(),@s='e:\sql_db_bak_diff' backup database @a to disk=@s WITH DIFFERENTIAL,format
已为数据库'sql92_exam_xjgl',文件'sql92_example' (位于文件1上)处理了40页。
已为数据库'sql92_exam_xjgl',文件'sql92_example_log' (位于文件1上)处理了1页。
BACKUP DATABASE WITH DIFFERENTIAL成功处理了41页,花费0.095秒(3.530 MB/秒)。
差异备份要在至少有一次完全备份成功之后才能实施,否则出错。
例28.51 从磁带中恢复完整的数据库备份
从磁带中恢复sql92_exam_xjgl的完整数据库备份。
USE master
GO
RESTORE DATABASE sql92_exam_xjgl
FROM TAPE = '\\.\Tape0'
GO
例28.52 在脱机状态下进行数据库备份和恢复
在脱机状态下对sql92_exam_xjgl数据库进行备份和恢复。
步骤如下:
卸载需要进行备份恢复的sql92_exam_xjgl数据库。
在master数据库下新建下列查询分析语句:
Sp_detach_db 'sql92_exam_xjgl'
运行结果为:命令已成功完成。
复制sql92_exam_xjgl 库的sql92_example.mdf文件和sql92_example_log.ldf文件到E:\下。
启动数据库服务器进行恢复。
sp_attach_db 'sql92_exam_xjgl',
'E:\sql92_example.mdf', 'E:\sql92_example_log.ldf'
运行结果为:命令已成功完成。
当恢复单个mdf文件采用下列语句:
sp_attach_single_file_db 'sql92_exam_xjgl','E:\sql92_example.mdf''
查看数据库所在机器操作系统参数的存储过程如下
EXEC master..xp_msver
例28.2 查看当前数据库服务器名(xp_getnetname、HOST_NAME())
EXEC master..xp_getnetname
或者:
SELECT HOST_NAME()
例28.3 查看服务器上所有Windows本地组(xp_enumgroups)
查看服务器上所有Windows本地组的存储过程如下
EXEC master..xp_enumgroups
例28.4 查看服务器上安装的所有代码页(xp_enumcodepages)
查看服务器上安装的所有代码页的存储过程如下
EXEC master..xp_enumcodepages
嘿嘿,是不是报没开启错误啊~~没错误略过
先执行下面语句
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
RECONFIGURE
EXEC sp_configure 'Web Assistant Procedures',1
RECONFIGURE
EXEC sp_configure
例28.5 查看指定目录的所有下一级子目录(xp_subdirs)
查看C:\WINDOWS\Drivers目录所有下一级子目录的存储过程如下
EXEC [master].[dbo].[xp_subdirs] 'C:\WINDOWS\Drivers'
查看磁盘信息的存储过程如下
EXEC [master].[dbo].[xp_availablemedia]
或者采用下列语句
EXEC master..xp_fixeddrives
请注意:其中,low free为以字节为单位的空闲空间,media type为驱动器类型,软驱为1,硬盘为2,CD-ROM为8。
例28.8 查看硬盘文件信息(xp_dirtree)
查看C盘文件信息的存储过程如下
EXEC master..xp_dirtree 'c:'
查看C盘深度为1的文件信息的存储过程如下
EXEC master..xp_dirtree 'c:',1
查看C盘深度为1、是否为的信息的存储过程如下
EXEC master..xp_dirtree 'c:',1,1
查看“C:\WINDOWS\Web”目录中的文件信息的存储过程如下
EXEC master..xp_dirtree 'C:\WINDOWS\Web'
例28.9 查看服务器提供的OLEDB程序(xp_enum_oledb_providers)
查看服务器提供的OLEDB程序的存储过程如下
EXEC master..xp_enum_oledb_providers
例28.10 查看数据库服务名(@@SERVERNAME)
print 'SQL Server数据库服务名: ' +
convert(varchar(30),@@SERVERNAME)
查看结果如下:
SQL Server数据库服务名: SZX\SQLS2008
例28.11 查看数据库实例名(@@SERVICENAME)
PRINT 'SQL Server数据库实例名: ' +
convert(varchar(30),@@SERVICENAME)
查看结果如下:
SQL Server数据库实例名: MSSQLSERVER
例28.12 查看DBMS数据库的版本(@@version、sp_msgetversion)
查看DBMS版本的命令如下
SELECT @@version SQL_Server版本
或者
EXEC master..sp_msgetversion
例28.13 查看数据库配置参数(sp_configure)
查看数据库配置参数的存储过程如下
EXEC sp_configure
例28.14 查看所有数据库名称、容量等信息(sp_helpdb、sp_databases)
sp_helpdb
或sp_databases
查看单个数据库的容量:如sql92_exam_xjgl
sp_helpdb sql92_exam_xjgl
例28.15 查看所有数据库名称及大小(sp_helpdb)
查看所有数据库名称及大小的存储过程如下
EXEC sp_helpdb
例28.16 修改数据库的名称(sp_renamedb)
EXEC sp_renamedb 'old_dbname', 'new_dbname'
例28.17 查看当前数据库的启动时间(sysprocesses)
SELECT convert(varchar(30),login_time,120)启动时间
FROM master..sysprocesses
WHERE spid=1
例28.18 查看当前数据库文件路径等信息(sp_helpfile)
sp_helpfile
例28.19 查看AdventureWorks数据库文件路径(sysfiles)
SELECT ltrim(rtrim(filename))
FROM AdventureWorks..sysfiles
WHERE charindex('MDF',filename)>0
查看结果如下:
C:\Program Files\Microsoft SQL Server\100\Tools\Samples\
AdventureWorks_Data.mdf
例28.20 查看当前数据库文件组名(sp_helpfilegroup)
sp_helpfilegroup
例28.21 查看当前数据库中所有的存储过程(sysobjects)
查看当前数据库中所有存储过程的命令如下
SELECT name as存储过程名称FROM sysobjects WHERE xtype='P'
例28.22 查看数据库里所有的存储过程和函数(sp_stored_procedures)
查看某个数据库里所有存储过程和函数的命令如下
use AdventureWorks
GO
EXEC sp_stored_procedures
例28.23 查看所有数据库日志文件大小(dbcc sqlperf())
查看所有数据库日志文件大小的命令如下
dbcc sqlperf(logspace)
例28.24 查看SQL Server错误日志(xp_enumerrorlogs、xp_readerrorlog)
(1)查看SQL Server错误日志信息
EXEC master..xp_enumerrorlogs
(2)查看当前错误日志具体内容
EXEC [master].[dbo].[xp_readerrorlog]
例28.25 查看数据库角色信息(sp_helpRole)
查看数据库角色信息的存储过程如下
EXEC sp_helpRole
例28.26 查看所有数据库用户所属的角色信息(sp_helpsrvrolemember)
查看所有数据库用户所属角色信息的存储过程如下
EXEC sp_helpsrvrolemember
例28.27 查看角色成员用户信息(sp_helpRoleMember)
查看角色成员用户信息的存储过程如下
EXEC sp_helpRoleMember 'db_owner'
例28.28 查看当前数据库所有用户信息(sp_helpUser)
查看数据库用户信息的存储过程如下
EXEC sp_helplogins
例28.29 查看本地数据库用户登录信息(sp_helplogins)
查看本地数据库用户登录信息的存储过程如下
EXEC sp_helplogins
例28.30 查看远端数据库用户登录信息(sp_helpremotelogin )
查看远端数据库用户登录信息的存储过程如下
EXEC sp_helpremotelogin
例28.31 查看链接服务器的登录信息(sp_helplinkedsrvlogin)
查看链接服务器信息的存储过程如下
EXEC sp_helplinkedsrvlogin
例28.32 将用户账户添加到数据库中(sp_grantdbaccess)
将guest用户账户添加到数据库中的命令如下:
USE sql92_exam_xjgl
GO
EXEC sp_grantdbaccess guest
例28.33 查看数据库下对象级用户权限(sp_helprotect)
查看数据库下对象级用户权限的存储过程如下
EXEC sp_helprotect
例28.34 获得当前数据库所有用户表的名称(sysobjects)
获得当前数据库所有用户表名称的命令如下
SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0
例28.36 查询单个用户创建的所有数据库(sysdatabases)
查询sa用户创建的所有数据库的命令如下
SELECT name,dbid,filename
FROM master..sysdatabases D
WHERE sid not in(SELECT sid FROM master..syslogins WHERE name='sa')
或者通过以下命令实现:
SELECT dbid, name AS DB_NAME,filename
FROM master..sysdatabases
WHERE sid <> 0x01
例28.37 查看一个表上相关的对象(sysobjects、syscomments)
查询一个表上相关对象的命令如下
SELECT a.* FROM sysobjects a, syscomments b
WHERE a.id = b.id and b.text like '%teacher%'
例28.38 获取某一个表的所有字段(syscolumns、sp_mshelpcolumns)
获取某一个表的所有字段的命令如下
SELECT name FROM syscolumns WHERE id=object_id('teacher')
或者通过以下存储过程实现
EXEC sp_mshelpcolumns 'teacher'
例28.39 获得指定表上所有的索引名称(sysindexes)
通过系统表sysindexes获得指定表上所有索引名称的命令如下
SELECT name FROM sysindexes
WHERE id = OBJECT_ID ('dept') AND indid > 0
例28.40 查询某一个表的字段和数据类型(information_schema.columns)
查询某一个表的字段和数据类型的命令如下
SELECT column_name,data_type
FROM information_schema.columns
WHERE table_name = N'teacher'
例28.41 获取某一个表的基本信息(sp_MShelpcolumns)
获取某一个表的基本信息的存储过程如下
EXEC sp_MShelpcolumns N'teacher'
例28.42 获取某一个表的主键、外键信息(sp_pkeys、sp_fkeys)
获取表teacher的主键信息的存储过程如下
EXEC sp_pkeys N'teacher'
获取表teacher的外键信息的存储过程如下:
EXEC sp_fkeys N'teacher'
例28.43 判断某一个表是否存在某一字段(syscolumns)
通过系统表syscolumn判断某一个表是否存在某一字段的命令如下:
if exists(SELECT 1 FROM syscolumns
WHERE id=object_id(N'teacher') and name=N'tname')
print N'存在'
else
print N'不存在'
例28.44 查看单个存储过程和函数的源代码(sp_helptext)
查看单个存储过程和函数源代码的存储过程如下
USE AdventureWorks
GO
EXEC sp_helptext 'dbo.uspLogError'
例28.45 查看数据库里用户和进程的信息(sp_who)
(1)查看数据库里用户和进程信息
EXEC sp_who
其中,spid是进程编号,进程号1--50是SQL Server系统内部用的,进程号大于50的是用户的连接进程。
(2)查看活动用户和进程信息的存储过程如下
EXEC sp_who 'active'
例28.46 清除sleeping进程(Kill__Sleeping_Processes)
Sleeping进程是系统中处于睡眠状态尚未活动的进程,这部分进程可以杀掉。
CREATE PROCEDURE dbo.Kill__Sleeping_Processes @dbname varchar(50)
AS
BEGIN
SET NOCOUNT ON
DECLARE @spid INT,
@cnt INT,
@sql VARCHAR(255)
SELECT @spid = MIN(spid),@cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname) AND spid != @@SPID AND status = 'sleeping'
WHILE @spid IS NOT NULL
BEGIN
SET @sql = 'KILL ' + RTRIM(@spid)
EXEC ( @sql )
SELECT @spid = MIN(spid),@cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname) AND spid != @@SPID AND status = 'sleeping'
END
END
GO
运行改存储过程后杀掉sleeping进程:
Kill__Sleeping_Processes SQLS2008
清除前后可以用EXEC sp_who 'active '进行查看。
例28.47 查看进程正在执行的SQL语句(dbcc inputbuffer ())
查看进程正在执行的SQL语句:dbcc inputbuffer (spid)
其中spid是用sp_who查询出来的spid号,如:56。
查看56号进程正在执行的SQL语句实例如下
dbcc inputbuffer (56)
例28.48 查看数据库锁(sp_lock)
查看SQL Server数据库里锁的情况的存储过程如下
EXEC sp_lock
其中,spid是进程编号,dbid是数据库编号,Objid是数据对象编号。
例28.49 查看数据库死锁的进程(proc_who_lock)
用proc_ find _lock过程查看数据库死锁的进程。
if exists (SELECT *
FROM dbo.sysobjects
WHERE id = object_id(N'[dbo].[proc_find_lock]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_find_lock]
GO
use master
go
create procedure proc_find_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #temp_lock (
id int identity(1,1),
spid smallint,
bl smallint)
IF @@ERROR<>0 RETURN @@ERROR
insert into #temp_lock(spid,bl)
SELECT 0 ,blocked
FROM (SELECT * FROM sysprocesses WHERE blocked>0 ) a
WHERE not exists(SELECT *
FROM (SELECT *
FROM sysprocesses
WHERE blocked>0 ) b
WHERE a.blocked=spid)
union SELECT spid,blocked
FROM sysprocesses
WHERE blocked>0
IF @@ERROR<>0 RETURN @@ERROR
SELECT @intCountProperties = Count(*),@intCounter = 1 --找到临时表的记录数
FROM #temp_lock
IF @@ERROR<>0 RETURN @@ERROR
if @intCountProperties=0
SELECT '没有阻塞和死锁信息' as 提示
while @intCounter <= @intCountProperties
begin
SELECT @spid = spid,@bl = bl
FROM #temp_lock WHERE Id = @intCounter
begin
if @spid =0
SELECT '引起数据库死锁的进程号是: '+ CAST(@bl AS VARCHAR(10))
+ ',其执行的SQL语句为:'
else
SELECT '进程号SPID:'+ CAST(@spid AS VARCHAR(10))
+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10))
+'阻塞,其当前进程执行的SQL语句为:'
DBCC INPUTBUFFER (@bl )
end
set @intCounter = @intCounter + 1
end
drop table #temp_lock
return 0
end
运行过程proc_find_lock
proc_find_lock
例28.50 备份当前数据库(backup database)
(1)完全备份
declare @a sysname,@s nvarchar(4000)
SELECT @a=db_name(),@s='e:\sql_db_bak_full' backup database @a to disk=@s WITH format
已为数据库'sql92_exam_xjgl',文件'sql92_example'(位于文件1上)处理了240页。
已为数据库'sql92_exam_xjgl',文件'sql92_example_log'(位于文件1上)处理了1页。
BACKUP DATABASE成功处理了241页,花费0.101秒(19.547 MB/秒)。
(2)差异备份
declare @a sysname,@s nvarchar(4000)
SELECT @a=db_name(),@s='e:\sql_db_bak_diff' backup database @a to disk=@s WITH DIFFERENTIAL,format
已为数据库'sql92_exam_xjgl',文件'sql92_example' (位于文件1上)处理了40页。
已为数据库'sql92_exam_xjgl',文件'sql92_example_log' (位于文件1上)处理了1页。
BACKUP DATABASE WITH DIFFERENTIAL成功处理了41页,花费0.095秒(3.530 MB/秒)。
差异备份要在至少有一次完全备份成功之后才能实施,否则出错。
例28.51 从磁带中恢复完整的数据库备份
从磁带中恢复sql92_exam_xjgl的完整数据库备份。
USE master
GO
RESTORE DATABASE sql92_exam_xjgl
FROM TAPE = '\\.\Tape0'
GO
例28.52 在脱机状态下进行数据库备份和恢复
在脱机状态下对sql92_exam_xjgl数据库进行备份和恢复。
步骤如下:
卸载需要进行备份恢复的sql92_exam_xjgl数据库。
在master数据库下新建下列查询分析语句:
Sp_detach_db 'sql92_exam_xjgl'
运行结果为:命令已成功完成。
复制sql92_exam_xjgl 库的sql92_example.mdf文件和sql92_example_log.ldf文件到E:\下。
启动数据库服务器进行恢复。
sp_attach_db 'sql92_exam_xjgl',
'E:\sql92_example.mdf', 'E:\sql92_example_log.ldf'
运行结果为:命令已成功完成。
当恢复单个mdf文件采用下列语句:
sp_attach_single_file_db 'sql92_exam_xjgl','E:\sql92_example.mdf''