Как перенести большие объемы данных из старой базы данных в новую - PullRequest
0 голосов
/ 24 марта 2010

Мне нужно переместить огромное количество данных из пары таблиц в старой базе данных в пару разных таблиц в новой базе данных. Базы данных являются SQL Server 2005 и находятся на одном и том же сервере и экземпляре сервера sql. Мне сказали, что если я попытаюсь сделать все это одним выстрелом, журнал транзакций будет заполнен. Есть ли способ отключить журнал транзакций для каждой таблицы? Если нет, что является хорошим методом для этого? Будет ли курсор сделать это? Это только разовое преобразование.

Ответы [ 3 ]

1 голос
/ 24 марта 2010

Старик, но положительный герой:

http://www.tek -tips.com / faqs.cfm? FID = 3141

1 голос
/ 24 марта 2010

Используйте мастер импорта / экспорта данных в SQL Server Management Studio. Вот как

  1. Щелкните правой кнопкой мыши по вашей базе данных в обозревателе объектов
  2. Выберите задачи -> Импорт данных
  3. Заполнить окно «Выбор источника»
  4. Заполнить окно «Выберите пункт назначения»
  5. Выберите «Копировать данные из одной или нескольких таблиц или представлений»
  6. Выберите ваши столы

Не используйте курсор, это заняло бы вечность!

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

SET ROWCOUNT 10000
WHILE EXISTS(SELECT * FROM tblA LEFT JOIN tblB on tblA.ID = tblB.ID WHERE tblB.ID IS NULL) 
BEGIN
    BEGIN TRAN
    INSERT tblB
    SELECT * FROM tblA LEFT JOIN tblB on tblA.ID = tblB.ID WHERE tblB.ID IS NULL
    COMMIT
    PRINT CAST(@@ROWCOUNT AS VARCHAR) + ' rows have been inserted.'
END

SET ROWCOUNT 0 --to reset
0 голосов
/ 24 марта 2010

Очень большой INSERT INTO db2.t SELECT * FROM db1.t действительно может заполнить ваш журнал транзакций - так как он будет занимать много места до совершения транзакции. Но этот размер зависит от многих факторов - количества строк, размера строк, размера журнала транзакций и т. Д.

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

Вы можете разделить его на партии «разумного» размера (опять же, это зависит). Если это просто слишком сложно (нет хорошей стратегии разделения), используйте SSIS, выполните передачу и установите предел пакетного принятия.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...