جابجایی دیتابیس TempDB

جابجایی دیتابیس TempDB

این اسکریپت به‌سادگی امکان جابجایی TempDb را فراهم می‌کند و بر اساس پارامترهای واردشده، چندین دستور T-SQL تولید می‌کند. حداقل یک مسیر جدید برای فایل باید مشخص شود. پارامترهای اندازه فایل، حداکثر اندازه و مراحل افزایش حجم اختیاری هستند و در صورت وارد شدن، برای تمام فایل‌های داده اعمال می‌شوند.

اگر پارامتر @debug روی “Y” تنظیم شود، اسکریپت هیچ تغییری ایجاد نمی‌کند و فقط دستورات را نمایش می‌دهد.

در صورت تعیین حداکثر اندازه فایل، اسکریپت همچنین بیشترین فضای دیسکی که TempDb ممکن است استفاده کند را نشان می‌دهد. این یک محاسبه ابتدایی برای هر نوع فایل است و توصیه می‌شود خودتان آن‌ها را بازبینی کنید.

این اسکریپت تعداد فایل‌های داده را نسبت به تعداد CPUها بررسی نمی‌کند.

 

 

/*
Move TempDB datafiles
v20140909 Wilfred van Dijk (wvand@wilfredvandijk.nl)
*/use master
set nocount on
go

declare @new_datafile_location varchar(256)
declare @new_logfile_location varchar(256)
declare @new_datafile_size int
declare @new_datafile_maxsize int
declare @new_logfile_size int
declare @new_logfile_maxsize int
declare @new_datagrowth_size int
declare @new_loggrowth_size int
declare @new_datagrowth_is_percent bit
declare @new_loggrowth_is_percent bit

declare @debug char(1)
declare @SQLCmd table(id int identity(1,1), TSQL nvarchar(512), type int NULL)
declare @Statement nvarchar(512)
declare @max_datafile_size bigint
declare @max_logfile_size bigint
/*
MANDATORY PARAMETERS:
(at least one new location must be specified)
*/set @debug = 'Y'
set @new_datafile_location = -- (no backslash added)
set @new_logfile_location = -- (no backslash added)
/*
OPTIONAL PARAMETERS HERE:
*/--set @new_datafile_size = 
--set @new_logfile_size =
--set @new_datafile_maxsize = 
--set @new_logfile_maxsize =
--set @new_datagrowth_size =
--set @new_loggrowth_size =
--set @new_datagrowth_is_percent = 0
--set @new_loggrowth_is_percent = 0
/*
CREATE COMMANDS
1) create subdirectories
*/insert into @SQLCmd(TSQL)
select 'EXECUTE master.dbo.xp_create_subdir "'+ @new_datafile_location + '"'
where @new_datafile_location is not null
union
select 'EXECUTE master.dbo.xp_create_subdir "'+ @new_logfile_location + '"'
where @new_logfile_location is not null
/*
2) Change location(s)
*/insert into @SQLCmd
SELECT 'ALTER DATABASE Tempdb MODIFY FILE ( NAME = ' + name + ', FILENAME = "'+ @new_datafile_location + right(physical_name, charindex('\', reverse(physical_name))) + '"', type
FROM sys.master_files
WHERE database_id = 2 and type = 0
and @new_datafile_location is not null
;
insert into @SQLCmd
SELECT 'ALTER DATABASE Tempdb MODIFY FILE ( NAME = ' + name + ', FILENAME = "'+ @new_logfile_location + right(physical_name, charindex('\', reverse(physical_name))) + '"', type
FROM sys.master_files
WHERE database_id = 2 and type = 1
and @new_logfile_location is not null;
/*
3) Change size (if specified)
*/if @new_datafile_size is not null
update @SQLCmd
set TSQL = TSQL + ', SIZE = ' + cast(@new_datafile_size as varchar) + 'MB'
where type = 0
;
if @new_logfile_size is not null
update @SQLCmd
set TSQL = TSQL + ', SIZE = ' + cast(@new_logfile_size as varchar) + 'MB'
where type = 1;
/*
4) Change maxsize (if specified)
*/if @new_datafile_maxsize is not null
update @SQLCmd
set TSQL = TSQL + ', MAXSIZE = ' + cast(@new_datafile_maxsize as varchar) + 'MB'
where type = 0
;
if @new_logfile_maxsize is not null
update @SQLCmd
set TSQL = TSQL + ', MAXSIZE = ' + cast(@new_logfile_maxsize as varchar) + 'MB'
where type = 1;
/*
5) filegrowth settings (if specified)
*/if @new_datagrowth_size is not null
update @SQLCmd
set TSQL = TSQL + ', FILEGROWTH = ' + cast(@new_datagrowth_size as varchar) + case when @new_datagrowth_is_percent = 1 then '%' else 'MB' end
where type = 0
;
if @new_loggrowth_size is not null
update @SQLCmd
set TSQL = TSQL + ', FILEGROWTH = ' + cast(@new_loggrowth_size as varchar) + case when @new_loggrowth_is_percent = 1 then '%' else 'MB' end
where type = 1;
/*
FINALIZE: Add closing parenthesis
*/update @SQLCmd
set TSQL = TSQL + ')'
where type is not null
/*
Show max size allocated for TempDb
*/if @new_datafile_maxsize is not null
set @max_datafile_size = @new_datafile_maxsize * (select count(*) from @SQLCmd where type = 0)

if @new_logfile_maxsize is not null
set @max_logfile_size = @new_logfile_maxsize * (select count(*) from @SQLCmd where type = 1)

print '-- TempDb uses a maximum of '+ cast(@max_datafile_size as varchar) + 'MB for datafiles on '+ @new_datafile_location
print '-- TempDb uses a maximum of '+ cast(@max_logfile_size as varchar) + 'MB for logfiles on '+ @new_logfile_location
/*
Execute or display?
*/if @debug = 'Y'

select TSQL from @SQLCmd order by id

else

begin

declare c_lus cursor for
select TSQL from @SQLCmd

open c_lus
fetch next from c_lus into @Statement

while @@FETCH_STATUS = 0

begin

print '-- Executing: "' + @Statement + '"'
exec (@Statement)
fetch next from c_lus into @statement

end

close c_lus
deallocate c_lus

print '-- Finished'
print '-- Restart MSSQL Server to apply changes'
print '-- After the restart, delete the Tempdb datafiles at the old location'

end

 

 

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی دیدگاه‌ها

فوتر سایت

ورود به سایت

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟