Каков наилучший способ массового копирования данных SQL по коммутируемому соединению? - PullRequest
0 голосов
/ 13 января 2009

У меня есть несколько удаленных SQL-серверов, с которых мне нужно регулярно получать большой объем данных (скажем, 5 000 000 строк на сервер). Эти данные также должны быть отформатированы и отправлены по FTP на другой сервер. Коммутируемая часть в порядке, я могу подключиться и связаться с сервером, но иногда соединение медленное, может быть, только 19 Кбит / с.

После подключения я попытался использовать System.Data.SqlClient.SqlBulkCopy, но он просто выдает ошибку времени ожидания. Я установил время ожидания для массовой копии на 7200 секунд, а время ожидания для строк подключения к каждой базе данных - 900 секунд, но время ожидания все еще составляет около 30 секунд.

Я попытался использовать DataReader и запустить SqlCommand.ExecuteNonQuery () для вставки каждой строки, что работает нормально, но это медленно, а иногда соединение теряется.

Я также попытался настроить пакет DTS на удаленных серверах, запланировать их отправку данных, которые мне нужны, и затем попытался загрузить файлы. Но они могут составлять несколько сотен МБ (возможно, даже ГБ на некоторых серверах), и в какой-то момент удаленное соединение обычно прерывается.

Ответы [ 7 ]

2 голосов
/ 13 января 2009

Если это вариант, застегните его, ftp и выполните массовую вставку на вашей стороне.

1 голос
/ 13 января 2009

Несколько мыслей по теме:

  • Сборка подпрограммы в источнике для извлечения данные и нарезать его на несколько меньшие файлы. FTP файлы индивидуально и немного проверить механизм, чтобы убедиться, что у них есть все прибыли.

  • Если вы можете идентифицировать измененные или новые данные в источнике, поместите какую-то функцию сбора измененных данных в источник и отправьте только дельты (извините, если вы уже это делаете).

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

1 голос
/ 13 января 2009

Сколько миль это? Вы можете sneakernet DVD?

0 голосов
/ 14 января 2009

Я закончил тем, что создал небольшое приложение на C (некоторые из них WINNT, и это был самый простой способ, он также позволяет другим получать данные вручную, если это необходимо, без возможности изменения источника), который требует несколько аргументов для построения запроса мне нужно. Затем он выполняет запрос и выводит результаты в требуемом формате CSV. Затем он вызывает 7zip с наивысшим уровнем сжатия, чтобы сжать данные как можно меньше (это уменьшает файл размером 500 МБ до примерно 20 МБ).

Поскольку мне нужно доставить данные обратно до того, как я смогу передать их по FTP, и удаленные серверы не имеют доступа к Интернету, я все равно просто копирую файл в общую папку Windows, а затем распаковываю он локально отправляет несжатые данные (по запросу) по FTP к месту назначения.

Возможно, это не лучший подход, но он работает. Спасибо

0 голосов
/ 14 января 2009

Возможно, вы захотите использовать комбинированный подход.

  • BCP OUT таблицы в собственном формате.

  • Сжатие файла с помощью инструмента, который создаст серию файлов.

  • ftp отдельных файлов. Вы сможете продолжить передачу.

Я обнаружил, что 7Zip (бесплатный с открытым исходным кодом) имеет лучшее сжатие и создаст серию пронумерованных файлов с указанным вами размером. Я считаю, что это можно запустить из командной строки.

НТН Andy

0 голосов
/ 13 января 2009

bcp.exe поддерживает параметр "out", который позволяет вывести выходные данные оператора SQL в плоский текстовый файл.

  • На стороне источника: выгрузить, сжать и разделить файл на более мелкие части, загрузить
  • На стороне получателя: скачайте, распакуйте и снова присоедините файлы, как только они у вас появятся, и введите bcp.

Это не элегантное решение. Если вы хотите сделать это программно, вы будете делать вызовы процесса. Тем не менее, он выполняет свою работу.

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

0 голосов
/ 13 января 2009

Сжатие данных в формате ZIP, оно встроено в .NET

http://www.windowsdevcenter.com/pub/a/windows/2006/09/12/using-data-compression-in-net-20.html

Если данные по-прежнему слишком велики, вы можете попробовать использовать внешнюю библиотеку / исполняемый файл для RAR или 7Zip данных, так как это будет вдвое меньше размера копии ZIP.

...