无法复制mysql数据库本地连接

无法复制mysql数据库本地连接

我正在运行 Eclipse Java 项目 (Mars.2) 中的一个 Java 程序,它需要在基于 MySQL 的数据库中插入数据。当我在安装了 mysql 5.5.55 的 Ubuntu 14.04 LTS 的 32 位虚拟机中执行它时,它运行没有问题。

但是,当我尝试将项目移植到 64 位主机(不是虚拟机)时,该主机具有 Eclipse Oxygen.1 并运行相同的 Ubuntu 发行版并安装了 mysql 5.5.58(我之前安装了 5.5.57,但问题仍然存在)我收到以下异常:

Exception in thread "Thread-2" java.lang.StackOverflowError
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)

我的猜测是 StackOverflow 异常是由于尝试与数据库建立连接次数过多造成的,所以我相信发生这种情况是因为与数据库的连接出现某种故障。

两台机器的配置文件my.cnf完全相同(我不需要更改任何 IP,因为我在两种情况下都使用了环回接口),因此我认为这与此无关。此外,我在两种情况下使用的代码完全相同。有人知道会发生什么吗?

更新:我已采取多项措施来解决这个问题,但均未奏效。其中,我已成功运行了http://www.vogella.com/tutorials/MySQLJava/article.html在两台机器上,这让我认为这个问题不是由于 JDBC 连接器(尽管版本不同,但它们都工作正常;它们被添加到 Eclipse 的构建路径中)、操作系统差异、数据库本身(我已经检查了示例中几列的内容以及我正在使用的列,它们是相同的)或 MySQL 服务器版本(一台机器有 5.5.55,而出现问题时的 64 位机器是 5.5.58,但它们都工作正常)。

但是,我注意到,如果我在两台机器上完全删除数据库(通过执行 DROP DATABASE mydatabase),我会得到不同的结果。在可以正常工作的机器上,我收到一个异常,告诉我我尝试连接的数据库是未知的(有道理),而另一台机器则给出完全相同的异常,好像数据库根本不存在一样。如果我故意将数据库的名称更改为不存在的名称,也会发生这种情况(正常工作的机器说它是未知的,非正常工作的机器会抛出相同的异常)。这可能是与 Eclipse 在其中一台机器上的权限有关的问题吗?

答案1

您不能只是将 mysql 文件从一个版本复制到另一个版本并期望数据库可以正常工作。您首先需要导出数据库:

mysqldump -u root -p yourdatabasename > yourdatabase.sql

然后在目标机器上创建一个新的数据库:

CREATE DATABASE mynewdb;

并导入转储的数据库:

mysql -u root -p mynewdb  < yourdatabase.sql

只有这样才能保证数据库可以在不同版本或操作系统之间迁移。

相关内容