【发布时间】:2010-12-14 10:15:51
【问题描述】:
我需要将一个大型 SQL 表从 Oracle 数据库导入到 mySQL 数据库。我使用 RazorSQL “转储”了 Oracle 表,因此我现在有一个大 (2.5 GB) .sql 文件,其中包含许多 INSERT 语句。
这个文件太大了,我想把它拆分成块导入。拆分此类文件的聪明方法是什么?
使用
split命令会起作用,除非某些字符串值包含换行符,因此split分裂中间语句的风险很高。使用正则表达式拆分“;\n”(语句结束)的 Perl quickie 可以工作,但在数据中找到这样的字符序列的可能性仍然很小。
当然,我总是可以编写一个解析器来理解字符串引用。我想知道是否有更聪明的方法?
已提出类似问题。例如:
How do I split the output from mysqldump into smaller files?
但唯一的拆分解决方案是针对某些 Windows 软件的建议。 Windows 不是我的选择。我运行 Unix,即 Mac OS X。
为了提供一些背景知识,我想这样做的原因是在将文件导入 mySQL 时出现错误。将错误本地化是很痛苦的,因为它很耗时,而且对于大多数文本编辑器来说,打开如此大的文本文件进行编辑充其量也不是一件容易的事。我的一些 SQL 工具甚至没有报告文件中错误的位置,这强烈建议采用二分法通过拆分次数来归零错误。自动化这将很有用。
感谢您的任何想法。
【问题讨论】:
-
如果您可以使用工具 mysqlimport 并避免使用 INSERT 语句,那么事情会变得更快,解析器开销并非微不足道。还要确保在加载数据之前禁用表上的索引。导入时间的差异可能高达几个数量级。使用split,它可以产生你感兴趣的文件,如果你关心的问题发生了就处理它。如果您从导入过程中得到可怕的错误输出,您可以对麻烦的文件进行二进制搜索以定位错误。
-
正如我所写,
split不行:它会在行边界上分割文件,而不是在语句边界上。我确实有运行多行的语句。为了进行二分搜索,我需要一个可靠的拆分解决方案。简单的基于文本的拆分是不行的。也许正则表达式可以,但正则表达式必须是单引号字符串。 -
你要创建多少个什么大小的文件?
-
这取决于 ;-)。如果通过二分搜索找到问题,则需要两个大约一半大小的文件。或者我可能更喜欢选择最大大小和可变数量的文件(例如,尽可能多的文件,但不超过这样那样的大小)。为什么重要?
标签: sql split large-files