【问题标题】:Splitting a large sql file on statement boundaries?在语句边界上拆分大型 sql 文件?
【发布时间】: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


【解决方案1】:

不完全是您问题的答案,但可能是您问题的解决方案:

安装Navicat (MySQL GUI)。它有一个 oracle=>mysql 迁移工具,可能会对您有所帮助,因为您得到的错误很可能来自语法差异。手动将一种 SQL 方言转换为另一种 SQL 方言将是一项艰巨的任务。

【讨论】:

  • 并非如此。我发现的唯一语法差异是 to_date Oracle 函数。我通过定义我自己的 mySQL to_date 函数解决了这个问题。在大多数情况下,我希望所有行都会出现任何语法问题,而不是那个大文件中间的一个孤立行。
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多