Як перемістити файли баз даних SQL Server?


103

У мене є база даних і хочу перемістити файли .mdfта .ldfфайли в інше місце. Але я не хочу зупиняти MSSQLSERVERпослугу і не хочу експортувати на інший сервер.

Як я можу це зробити?

Відповіді:


154

Вам не потрібно зупиняти службу SQL Server для переміщення файлів баз даних, але вам доведеться переносити конкретну базу даних в автономному режимі. Це відбувається тому, що ви не можете переміщувати файли під час доступу до них, а передача бази даних офлайн перешкоджає використанню файлів програмою SQL Server.

Процес їх переміщення досить простий. Детально / приєднано вже було описано, але це далеко не цей комплекс.

Змініть розташування файлів за допомогою ALTER DATABASEкоманди:

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

Зауважте, вам не потрібно оголошувати старе місце розташування в цій команді. Зміна цього шляху набирає чинності негайно, але буде використана при наступному запуску бази даних.

Встановлення бази даних офлайн

(Я використовую WITH ROLLBACK IMMEDIATEдля того, щоб вигнати всіх і відкатати всі відкриті в даний час транзакції)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Перемістити / скопіювати файли на нове місце

Просто скопіюйте файли за допомогою улюбленого методу (Клацніть 'Перетягніть, XCopy, Копіюйте-елемент, Робокопія)

Донесіть до бази даних в Інтернеті

ALTER DATABASE foo SET ONLINE;

Ви можете ознайомитись з цим детальніше описаним тут .


13
Це працювало для мене. У моєму випадку мені також довелося переміщувати файл LDF, використовуючи першу команду: напр. USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
Dewi Rees

1
Також можна використовувати для переміщення файлів повнотекстового індексу, просто оновивши ім'я файлу, щоб відповідати тому, що ви бачите в діалоговому вікні файлів.
DShook

24
Переконайтеся, що після переміщення файлів (-ів) бази даних користувач "NT SERVICE \ MSSQLSERVER" має на нього дозволи, або ви отримаєте помилки при спробі повернути базу даних в Інтернет.
Demonslay335

Що таке "ім'я"? У документації воно має "логічне ім'я". Що вони означають?
Джонні

2
@mlhDev Насправді в моєму випадку MODIFY FILEпорядок є змінним. Якщо спершу запустити MODIFY FILE, він повідомить вам, що команда успішно виконується, а місце розташування буде змінено після роботи в режимі офлайн-онлайн (формулювання відрізняється, але ви зрозумієте, що це ідея). Офлайн-> Перемістити файли-> Замовлення в Інтернеті має значення, хоча з очевидних причин. Позначте також примітку Demonslay335. Важливий дозвіл файлів.
Ліонет Чен

50

Файли MDF та LDF захищені, і їх неможливо перемістити, коли база даних є в Інтернеті.

Якщо ви не проти зупинити роботу бази даних, ви можете DETACHце перенести, а потім перемістити файли ATTACH.

  • Клацніть правою кнопкою миші на ім'я бази даних
  • Виберіть Properties
  • Перейдіть на Filesвкладку
  • Запишіть з Pathі FileNameМДФ і LDF файлів . Цей крок важливий у тому випадку, якщо ви не хочете шукати файли, що пропали ...
  • Клацніть правою кнопкою миші на ім'я бази даних
  • Виберіть Tasks -> Detach
  • Перемістіть файли, куди ви хочете
  • Клацніть правою кнопкою миші на Databasesвузлі вашого сервера
  • Виберіть Attach
  • Натисніть на Addкнопку
  • Вкажіть на нове місце
  • Клацніть OK

Ви маєте бути в порядку зараз. Інформацію про DETACH- ATTACHпроцесі можна знайти тут .

У посиланні про DETACH- ATTACHє рекомендація щодо використання ALTER DATABASEоператора при збереженні бази даних у тому ж екземплярі SQL Server. Більше посилання у Перемісті баз користувачів .

Якщо ви хочете продовжувати працювати під час руху, то зробіть BACKUP- RESTORE. У процесі відновлення ви можете визначити нове розташування файлів бази даних.


3
Я рекомендую відкрити SQL Management Studio як адміністратор, щоб уникнути проблем із доступом до файлів при повторному
введенні

6

Для переміщення файлів системної бази даних виконайте наступні дії:

  1. Увійдіть як користувач у SSMS

  2. Візьміть резервну копію створеної користувачем бази даних для безпеки.

  3. Вбийте всі сеанси, підключені до Сервера від SSMS.

  4. Виконайте таку команду, щоб перевірити поточне розташування файлів у системних базах даних:

    USE master;
    SELECT * FROM sys.master_files;

Визначте шлях та відзначте поточний шлях файлів.

  1. Використовуйте TSQL, щоб змінити шлях до файлу для всієї бази даних, крім головного:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

Наприклад:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

Тепер розташування файлу було змінено.

Переконайтеся, що переміщуєте файли ldf та mdf

  1. У SSMS клацніть правою кнопкою миші Сервер та виберіть властивості. Внутрішні властивості перейдіть у Налаштування бази даних. Змініть розташування за замовчуванням у базі даних для Data and Log на шлях призначення. Вийдіть із сервера.

    Наприклад: змінити C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\наE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Зупиніть екземпляр SQL Server.

  3. Скопіюйте файл або файли на нове місце. Використовуйте Robocopy для переміщення файлів, щоб скопіювати дозволи на доступ до папки призначення. Відкрийте cmd та запустіть як адміністратор та скористайтеся такою командою:

    робокопія / сек джерелоFolder призначенняFolder

Краще перейти до місця розташування джерела, щоб виконати команду. Видаліть інші файли, крім файлів системної бази даних, які скопійовані. Наприклад:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(Тут ми переміщуємо всі файли системних баз даних на нове місце.)

  1. У меню "Пуск" виберіть Усі програми, наведіть на сервер Microsoft SQL, виберіть Інструменти конфігурації та натисніть Менеджер конфігурацій SQL Server.

Виконайте наступні дії в Менеджері конфігурацій SQL Server:

У вузлі Служб SQL Server клацніть правою кнопкою миші екземпляр SQL Server (наприклад, SQL Server (MSSQLSERVER)) та виберіть "Властивості". У діалоговому вікні "Властивості SQL Server (ім'я_ ім'я)" перейдіть на вкладку Параметри запуску. У полі Існуючі параметри виберіть параметр –d, щоб перемістити файл головних даних. Клацніть Оновити, щоб зберегти зміни. У полі Вкажіть параметр запуску, змініть параметр на новий шлях головної бази даних. У полі Існуючі параметри виберіть параметр –l, щоб перемістити файл головного журналу. Клацніть Оновити, щоб зберегти зміни. У полі Вкажіть параметр запуску, змініть параметр на новий шлях головної бази даних.

Значення параметра для файлу даних повинно відповідати параметру -d, а для файлу журналу має відповідати параметру -l. Наступний приклад показує значення параметрів для типового розташування головного файлу даних.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Якщо запланований переїзд основного файлу даних є E: \ SQLData, значення параметрів будуть змінені наступним чином:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Зупиніть екземпляр SQL Server, клацнувши правою кнопкою миші ім'я екземпляра та вибравши Стоп. Перезавантажте екземпляр SQL Server.

  1. Увійдіть як saкористувач у SSMS та перевірте розташування файлів бази даних, виконавши наступний запит:

    USE master;
    SELECT * FROM sys.master_files;

Все зроблено.


Ви можете використовувати функцію SQL , щоб автоматизувати завдання для всіх баз даних: stackoverflow.com/a/19505918/439524
amuliar

3

Ви робите покроково:

  1. закрити все підключення
    АЛЬТЕР ДАТАБАЗА MyDB SET SINGLE_USER З НЕМОВНИМИ ПОВЕРХНЯМИ

  2. встановити базу даних зі статусом в режимі офлайн
    ALTER DATABASE MyDB SET OFFLINE

  3. До нового шляху
    ПОДІЛЕННЯ ДАТАБАЗИ ФОТО ЗМІНИ МОДБ (Ім'я = MyDB, Ім'я файлу = 'N: \ DATA \ MyDB.MDF')

  4. встановити базу даних зі статусом в Інтернеті
    ПІДКЛЮЧЕННЯ ДАТАБАЗИ MyDB SET ONLINE

  5. встановити багатокористувацький
    ALTER DATABASE MyDB SET MULTI_USER


3

Існує спосіб переміщення файлів даних БД (ще не впевнений, чи є спосіб зробити це для журналів), не знімаючи базу даних в автономному режимі.

Деян Накарада-Кордич має пояснення + сценарії цього методу тут: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

Коротка версія полягає в тому, що ви додаєте інший файл бази даних у новому місці, а потім використовуєте DBCC Shrinkfile, з опцією EMPTYFILE для переміщення даних зі старого файлу в новий файл. Після цього ви можете видалити старий файл даних.

Не моє рішення, я сам шукав це рішення і вважав його дуже корисним для нашого виробничого середовища.

Торфін


1

Виконайте ці прості 4 кроки:

  1. Відкрийте SSMS та виберіть опцію Новий запит у верхній частині вікна. Потім скопіюйте та виконайте наступний запит для пошуку шляху бази даних, який ми хочемо перейти до нового шляху, і відзначте той шлях, який ви показуєте у CurrentLocationстовпці.

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. Тепер перейдіть до цього шляху і відзначте ім’я файлів Database_Name.mdf & Database_Name_log.ldf . Потім виконайте наступні два запити щодо переміщення бази даних до конкретного місця розташування.

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. Тепер зупиніть сервер правою кнопкою миші, Server_Nameяку ви можете побачити в Провіднику об’єктів (зліва).

    введіть тут опис зображення

  2. Потім перемістіть обидва файли зі Старого Шляху на Новий Шлях та знову запустіть сервер, клацнувши правою кнопкою миші на Сервер_Ім'я. Підтвердьте новий шлях бази даних, знову виконавши запит 1-го кроку.


0

Я не впевнений, що це найкращий спосіб (я б вітав будь-які коментарі, щоб сказати, як це не так), але це дуже просто (і швидко, якщо у вас є невелика база даних):

Спочатку створіть резервну копію бази даних у .bak-файлі. Потім відновіть базу даних із того самого файлу .bak, вибравши нове розташування файлів .mdf та .ldf у параметрах файлів для завдання відновлення.

Я б не робив цього у виробничому середовищі поза вікном технічного обслуговування, оскільки ви не можете отримати доступ до бази даних під час відновлення. Інші методи, які я бачив вище, мали б подібні недоліки. Після завершення завдання відновлення вам не доведеться видаляти старий файл. Це робиться автоматично.


1
Цей сценарій має деякі недоліки. При відновленні оригінальний БД повинен бути перезаписаний або перейменований. Для великих баз даних метод вводить серйозні накладні витрати вводу-виводу. Переміщення файлів, як описано методами окремо -приєднати або змінити db, відбувається набагато швидше. Якщо файли переміщуються в межах одного розділу NTFS, це лише метадані.
vonPryz

@Ali - резервне копіювання та відновлення. Може зайняти більше часу, але це, як правило, безпечніший шлях. Дивіться аналіз Аарона Бертран за адресою: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups Також: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

Для дуже великих баз даних такий підхід (і підхід до відключення / приєднання) вводить значні простої. Щоб уникнути цього, переведіть вихідну базу даних у режим повного відновлення, після чого виконайте початкове відновлення резервного копіювання з цільовою БД, що залишилася непрацездатною. Потім створіть резервну копію / відновлення одного або декількох журналів транзакцій. База даних повинна бути знищена лише під час остаточного резервного копіювання / відновлення журналу транзакцій, який може містити довільно невеликий час та розмір. Очевидно, вам також потрібно буде відновити до іншого імені, а потім виконати своп імені. Цей підхід приблизно еквівалентний доставці журналу.
Брайан

0

Для доповнення існуючих відповідей: Ось сценарій для створення ALTER DATABASE ... MOVE ...висловлювань для всіх баз даних:

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

Примітка:

  • Замініть REPLACE(f.physical_name, 'C:\', 'D:\')будь-яке перетворення, яке ви хочете зробити до файлових шляхів.

  • masterне застосовується, оскільки його шлях визначається параметрами запуску SQL Server (детальніше див., наприклад, цю відповідь ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.