Сложности при выгрузке 500 гб из базы данных и пример их решения
Хочу поделиться с вами забавным случаем, который произошел со мной. Была поставлена задача — в кратчайшие сроки выгрузить 500 ГБ информации из базы данных (БД). Но на тот момент места на жестком диске катастрофически не хватало, и не было возможности оперативно очистить или добавить новый. К счастью, в наличии был защищенный файловый информационный ресурс (ФИР). Казалось бы, вот и решение — сохранять данные сразу в файл на ФИР. Но доступной скорости передачи информации на сетевой ресурс оказалось недостаточно, чтобы все выгрузить в полном объеме. У нас так: если SQL-запрос не отработал за сутки, он выпадает в ошибку из-за обрыва сессии. В итоге комичность в том, что на жесткий диск можно выгрузить быстро, но мало, а на ФИР много, но долго.
При учете всего вышеописанного, требовался инструмент, который мог выгружать из базы на жесткий диск определенный объем данных и перекладывать на ФИР без участия человека. Под такое описание подходил Python с библиотеками «cx_Oracle» и «shutil». Решение разделено на два скрипта:
Первый «Выгрузка данных»
Скрипт настроен на порционную выгрузку в отдельные файлы. Фильтрация в SQL-запросе подобрана с учетом оставшегося места на жестком диске. Чтобы исключить переполнение, учтена скорость скрипта на перенос файлов.
За основу взят пример кода из предыдущей статьи. Ссылки на разные сайты:
Без изменений:
- Используемые библиотеки
- Проверка версии
- Дескриптор соединения с БД
- Указание логин/пароль
- Функция, в которой создается экземпляр класса connect
- Подключение к серверу
Внесенные изменения:
Функция, в которой создается курсор, выполняется запрос в БД и сохраняются данные в файл:
Создаем массивы:
Цикл для формирования уникальных имен файлов, создания SQL-запросов и вызова функций:
Второй «Перемещение выгруженных файлов»
Скрипт обеспечит постоянный контроль количества сохраняемых файлов. При превышении установленного лимита определит ранее выгруженные, скопирует в указанную папку и удалит из старой директории. Завершит свою работу после того как скрипт на выгрузку создаст файл «Выгрузка_завершена_V.txt».
Используем библиотеки:
Создаем массивы:
Цикл мониторинга выгруженных файлов:
В итоге, за два неполных дня автоматически выгружено и перенесено более 500 ГБ, а это 168 файлов в среднем по 3 ГБ (без учета одного обрыва сессии). Применен метод fetchmany() с возможностью установки приемлемого расхода памяти для комфортной работы с другими задачам без зависания системы и ошибок «memory error».
За 6 лет я успела поработать в трех крупных IT-компаниях, несколько раз меняла жилье и переехала из Мюнхена в Берлин. В статье я расскажу про немецкую бюрократию, налоги и почему даже айтишники с высокими зарплатами живут в коммуналках. А еще, как в Германии искать работу и жилье, сколько стоит здесь лечиться и жить, и как вы можете остаться без ви…
Как меняется спрос на букеты и куда ехать за недорогими цветами в этом году — рассказываем в исследовании T-Pay.
Исполнительный директор AmCham Russia Роберт Эйджи в разговоре с РБК порассуждал о возвращении американского бизнеса и о его конкуренции с Китаем на российском рынке.
Глава YC предупредил, что разработчикам всё равно необходимы знания в программировании.
Поколения Z (родившиеся после 1997 года) и Альфа (2010–2024 гг.) — это не будущие клиенты, а уже активные участники рынка. Их потребительское поведение, ценности и взаимодействие с технологиями кардинально отличаются от предыдущих поколений. Чтобы завоевать их лояльность компаниям необходимо пересмотреть стратегии, внедрить в них иммерсивные технол…
Он может состоять примерно из 200 тысяч биткоинов, заявил спецпредставитель по ИИ и криптовалютам Дэвид Сакс.
А чем не устраивал штатный sqlplus? В 12.2 есть корректная выгрузка csv.
После выгрузки таблицы запаковываете ее gz, 40-50 гб займет
Для штатной выгрузки на жестком диске не хватало места, поэтому выгружали частями и переносили на ФИР.
Свободного места было около 20 ГБ или чуть больше.