Python 如何更快地将较大的.sql文件执行到数据库?

Python 如何更快地将较大的.sql文件执行到数据库?,python,mysql,sql,mysql-python,Python,Mysql,Sql,Mysql Python,我目前正在处理一个4gb dump.sql文件,所以我尝试使用mysql服务器控制台从中创建一个数据库 以下是我在终端中使用的命令: mysql -u username -ppassword mysql> create database test; mysql> use test; mysql> source dump.sql 这花了我大约3个小时来完成这个过程。在那之后,我可以毫无问题地访问创建的数据库 规格: 16核intel处理器,60gb ram,120gb ssd

我目前正在处理一个4gb dump.sql文件,所以我尝试使用mysql服务器控制台从中创建一个数据库

以下是我在终端中使用的命令:

mysql -u username -ppassword

mysql> create database test;
mysql> use test;
mysql> source dump.sql
这花了我大约3个小时来完成这个过程。在那之后,我可以毫无问题地访问创建的数据库

规格: 16核intel处理器,60gb ram,120gb ssd

问题是我有一个8gb或更多的转储文件,所以我正在寻找任何更快的方法来执行.sql脚本。我不确定第一种方法是否优化

我也试着用python来做

import mysql.connector

conn = mysql.connector.connect(user='root', password='root')
cursor = conn.cursor()

cursor.execute(open('dump.sql').read(), multi=True)
conn.commit()

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-7-b5009cf1d04b> in <module>
----> 1 cursor.execute(open('dump.sql').read(), multi=True)

~/miniconda3/lib/python3.7/site-packages/mysql/connector/cursor_cext.py in execute(self, operation, params, multi)
    264             result = self._cnx.cmd_query(stmt, raw=self._raw,
    265                                          buffered=self._buffered,
--> 266                                          raw_as_string=self._raw_as_string)
    267         except MySQLInterfaceError as exc:
    268             raise errors.get_mysql_exception(msg=exc.msg, errno=exc.errno,

~/miniconda3/lib/python3.7/site-packages/mysql/connector/connection_cext.py in cmd_query(self, query, raw, buffered, raw_as_string)
    487             self._cmysql.query(query,
    488                                raw=raw, buffered=buffered,
--> 489                                raw_as_string=raw_as_string)
    490         except MySQLInterfaceError as exc:
    491             raise errors.get_mysql_exception(exc.errno, msg=exc.msg,

OverflowError: size does not fit in an int

这返回了int的溢出错误。我无法在线找到任何帮助来克服此错误。

导入使用mysqldump生成的转储文件速度非常慢。它必须在一个线程中串行执行SQL语句,所以不管服务器上有多少内核。只有一个核心将被使用

您不太可能编写更快导入的python脚本,因为您仍然必须串行运行SQL语句

此外,转储文件还包含一些python脚本未实现的客户端命令,MySQL SQL解析器无法识别这些命令。无法使用SQL API执行这些客户端内置命令。看

另一种方法是使用mysqldump-tab转储,它将选项卡分隔的数据转储到每个表的一个文件中,而不是所有表的一个巨大的.sql文件中

然后使用mysqlimport导入这些文件。在内部,它使用LOAD DATA INFILE,这类似于Chris在上面的评论中提到的PostgreSQL COPY命令

或者,mysqlimport-使用线程以并行方式导入表。根据我的经验,如果您尝试使用4个以上的并发线程,即使您的CPU有更多的内核,您也会得到递减的回报,因为您将达到MySQL可以写入数据的最大速率

但是并行加载仍然会串行加载每个表,它不会被拆分成多个部分。因此,如果您的数据由一个非常大的表和一组较小的表组成,这是一个非常典型的场景,您仍然会被最大的单个表绑定


要做到这一点,您基本上必须开发自己的原始数据加载客户机,该客户机可以拆分数据并并行加载。您愿意为此投入多少开发时间,以避免为更大的数据负载等待6个小时?

转储从何而来?你能控制这个过程吗?@Chris,实际上我不能。如果我这样做了,我有什么选择呢?我更像是一个PostgreSQL的家伙,与DBA没有任何关系,但我知道它的专有副本可以比执行SQL快得多。只是想知道您是否需要从给定的文件开始,或者您是否可以选择更改它。看一看需要添加的一件事是,该文件是否可以压缩并传输到DB server,然后解压并执行,这也会节省一些时间。如果网络传输速度是瓶颈,那么您可以对mysql客户端使用-compress选项,但更有可能是SQL执行时间以及它是串行加载的事实。