Бэкап SQL 2008 R2 не восстановить на SQL 2008, что делать?

Автор Сообщение
aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 26.01.2013 15:33 Заголовок сообщения: Бэкап SQL 2008 R2 не восстановить на SQL 2008, что делать?
Иногда возникает задача, которую консультанту удобнее решать не на компьютере клиента, где отсутствуют необходимые инструменты, а на собственном. Не буду обсуждать вопросы, связанные с доступом в сеть клиента или его готовностью дать бэкап, будем считать, что наиболее оправданным и удобным вариантом является подъём бэкапа на компьютере консультанта и работа с ним в локальном режиме. У меня такие ситуации возникали достаточно часто и как минимум в трёх из них я сталкивался с обратной несовместимостью бэкапов более старших версий SQL сервера с более младшими, так, например, у меня имеется рабочая виртуалка, где установлен SQL 2008, а у клиента SQL Server 2008 R2. Увы, в этом случае бэкап не восстановить. Что же тогда делать?
Мне кажется, что подобный вопрос может быть актуален не только для консультантов, потому я и решил поделиться своими "хождениями по мукам" Very Happy
Чаще всего я обхожусь тем, что делаю скальский бэкап определённых таблиц (Скала позволяет очень простым стандартным способом создавать потабличные резервные копии в виде .bcp файлов), переношу .bcp файлы и восстанавливаю их на своём компьютере. Бывали, правда ситуации, когда это было невозможно сделать, так у одного из клиентов не работал скальский бэкап: старая Scala 5.1 и SQL Server 2008 R2. Ну, не расчитана 5.1 на работу с 2008 SQL, когда она была выпущена, ещё была 7 версия SQL, потом появился SQL 2000, с ними она и умеет работать.
Недавно мне потребовалось перетащить на свою тестовую виртуалку БД Epicor 9, установленную на SQL Server 2008 R2. У меня просто SQL Server 2008 (без R2). Естественно, восстановить не вышло. Восстановил на своём SQL Server 2012 Express. А что дальше? Стал искать ответ на простенький вопрос, так хорошо известный в России: "Кто виноват и Что делать?" Very Happy
С тем, кто виноват всё ясно, Microsoft, естественно, а вот, что делать?
Первый сайт, куда меня привёл Яндекс, оказался SQL ру. Ох, до чего ж я ненавижу русскоязычные форумы, на свой вопрос Вы получите вместо ответов кучу дурацких вопросов, отвечающие будут умничать, надувать щёки, самоутверждаться и, в конечном счёте Вы так и не получите ответ на простой вопрос (даже если он впрямую и не был Вами задан): Что делать-то? Убедитесь сами, привожу картинку:

Впечатляет? Меня тоже, чуть в экран не плюнул… Evil or Very Mad Кстати, меня всегда интересовало, куда смотрят работодатели некоторых участников таких форумов: если бы я увидел, что мой сотрудник оставил более 85 тысяч сообщений, я бы с ним постарался как можно быстрее расстаться, ибо он вместо того, чтобы работать… не буду продолжать…

Очень хотелось бы, чтобы на нашем форуме по возможности ответы носили бы доброжелательный характер, а отвечающие не пытались бы самоутверждаться за счёт человека, задающего вопрос…

Слава Богу, интернет не заканчивается на sql ру. Я нашёл ответы на извечный российский вопрос "что делать" — увы, за пределами России. Но об этом чуть позднее, написать я собираюсь достаточно подробно, с пошаговыми картинками, надо подготовиться…

Продолжение следует…

Последний раз редактировалось: aav (28.01.2013 16:42), всего редактировалось 2 раз(а)

aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 26.01.2013 18:37 Заголовок сообщения: Бэкап SQL 2008 R2 не восстановить на SQL 2008, что делать?

TheCTOSian2 на странице http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/4daae3e5-15ab-4929-a122-e1bab420310e в моём переводе писал(а):
Попробуйте следующее:

1.Установите instance SQL 2008 R2 на одну машину и SQL 2008 на другую
2.Откройте SQL Server Management Studio R2
3.Выберите Вашу исходную базу данных
4.Выберите Задачи (Tasks) > Сформировать скрипты… (Generate Scripts)
5.Выберите "Внести в скрипт всю базу данных и все объекты базы данных" ("Script entire database and all database objects"), нажмите "Далее" ("Next")
6.Выберите "Сохранить в файл ("Save to File") и нажмите на кнопке "Дополнительно" ("Advanced")
7.Выберите "Скрипт для версии сервера ("Script for Server Version") и выберите версию, которая Вам нужна: 2000/2005/2008
8.Выберите "Типы данных для внесения в скрипт" ("Type of data to Script") и выберите "Схема и данные" (Schema/Data/both)
9.Нажмите "OK", "Далее" и создайте скрипт!
10.Скопируйте созданный файл на машину с SQL 2008 [или каким-то другим]
11.Войдите в SQL Management Studio и откройте скопированный .sql файл… имейте в виду, что может иметь место ограничение по размеру файла.
Также могут быть проблемы с порядком в котором .SQL файл вставляет данные в новую базу данных если имеются FK constraints, это может быть проблемой…. просто измените порядок вставляемых данных.
12.Как только реорганизуете .sql файл, проверьте его [на всякий случай], и исполните.

Вот такого ответа я обычно и жду, это настоящий профессиональный ответ, а не ответ типа "А с чего вы решили, что Compatibility level влияет на бэкапы ?"
Для того, чтобы вышеописанное было более наглядным, я проиллюстрирую отдельные шаги картинками:

4. Выберите Задачи (Tasks) > Сформировать скрипты… (Generate Scripts):

5. Выберите "Внести в скрипт всю базу данных и все объекты базы данных" ("Script entire database and all database objects"), нажмите "Далее" ("Next"):

6. Выберите "Сохранить в файл ("Save to File") и нажмите на кнопке "Дополнительно" ("Advanced"):

7. Выберите "Скрипт для версии сервера ("Script for Server Version") и выберите версию, которая Вам нужна: 2000/2005/2008
8. Выберите "Типы данных для внесения в скрипт" ("Type of data to Script") и выберите "Схема и данные" (Schema/Data/both):

9. Нажмите "OK", "Далее" и создайте скрипт!:

11. Войдите в SQL Management Studio и откройте скопированный .sql файл… имейте в виду, что может иметь место ограничение по размеру файла:

Именно с этой проблемой я и столкнулся: При размере БД меньше 5 ГБ создался скрипт размером в 10,8 ГБ. Загрузить такой скрипт не удалось. Описание проблемы я нашёл во множестве мест, предлагают пользоваться утилитой sqlcmd: (http://msdn.microsoft.com/en-us/library/ms165702.aspx) но я с этим не разбирался, не было времени, к сожалению, по указанной ссылке нет адекватного примера, как исполнить скрипт из файла. Если кто-нибудь разбирался, приведите пример.

Однако, вернёмся к созданию скрипта. Раз скрипт, содержащий и структуру и данные открыть не удаётся, попробуем создать скрип, содержащий только структуру, без данных:

На этот раз он получился размером не 10,8 ГБ, а всего-то 60 МБ Very Happy

Продолжение следует…

Последний раз редактировалось: aav (28.01.2013 16:44), всего редактировалось 1 раз

aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 26.01.2013 20:01 Заголовок сообщения: Бэкап SQL 2008 R2 не восстановить на SQL 2008, что делать?
Первое, что мне пришлось сделать перед запуском скрипта — это откорректировать путь, где будут созданы файлы базы данных. На моей виртуалке совсем мало места осталось на диске C:, зато много на диске E:

При попытке запустить скрипт целиком, всё висело почти полчаса, а когда мне надоело ждать и я решил прервать, оказалось, что уже первая инструкция, а именно создание базы данных завершилась с ошибкой:

SQL Server писал(а):
Msg 5149, Level 16, State 3, Line 1
Параметр MODIFY FILE вызвал системную ошибку 112(failed to retrieve text for this error. Reason: 1815) при попытке расширить физический файл "E:\Epicor905\Epicor905_log.LDF".
Msg 1802, Level 16, State 4, Line 1
Ошибка операции CREATE DATABASE. Некоторые из перечисленных имен файлов не были созданы. Проверьте связанные ошибки.


Пришлось откорректировать инструкцию

Код:
CREATE DATABASE [Epicor905] ON  PRIMARY
( NAME = N’Epicor905′, FILENAME = N’E:\Epicor905\Epicor905.mdf’ , SIZE = 4909312KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N’Epicor905_log’, FILENAME = N’E:\Epicor905\Epicor905_log.LDF’ , SIZE = 46445760KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

убрав из неё "SIZE = 46445760KB , "

Код:
CREATE DATABASE [Epicor905] ON  PRIMARY
( NAME = N’Epicor905′, FILENAME = N’E:\Epicor905\Epicor905.mdf’, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N’Epicor905_log’, FILENAME = N’E:\Epicor905\Epicor905_log.LDF’, MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO


После этого всё прошло успешно, однако я получил большое количество предупреждений:

SQL Server писал(а):
Внимание! Максимальная длина ключа — 900 байт. Индекс "PRIdx" имеет максимальную длину 2460 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PRIdx" имеет максимальную длину 2460 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryKeyIdx" имеет максимальную длину 1900 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimIdx" имеет максимальную длину 1706 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_001_000003849" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbPartSubPart" имеет максимальную длину 1388 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbRuleSeq" имеет максимальную длину 1392 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbRuleSeq" имеет максимальную длину 1436 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD100A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD101A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD102A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD103A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD104A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD105A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD106A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD107A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD108A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD109A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbUD110A" имеет максимальную длину 1032 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "IDTable" имеет максимальную длину 1088 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryKeyIdx" имеет максимальную длину 1900 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PartSubPart" имеет максимальную длину 1372 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "RuleSeq" имеет максимальную длину 1376 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "RuleSeq" имеет максимальную длину 1420 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PartSubPart" имеет максимальную длину 1376 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "RuleSeq" имеет максимальную длину 1380 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "RuleSeq" имеет максимальную длину 1424 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIndex" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SessionConfValue" имеет максимальную длину 1380 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "GlbConfValue" имеет максимальную длину 1380 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "WebSessionValue" имеет максимальную длину 1380 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "AttrName" имеет максимальную длину 1338 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "pathidx" имеет максимальную длину 1980 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "Facility" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SegCD" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SegCDAvailableDate" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SegCDOccupancyDate" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "CDIdx" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "ParentCD" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "ParentCDSegmentCode" имеет максимальную длину 1060 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SegDisplayCD" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "Date_" имеет максимальную длину 1052 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_002_000003921" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_002_000003916" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_002_000003920" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_002_000003917" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_002_000003918" имеет максимальную длину 1064 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_002_000003923" имеет максимальную длину 1124 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "SYS_002_000003922" имеет максимальную длину 1024 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalPartSubPart" имеет максимальную длину 1372 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalRuleSeq" имеет максимальную длину 1376 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalRuleSeq" имеет максимальную длину 1420 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD100A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD101A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD102A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD103A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD104A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD105A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD106A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD107A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD108A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD109A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "LocalUD110A" имеет максимальную длину 1016 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 2463 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 2463 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1903 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1555 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1027 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1391 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1395 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1439 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1035 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1091 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1903 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1375 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1379 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1423 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1379 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1383 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1427 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1019 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "PrimaryIdxInOut" имеет максимальную длину 1341 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "DateIDTblKey" имеет максимальную длину 1088 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Внимание! Максимальная длина ключа — 900 байт. Индекс "ProgramName" имеет максимальную длину 1188 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.


Поискал я что это означает, чем грозит и успокоился. Вот, в частности, что удалось обнаружить (красным выделено мною):

technet.microsoft.com на странице http://technet.microsoft.com/ru-ru/library/bb794645.aspx писал(а):
3.UpdateApplicationsStatusScript.sql
Примечание.
При выполнении сценария TypeLibMasterSchema.sql вручную в базе данных приложения вы увидите следующее сообщение:
«Внимание! Максимальная длина ключа – 900 байт. Индекс "Sec_ConsolidationMethod_PK" имеет максимальную длину 1040 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены».

«Внимание! Максимальная длина ключа – 900 байт. Индекс "Sec_ExchangeRate_PK" имеет максимальную длину 1040 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены».
Игнорируйте эти сообщения. Корпорация Майкрософт подтверждает, что эти сообщения в данном случае безвредны. Они будут удалены в более поздней версии продукта.


Продолжение следует…

aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 28.01.2013 17:56 Заголовок сообщения: Бэкап SQL 2008 R2 не восстановить на SQL 2008, что делать?
Теперь, когда база данных и все объекты в ней созданы, можно попытаться наполнить таблицы данными.

Однако, у меня с первого раза это не получилось.

Сначала я пробовал создать скрипт с данными для отдельно взятой таблицы и запустить его на машине с SQL Server 2008: попытка оказалась неудачной.

Тогда я попробовал перенести данные через bulk copy (с помощью .bcp файлов) — увы, с тем же успехом.

Тогда я создал на исходной машине (где установлен SQL Server 2012 Express) скрипт создания таблицы, удалил таблицу на сервере с 2008 SQL’ем и заново её создал. Попробовал загрузить данные: всё отлично. Стало понятно, что при создании скрипта базы данных я что-то не учёл. Пришлось заново создать скрипт для базы данных целиком, при этом я внимательно прошёлся по всем параметрам и изменил некоторые значения, установленные по умолчанию:

В частности:
Сформировать скрипт для зависимых объектов — True
Внести в скрипт индексы — True

Не помню, что ещё было по умолчанию, смотрите на картинку внимательно!

Заново сформировал скрипт, он стал не 60 МБ, а 65 МБ, удалил базу данных на SQL Server’е 2008, откорректировал пути к файлам, убрал размеры (см. выше), заново создал базу данных и все объекты.

На сей раз всё получилось! Very Happy

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

1. Если Вам доступны одновременно 2 сервера, то очень логичным выглядит вариант прилинковывания сервера с младшей версией к серверу со старшей версией SQL и вставлять данные в пустые таблицы со стороны сервера с более старшей версией.

Я так и сделал. Прилинковал SQL Server 2008 к SQL Server’у 2012 и попытался выполнить примерно такой запрос:

Код:
insert into [SQLSERVER2008].[Epicor905].[dbo].[QuoteMtl]
select * from [dbo].[QuoteMtl]


Однако столкнулся с такой проблемой, что вставить записи простой конструкцией insert into… select from… не получается, так как часть полей таблицы обозначена следующим образом:

Код:
[PROGRESS_RECID_IDENT_] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL


Для вставки информации в такие поля должна использоваться директива типа:

Код:
SET IDENTITY_INSERT [dbo].[QuoteMtl] ON


Попробовал такую конструкцию:

Код:
SET IDENTITY_INSERT [SQLSERVER2008].[Epicor905].[dbo].[QuoteMtl] ON
insert into [SQLSERVER2008].[Epicor905].[dbo].[QuoteMtl]
select * from [dbo].[QuoteMtl]

Увы, не проходит. Видимо с удалённого сервера включить IDENTITY_INSERT нельзя:

SQL Server писал(а):
Сообщение 1088, уровень 16, состояние 11, строка 1
Не удалось найти объект "SQLSERVER2008.Epicor905.dbo.QuoteMtl", так как он не существует, или отсутствуют разрешения.


В то же время инструкция

Код:
select * from [SQLSERVER2008].[Epicor905].[dbo].[QuoteMtl]

выполняется успешно.

Как говаривал один мой знакомый: "Мы же консультанты!". Консультант отличается от других людей тем, что не будет искать единственную в своём роде истину, а попытается пойти другим путём, чем достигнет результата может быть менее красивым путём, зато быстрее. Под "быстрее" я в данном случае понимаю не быстрее в абсолютном смысле, а быстрее именно с точки зрения моих конкретных навыков и знаний. Мне важен результат, как его получить, в конце концов, не так важно. Иногда, если речь идёт о 2-х записях, проще "вколотить их руками", чем писать универсальную программу, которая пригодится в следующей такой же ситуации, иное дело, если ситуация будет повторяться достаточно часто.

Ну, это было лирическое отступление, двинемся дальше.

2. Второй путь — использование утилиты sqlcmd и перенос данных с помощью скрипта, выполняемого с её помощью. Но я с ней работать пока не умею, поэтому — дальше! ("Мы же консультанты!", нам некогда искать абсолютного совершенства. Когда разберусь с этим, обязательно напишу, но позднее.)

3. Создать несколько скриптов, чтобы их размер не превышал возможности системы сервера, где установлен мой SQL Server 2008, их загрузить. Почему бы нет, вот только как узнать, по сколько таблиц можно за раз выгружать-загружать? Дальше!

Хочу заметить, что этот путь работает, я его попробовал и, более того, использую в сценарии №4 Very Happy

4. С помощью запроса выгрузить данные таблиц в .bcp файлы, перенести их на другой сервер и там загрузить с помощью скрипта.

Мы же консультанты! Похожую задачу я уже решал. Правда для одного файла, но мы же консультанты Very Happy

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

Код:
select sysobjects.name, rowcnt into TablesToRestore
from sysobjects (nolock)
join sysindexes (nolock)
on sysobjects.id=sysindexes.id and indid < 2 and rowcnt>0
where [uid]=USER_ID(’dbo’) and  xtype=’U’
GO

После этого я посмотрел на эту таблицу и обнаружил, что есть то, что я переносить не хочу, в частности лог действий пользователей, размером почти 1 ГБ, который мне на моей тестовой виртуалке совсем не нужен. Не нужен, так удалим его из таблицы:

Код:
delete from TablesToRestore where [name]=N’SysActivityLog’

Вот теперь всё готово к выгрузке тех данных, что мне действительно нужны:

Код:
declare @objname sysname
declare @DataBase nvarchar(20),
@FolderName nvarchar(100),
@command nvarchar(500)
—Указать имя папки, куда сохранить файл
set @FolderName=’C:\TEMP\Epicor905′
—Указать имя базы данных
set @DataBase=’Epicor905′
—Указать название таблицы

DECLARE t_c CURSOR FOR

select [name]
from TablesToRestore (nolock)
order by [name]

OPEN t_c

FETCH NEXT FROM t_c
INTO @objname

WHILE @@FETCH_STATUS = 0
BEGIN
set @command = ‘bcp ‘+@DataBase+’.dbo.’+@objname+’ out ‘+@FolderName+’\’+@objname+’.bcp -n -T’
exec master..xp_cmdshell @command
   FETCH NEXT FROM t_c
   INTO @objname
END

CLOSE t_c
DEALLOCATE t_c

Здесь используется xp_cmdshell, которая по умолчанию запрещена. Её нужно разрешить с помощью sp_configure

Эту служебную таблицу надо как-то перенести на SQL Server 2008. Так воспользуемся сценарием №3:

Созданный таким образом скрипт запустим на сервере, где установлен SQL 2008:

Копируем .bcp файлы на сервер SQL 2008.

А теперь там же можно запустить следующий скрипт:

Код:
declare @objname sysname
declare @DataBase nvarchar(20),
@FolderName nvarchar(100),
@command nvarchar(500)
—Указать имя папки, откуда взять файл
set @FolderName=’E:\Backup\Epicor905\’
—Указать имя базы данных
set @DataBase=’Epicor905′
DECLARE t_c CURSOR FOR
   select [name]
   from TablesToRestore (nolock)
   order by [name]
OPEN t_c

FETCH NEXT FROM t_c
INTO @objname

WHILE @@FETCH_STATUS = 0
BEGIN
—set @command = ‘truncate table ‘+@DataBase+’.dbo.’+@objname
—exec(@command)
set @command = ‘bcp ‘+@DataBase+’.dbo.’+@objname+’ in ‘+@FolderName+’\’+@objname+’.bcp -n -T’
exec master..xp_cmdshell @command
   FETCH NEXT FROM t_c
   INTO @objname
END

CLOSE t_c
DEALLOCATE t_c
go

Ура! всё прошло успешно. На всякий случай делаю запрос к первой попавшейся таблице:

Да, всё получилось!

Итак, восстановить бэкап, сделанный на SQL Server 2008 R2, на сервере, где установлен SQL Server 2008, нельзя! …но если очень хочется и Вы готовы "поприседать", то можно Very Happy

aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 13.07.2016 21:38 Заголовок сообщения: Re:Бэкап SQL 2008 R2 не восстановить на SQL 2008, что делать

aav писал(а):
Итак, восстановить бэкап, сделанный на SQL Server 2008 R2, на сервере, где установлен SQL Server 2008, нельзя! …но если очень хочется и Вы готовы "поприседать", то можно Very Happy

Вчера пытался повторить фокус с восстановлением бэкапа базы данных SQL 2014 на виртуалке с 2012. Номер не прошёл Sad
Точнее почти всё получилось, но что-то оказалось не совсем корректным из-за неряшливого стиля программирования в исходной базе данных, где из-за Collations CI (case insensitive) было неважно, как написать, "DimensionId" или "DimensionID", но у меня в итоге программа, использующая перетащенную таким образом базу данных в какой-то момент отказалась работать, сославшись на этот самый "DimensionId" (или что-то в этом роде), т.к. у моего сервера по умолчанию установлено "CS_AS". Я уже писал ранее про то, что программисты всегда должны всё делать при максимальных ограничениях, а не устраивать себе легкую жизнь: http://scala.org.ru/case-insensitive-collation-settings/