SQL Server2000在X86的计算机上,只有32位版本,SQL Server2005开始有64位版本,维护命令也开始有很多的不同。本文提到的维护命令,若无特别说明,都以经典64位版本SQL Server2008R2为例。
一、指定某些IP才能使用sa登入数据库。运行下面这段代码就会在【服务器】\【服务器对象(伺服器物件)】\【触发器】下生成tr_connection_limit
CREATE TRIGGER [tr_connection_limit]
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'sa'
AND
(SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)'))
NOT IN('<local machine>','192.168.0.220','192.168.0.221')
ROLLBACK;
END;
二、查找阻塞的连接并将其中止。
- SQL Server2000,打开数据库管理器 — Management — CurrentActivity — Process Info,找到显示为阻塞的进程,将其中止
- SQL Server2008,打开数据库管理器,鼠标右击服务器,活动监视器。直观动态地查看进程情况。
- SQL Server2008,打开数据库管理器,鼠标右击服务器,報表,標準報表,活動-所有進行封鎖交易。查看阻塞进程的信息,并能查看造成阻塞的SQL語句。
- 執行下述SQL語句(幾種語句各有特色),找出阻塞的进程,再用 kill session_id 命令中止該進程。
Select spid,dp.[status],loginame,hostname,blocked,dd.name DBName,cmd as Command,
cpu CPUTime,physical_io,last_batch,[program_name]
From master.dbo.sysprocesses dp
Join master.dbo.sysdatabases dd ON dp.dbid = dd.dbid
ORDER BY DBName,[program_name],hostname
Select session_id,status,last_request_start_time,last_request_end_time,host_name,program_name,
host_process_id,client_version,login_name,cpu_time,total_scheduled_time,total_elapsed_time,
reads,writes,logical_reads,lock_timeout,deadlock_priority,row_count
From sys.dm_exec_sessions
Select * from sys.dm_exec_requests
Select * from sys.dm_tran_locks
三、sp_who2的用法,也能找出加锁阻塞的进程ID。
--查登录账号sa的进程
sp_who2 'sa'
sp_who2 @loginame='sa'
--查会话ID8的进程
sp_who2 8
sp_who2 '8'
sp_who2 [8]
--查当前活动的进程
sp_who2 ACTIVE
sp_who2 'ACTIVE'
sp_who2 [ACTIVE]
四、收缩数据库,针对某数据库的全部文件(mdf 和 ldf),一般用于删除大量记录后释放磁盘空间。
--压缩库【jhERP】并预留5%的未用空间
use [jhERP] DBCC ShrinkDatabase(jhERP,5,NOTRUNCATE);
--截斷資料庫【jhERP】
use [jhERP] DBCC ShrinkDatabase(jhERP,TRUNCATEONLY);
五、收缩数据库数据文件(mdf)或日志文件(ldf)。收缩日志文件是日常维护工作之一,一般由数据库的代理程序排期执行,而数据文件只有在进行了大量记录删除时才执行。收缩数据库文件前,要把恢复模式设成简单。
ALTER DATABASE jhERP SET RECOVERY SIMPLE WITH NO_WAIT
--把tempdb.mdf压缩到150MB
use tempdb dbcc ShrinkFile(tempdev, 150)
--把jhERP.mdf压缩到18000MB
use jhERP dbcc ShrinkFile(jhERP, 18000)
--压缩tempdb的日志
use tempdb dbcc ShrinkFile(templog,0)
--压缩jhERP的日志
use jhERP dbcc ShrinkFile(jhERP_log,0)
use jhVisProd dbcc ShrinkFile(jhVisProd_Log,0)
ALTER DATABASE jhERP SET RECOVERY FULL WITH NO_WAIT
六、把数据库备份到网络内的共享目录,直接覆盖备份目录中的同名文件。
Declare @varDate varchar(60)
Declare @PROD varchar(128)
set @varDate = Convert(varchar(6),getdate(),12)+RIGHT('0'+datename(hour,getdate()),2)+RIGHT('0'+datename(minute,getdate()),2)
set @PROD= '\\192.168.0.168\Databasebackup\jhERP'+@varDate+'.bak'
EXEC master..xp_cmdshell 'net use * /delete /y'
EXEC master..xp_cmdshell 'net use \\192.168.0.168\Databasebackup password /user:192.168.0.168\ErpBacker'
Backup database jhERP to disk = @PROD WITH INIT
七、重建tempdb。停止SQL服务,把tempdb.mdf 和 templog.ldf两个文件移到其它地方,以防失败了重来,启动SQL服务,正常情况下系统会自动重建tempdb数据库。
----有交易明细的物项才更新合计值
Update d1 set d1.OrderedQty=d2.poQty from stItSum d1,
(select itID,HouseID,sum(qtyIng)as poQty from mpReqLine
where mpReqType in('PI','WI') group by itID,HouseID) d2
where d1.itID=d2.itID and d1.HouseID=d2.HouseID
----所有记录都参与更新,没有明细的更新为Null
Update mpReqTable set VendID=(select top 1 d2.VendID from poItPrice d2,vacExchRate d3
where d1.itID=d2.itID and d2.Currency=d3.Currency order by d2.Price*d3.ExchRate)
from mpReqTable d1
八、重建数据库的 ldf 档案。正常卸载的数据库,附加时会自动生成 ldf 档案,如果出现意外,就需要用命令重建。下面例子中,AxStd是数据库名,AxStd_Log.LDF是数据库要重建的日志档名。
sp_Configure 'Allow update',1
go
reconfigure with override
go
update sysdatabases set status=32768 where name='AxStd'
go
sp_dboption 'AxStd','single user','true'
go
dbcc rebuild_log ('AxStd','e:\AxBack\database\AxStd_Log.LDF')
go
dbcc checkdb('AxStd')
go
update sysdatabases set status=28 where name='AxStd'
go
sp_configure 'Allow updates',0
go
reconfigure with override
go
sp_dboption 'AxStd','single user','false'
go
九、查询数据库中各表的大小
SELECT t.NAME AS TableName,p.rows AS RowCounts,SUM(a.data_pages) * 8 AS DataSpaceKB,
SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 255
GROUP BY t.Name, p.Rows
ORDER BY TableName
十、查询当前数据库中表和栏位清单。
select d2.name as TblName,d1.Name as FieldName,d1.Length,d1.type,d1.colid
from sysColumns d1,sysObjects d2
where d1.id=d2.id
order by d2.name,d1.name
十一、查询当前库中各数据表的记录数
Select a.name,a.rows from sysindexes a,sysobjects b where a.name=b.name order by a.rows desc