我们的项目在前端展示时用到了Sql Server数据库,这篇文章整理了一下日常使用和维护中用到的一些命令和方法。
1.重建表索引,提升访问速度
数据量比较大的表,如果进行了较多的插入修改等操作,则需要重建索引。
alter index all on st_kpi_day reorganize; --不影响在线用户的访问,但很慢
alter index all on st_kpi_day rebuild; --要锁表!!!
2.查看数据库有多少连接
exec sp_who
exec sp_who2
--sql server 2000 保留从 1 到 50 的 spid 值以便内部使用,而 51 或更大的 spid 值则代表用户会话。
--那个status里的sleeping是连接的用户没有操作数据,但保持连接,无活动状态
3.清除日志及收缩数据库,释放磁盘空间
backup log DataBaseName with NO_LOG
backup log DataBaseName with TRUNCATE_ONLY
DBCC SHRINKDATABASE(DataBaseName)
解析:
NO_LOG | TRUNCATE_ONLY
无须备份复制日志即删除不活动的日志部分,并且截断日志。该选项会释放空间。因为并不保存日志备份,所以没有必要指定备份设备。NO_LOG 和 TRUNCATE_ONLY 是同义的
NO_TRUNCATE
允许在数据库损坏时备份日志
第一步:
backup log database_name with no_log
或者 backup log database_name with truncate_only --no_log和truncate_only是在这里是同义的,随便执行哪一句都可以
第二步:
1.收缩特定数据库的所有数据和日志文件,执行 dbcc shrinkdatabase (database_name,[,target_percent])--database_name是要收缩的数据库名称;target_percent是数据库收缩后的数据库文件中所要的剩余可用空间百分比
2.收缩一次一个特定数据库中的数据或日志文件,执行 dbcc shrinkfile(file_id,[,target_size]) --file_id是要收缩的文件的标识 (ID) 号,若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles;target_size是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,dbcc shrinkfile 将文件大小减少到默认文件大小
两个dbcc都可以带上参数notruncate或truncateonly,具体意思看帮助。
4.恢复可疑数据库
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
GO
ALTER DATABASE cqcrm20 SET EMERGENCY
GO
sp_dboption 'cqcrm20', 'single user', 'true'
GO
DBCC CHECKDB('cqcrm20','REPAIR_ALLOW_DATA_LOSS')
GO
ALTER DATABASE cqcrm20 SET ONLINE
GO
sp_configure 'allow updates', 0 reconfigure with override
GO
sp_dboption 'cqcrm20', 'single user', 'false'
GO
5、链接服务器
exec sp_addlinkedserver 'link123','','SQLOLEDB','10.191.123.123,14123'
exec sp_addlinkedsrvlogin 'link123','false',null,'账号','密码'
Select count(*) From link123.cqcrm20.dbo.st_kpi_day where op_time='2009-09-02'
上述三行语句分别是连接服务器的创建、登录和使用示例。
6、简单统计SQLSERVER用户数据表大小(包括记录总数和空间占用情况)
create table #t(name varchar(255), rows bigint, reserved varchar(20), data varchar(20), index_size varchar(20), unused varchar(20))
exec sp_MSforeachtable "insert into #t exec sp_spaceused '?'"
select * from #t
drop table #t
7、使用游标
declare @roleid int;
declare @menuid int;
declare mycursor cursor for select role_id,resource_id from bqy_roleright where role_id in (52092,52093,52094,52095,52096,52097,52098);
OPEN mycursor
FETCH NEXT FROM mycursor INTO @roleid,@menuid
WHILE @@fetch_status = 0
BEGIN
IF @@fetch_status = -2
CONTINUE
begin transaction
...
commit transaction
FETCH NEXT FROM mycursor INTO @roleid,@menuid
END
DEALLOCATE mycursor
8、分布式事务的配置(MSDTC设置)
管理工具―组件服务―计算机―我的电脑(右键)―MSDTC―安全配置
在安全配置窗口中做如下设置:
a.选中“网络DTC访问”
b.在客户端管理中选中“允许远程客户端”“允许远程管理”
c.在事务管理通讯中选“允许入站”“允许出站”“不要求进行证”