Sql-server – Migrate Sql Server 2014 to Oracle 12c: best options

migrationoracleoracle-sql-developersql server

I need to migrate an Sql Server 2014 database across to Oracle. The best option is to use SQL Developer which comes with the migration tool.

Having gone through the steps described it fails due to the Sql Server version not being supported.
2012 is supported according to Oracle however it fails with the same errors as 2014 so I'm guessing they're fibbing a little.
I've tried a tool called Inspirer MnMTK, this tool won't even install (raised the issue with the company).

Now I'm at the point of manually doing this but it'll take hours, I'd be happy with a DDL create script conversion even.

Any suggestions?

EDIT

The error I get against both Sql Server 2014 and 2012 is:

java.lang.Exception: The plugin used to capture this model is not available.  Please re-install the plugin and try again before convert.

            at oracle.dbtools.migration.workbench.core.ui.quickmigrate.QMWizard$ContextHelper.getMigrationPluginOnline(QMWizard.java:918)

            at oracle.dbtools.migration.workbench.core.ui.quickmigrate.CapturePageMigration.initPageState(CapturePageMigration.java:312)

            at oracle.dbtools.migration.workbench.core.ui.quickmigrate.CapturePageMigration.onEntry(CapturePageMigration.java:81)

            at oracle.ide.wizard.FSMWizard.gotoPanel(FSMWizard.java:743)

            at oracle.ide.wizard.FSMWizard.setSelectedPage(FSMWizard.java:463)

            at oracle.bali.ewt.wizard.BaseWizard.selectPage(BaseWizard.java:1964)

            at oracle.ide.wizard.FSMWizard.selectPage(FSMWizard.java:447)

            at oracle.ide.wizard.FSMWizard.doNext(FSMWizard.java:322)

            at oracle.bali.ewt.wizard.BaseWizard$Action$1.run(BaseWizard.java:3944)

            at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

            at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)

            at java.awt.EventQueue.access$400(EventQueue.java:81)

            at java.awt.EventQueue$2.run(EventQueue.java:640)

            at java.awt.EventQueue$2.run(EventQueue.java:638)

            at java.security.AccessController.doPrivileged(Native Method)

            at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)

            at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)

            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)

            at java.awt.Dialog$1.run(Dialog.java:1052)

            at java.awt.Dialog$3.run(Dialog.java:1104)

            at java.security.AccessController.doPrivileged(Native Method)

            at java.awt.Dialog.show(Dialog.java:1102)

            at java.awt.Component.show(Component.java:1615)

            at java.awt.Component.setVisible(Component.java:1567)

            at java.awt.Window.setVisible(Window.java:846)

            at java.awt.Dialog.setVisible(Dialog.java:987)

            at oracle.bali.ewt.wizard.WizardDialog.runDialog(WizardDialog.java:382)

            at oracle.bali.ewt.wizard.WizardDialog.runDialog(WizardDialog.java:298)

            at oracle.ide.dialogs.WizardLauncher.runDialog(WizardLauncher.java:51)

            at oracle.dbtools.migration.workbench.core.ui.quickmigrate.QMWizard.launch(QMWizard.java:117)

            at oracle.dbtools.migration.workbench.core.QMLauncher.launch(QMLauncher.java:40)

            at oracle.dbtools.raptor.controls.sqldialog.ObjectActionController.handleEvent(ObjectActionController.java:195)

            at oracle.ide.controller.IdeAction.performAction(IdeAction.java:529)

            at oracle.ide.controller.IdeAction.actionPerformedImpl(IdeAction.java:884)

            at oracle.ide.controller.IdeAction.actionPerformed(IdeAction.java:501)

            at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

            at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

            at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

            at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

            at javax.swing.AbstractButton.doClick(AbstractButton.java:357)

            at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:809)

            at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:850)

            at java.awt.Component.processMouseEvent(Component.java:6329)

            at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)

            at java.awt.Component.processEvent(Component.java:6094)

            at java.awt.Container.processEvent(Container.java:2040)

            at java.awt.Component.dispatchEventImpl(Component.java:4692)

            at java.awt.Container.dispatchEventImpl(Container.java:2098)

            at java.awt.Component.dispatchEvent(Component.java:4520)

            at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)

            at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)

            at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4165)

            at java.awt.Container.dispatchEventImpl(Container.java:2084)

            at java.awt.Window.dispatchEventImpl(Window.java:2492)

            at java.awt.Component.dispatchEvent(Component.java:4520)

            at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:681)

            at java.awt.EventQueue.access$400(EventQueue.java:81)

            at java.awt.EventQueue$2.run(EventQueue.java:640)

            at java.awt.EventQueue$2.run(EventQueue.java:638)

            at java.security.AccessController.doPrivileged(Native Method)

            at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)

            at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97)

            at java.awt.EventQueue$3.run(EventQueue.java:654)

            at java.awt.EventQueue$3.run(EventQueue.java:652)

            at java.security.AccessController.doPrivileged(Native Method)

            at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)

            at java.awt.EventQueue.dispatchEvent(EventQueue.java:651)

            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

            at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

I've looked around and this plugin missing error relates to the unsupportability of the SQL Server version.

It occurs at the same point of the migration wizard which is stepping between 'Source Database' and 'Capture'.

The version of jtds I'm using is 1.2, this is the most recent version supportable by SQL Developer. I've tried using a more recent version but it won't connect (this was when I saw this version limitation).

*EDIT 2 *

I've found a work around by migrating using the offline method. You need to create database capture scripts. However the max sql server version for this is 2008! I've tried running this against 2012, just in case, and it doesn't work either.

Best Answer

If it was me I would use an ERD tool like Erwin to generate an ERD diagram of your database. You can use Erwin to take the SQL Server ERD and generate an Oracle equivalent. I would then generate all of the table creates from the ERD tool and either with the tool or manually generate the DDL for the constraints, indexes and triggers.

Once you do that you can create a schema with all of the tables that you need and create a database connection to SQL Server using heterogeneous services. At that point you have all of the tables that you need in Oracle without any constraints, indexes or triggers. You can go through each SQL Server table and do an insert into as select from. Finally you would run the script to create constraints, indexes and triggers. Since T-SQL and PL/SQL are not compatible, you will need to rewrite stored procedures by hand, including triggers.

Erwin has/had a macro language that allows someone to write code that can translate to either SQL Server or PL/SQL and I managed an application that worked with both almost 15 years ago. But if you are migrating once, I would not bother with it. Based on personal experience, this process works best if you can script the process and run many iterations of your migration process. Then test after each iteration.