Задать вопрос
@ubirust

Как работать с файлом SQL объемом 20 ГБ?

У меня есть база данных одной компании, которую я скачала в инете. Она весит более 20 гб. В файле скрипты на языке sql.
Я хочу произвести поиск в этой базе по номеру телефону пользователей, используя Python. Например, если есть номер в базе, то вывести имя и адрес пользователя.

Чтобы это сделать, наверное, надо сначала выполнить sql команды, чтобы сгенерировалась сама база данных.

Написал такой скрипт:

spoiler
from mysql.connector import connect, Error

# Open and parse the "par3.sql" file
with open('part3.sql', 'r', encoding="utf-8") as f:
    sql_commands = f.read()

print("Файл прочитан")

try:
    with connect(
        host="localhost",
        user="root",
        password="password",
        database="database",
    ) as connection:
        print(connection)
        with connection.cursor() as cursor:
            cursor.execute(sql_commands)
        connection.commit()
        connection.close()

except Error as e:
    print(e)


Проблема в том, что файл действительно большой и подключения разрывается. Как можно осуществить данную задачу? Есть какие-нибудь идеи?
  • Вопрос задан
  • 1043 просмотра
Подписаться 2 Простой 7 комментариев
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Вы выбрали плохой путь по ряду причин.
Во-первых, вы пытаетесь вычитать весь 20гб файл в оперативную память. Это будет долго, отожрёт кучу свопа и не факт. что завршится успешно.
Во-вторых, вы пытаетесь запустить весь SQL за один раз - это вы правильно поняли.ч то проблематично.
Ну а в-третьих...
В общем, следует глазами посмотреть в SQL и понять что там. Если там дамп БД, то сперва идут стейтменты для содания таблиц, индексов, хранимок, а потом уже операции вставки в эти таблицы.
Ваш файл называется "часть 3", так что, возможно, часть нужных стейтментов для создания структур просто оказались в других фвйлах.
Обычно кусок SQL, который создаст все таблицы, не так уж и велик по размеру. Можно открыть файлы с дампом текстовым редактором и вытащить оттуда куски SQL из начала с созданием структуры. Положить эти кусуи в отдельный файл. Иногда в SQL-файле с дампом лежит и команда создания базы, посмотрите внимательно.

Когда у вас операции вставки данных в БД в отдельном огромном файле, всё тсановится чуточку проще.
Если у вас задача одноразовая и нужно просто найти один номер и больше ничего, то можно просто воспользоваться командой grep на SQL файле. Она поищет нужный номер и покажет строчки, в которой он встретился. Параметры командной строки могут настроить выхлоп так, чтобы показывались несколько строчек. Это, возможно пригодится, если отдельные стейтменты со вставками занимают по много строк. Так можно быстро найти нужные данные не возясь с поднятием БД.

Если задача более-менее систематическая, то, конечно, лучше выполнить SQL и занести все данные в БД. Для этого имеет смысл воспользоваться стандартными утилитами, а не городить такой вот велосипед с квадратными колёсами.
Если описанные действия нужно проделывать в рамках какого-то более широкого автоматизированного процесса, а не одноразово руками, то можно тулзы для БД запускать и из питона, просто системным вызовом консольной команды.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Akina
Сетевой и системный админ, SQL-программист.
В комментариях выше фиксируются следующие факты:
  • используемая СУБД - MySQL
  • (вероятно) дамп - MySQL либо MariaDB
  • дамп поделен на несколько частей
  • задача - периодическая

Соответственно некоторые соображения в дополнение к сказанному ранее.

Если дамп выполнялся штатной утилитой (вряд ли иначе), то он содержит кучу комментариев, которые позволяют без особых проблем поделить дамп на отдельные файлы - дамп только структуры и дамп только данных. Даже в автоматическом режиме (программно), и уж тем более вручную. Поскольку нужны данные только по пользователям, то после описанного выше разделения можно безболезненно вырезать всё ненужное из дампа структуры (лишние таблицы, всякие процедуры-функции-триггеры, индексы и внешние ключи - всё это нафиг не нужно при восстановлении, а если нужно для эффективности выборки, лучше создать индексы после заливки данных), а также просто убрать дампы данных ненужных таблиц. И скорее всего объём информации для восстановления после такой чистки уменьшится на порядок, а то и больше.
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Как уже подсказывают, заливать лучше утилитами базы данных.
Ну и если никак, то коммитьте порциями, например по 1000 записей., а не все сразу
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
Маленькое уточнение к предыдущим ораторам, ответы которых дают целый спектр годных решений.

Вполне возможно что таблица которая вам нужна (пользователи?) не занимает много места и, на самом деле, является лишь малой частью файла, а остальное ненужные данные. Стоит проверить данный тезис и далее выделить в отдельный файл скрипт загрузки только этой таблицы. Как работать с этим куском уже дело вкуса - искать как в файле или импортировать в бд. ИМХО бд в этом плане удобнее и практичнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы