的 的 ** * **** EDITED 的 < EM> * ** * *
我有多个sql服务器,其中包含大约200-300 dbs,并希望节省我服务器上的空间。
我想通过任务调度程序运行此脚本,在我的sql server中的所有数据库上运行一个收缩例程。我有查询,但我不知道如何将两者连接在一起。 为了选择我使用的所有数据库
select * from sys.sysdatabases
Where name <> 'master' and name <> 'tempdb' and name <> 'model' and name <> 'msdb'
对于我的收缩路线,我使用此
USE [single_database_name]
GO
DBCC SHRINKFILE ('single_database_name', 10)
GO
如何连接两个查询,以便“single_database_name”来自第一个查询中的所有数据库名称列表。
感谢您的帮助
答案 0 :(得分:5)
将光标与动态SQL一起使用。这将在每个数据库上单独收缩每个文件。
Declare @dataFiles Table (databaseName Varchar(256), datafile Varchar(256))
Declare @SQL Nvarchar(Max), @databaseName Varchar(256), @dbfile Varchar(256)
Insert @dataFiles
select sd.name, smf.name
from sys.sysdatabases sd
join sys.master_files smf
On sd.[dbid] = smf.database_id
Where sd.name not in ('master','tempdb','model','msdb')
Declare cur Cursor For
Select databaseName,
datafile
From @dataFiles
Open cur
Fetch Next
From cur
Into @databaseName,
@dbfile
While @@Fetch_Status = 0
Begin
Set @SQL = 'USE [' + @databasename + ']
DBCC SHRINKFILE (''' + @dbfile + ''', 10) WITH NO_INFOMSGS'
Exec sp_executeSQL @SQL
Fetch Next
From cur
Into @databaseName,
@dbfile
End
Close cur
Deallocate cur
select sd.name As DatabaseName, smf.name DBFileName, (size*8)/1024 SizeMB
from sys.sysdatabases sd
join sys.master_files smf
On sd.[dbid] = smf.database_id
Where sd.name not in ('master','tempdb','model','msdb')
答案 1 :(得分:1)
select
'USE '+ quotename([name]) + '
GO
DBCC SHRINKFILE (''' + [name] + ''', 10)
GO
'
from sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb')
但请不要这样做:萎缩是不好的。
答案 2 :(得分:0)
使用未记录的存储过程sp_MSForEachDB和DBCC SHRINKDATABASE命令,您可以在一行代码中收缩SQL Server上的所有数据库
EXEC sp_MSForEachDB
'if ''?'' not in (select name from sys.databases
where name <> ''master'' and name <> ''tempdb'' and name <> ''model'' and name <> ''msdb'')
DBCC SHRINKDATABASE([?], 10)'
的更多信息
答案 3 :(得分:0)
应避免缩小数据库,除非在非常特定的情况下,例如删除大量数据的地方,数据库永远不会恢复到原始大小并回收空间。缩小数据库会使数据分段,并可能导致性能问题。
答案 4 :(得分:-1)
对于在特定数据库上操作,您将至少知道数据库的名称,如果是这种情况,则使用以下查询
if (exists(Select name from sys.databases where name like 'single_database_name'))
begin
DBCC SHRINKFILE ('single_database_name', 10)
end