使用Python脚本实现大型MySQL转储

使用Python脚本实现大型MySQL转储,python,database-backups,mysql-python,Python,Database Backups,Mysql Python,我有一个巨大的(1GB+)数据库转储,我想加载到其他服务器上的新数据库中。我试着逐行解析它,并将每一行执行到mysql中,但不幸的是,它没有将行均匀地分割成命令,只在不完整的命令上失败 filename='/var/test.sql' fp = open(filename) while True: a = fp.readline() if not a: break cursor.execute(a) #fails most o

我有一个巨大的(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
它也太大了,无法将整个内容加载到内存中。此外,该文件不支持

编辑


文件包括一组insert和create语句。其失败之处在于插入包含原始文本的大型表。原始文本中有各种分号和换行符,因此很难根据这些分号和换行符拆分命令。

假设查询以行边界结束,您可以将行添加到一起,直到它们生成完整的查询

比如:

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语句,您可以查找结尾的行;下一行以“插入”开头


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

假设查询以行边界结束,您可以将行添加到一起,直到它们完成查询

比如:

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语句,您可以查找结尾的行;下一行以“插入”开头


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

我认为,有时候,我们应该选择其他方法来有效地完成这项工作。我更喜欢将这些东西用于大数据:

我认为,有时候,我们应该选择其他方法来有效地完成这项工作。我更喜欢将这些东西用于大数据:

有什么原因不能生成一个流程来为您完成它吗

import subprocess

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

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

您有没有理由不能生成一个流程来为您执行此操作

import subprocess

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

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

如果您提供test.sql中的示例代码,可能会有所帮助。请将“巨大”翻译为MB。请说明test.sql看起来像什么。巨型大约是1GB,但理论上可能是5GB,10GBA快速愚蠢的问题:mySQL是否提供了一个可执行程序,可以从您的文件中批量创建和插入语句(可能比解析您的文件并一次执行一条语句的Python脚本快得多)?如果您提供test.sql中的示例代码,可能会有所帮助。请将“巨大”转换为兆字节。请说明test.sql看起来像什么。巨量大约是1GB,但理论上可能是5GB,10GBA快速愚蠢的问题:mySQL是否提供了一个可执行程序,可以从您的文件中批量创建和插入语句(可能比解析您的文件并一次做一个语句的Python脚本快得多)?谢谢RJ。好主意,我试过了,但是转储包含包含分号和分号的文本newlines@johnmachin@Xavier,是的,我是说脱衣舞。我想在换行符以;结尾之前把换行符拿走;。不幸的是,python不是我最近使用的语言。@JiminyCricket它有以“;”结尾的行,下一行在数据中以“insert”开头。第一个方法是如何尝试在查询中添加更多行,直到它工作为止?谢谢RJ。好主意,我试过了,但是转储包含包含分号和分号的文本newlines@johnmachin@Xavier,是的,我是说脱衣舞。我想在换行符以;结尾之前把换行符拿走;。不幸的是,python不是我最近使用的语言。@JiminyCricket它有以“;”结尾的行,下一行在数据中以“insert”开头。第一个方法是如何尝试向查询添加更多行,直到它工作为止?