0

我有一个巨大的(1GB+)数据库转储,我想将它加载到其他服务器上的新数据库中。我尝试逐行解析它并将每个执行到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 模块不支持source 命令

已编辑

文件包括一堆插入和创建语句。它的失败在于插入包含原始文本的大表。原始文本中有各种分号和换行符,因此很难根据这些来拆分命令。

4

3 回答 3

1

假设查询确实在行边界上结束,您可以将行添加在一起,直到它们进行完整的查询。

就像是:

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)

编辑:替换trim()strip()& 意识到我们不需要执行a第二个代码示例中的行。

于 2011-05-13T12:19:48.693 回答
1

有什么理由你不能产生一个为你做这件事的过程?

import subprocess

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

您可能需要稍微调整一下,因为密码将暴露给 ps。

于 2011-05-14T18:48:38.097 回答
0

我认为,有时,我们应该选择其他方式来有效地完成工作。我更喜欢将这些东西用于大数据:http ://www.mysqldumper.net/

于 2011-05-14T18:10:23.413 回答