Недавно Энди опубликовал статью на swynk.com о том, как
перемещать данные с одного сервера на другой. Оригинал статьи вы найдёте здесь: http://www.swynk.com/friends/warren/movingdbstonewmachine.asp
В той статье он предлагал "уловку", которую Вы
можете использовать, если новый сервер будет иметь ту же самую логическую
конфигурацию дисков, как и старый. Если логическая конфигурация дисков
различна, или Вы хотите переместить только часть ваших файлов, самый легкий
путь состоит в том, чтобы отсоединить их от первоначального сервера и затем
присоединяться к новому. Это даёт Вам шанс, изменить физическое расположения
файлов для каждой базы данных. Обратная сторона этого метода в том, что, если
Вам нужно перемещать много баз данных, это становится очень утомительным
занятием!
Имеются три хранимые процедуры, которые применяют в этих
целях: sp_detach_db, sp_attach_db, sp_attach_single_file_db. Использование
sp_detach_db удалит указанную базу данных SQL сервера, но оставит нетронутыми
её файлы. После этого Вы можете перемещать их в другие каталоги или даже на
другой сервер. Затем, используя sp_attach_db, можно повторно подключить базу
данных, и продолжить её использование. Отсоединение базы данных также полезно,
когда Вы хотите её архивировать, но не исключена возможность использования её в
будущем.
Когда Вы отсоединяете базу данных, В вашем распоряжении
есть опция, позволяющая перед этим обновить статистику. Также, у Вас всегда
есть возможность обновить статистику после того, как Вы снова прикрепили базу.
Вы должны использовать sp_attach_single_file_db, если Вы имеете только файл
данных, это позволит создать новый журнал транзакций (Примечание автора
рассылки: если журнал разбит на несколько файлов – это не работает). Если
журнал существует, то можно использовать sp_attach_db. SP_attach_db
поддерживает до 16 файлов (имеется ввиду: комбинация файлов данных и журналов).
Если Вы имеете больше 16-ти файлов, Вы должны использовать CREATE DATABASE
вместе с опцией FOR ATTACH.
Когда Энди изучал BOL, у него возникло желание убедиться в
ограничении на 16 файлов и причинах такого ограничения. Оказалось, что
ограничение введено непосредственно в коде sp_attach_db и не допускает более
16-ти имен файлов, причём только для создания динамического sql-запроса,
выполняющего CREATE DATABASE с опцией FOR ATTACH! Также Энди смотрел
sp_attach_single_file_db, которая просто создаёт базу данных с опцией «for
attach» и создаёт журнал в заданном по умолчанию каталоге. SP_detach_db - это
только «обертка» для DBCC DetachDB, но можно предположить, что происходит
только удаление строки из sysdatabases, а также из других, связанных таблицы
базы данных master.
Отсоединение и присоединение баз данных в SQL сервер 7
требует, чтобы Вы использовали хранимые процедуры, но в SQL сервер 2000, Вы
можете щёлкнуть правой кнопкой мыши, чтобы исполнить те же операции, что бывает
очень удобно, так как необходимо вводить полный путь и имя файла. К сожалению
ни одна хранимая процедура и Enterprise Manager не могут корректно оперировать
фалами, включёнными в группы (filegroup), при выполнении операции
присоединения. Если Вы имеете группы файлов, Вам придётся вручную написать sql - запрос, который будет содержать CREATE
DATABASE вместе с опцией FOR ATTACH.
Энди предлагает Вам ознакомиться со статьёй, которая
предлагает метод прикрепления баз данных с использованием DMO: http://www.swynk.com/friends/warren/attachdetachdatabase2.asp
Комментарий автора рассылки к вопросу переприкрепления баз данных:
При переносе баз данных методом переприсоединения на
другой сервер с отличной конфигурацией дисков или каталогов, может нарушиться
связь между базой и её логинами. Решение этой проблемы было подробно освещено
в 12-м выпуске рассылки в статье «Восстановление связи между пользователем БД и его login» http://www.sql.ru/subscribe/012.shtml
В SQL сервер 2000 Вы можете воспользоваться мастером Copy
Database Wizard, который также позволяет переместить базу данных без потери
связи с логинами.
В прошлом выпуске рассылки, в статье Кришнана «Метод быстрого усечения журнала
транзакций и перевода БД в offline» была предложена уловка, которая
предлагала методом переприкрепления базы данных уменьшать до минимального
размера журнал транзакций. После публикации этой статьи, в мой адрес поступила
совершенно справедливая критика этого метода, а точнее не достаточно полного
изложения Кришнаном всех возможных нюансов при таком подходе. Суть критики в
том, что уловка не работает, если журнал транзакций разбит на два или более
файла. Макетирование этой проблемы на моём полигоне показало, что попытка
применить уловку Кришнана приводит к ошибке. Новый, с минимальным размером
журнал создаётся при прикреплении базы, только если у открепляемой базы был
один журнал. Обойти это ограничение удалось только после того, как оператором ALTER DATABASE были уничтожены все файлы
журнала, кроме первого, а потом, файл базы был повторно прикреплён оператором
CREATE DATABASE с опцией FOR ATTACH.
Как правило, DTS пакет состоит из полного описания
нескольких, последовательно/параллельно выполняемых задач, т.е. конкретных
шагов (steps) состоящих из разнотипных или однотипных операций. Создать пакет
Вы можете с помощью соответствующего визарда, DTS Designer или с помощью языка
программирования с интерфейсом OLE Automation (VB, C#). Сохранить пакет можно в
файле, репозитории или в базе msdb. Не сохранённый пакет будет незамедлительно
исполнен. Сохранённые пакеты можно использовать повторно по расписанию,
изменять и т.д.
Если DTS пакет сохраняется во внешнем файле, это
облегчает планирование его выполнения, позволяет рассылать пакеты, как
вложения, в письмах электронной почты, а также позволяет хранить в одном файле
несколько пакетов или несколько версий одного пакета (пакеты сохраняются с
другим именем, а имя файла не изменяется). Такие файлы имеют расширение .dts и
объектную структуру Component Object Model (COM).
Если пакет сохранять в базе данных Microsoft
Repository, предназначенной для хранения сведений об объектах и их взаимосвязях
(метаданные), то у Вас появится возможность повторно использовать метаданные
пакета и иметь информацию об его истории преобразования и происхождении пакета
и сопутствующих данных. Кроме того, вся эта информация может быть доступна для
других приложений.
Если пакет сохраняется в msdb, то он и его данные
будут сохранены в таблице sysdtspackage. При таком варианте, не получится
сохранять несколько пакетов в одном файле.
DTS пакет могут шифроваться, причём
не зашифрованными останутся только имя, описание, идентификатор, номер версии и
дата создания. У пакета может быть пароль владельца, предоставляющий на него
все права, и пароль оператора, который применяется в основном при шифрации
пакетов и предоставляет доступ к данным, не давая доступа к определению пакета,
именам пользователей и паролям. По умолчанию, пакеты не шифруются и не имеют
этих паролей. Т.о., пользователь, имеющий доступ к месту хранения пакета может
прочитать содержащуюся там информацию, включая пароли и имена пользователей.
В процессе создания DTS пакета,
Вы можете задать преобразование данных, при котором будет осуществляться их
форматирование и/или изменение. Данные, после получения из источника, могут
быть заменены обобщёнными или производными значениями. Эти значения могут быть
результатом вычислений или других операций с разными полями набора строк
источника данных, и наоборот, дно поле может быть разложено на несколько.
Наиболее частой операцией
преобразования данных на пути от источника к месту назначения является
отображение типов. Для этого используются специальные флаги преобразования, а
также можно установить правила преобразования, в соответствии с которыми данные
из столбцов одного типа будут трансформироваться в данные столбцы другого типа.
Кроме типа данных, разными могут быть размер, точность, масштаб или
допустимость NULL. С помощью таких правил можно добиться, что бы точного
соответствия исходных данных результирующим, даже если Вам придётся
преобразовывать real во float (вот наоборот будет сложнее). При создании DTS
пакетов, визарды и дизайнер стараются, как можно более точно установить
соответствие типов данных источника и назначения, но у Вас всегда есть
возможность внести свои коррективы. Вы можете задать следующие уровни
преобразования данных:
- Allow all possible conversions: устанавливается по умолчанию и разрешает все допустимые виды
преобразования. Передаваться будут все данные, разрешено расширение типов и
преобразование значений NULL.
- Reguire exact match between source and destination: устанавливает уровень точного совпадения данных, т.е.
если тип, размер, точность, масштаб или допустимость NULL в источнике и в
назначении абсолютно идентичны.
- Allow data type promotion: задаёт уровень, когда возможно расширение типов (real в float), т.е. из
короткого в расширенный (из 16 в 32 разрядный).
- Allow data type demotion: Обратное предыдущему, когда из расширенного типа можно сделать короткий.
Возможны ошибки переполнения.
- Allow NULL conversion: позволяет копировать столбцы не допускающие NULL в столбцы его допускающие.
Также, часто приходится всячески интегрировать или объединять данные одного или нескольких источников
или наоборот, данные одного источника размещаются в нескольких таблицах
назначения. Объединятся могут даже разнотипные таблицы. То же самое возможно
ина уровне столбцов (объединение или дробление). Например, операция
агрегирования, когда общие суммы по некоторым категориям записей и сохраняет
эти суммы в таблице назначения.
Продолжение следует.
ПОЛЕЗНОСТИ
Статья Джозефа Ф. Ковара «SAN and NAS - два подхода к хранению данных». Непрерывно растущая потребность предприятий,
специализирующихся на обработке данных, в различных хранилищах информации -
оперативных, полуавтономных и автономных - все чаще вынуждает отдавать
предпочтение устройствам, которые предназначены для работы в сетях хранения
распределенных данных (storage area network, SAN), или сетевым устройствам
памяти (network-attached storage, NAS). http://www.crn.ru/news.asp?ID=3465
Справочное руководство от Владимира Новика по SQL, PL-SQL и SQL-Plus. http://www.deltacom.co.il/rus/document/oracle_ref.htm
Журнал "Windows 2000 Magazine", #03/2000 «SQL Server в вопросах и ответах». http://www.citforum.ru/database/articles/sqlservqa.shtml