DB2数据库从LINUX迁移到AIX怎么迁?用什么命令?

DB2数据库从LINUX迁移到AIX怎么迁?用什么命令?,第1张

Linux到AIX我没有试过,但是linux到windows我知道不行,跨平台DB2可能版本不支持整个数据的恢复,系统不一样,软件可能有区别,但是可以用数据导出的方式,把表倒出来,然后在导入。

db2 export to xxx.ixf select * from xxx where 1=1

导出命令我记得是这个形式,xxx是表名,你需要把所有表都导出来。会有N条命令。

db2 import from xxx.ixf of ixf insert into xxx

导入命令记不清了,大概应该是没错的,xxx是表名。两次都需要连接库

connect to db aaa user username using password

aaa是库名,username是用户名,password是密码。

两次连接第一次连原库,第二次连新建的库

AIX也算是unix,你先试试备份还原吧

db2 backup db aaa to 路径

db2 restore db aaa frome 路径

1. 大前提是你已经安装好DB2服务器和MySQL服务器,现在只是借用Navicat for MySQL这个软件把DB2中的数据库转换到mySQL中去。

2. 首先利用这个软件建立一个连接,连接到mySQL服务器上。

这里的连接名,自己随便取。主机名或IP地址填写你的mySQL服务器地址自己机器就填localhost就行,端口一般都是3306,用户名一般都为root 密码是你mySQL服务器的密码。

3.    完成后,双击连接名,打开连接,右击连接名,选择新建数据库。数据名自己起,字符集选择与数据库相符的,或者不选默认就行,排序规则不用选。

4.  建好数据库,双击数据库名,打开数据库,右击数据库名中的表,选择导入向导,打开界面后选择ODBC,然后下一步。

5.    按照下图所示选择,会d出一个窗口。

6.   选择IBM OLE DB Provider for DB2 – DB2COPY1,点击下一步。

7. d出数据连接属性对话框,指定好DB2数据源,如果你DB2里已经建好,这里会有显示,登录信息就是你的DB2数据库的登录信息。

8. 说到这里基本步骤完成,下面的就一直点下一步,或者确定就ok了。

现在就可以将DB2的数据库转换到mySQL中了。

数据迁移:

1、在DB2数据库中通过以下表查询出表的结构

SELECT

TABNAME TAB, --表英文名称

COLNAME COL, --列名称

CASE

WHEN TYPENAME='VARCHAR' THEN 'VARCHAR2'

WHEN TYPENAME LIKE 'SMALLINT' OR TYPENAME LIKE 'BIGINT' THEN 'INTEGER'

WHEN TYPENAME ='CHARACTER' THEN 'CHAR'

WHEN TYPENAME='DECFLOAT' OR TYPENAME ='DECIMAL' THEN 'NUMBER'

ELSE TYPENAME

END TY

, --数据类型

LENGTH LEN , --列长度

scale S, --精度

CASE

WHEN NULLS='N' THEN '否'

WHEN NULLS='Y' THEN '是'

END N --是否为空

--TY||'('||LEN||')'

FROM

SYSCAT.COLUMNS S

WHERE

LEFT( TABSCHEMA, 3 ) <>'SYS'

/* and s.SCALE <>0*/

ORDER BY

S.TABNAME,

S.COLNO

2、根据表的结构在oracle数据库中建表(脚本见《create_tab_onOracle.sql》)

3、通过编写java程序把数据从DB2导入到oracle数据库中(以下代码思想仅供参考)

3.1、 导入db2jcc_license_cu.jar 、db2jcc.jar 、ojdbc14.jar 三个jar包即可

3.2、 编写三个工具类

此类链接DB2数据库工具类

package com.util

import java.sql.Connection

import java.sql.DriverManager

import java.sql.SQLException

public class ConnectionDB2 {

private static final String URL="jdbc:db2://192.168.0.98:50000/sem"//DB2数据库url

private static final String USER="db2admin" //DB2数据库账号

private static final String PASSWORD="dnhc9988"//DB2数据库密码

static{

try {

Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance()//利用反射注册驱动

} catch (InstantiationException e) {

e.printStackTrace()

} catch (IllegalAccessException e) {

e.printStackTrace()

} catch (ClassNotFoundException e) {

e.printStackTrace()

}

}

public Connection getConnection(){

Connection conn=null

try {

conn=DriverManager.getConnection(URL, USER, PASSWORD)

} catch (SQLException e) {

e.printStackTrace()

}

return conn

}

}

此类链接oracle数据库工具类

package com.util

import java.sql.Connection

import java.sql.DriverManager

import java.sql.SQLException

public class ConnectionDB2 {

private static final String URL="jdbc:db2://192.168.0.98:50000/sem"//DB2数据库url

private static final String USER="db2admin" //DB2数据库账号

private static final String PASSWORD="dnhc9988"//DB2数据库密码

static{

try {

Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance()//利用反射注册驱动

} catch (InstantiationException e) {

e.printStackTrace()

} catch (IllegalAccessException e) {

e.printStackTrace()

} catch (ClassNotFoundException e) {

e.printStackTrace()

}

}

public Connection getConnection(){

Connection conn=null

try {

conn=DriverManager.getConnection(URL, USER, PASSWORD)

} catch (SQLException e) {

e.printStackTrace()

}

return conn

}

}

此类用来关闭数据库连接工具类

package com.util

import java.sql.Connection

import java.sql.PreparedStatement

import java.sql.ResultSet

import java.sql.SQLException

import java.sql.Statement

public class CloseFunction {

//关闭连接方法,释放资源

public static void closeConnection(Connection conn){

if (conn !=null){

try {

conn.close()

} catch (SQLException e) {

e.printStackTrace()

}

}

}

//关闭执行sql,释放资源

public static void closeExecuteSQL(Statement preparedStatement){

if (preparedStatement !=null){

try {

preparedStatement.close()

} catch (SQLException e) {

e.printStackTrace()

}

}

}

//关闭查询SQL结果,释放资源

public static void closeResultSet(ResultSet resultSet){

if(resultSet !=null){

try {

resultSet.close()

} catch (SQLException e) {

e.printStackTrace()

}

}

}

}

关键在此类:需要从DB2数据库查询语句放在db2SQL变量中,往oracle插入数据的语句放在oracleSQL变量中。注意,查询和插入的语句中字段顺序要一致,在while循环里要对日期时间处理(用setDate),然后执行junit测试类就可以了。

package com.dao

import java.security.interfaces.RSAKey

import java.sql.Connection

import java.sql.PreparedStatement

import java.sql.ResultSet

import java.sql.SQLException

import java.sql.Statement

import org.junit.Test

import com.util.CloseFunction

import com.util.ConnectionDB2

import com.util.ConnectionOracle

public class FromDB2ToOracle {

@Test

public void test1() throws SQLException{

long startTime=System.currentTimeMillis()//记录开始时间

Connection connDB2=null//链接DB2数据库

Connection connOracle=null//链接oracle数据库

Statement statement=null

ResultSet resultSet=null

PreparedStatement preparedStatement=null

try {

ConnectionOracle connectionOracle=new ConnectionOracle()

// System.out.println(connectionOracle+"链接oracle成功!")

ConnectionDB2 connectionDB2=new ConnectionDB2()

// System.out.println(connectionDB2+"-->>>链接DB2数据库成功!")

connDB2=connectionDB2.getConnection()

//执行DB2数据库sql语句,此处并非固定代码

String

db2SQL="SELECT ID,SENDNO,SENDTYPE,BRNUMBER

,SENDTIME,ALARMTIME,SENDCONTENT,ISSEND ,ELEALARMID from

DB2ADMIN.ET_SENDMESSAGEINFO"

//执行oracle数据库sql语句,此处并非固定代码

//String oracleSQL="INSERT INTO EPC.SYS_LOG(ID,REMARK) values(?,?)"

String

oracleSQL="INSERT INTO

EPC.ET_SENDMESSAGEINFO(ID,SENDNO,SENDTYPE,BRNUMBER

,SENDTIME,ALARMTIME,SENDCONTENT,ISSEND ,ELEALARMID )"

+ "VALUES(?,?,?,?,?,?,?,?,?)"

statement=connDB2.createStatement()

statement.execute(db2SQL)//执行sql语句

resultSet=statement.getResultSet()//获取DB2数据库的结果集

connOracle=connectionOracle.getConnection()//获取oracle数据库连接

connOracle.setAutoCommit(false)//把oracle数据库设置为非自动提交,以免在再循环里每次都提交,减低效率

preparedStatement=connOracle.prepareStatement(oracleSQL)//执行oracle语句,预编译

int num=0

while (resultSet.next()) {

num ++

preparedStatement.setString(1,resultSet.getString("ID"))

preparedStatement.setString(2, resultSet.getString("SENDNO"))

preparedStatement.setString(3, resultSet.getString("SENDTYPE"))

preparedStatement.setString(4, resultSet.getString("BRNUMBER"))

preparedStatement.setDate(5, resultSet.getDate("SENDTIME"))

preparedStatement.setDate(6, resultSet.getDate("ALARMTIME"))

preparedStatement.setString(7, resultSet.getString("SENDCONTENT"))

preparedStatement.setString(8, resultSet.getString("ISSEND"))

preparedStatement.setString(9, resultSet.getString("ELEALARMID"))/*

preparedStatement.setString(10, resultSet.getString("CONSUMETIME"))

preparedStatement.setString(11, resultSet.getString("TASKID"))

preparedStatement.setString(12, resultSet.getString("ISSYNCHRO"))

preparedStatement.setString(13,resultSet.getString("LOGTYPE"))

preparedStatement.setString(14, resultSet.getString("ISCACHE"))

preparedStatement.setString(15, resultSet.getString("LAST_RPORT_TIME"))

preparedStatement.setString(16, resultSet.getString("AUTO_REMEMBER"))

preparedStatement.setString(17, resultSet.getString("REMARK"))*/

preparedStatement.addBatch()

//每一万次在oracle数据库里提交事务

if(num>10000){

preparedStatement.executeBatch()

connOracle.commit()

num=0

}

}

preparedStatement.executeBatch()

connOracle.commit()

} catch (Exception e) {

connOracle.rollback()//oracle数据库事务回滚

e.printStackTrace()

}finally{

new CloseFunction().closeConnection(connOracle)//关闭oracle数据库,释放资源

new CloseFunction().closeConnection(connDB2)//关闭DB2数据库,释放资源

long endTime=System.currentTimeMillis()//记录程序结束时间

System.out.println("总的时间:"+(endTime-startTime)/1000+"秒")

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10038435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存