Как выполнить файл SQL размером 3 ГБ (Microsoft SQL Server)?

У меня есть большой файл SQL, который не помещается в память и должен быть выполнен на Microsoft SQL Server 2008. Кажется, что инструмент sqlcmd.exe всегда сначала загружает его в память, что в данном случае невозможно. Любые идеи?

К сожалению, я не могу разделить сценарий, потому что он сгенерирован превосходным средством сравнения данных SQL Red Gate. Весь сценарий представляет собой одну большую транзакцию, и я хочу так и оставить. Я никогда не думал, что гигантский сценарий — это необычно, потому что в мире баз данных обычно много данных. Скрипт весит 3 Гб.


person Community    schedule 04.06.2009    source источник
comment
Файл SQL не помещается в память? Действительно???   -  person Rockcoder    schedule 04.06.2009
comment
Насколько большой файл?!?!?!?!?!?   -  person OneSHOT    schedule 04.06.2009
comment
Просто чтобы добавить ко всем изумленным комментариям выше... возможно, если вы объясните, почему вы запускаете такой большой файл, люди могут предложить альтернативу. Например, если он такой большой из-за того, что вы вручную вставляете миллионы строк из другой базы данных, то, возможно, процесс ETL будет лучше, чем извлекать все это в сценарий и запускать.   -  person Tom H    schedule 04.06.2009
comment
Если файл представляет собой данные (т. е. множество операторов INSERT), то использование файла SQL, вероятно, является неправильным подходом, лучше использовать SSIS с файлом CSV или подобным.   -  person Richard    schedule 04.06.2009
comment
@Г-н. Brownstone: это может произойти с установкой базы данных по сценарию, которая должна выполнять много вставок.   -  person Joel Coehoorn    schedule 04.06.2009
comment
к сожалению, я не могу разделить сценарий, потому что он создан с помощью превосходного сравнения данных SQL Redgates. весь сценарий представляет собой одну большую транзакцию, и я хочу оставить все как есть. я никогда не думал, что наличие гигантского скрипта необычно, потому что в мире баз данных обычно много данных. размер скрипта 3gb.   -  person    schedule 04.06.2009
comment
Это звучит как вопрос, который нужно задать RedGate. Может быть, даже отчет об ошибке. Или, может быть, просто пришло время обновить вашу машину до 64-битного процессора с 16 или 32 ГБ памяти.   -  person John Saunders    schedule 04.06.2009
comment
Если вы просто перемещаете огромное количество данных из одной базы данных/таблицы в другую, то средство сравнения данных RG — не тот инструмент. Если вы синхронизируете две таблицы (две таблицы содержат клиентов и вам нужно их объединить, или одна таблица содержит некоторые данные и вам нужно добавить не совпадающие строки из другой таблицы, но вы не можете удалить то, что уже есть), это это то, где Data Compare превосходит. Если вы просто перемещаете данные в пустую таблицу, я бы проверил другие методы, такие как SSIS, которые все еще можно выполнять внутри транзакции.   -  person SqlRyan    schedule 04.06.2009


Ответы (8)


В RedGate SQL Compare есть возможность выполнять операторы напрямую, вместо того, чтобы генерировать SQL-скрипт и выполнять его позже. Есть ли причина, по которой это не сработает — другими словами, есть ли причина, по которой вам требуется сценарий SQL и вы не можете использовать функцию приложения «синхронизировать сейчас»?

person SqlRyan    schedule 04.06.2009
comment
Это хороший момент (Redgate производит отличные продукты), но у него может не быть доступа к обновлениям в его среде. Вот в каком положении я нахожусь. Мне нужно генерировать сценарии и передавать их администраторам баз данных для запуска. - person wcm; 04.06.2009
comment
Туш. В таком случае необходимо ли обновлять каждую таблицу за одну транзакцию? Можете ли вы вместо этого разбить операцию на 3-4 разных сценария, то есть запускать инструмент Red Gate каждый раз только на 1/4 ваших таблиц (выбирая таблицы, чтобы сбалансировать размер каждого сценария)? Хотя это не чистая транзакция для всего вашего обновления, каждая часть является транзакцией, поэтому ваши данные не останутся в поврежденном состоянии в случае сбоя сценария, и вы даже можете попросить администраторов баз данных запустить их одновременно во время окна обслуживания. , поэтому пользователи не увидят частично обновленные данные. - person SqlRyan; 04.06.2009
comment
Вы можете возразить, что администратор базы данных может выполнить для него сравнение данных SQL. Вопрос для меня заключается в том, столкнется ли SQL Data Compare с той же проблемой. Я имею в виду, разве Redgate не просто запускает сценарий для вас так же, как Management Studio запускает сценарий. Я не говорю, не пробуйте. Это хорошая идея - person wcm; 04.06.2009
comment
wcm в самый раз: я не могу обновить базу данных с машины, на которой работает SQL Data Compare, и я сомневаюсь, что это изменится очень скоро. Неужели так сложно запустить скрипт вместо того, чтобы выполнять его сразу? Кстати, скрипт предназначен для одной гигантской таблицы, а не для многих. - person ; 04.06.2009
comment
У нас есть копия Red Gate Data Compare, поэтому я только что провел сравнение, и инструмент синхронизировал базы данных при запуске SQL Profiler, и похоже, что инструмент фактически открывает транзакцию, запускает операторы пакетами и фиксирует в конец. Поскольку он отправляет меньшие пакеты за раз, он должен нормально работать на рабочей станции администратора баз данных. Это жизнеспособный вариант? - person SqlRyan; 04.06.2009
comment
Обновляются ли пакеты для каждой таблицы? Если это так, поскольку он работает только с одной таблицей, это не сработает для него. - person wcm; 04.06.2009

Я столкнулся с этой проблемой несколько месяцев назад. Я генерирую сценарии синхронизации с помощью SQLDataCompare еженедельно и ежемесячно для нескольких наших баз данных каталогов, и они обычно превышают 500 МБ. Мое решение заключалось в написании VBscript, который разбивает сценарий обновления на пакеты команд от 50 до 1000. Проблема с этим подходом заключается в потере возможности откатить все изменения, если что-то сломается на полпути к обновлению вашей базы данных.

person Community    schedule 06.07.2009

Что/кто создал скрипт SQL? Получите то, что создало файл, чтобы разделить сценарий на логические фрагменты либо транзакцией, либо оператором (в зависимости от того, как структурирован файл). Если источник не может этого сделать, то придумайте сценарий, чтобы логически разделить файл.

person Welbog    schedule 04.06.2009

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

Это разовое мероприятие или регулярное мероприятие?

person CJM    schedule 04.06.2009

У меня была эта проблема раньше, когда в сценарии была огромная строка XML, которая использовалась с OpenXML. Фактический SQL был довольно минимальным, обновляя некоторые значения в таблице.

В итоге я вставлял данные (порциями) во временную таблицу до тех пор, пока вся информация, которая была в XML, не была сохранена. Затем я запустил свое заявление об обновлении.

Добавлено позже после публикации дополнительных данных:

Возможно, вы захотите выбрать большие фрагменты в инструменте, чтобы сравнение данных SQL генерировало сценарии по частям. Таким образом, вы получаете транзакции. Вы можете выбрать большие разделы, просто выделив диапазон и нажав клавишу пробела.

person wcm    schedule 04.06.2009

1-800-редгейт-поддержка.....

or

  • разбить скрипт транзакции на более мелкие файлы
  • установить базу данных в однопользовательский режим
  • полная резервная копия базы данных
  • запускать каждый меньший файл сценария; в случае сбоя: восстановить резервную копию, исправить скрипт, повторить попытку
  • выйти из однопользовательского режима, все готово
person KM.    schedule 04.06.2009

Насколько я понимаю, SSMS 32-битная, поэтому она не может загрузить скрипт размером более 1,5-2 ГБ. Вы можете запустить сценарий в SQLCMD.exe, но тогда вы можете столкнуться с проблемами из-за размера транзакции — SqlCmd сохранит всю транзакцию в памяти. Итак, что вы можете сделать в SQL Data Compared, так это перейти к параметрам и использовать «разделенные транзакции», что может помочь.

SQL Data Compare также будет выполнять частичные обновления больших двоичных объектов, что решит проблему «огромного большого двоичного объекта».

Это, конечно, если на основе последней версии Data Compare. Некоторые версии могут не иметь этих функций.

Другим вариантом может быть использование SQL Compare для создания сценария схемы в папке, а затем использование SDC для синхронизации данных в этой папке. Тогда у вас есть файл для каждой таблицы, а не один массивный файл.

Надеюсь это поможет.

person Wonko    schedule 10.03.2014

Используйте команду sqlcmd

Пример:

sqlcmd  -S myServer\instanceName -i C:\myScript.sql
person Suresh Chahal    schedule 07.03.2014