Обратная совместимость SQL Server 2012 для резервных копий с 2008

14

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

Я читал, что при создании резервной копии из SQL Server 2012 невозможно восстановить ее на экземпляр 2008 года. Я предполагал, что уровень совместимости решит эту проблему, но это не так. Поэтому я в растерянности относительно того, как обновить. Кроме обновления всех моих клиентов сразу, что невозможно, я не могу придумать чистого способа сделать это.

У меня есть необходимость отправить базу данных клиенту, а также получить базу данных от клиента. Это мое первое обновление версии на SQL Server, поэтому я новичок в этой проблеме. Есть идеи, как поступить?

Джефф Сток
источник
4
На вашем сервере может быть одновременно установлен один экземпляр SQL Server 2008 и один экземпляр SQL Server 2012 с разными именами экземпляров. Возможно, это решило бы ваши проблемы с клиентами на разных версиях?
Микаэль Эрикссон
Аналогичный вопрос по SO: stackoverflow.com/q/1744808/95710
DForck42

Ответы:

16

Здесь есть две вещи: номер версии файла и уровень совместимости. Когда вы присоединяете базу данных к более новой основной версии (например, с 2008 по 2008R2 или с 2008R2 по 2012), версия базы данных постоянно изменяется, и вы не можете снова присоединить эту базу данных к более старой версии.

Уровень совместимости предназначен для анализа устаревшего T-SQL, который использовался в более старых версиях SQL Server. Это не меняет способ хранения данных на диске.

Чтобы передать базу данных кому-то в более старой версии SQL Server, вам нужно будет экспортировать данные и импортировать их в другую базу данных. Для этого полезны такие инструменты, как Сравнение данных Red Gate.

Брент Озар
источник
Да, у меня была точно такая же проблема раньше. Закончилось создание сценариев для всей базы данных, а затем создание сценариев для всех данных. В этот день на помощь пришли SQL Compare и Data Compare от Red Gate.
DForck42
@ DForck42: В моем случае БД была слишком большой, чтобы составлять сценарий с данными, поэтому я закончил составлять сценарий, а затем перемещать данные bcp.
ivan_pozdeev
@ivan_pozdeev Вы говорите, что экспортировали с использованием BCP на SQL Server 2012 и импортировали с использованием BCP на SQL Server 2008R2? Приятно знать, что форматы файлов совместимы, спасибо.
Крис
2
@Chris msdn.microsoft.com/en-us/library/ms162802.aspx "В SQL Server 2014 утилита bcp поддерживает собственные файлы данных, совместимые с SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2 и SQL Server 2012 ».
ivan_pozdeev
Спасибо @ivan_posdeev, это было откровением. Я задокументировал мои шаги ниже на случай, если это поможет кому-то еще.
Крис
6

Параметр уровня совместимости используется SQL Server для определения способа обработки определенных новых функций. Таким образом, БД может быть перенесена на более новую версию SQL без проблем с приложением. Уровень совместимости можно менять взад и вперед.

К сожалению, файлы резервных копий не имеют обратной совместимости. Одним из методов будет использование импорта / экспорта для перемещения ваших данных из вашей текущей БД в ваш экземпляр более старой версии.

StanleyJohns
источник
3

Для миграции SQL используйте мастер миграции базы данных SQL с открытым исходным кодом.

У меня была база данных 5 ГБ с парой ~ 10 миллионов записей, и я попробовал маршрут через Generate Script, а затем запустил его с помощью sqlcmd.exe. Прежде всего, сгенерированный скрипт не всегда работал правильно. Во-вторых, sqlcmd.exe также может не работать с большими файлами, жалуясь на доступную память. osql.exe работает, но требует времени (и имеет те же аргументы командной строки).

Затем я наткнулся на замечательный инструмент для миграции SQL Server на базы данных SQL Azure. Это работает и для SQL Server в SQL Server, например, если вы хотите перенести базу данных SQL 2012 в 2008 R2. Он использует bcp.exe, который использует массовое копирование. Доступна версия с графическим интерфейсом и командной строкой (Batch) с открытым исходным кодом. См. Http://sqlazuremw.codeplex.com/ . В моем случае операция заняла 16 минут.

На расширенном экране вы можете выбрать, что ваша цель - SQL Server, а не SQL Azure.

lvmeijer
источник
2

Я обнаружил, что BCP более эффективен, чем некоторые инструменты для переноса данных в более раннюю версию SQL Server и для извлечения данных из RDS. (Спасибо @ivan_posdeev.)

Сначала я создаю схему, щелкая правой кнопкой мыши базу данных в SQL Server Management Studio, Задачи, Генерация сценариев. Отметьте все объекты, в расширенных объектах убедитесь, что все, что вам нужно, будет написано в сценарии (статистика, индексы и т. Д.), Снимите флажок «ИСПОЛЬЗОВАТЬ базу данных», если ваша база данных назначения имеет другое имя, установите совместимость с вашей версией базы данных назначения и сгенерируйте файл, который создает вашу схему. Создание базы данных по месту назначения и запустить этот файл на него ( с помощью osql, sqlcmdили GUI).

Чтобы переместить данные, дважды выполните следующий запрос в исходной базе данных, сначала закомментировав второй столбец, чтобы сгенерировать пакетный файл для извлечения данных, а затем закомментировав первый столбец, чтобы сгенерировать пакетный файл импорта, который будет выполняться в месте назначения. (Вы должны добавить свои исходные и целевые сервера, имена экземпляров, выходные и входные каталоги файлов, имена пользователей и пароли. Для использования интегрированной безопасности замены -Uи -Pвариант с только -T.)

Это поддерживает Unicode, если вам это не нужно, измените -Nпереключатель в обоих операторах на -n.

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

После запуска проверьте файлы с именем schema.tablename.ERRORS.dat - будет включать в себя все строки, которые не удалось, пустые, если ни один не сделал.

Ссылка MSDN для BCP здесь , более дружественный обзор вариантов BCP здесь .

Я обнаружил, что это значительно превосходит создание скриптов и любых инструментов, которые я пробовал. Он также работает на базах данных RDS (которые не разрешают резервное копирование). Сгенерированные файлы данных имеют размер скриптов SQL на 30%, их запуск занимает меньше времени и является гораздо более надежным. (Сценарии, сгенерированные SQL Server для данных сценариев, всегда срабатывали, иногда предсказуемо, иногда нет, сгенерированный SQL не был совместим с 2008R2 (например, использовался nvarchar(0), часто не завершался без видимой причины и т. Д. BCP также копирует любые нарушения ограничений) , такие как ссылочная целостность.).

Крис
источник