有没有办法找出DBCC SHRINKFILE
语句的进度?
这是我运行它的方式
dbcc 收缩文件('main_data',250000)
我在 SQL Server 2005 和 2008 上运行上述语句。
[更新] 这是我为了检查进度和正在运行的文本而运行的查询。
select T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
, R.cpu_time, R.total_elapsed_time, R.percent_complete
from sys.dm_exec_requests R
cross apply sys.dm_exec_sql_text(R.sql_handle) T
Run Code Online (Sandbox Code Playgroud) 我设置了三个维护计划以在 Sql Server 2005 实例上运行:
每小时的日志备份通常在几百 Kb 到 10Mb 之间,具体取决于活动水平,每日差异通常在周末增加到 250Mb 左右,每周备份约为 3.5Gb。
我遇到的问题是完整备份之前的优化似乎导致下一个事务日志备份在恢复正常之前增长到完整备份大小的 2 倍以上,在本例中为 8Gb。
除此之外BACKUP LOG <DatabaseName> WITH TRUNCATE_ONLY
,是否有任何方法可以减少该日志备份的大小,或者完全防止将优化记录在事务日志中,因为它们肯定会在它们之前的完整备份中被考虑在内?
我正在尝试在单个排序规则上标准化所有数据库 - Latin1_General_CI_AS(标准排序规则)。我有一些数据库位于 SQL_Latin1_General_CP1_CI_AS 中。
我知道我可以使用 ALTER DATABASE 来更改数据库排序规则,但这只会影响新对象。我的理解是,更改现有列的唯一方法是对每个表中的每一列执行 ALTER COLUMN - 我需要删除并重新创建所有索引才能做到这一点。
我想它看起来像这样:
DROP INDEX indexname ON tablename
GO
ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL
GO
CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)
Run Code Online (Sandbox Code Playgroud)
并对整个数据库中的每个 varchar、char、text、nvarchar、nchar 和 ntext 列重复。那将是一个巨大的SQL 脚本。
有没有更简单的方法来做到这一点,或者任何人都可以建议一种自动创建 SQL 脚本的方法来做到这一点?
我正在尝试使用 SSMS 向 SQL Server 2005 中包含大量数据的表中添加一列。
所以我浏览到表,选择修改,然后添加新列。然后,当我按保存时,我收到以下警告:
保存对包含大量数据的表的定义更改可能需要相当长的时间。保存更改时,将无法访问表数据
我没问题,数据库处于离线状态,而我一直在世界上,所以我按是。
但是,操作将在大约 30 秒后超时并显示以下消息:
无法修改表。超时已过。操作完成前超时时间已过或服务器未响应。
然后,当我按 OK 时:
用户取消保存对话框(MS Visual Database Tools)
我不明白。我已在 SSMS 连接对话框和工具 -> 选项 -> 查询执行 -> SQL Server 下将执行超时设置为 0(无限)。如果只是忽略它,设置执行超时有什么意义?
有谁知道这里使用了什么超时值,以及如何设置它?
我在 dev(Windows Server 2008 上的 SQL Server 2005)中有一个数据库,我需要将其转移到 prod(Windows Server 2003 上的 SQL Server 2000)。我的流程如下:
现在我已准备好恢复数据库,所以我单击“确定”并收到以下错误:
“设备 'E:...bak' 上的媒体系列格式不正确。SQL Server 无法处理此媒体系列。RESTORE DATABASE 异常终止。”
这个错误是即时的。
我尝试了一些不同的变体 - 将数据库恢复到具有不同数据库名称和日志文件名(它起源的地方)的开发机器,创建一个具有相同物理路径的空数据库,然后尝试恢复到那个,制作一些不同的 .bak 文件并确保在将它们上传到 prod 之前验证它们。我知道 prod 上存在 .mdf 和 .ldf 文件的目录,尽管文件本身不存在。如果在单击“确定”还原之前转到“选项”选项卡,则会出现以下错误:
错误 3241:设备“E:...bak”上的媒体系列格式不正确。SQL Server 无法处理此媒体系列。RESTORE FILELIST 异常终止。
有人有什么好主意吗?
我们有一个强大的 Windows 2008 x64 服务器(4 x 4 核 CPU,32GB RAM)运行 SQL Server 2005 64 位。我们有一个很小(6GB)但非常重要的数据库,它在页面缓存在内存中之前访问有点慢(使用是非常随机的 I/O,因此给定页面在内存中的几率非常低,最终用户抱怨最初的缓慢)。磁盘足够快(本地 15K SAS),但我猜该应用程序编写得有些笨拙(它是一个 COTS 解决方案)所以我想知道是否有办法在 SQL Server 2005(不支持 2008)的内存中“强制”数据库由供应商提供,所以我们不应该升级到那个)来帮助避免最初的缓存填充蓝调?
我目前的方法是,我从脚本中的每个表中运行 SELECT * 以获取内存中的数据页,但此方法未缓存某些对象(索引、全文搜索等)(并修改脚本以查询索引和将适当的 WHERE 子句写入缓存是一种复杂的海洋)。
即使没有使用它,我也无法分离数据库,因为它正在使用。
Cannot detach the database 'DEMO' because it is currently in use.
Run Code Online (Sandbox Code Playgroud)
我尝试重新启动并收到相同的消息。
我在世界各地部署了相当多的服务器。他们运行 Windows 2003 x64 和 SQL Server 2005 x64,6 GB RAM。这些盒子没有最好的(甚至是可接受的)配置,因为几年前订购它们的人并不真正知道他在做什么。
这些盒子总是内存不足,最终使用分页文件,一切都变慢了。通常提交费用是 5.8GB,然后当有人需要做一些密集的事情(例如运行报告)时,这个数字就会飙升。
我一直试图获得订购更多内存的权力,但我遭到了强烈反对(例如,使软件性能更高,所有这些服务器的成本太高,或者证明盒子没有足够的内存等。 ...)。
我可以向非技术人员展示一个盒子需要多少 RAM 的指南(或公式),以便我们最终可以订购更多内存?
我的一个朋友今天问我(试图让他的一位激动的客户平静下来)如何才能在 SQL Server 2005 中找出在任何给定时间哪个数据库使用了多少内存(在服务器的 RAM 中)。
这可能吗?如果是这样 - 如何?您可以使用内置的 SQL Server 工具执行此操作,还是需要额外的第三方选项?
他的客户很慌张,因为他的专用 SQL Server 机器突然使用了 4 GB RAM 中的 200KB 以外的所有内容。我不认为这是一个问题,真的 - 但是因为这个家伙声称它或多或少是在一夜之间发生的,他想知道是什么导致了内存使用量的增加......
马克
我在 600G 数据文件上运行 SHRINK 文件。
目前,状态报告为“暂停”,并sys.dm_exec_requests.percent_complete
为DbccFilesCompact
命令会报告它正在运行(但很慢)
有没有办法检查它为什么被暂停以及如何使它运行更顺畅?
仅供参考- 检查状态的 SQL 查询
select T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
, R.cpu_time, R.total_elapsed_time, R.percent_complete
from sys.dm_exec_requests R
cross apply sys.dm_exec_sql_text(R.sql_handle) T
order by Command
Run Code Online (Sandbox Code Playgroud) sql-server-2005 ×10
sql-server ×8
memory ×2
64-bit ×1
cache ×1
database ×1
dbcc ×1
maintenance ×1
memory-usage ×1
restore ×1
shrink ×1
sql ×1
ssms ×1
timeout ×1