Исходный большой дамп MySQL с помощью скрипта Python - PullRequest
0 голосов
/ 13 мая 2011

У меня есть огромный (1 ГБ +) дамп базы данных, который я хочу загрузить в новые базы данных на других серверах. Я попытался разобрать его построчно и выполнить каждый в mysql, но, к сожалению, он не разбивает строки равномерно на команды, а просто не работает на неполных.

filename='/var/test.sql'
fp = open(filename)
while True:
        a = fp.readline()
        if not a:
           break
        cursor.execute(a) #fails most of the time

Он также слишком велик, чтобы загрузить все это в память, так и вызовите. Кроме того, модуль Python MySQLdb не поддерживает исходную команду .

EDITED

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

Ответы [ 3 ]

2 голосов
/ 14 мая 2011

По какой причине вы не можете создать процесс, который сделает это за вас?

import subprocess

fd = open(filename, 'r')
subprocess.Popen(['mysql', '-u', username, '-p{}'.format(password), '-h', hostname, database], stdin=fd).wait()

Возможно, вы захотите немного изменить это, поскольку пароль будет открыт для ps.

1 голос
/ 13 мая 2011

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

Что-то вроде:

filename='/var/test.sql'
fp = open(filename)
lines = ''
while True:
        a = fp.readline()
        if not a:
           break
        try:
           cursor.execute(lines + a)
           lines = ''
        except e:
           lines += a

Если это только операторы вставки, вы можетеищите окончания строк;и со следующей строки, начинающейся с «INSERT».

filename='/var/test.sql'
fp = open(filename)
lines = ''
while True:
        a = fp.readline()
        if not a:
           break
        if lines.strip().endswith(';') and a.startswith('insert'):
           cursor.execute(lines)
           lines = a
        else:
           lines += a
# Catch the last one
cursor.execute(lines)

edit: заменил trim() на strip() и понял, что нам не нужно выполнять строку a во втором примере кода.

0 голосов
/ 14 мая 2011

Я думаю, иногда нам следует выбирать другие способы эффективного выполнения работы. Я предпочитаю использовать этот материал для больших данных: http://www.mysqldumper.net/

...