Как правильно переместить базу данных с одного диска на другой в SQL Server 2005? - PullRequest
25 голосов
/ 13 июля 2009

Я не собираюсь полностью перемещать базу данных на другой сервер, а просто переместить файл (ы) данных и файл журнала на другой диск с большим количеством места. Я видел противоречивые указания о том, как это сделать, поэтому я ищу рекомендуемый правильный способ сделать это.

Ответы [ 6 ]

27 голосов
/ 13 июля 2009

Отсоединение базы данных:

use master
go 
sp_detach_db 'mydb'

Перемещение файлов базы данных (показано Xcopy через xp_cmdshell):

DECLARE @SRCData nvarchar(1000)
SET @SRCData = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\mydb.mdf';
DECLARE @SRCLog nvarchar(1000)
SET @SRCLog = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\mydb_log.ldf';
DECLARE @FILEPATH nvarchar(1000);
DECLARE @LOGPATH nvarchar(1000);
SET @FILEPATH = N'xcopy /Y ' + @SRCData + N' D:\Data';
SET @LOGPATH = N'xcopy /Y ' + @SRCLog + N' E:\Log';
exec xp_cmdshell @FILEPATH;
exec xp_cmdshell @LOGPATH;

ReAttach База данных:

sp_attach_db 'mydb', 'D:\Data\mydb.mdf', 'E:\Log\mydb_log.ldf'

Подробнее об этой статье Microsoft KB .

11 голосов
/ 13 июля 2009

Другой способ - отсоединить файлы базы данных (база данных-> задачи-> отсоединить), переместить их на новый диск и затем снова подключить. Но способ, описанный Джеем С., является самым простым.

9 голосов
/ 13 июля 2009

Чтобы быть в полной безопасности, я бы сделал следующее:

  1. Резервное копирование базы данных в файл BAK.
  2. Переведите текущую базу данных в автономный режим или удалите ее, если хотите.
  3. Восстановите базу данных и измените расположение файлов MDF и LDF.

Пример скрипта:

-- Get the file list from a backup file.  
-- This will show you current logical names and paths in the BAK file
RESTORE FILELISTONLY FROM disk = N'C:\Backups\MyDatabaseName.bak'

-- Perform the restore of the database from the backup file.  
-- Replace 'move' names (MDFLogicalName, LDFLogicalName) with those found in 
-- the previous filelistonly command
restore database MyDatabaseName
from disk = N'C:\Backups\MyDatabaseName.bak'
with move 'MDFLogicalName' to 'D:\SQLData\MyDatabaseName.mdf',
     move 'LDFLogicalName' to 'D:\SQLLogs\MyDatabaseName_log.ldf',
replace, stats=10;

Примечания

Первый скрипт даст вам текущие имена и пути, которые вам понадобятся во втором скрипте. Второй сценарий восстанавливает базу данных до того имени, которое вы хотите, чтобы оно имело, но вы можете изменить место хранения В приведенном выше примере он перемещает файлы MDF и LDF на диск D:

2 голосов
/ 04 июня 2015

Я бы предпочел не включать xp_cmdshell в своем экземпляре SQL Server, поэтому я написал функцию, которая делает это с помощью Powershell; это было особенно полезно, когда мне приходилось перемещать большое количество баз данных.

function Move-Database
{
    param ($database, $newPath)

    $paths = Invoke-SqlCmd "SELECT master_files.physical_name as Path
        FROM sys.databases
        JOIN sys.master_files ON master_files.database_id = databases.database_id
        WHERE databases.name = '$database';";

    $paths = $paths | % { $_.Path };

    if (!$paths)
    {
        throw "Unknown database '$database'";
    }

    Write-Host "Setting $database to single-user mode...";
    Invoke-SqlCmd "ALTER DATABASE [$database] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;";

    Write-Host "Detaching $database";
    Invoke-SqlCmd "EXEC sp_detach_db '$database';";

    if (!(test-path $newPath))
    {
        [void](mkdir $newPath);
    }

    $clauses = @();

    foreach ($oldFile in $paths)
    {
        $filename = [System.IO.Path]::GetFileName($oldFile);
        $newFile = [System.IO.Path]::Combine($newPath, $filename);

        $clauses += "(FILENAME = `"$newFile`")";

        Write-Host "Moving $oldFile to $newFile";
        mv $oldFile $newFile;
    }

    $clauses = $clauses -join ", ";

    Write-Host "Re-attaching $database";
    Invoke-SqlCmd "CREATE DATABASE [$database] ON $clauses FOR ATTACH;";
    Write-Host "All done!";
}

Вы можете использовать его так:

Move-Database -database "MyDatabase" -newPath "D:\SqlData";

Я также думаю, что этот метод немного более надежен, чем другие - что, если ваша база данных разбита на множество файлов или у вас, например, странное соглашение об именах журналов?

0 голосов
/ 12 января 2016

Также необходимо убедиться, что пользователь, под которым запущен процесс SQL Server, имеет доступ к папке. Для SQL2014 пользовательский процесс по умолчанию - «NT Service \ MSSQL $ SQL2014».

0 голосов
/ 14 января 2015

Мне нужно было переместить несколько баз данных на одном сервере, поэтому я немного расширил принятое решение, чтобы избежать копирования, вставки или перепечатывания команд. Это позволяет перемещать файлы данных за один запуск сценария, изменяя только имя базы данных. Обратите внимание, что предполагается, что расширенные команды включены; если нет, используйте sp_configure. Предполагается, что файлы данных и журналов находятся в одном каталоге.

use master

DECLARE @DBName nvarchar(50)
SET @DBName = 'YOUR_DB_NAME' 

DECLARE @RC int

EXEC @RC = sp_detach_db @DBName

DECLARE @NewPath nvarchar(1000)
SET @NewPath = 'E:\Data\Microsoft SQL Server\Data\';

DECLARE @OldPath nvarchar(1000)
SET @OldPath = 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\';

DECLARE @DBFileName nvarchar(100)
SET @DBFileName = @DBName + '.mdf';

DECLARE @LogFileName nvarchar(100)
SET @LogFileName = @DBName + '_log.ldf';

DECLARE @SRCData nvarchar(1000)
SET @SRCData = @OldPath + @DBFileName;

DECLARE @SRCLog nvarchar(1000)
SET @SRCLog = @OldPath + @LogFileName;

DECLARE @DESTData nvarchar(1000)
SET @DESTData = @NewPath + @DBFileName;

DECLARE @DESTLog nvarchar(1000)
SET @DESTLog = @NewPath + @LogFileName;

DECLARE @FILEPATH nvarchar(1000);
DECLARE @LOGPATH nvarchar(1000);
SET @FILEPATH = N'xcopy /Y "' + @SRCData + N'" "' + @NewPath + '"';
SET @LOGPATH = N'xcopy /Y "' + @SRCLog + N'" "' + @NewPath + '"';

exec xp_cmdshell @FILEPATH;
exec xp_cmdshell @LOGPATH;

EXEC @RC = sp_attach_db @DBName, @DESTData, @DESTLog

go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...