如何将默认的四个系统数据库迁移到另一个分区?

如何将默认的四个系统数据库迁移到另一个分区?

为什么我在 4 个 SQL Server 系统 DB 对象中看不到任何分离/附加命令?我想将其移动到每个数据库文件和日志文件的单独分区中,以获得更好的性能。

我应该这样做吗还是将其留在 C:\Program Files\Microsoft SQL Server\MSSQL10.(dbinstance)\MSSQL\DATA?

答案1

您不能在系统数据库上使用附加/分离功能,而是使用更改数据库语句并更改指向新位置的启动参数。

以下是 MS 有关如何移动系统数据库的指南:

http://msdn.microsoft.com/en-us/library/ms345408.aspx

答案2

系统数据库的位置不太可能导致或将会导致性能问题。

在执行此任务之前你应该回答两个问题:

  1. 是否存在性能问题?

  2. 系统数据库的位置是否是造成上述性能问题的原因?

如果您不能对这两个问题都回答“是”,那么我的建议是保持现状。

答案3

为了补充上述 2 个答案,您唯一应该关注的数据库是 tempdb。下面的查询将获取每个数据库的 IO 数量,并且它是一个很好的指标,表明 tempdb 与其他数据库相比是否正在做更多的工作。如果是,将 tempdb 移动到单独的主轴会有所帮助。您还应该使用 WAIT STATISTICS(下面的查询)检查 tempdb 中是否存在分配瓶颈,并根据需要使用 TF 1118 和多个 tempdb 数据文件。因此,如果您添加更多详细信息,您可能会得到很好的响应。您可以稍微调整第一个查询以查看每个文件级别的 IO 统计信息,以获得更详细的信息。

--Per database write cost with running total
With g as
(select db_name(mf.database_id) as database_name, mf.physical_name, 
left(mf.physical_name, 1) as drive_letter, 
vfs.num_of_writes, 
vfs.num_of_bytes_written as BYTESWRITTEN, 
vfs.io_stall_write_ms, 
mf.type_desc, vfs.num_of_reads, vfs.num_of_bytes_read, vfs.io_stall_read_ms,
vfs.io_stall, vfs.size_on_disk_bytes
from sys.master_files mf
join sys.dm_io_virtual_file_stats(NULL, NULL) vfs
on mf.database_id=vfs.database_id and mf.file_id=vfs.file_id
)
select 
    database_name
    , sum(BYTESWRITTEN) as BYTES_WRITTEN
    , Percentage = RTRIM(CONVERT(DECIMAL(5,3),sum(BYTESWRITTEN)*100.0/(SELECT SUM(BYTESWRITTEN) FROM g)))+'%'
from g 
group by database_name
order by BYTES_WRITTEN desc

-- Isolate top waits for server instance since last restart or statistics clear
WITH Waits AS
(SELECT wait_type, wait_time_ms / 1000. AS wait_time_s,
    100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct,
    ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn
 FROM sys.dm_os_wait_stats
 WHERE wait_type NOT IN( 'BROKER_TASK_STOP', 'BROKER_TRANSMITTER',
  'SQLTRACE_BUFFER_FLUSH', 'CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'BROKER_EVENTHANDLER',
    'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT',
  'LAZYWRITER_SLEEP', 'SQLTRACE_WAIT_ENTRIES')) -- filter out additional irrelevant waits
SELECT W1.wait_type, 
  CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
  CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
  CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
INNER JOIN Waits AS W2
ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 95; -- percentage threshold

相关内容