Копировать базу данных SQL Server Express на другой компьютер - PullRequest
8 голосов
/ 31 августа 2010

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

Я рассмотрел Самый простой способ скопировать всю базу данных сервера SQL с сервера на локальный SQL Express , и решения, которые там существуют, не работают в этом сценарии, потому что:

  1. не может использовать одноразовое решение (Мастер публикации баз данных), так как для этого необходимо создать сценарий.

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

  3. не может использовать какой-либо метод, который зависит от запуска средств управления SQL Server с консоли сервера или с рабочей станции для резервного копирования.

  4. не может подключиться к базе данных SQL Server напрямую для анализа, поскольку данные должны быть переносимы в другие места.

Мне кажется, мне нужен способ вызвать скрипт, который создает файл резервной копии, а затем скопировать результат на USB-накопитель. Затем мне нужен второй сценарий, чтобы скопировать файл резервной копии с USB-накопителя и восстановить его на другом сервере SQL.

Транспортируемые данные доступны только для чтения (или любые внесенные изменения не должны возвращаться на главный сервер), и данные не будут обновляться во втором местоположении. В настоящее время он сценариев с простым старым пакетным файлом для копирования внутреннего файла MDB, и мне нужно что-то, что так просто для пользователя.

У него не может быть никаких зависимостей, скажем, от Powershell (из SQL Server Management Studio), потому что я не хочу, чтобы его нужно было устанавливать на компьютер, с которого запускается скрипт (есть половина дюжина рабочих станций, с которых должен быть запущен скрипт, и я не хочу устанавливать что-либо на всех этих устройствах).

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

Мысли, предложения, указатели?

Ответы [ 4 ]

13 голосов
/ 31 августа 2010

Вы определенно должны быть в состоянии создать что-то подобное.

Одна часть будет сценарием T-SQL CREATE BACKUP в виде сценария .sql и выполнена из стандартного пакета Windows (* 1005).*) или командный (*.cmd) файл с использованием инструмента командной строки sqlcmd.

Это будет примерно так:

backup.sql

BACKUP DATABASE YourDatabase
TO DISK = 'Z:\Backup\YourDatabase.bak'
WITH FORMAT;

Второй частью будет файл .sql со сценарием T-SQL RESTORE, в основном считывающий данные из заданного места на диске и восстанавливающий их в этом экземпляре SQL Server.

restore.sql

RESTORE DATABASE YourDatabase
   FROM AdventureWorks2008R2Backups 
   WITH 
     MOVE 'YourDatabase_Data' TO 'C:\MSSQL\Data\YourDatabase.mdf',
     MOVE 'YourDatabase_Log' TO 'C:\MSSQL\Data\YourDatabase_Log.ldf';
GO

Конечно, вам нужно адаптировать эти имена и пути к вашим собственным фактическим требованиям - но это должно просто дать вам подсказку, как начать работу с этимendeavor.

Чтобы выполнить один из этих сценариев .sql с помощью sqlcmd, вам потребуется что-то вроде:

sqlcmd -S (name of server) -U (login) -P (password) -I (name of script file)

например

sqlcmd -S (local) -U someuser -P top$secret -I backup.sql

Ресурсы:

2 голосов
/ 09 сентября 2010

У меня была такая же проблема при переносе БД между производственной (серверной) и тестовой разработкой (локальной в другом месте), а также при переносе готовой БД на размещенный сервер.

Как оказалось, я могу просто транспортировать .MDF самостоятельно.

  1. Убедитесь, что к целевому БД не подключен этот БД, сначала удалите его в SSMS.
  2. Переместить .MDF отдельно (без файла журнала).
  3. В целевом расположении по умолчанию c: \ program files ... sql .. \ DATA убедитесь, что все предыдущие экземпляры MDF и LDF перемещены или удалены - если он видит .ldf там, он запутывается.
  4. В SSMS выберите прикрепить. Нажмите Добавить, выберите .mdf.
  5. На этом этапе в поле справа ниже будет показано, что MDF и LDF подключены и что LDF отсутствует. Нажмите LDF и нажмите кнопку УДАЛИТЬ.
  6. Теперь MDF будет прикреплен, и будет добавлен новый / пустой LDF.

Я делаю это все время; работает отлично - избавляет от необходимости перевозить большие .ldf. (Я часто использую dropbox.com вместо флэш-накопителя и сначала шифрую файл с помощью PKZIP / SecureZip.)

Я не уверен, что произойдет, если вы копируете MDF с запущенным сервером, хотя я не останавливаю его перед копированием. Я не уверен, как сделать этот сценарий доступным - присоединение может быть сценарием, но я не уверен насчет удаления .LDF перед продолжением.

Вы можете написать сценарий серверу для создания моментальной копии базы данных, а затем перенести этот MDF, зная, что он не обновляется.

Другая идея - написать программу, которая вставит все записи в файл компактного издания SQL-Server и перенесет это? Я не пробовал, но читал об этом.

1 голос
/ 01 сентября 2010

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

Если вы настраиваете свой «отчетный» MDB с таблицами, связанными и называемыми «tblFoo_LINKED», и локальной таблицей с именем «tblFoo», то вы можете просто запустить немного кода VBA, который будет проходить по всем таблицам и выполнять что-то вроде

INSERT INTO tblFoo SELECT * FROM tblFoo_LINKED

Восстановление резервной копии SQL-сервера все равно было бы вариантом, к которому я бы прибегнул, но просто предлагая другой подход к вещам, которые могли бы соответствовать вашим потребностям

0 голосов
/ 31 августа 2010

Почему бы не продолжить копирование всего файла базы данных?Это выглядит как достаточно небольшая операция, чтобы уйти с небольшой паузой: вы можете сжать базу данных, отсоединить и скопировать файлы напрямую.В целевой системе вы можете присоединить БД SQLExpress с именем файла в строке подключения.

...