【问题标题】:Copy a huge MySQL table from a remote to a local database将一个巨大的 MySQL 表从远程复制到本地数据库
【发布时间】:2012-02-27 04:16:44
【问题描述】:

我对远程 MySQL 数据库具有只读访问权限,该数据库包含一个非常大的表(数亿行)。

为了更快地访问该表,我想将它复制到我的本地数据库中。

最好的方法是什么?

SELECT INTO OUTFILE”不起作用,因为我没有远程数据库所需的权限。

我尝试使用 Java 将SELECT 远程表的所有行FROM 保存到本地文本文件,然后使用LOAD DATA INFILE; 但是,选择中断了

“线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间”。

【问题讨论】:

  • define large,在夫妻店里的人可能认为大的可能不是在谷歌或 Facebook 的人认为的大。
  • 您是否可以将 SELECT INTO OUTFILE '...' 放入您有权访问的目录中?
  • "define large" - 好吧,正如我所说,它足够大,以至于 Java 会因“OutOfMemoryError”而中断。也就是说,有几亿行。

标签: java mysql


【解决方案1】:

您的 Java 程序的问题很可能是因为 MySQL JDBC 驱动程序默认将整个 ResultSet 存储在内存中。对于一个巨大的表,这很可能导致 OutOfMemoryError。

您可以按照this page in the MySQL documentation(我通过this blog post 找到)的 ResultSet 部分中的说明阻止 MySQL 驱动程序执行此操作。

我能够使用一个简单的 Java 程序重现 OutOfMemoryError,该程序只需从包含超过 1.2 亿行的表中读取每一行。进行 MySQL 文档中建议的更改后,我的 Java 程序完成,没有任何内存问题。

【讨论】:

    【解决方案2】:

    尝试设置同步,最新版本的 PHPMyAdmin 提供了设置同步的选项。您需要将源数据库设置为远程数据库,并将目标数据库设置为本地数据库。
    在本地机器上设置 PHP(以及 PHPMyAdmin)并不是一项艰巨的任务。如果表更大,您可能需要增加 phpmyadmin 脚本的最大执行时间。
    或者,如果您可以访问远程 MySQL 端口,那么您可以尝试从本地计算机以mysql -h remote_IP -u usernmae -pPassword 连接到远程数据库。如果它连接了,那么你绝对可以在本地机器上使用 mysqldump 命令。检查这个link

    【讨论】:

      【解决方案3】:

      在远程数据库上使用 mysqldump 命令提取所需数据库的 SQL 语句。然后将提取的文件复制到本地系统并执行将在本地系统中创建数据库的sql文件。

      这里是mysqldump的例子 http://www.roseindia.net/tutorial/mysql/mysqlbackup/mysqldump.html

      【讨论】:

      • 好的,但是我没有权限锁定远程数据库中的表,所以我必须使用这个解决方案:stackoverflow.com/questions/104612/… 我运行的命令是:“mysqldump --single-transaction -h [remote-host] -P [remote-port] -u [remote-readonly-username] [remote-database-name] [remote-table-name] | mysql -u[local-username] -p[local -password] [本地数据库]"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多