sqlserver数据库恢复挂起(SQLServer数据库收缩相关知识)
各位老铁们,大家好,今天由我来为大家分享sqlserver数据库恢复挂起,以及SQLServer数据库收缩相关知识的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
如何解决微软sqlserver2005数据库重装不上的各种问题
1、安装过程中提示系统内已经存在实例名的解决办法卸载SQL2005后再重新安装发现卸载不彻底,提示我还占用着我的默认实例名,让我再给一个唯一的实例名 1.用微软自己的删除工具卸载 Windows Install Clean up.下载地址:http://support.microsoft.com/defaul
1、安装过程中提示系统内已经存在实例名的解决办法
卸载SQL2005后再重新安装发现卸载不彻底,提示我还占用着我的默认实例名,让我再给一个唯一的实例名
1.用微软自己的删除工具卸载
Windows Install Clean up.下载地址:http://support.microsoft.com/default.aspx?kbid=290301
2.删除其安装目录
3.注册表中删相关键值
删除C:\Program Files\Microsoft SQL Server这整个文件夹,regedit打开注册表
删除[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server]主键
删除[HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server]主键
重新启动计算机即
2、如果卸载干净系统内的SQL2005
1)添加/删除程序中彻底删除sql server。
2)将没有删除的sql server目录也删除掉。
3)打开注册表编辑器,在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目
删除完
不要马上重启安装完SQL在重新启动否则挂起文件有可能恢复
再遇到安装的问题会继续补充该文章
欢迎大家拍砖
SQL Server实用经验技巧集(1)
此文是Sql Server实用操作小技巧集合包括安装时提示有挂起的操作收缩数据库压缩数据库转移数据库给新用户以已存在用户权限检查备份集修复数据库等(一)挂起操作在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作要求重启这里往往重启无用解决办法到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager删除PendingFileRenameOperations(二)收缩数据库重建索引DBCC REINDEXDBCC INDEXDEFRAG收缩数据和日志DBCC SHRINKDBDBCC SHRINKFILE(三)压缩数据库 dbcc shrinkdatabase(dbname)(四)转移数据库给新用户以已存在用户权限 exec sp_change_users_login update_one newname oldname go(五)检查备份集 RESTORE VERIFYONLY from disk= E:\dvbbs bak(六)修复数据库 ALTER DATABASE [dvbbs] SET SINGLE_USERGODBCC CHECKDB( dvbbs repair_allow_data_loss) WITH TABLOCKGOALTER DATABASE [dvbbs] SET MULTI_USERGO CHECKDB有个参数: REPAIR_ALLOW_DATA_LOSS执行由 REPAIR_REBUILD完成的所有修复包括对行和页进行分配和取消分配以改正分配错误结构行或页的错误以及删除已损坏的文本对象这些修复可能会导致一些数据丢失修复操作可以在用户事务下完成以允许用户回滚所做的更改如果回滚修复则数据库仍会含有错误应该从备份进行恢复如果由于所提供修复等级的缘故遗漏某个错误的修复则将遗漏任何取决于该修复的修复修复完成后备份数据库 REPAIR_FAST进行小的不耗时的修复操作如修复非聚集索引中的附加键这些修复可以很快完成并且不会有丢失数据的危险 REPAIR_REBUILD执行由 REPAIR_FAST完成的所有修复包括需要较长时间的修复(如重建索引)执行这些修复时不会有丢失数据的危险 DBCC CHECKDB( dvbbs) with NO_INFOMSGS PHYSICAL_ONLY SQL SERVER日志清除的两种方法在使用过程中大家经常碰到数据库日志非常大的情况在这里介绍了两种处理方法……方法一一般情况下 SQL数据库的收缩并不能很大程度上减小数据库大小其主要作用是收缩日志大小应当定期进行此操作以免数据库日志过大设置数据库模式为简单模式打开SQL企业管理器在控制台根目录中依次点开Microsoft SQL Server>SQL Server组>双击打开你的服务器>双击打开数据库目录>选择你的数据库名称(如论坛数据库Forum)>然后点击右键选择属性>选择选项>在故障还原的模式中选择简单然后按确定保存在当前数据库上点右键看所有任务中的收缩数据库一般里面的默认设置不用调整直接点确定收缩数据库完成后建议将您的数据库属性重新设置为标准模式操作方法同第一点因为日志在一些异常情况下往往是恢复数据库的重要依据方法二 SET NOCOUNT ONDECLARE@LogicalFileName sysname@MaxMinutes INT@NewSize INTUSE tablename要操作的数据库名SELECT@LogicalFileName= tablename_log日志文件名@MaxMinutes= Limit on time allowed to wrap log@NewSize=你想设定的日志文件的大小(M) Setup/ initializeDECLARE@OriginalSize intSELECT@OriginalSize= sizeFROM sysfilesWHERE name=@LogicalFileNameSELECT Original Size of+ db_name()+ LOG is+CONVERT(VARCHAR()@OriginalSize)+ K pages or+CONVERT(VARCHAR()(@OriginalSize*/))+ MB FROM sysfilesWHERE name=@LogicalFileNameCREATE TABLE DummyTrans(DummyColumn char() not null)DECLARE@Counter INT@StartTime DATETIME@TruncLogVARCHAR()SELECT@StartTime= GETDATE()@TruncLog= BACKUP LOG+ db_name()+ WITH TRUNCATE_ONLY DBCC SHRINKFILE(@LogicalFileName@NewSize)EXEC(@TruncLog) Wrap the log if necessary WHILE@MaxMinutes> DATEDIFF(mi@StartTime GETDATE()) time has not expiredAND@OriginalSize=(SELECT size FROM sysfiles WHERE name=@LogicalFileName)AND(@OriginalSize*/)>@NewSizeBEGIN Outer loop SELECT@Counter= WHILE((@Counter<@OriginalSize/) AND(@Counter<))BEGIN updateINSERT DummyTrans VALUES( Fill Log)DELETE DummyTransSELECT@Counter=@Counter+ ENDEXEC(@TruncLog)ENDSELECT Final Size of+ db_name()+ LOG is+CONVERT(VARCHAR() size)+ K pages or+CONVERT(VARCHAR()(size*/))+ MB FROM sysfilesWHERE name=@LogicalFileNameDROP TABLE DummyTransSET NOCOUNT OFF lishixinzhi/Article/program/SQLServer/201311/22232
SQLServer数据库收缩相关知识
SQL Server数据库采取预先分配空间的方法来建立数据库的数据文件或者日志文件,比如数据文件的空间分配了300MB,而实际上只占用了20MB空间,这样就会造成磁盘存储空间的浪费。可以通过数据库收缩技术对数据库中的每个文件进行收缩,删除已经分配但没有使用的页。从而节省服务器的存储的成本。
官方解释:收缩数据文件通过将数据页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间。在文件末尾创建足够的可用空间后,可以取消对文件末尾的数据页的分配并将它们返回给文件系统。
收缩后的数据库不能小于数据库最初创建时指定的大小。或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)设置的显式大小。
比如:如果数据库最初创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小只能收缩到 10 MB,即使已经删除数据库的所有数据也是如此。
不能在备份数据库时收缩数据库。反之,也不能在数据库执行收缩操作时备份数据库。
介绍:收缩指定数据库中的数据文件大小。
语法格式:
参数说明:
介绍:收缩当前数据库的指定数据或日志文件的大小,或通过将数据从指定的文件移动到相同文件组中的其他文件来清空文件,以允许从数据库中删除该文件。文件大小可以收缩到比创建该文件时所指定的大小更小。这样会将最小文件大小重置为新值。
语法格式:
参数说明:
例如,如果创建一个10MB的文件,然后在文件仍然为空的时候将文件收缩为2 MB,默认文件大小将设置为2 MB。这只适用于永远不会包含数据的空文件。
另附SqlServer常见问题解答
1)管理器不会主动刷新,需要手工刷新一下才能看到最新状态(性能方面的考虑)
2)很少情况下,恢复进程被挂起了。这个时候假设你要恢复并且回到可访问状态,要执行:
RESTORE database dbname with recovery
这使得恢复过程能完全结束。
3)如果你要不断恢复后面的日志文件,的确需要使数据库处于“正在还原状态”,
这通常是执行下面命令:
RESTORE database dbname with norecovery
原来SQL Server对服务器内存的使用策略是用多少内存就占用多少内存,只用在服务器内存不足时,才会释放一点占用的内存,所以SQL Server服务器内存往往会占用很高。我们可以通过DBCC MemoryStatus来查看内存状态。
SQL SERVER运行时会执行两种缓存:
1.数据缓存:执行个查询语句,SQL SERVER会将相关的数据页(SQL SERVER操作的数据都是以页为单位的)加载到内存中来,下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。
2.执行命令缓存:在执行存储过程,自定函数时,SQL SERVER需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。
可以调用以下几个DBCC管理命令来清理这些缓存:
但是,这几个命令虽然会清除掉现有缓存,为新的缓存腾地方,但是Sql server并不会因此释放掉已经占用的内存。SQL SERVER并没有提供任何命令允许我们释放不用到的内存。因此我们只能通过动态调整SQL SERVER可用的物理内存设置来强迫它释放内存。
解决SQLSERVER内存占用过高的方法:
1、清除所有缓存DBCC DROPLEANBUFFERS
2、调整SQLSERVER可使用的最大服务器内存。
在SQL管理器,右击实例名称
在属性实例属性里面找到内存选项
把最大内存改成合适的内存,确定后内存就会被强制释放,然后重启实例。再看看任务管理器,内存使用率就降下来啦。
1、查看连接对象
USE master
GO
--如果要指定数据库就把注释去掉
SELECT* FROM sys.[sysprocesses] WHERE [spid]>50--AND DB_NAME([dbid])='gposdb'
当前连接对象有67个其中‘WINAME’的主机名,‘jTDS’的进程名不属于已知常用软件,找到这台主机并解决连接问题。在360流量防火墙中查看有哪个软件连接了服务器IP,除之。
2、然后使用下面语句看一下各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空。
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS'开始时间',
[status] AS'状态',
[command] AS'命令',
dest.[text] AS'sql语句',
DB_NAME([database_id]) AS'数据库名',
[blocking_session_id] AS'正在阻塞其他会话的会话ID',
[wait_type] AS'等待资源类型',
[wait_time] AS'等待时间',
[wait_resource] AS'等待的资源',
[reads] AS'物理读次数',
[writes] AS'写次数',
[logical_reads] AS'逻辑读次数',
[row_count] AS'返回结果行数'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'
ORDER BY [cpu_time] DESC
查看是哪些SQL语句占用较大可以使用下面代码
--在SSMS里选择以文本格式显示结果
SELECT TOP 10
dest.[text] AS'sql语句'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC
3、如果SQLSERVER存在要等待的资源,那么执行下面语句就会显示出会话中有多少个worker在等待
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS'开始时间',
[status] AS'状态',
[command] AS'命令',
dest.[text] AS'sql语句',
DB_NAME([database_id]) AS'数据库名',
[blocking_session_id] AS'正在阻塞其他会话的会话ID',
der.[wait_type] AS'等待资源类型',
[wait_time] AS'等待时间',
[wait_resource] AS'等待的资源',
[dows].[waiting_tasks_count] AS'当前正在进行等待的任务数',
[reads] AS'物理读次数',
[writes] AS'写次数',
[logical_reads] AS'逻辑读次数',
[row_count] AS'返回结果行数'
FROM sys.[dm_exec_requests] AS der
INNER JOIN [sys].[dm_os_wait_stats] AS dows
ON der.[wait_type]=[dows].[wait_type]
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC;
4、查询CPU占用最高的SQL语句
SELECT TOP 10
total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_offset/2+ 1,
(CASE WHEN statement_end_offset=-1
THEN LEN(CONVERT(nvarchar(max), text))* 2
ELSE statement_end_offset
END- statement_start_offset)/2)
FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC;
5、索引缺失查询
SELECT
DatabaseName= DB_NAME(database_id)
,[Number Indexes Missing]= count(*)
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)
ORDER BY 2 DESC;
SELECT TOP 10
[Total Cost]= ROUND(avg_total_user_cost* avg_user_impact*(user_seeks+ user_scans),0)
, avg_user_impact
, TableName= statement
, [EqualityUsage]= equality_columns
, [InequalityUsage]= inequality_columns
, [Include Cloumns]= included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle= g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle= g.index_handle
ORDER BY [Total Cost] DESC;
找到索引缺失的表,根据查询结果中的关键次逐一建立索引。
如果你还想了解更多这方面的信息,记得收藏关注本站。