【问题标题】:Migration from Oracle to MySql从 Oracle 迁移到 MySql
【发布时间】:2011-08-25 23:36:22
【问题描述】:

我想从 oracle 迁移到 MySql。我正在使用 MySql 迁移工具 5.0。 迁移向导出现问题。

错误信息是

Connecting to source database and retrieve schemata names.
Initializing JDBC driver ... 
Driver class Oracle Thin JDBC Driver using Service
Opening connection ... 
Connection jdbc:oracle:thin:system/**********@//127.0.0.1:1521/OracleServiceXE
The list of schema names could not be retrieved (error: 0).
ReverseEngineeringOracle.getSchemata :Listener refused the connection with the following error:
ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
The Connection descriptor used by the client was:
//127.0.0.1:1521/OracleServiceXE

Details: 
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:280)
oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:328)
oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:361)
oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:151)
oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:595)
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
com.mysql.grt.modules.ReverseEngineeringGeneric.establishConnection(ReverseEngineeringGeneric.java:141)
com.mysql.grt.modules.ReverseEngineeringOracle.getSchemata(ReverseEngineeringOracle.java:43)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.mysql.grt.Grt.callModuleFunction(Unknown Source)

两个 SQL 服务器都在 localhost 上运行。

我该如何解决这些错误?

【问题讨论】:

    标签: mysql oracle database-migration


    【解决方案1】:

    您可以将使用的服务名称添加到 oracle 数据库中,或者将输入的值“OracleServiceXE”修改为正确的值“XE”。输入的值看起来很像默认的 Windows 服务名称,可能会与 Oracle 数据库服务名称混淆。

    将当前实例服务名称更改为 OracleServiceXE:

    alter system set service_name = 'OracleServiceXE';
    

    lsnrctl services

    也应该在之后显示服务名称,除非数据库实例处于受限状态,否则使用服务名称的连接将失败。

    【讨论】:

    • 我的oracle服务名已经是'OracleServiceXE' 不用改了。
    • @smitpatel24 你是对的,如果 lsnrctl show services 确实将 OracleServiceXE 显示为受支持的 Oracle 服务。从您写的内容来看,该实例处于受限会话中或不支持 OracleServiceXE。那么,lsnrctl show services 会显示什么?
    • 对于 XE,数据库实例名称为 XE,即 TNSNAMES.ORA 中的服务名称。这就是 JDBC 所需要的。您不使用 Windows 服务名称是因为(震惊、恐怖)并非每个人都使用 Windows。
    • @Gary Myers 是的,在 TNSNAMES.ORA 中,服务名称为 XE。但是 windows 服务显示 OracleServiceXE。
    • @smitpatel24 这不是您连接的 Windows 服务名称,而是 Oracle 服务名称,如 'lsnrctl services' cmd 中所列。
    【解决方案2】:

    在我看来,您用于 Oracle 的 jdbc 连接 URL 是错误的。通常它看起来像这样:

    jdbc:oracle:thin:@localhost:1521:xe
    

    如果删除双斜杠 // 并将 1521/OracleServiceXE 之间的斜杠 / 替换为冒号 : 会发生什么?

    【讨论】:

    • MySql 迁移工具设置连接字符串。并且需要用户名传递,因为没有它,MySql 无法选择要从中获取数据的数据库(系统架构)。
    • 但是您一定在某处配置了这些值?配置的值是什么?
    • 是的,我已经在向导的“源数据库连接”步骤中配置了这些值。这些是“必须”值。没有它们,向导将不会采取任何行动。
    • 在高级选项中,我尝试了您之前的建议。它没有用。
    猜你喜欢
    • 2012-12-13
    • 2010-09-24
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2010-12-11
    • 2021-08-10
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多