data_migration_tools..

Download Report

Transcript data_migration_tools..

Data Migration Tools
By d.c.b.a
http://www.anysql.net
http://www.mydul.net
Source & Target

Source



Target




Oracle
MySQL
Oracle
MySQL
Flat Text File
Download
Oracle Source

Oracle to Oracle


Oracle to MySQL


datacopy
ora2mysql
Oracle to Flat Text File

SQLULDR2
MySQL Source

MySQL to Oracle


MySQL to MySQL


mysql2ora
mysqlcopy
MySQL to Flat Text File

MYSQLULDR2
Basic Concept

Query on Source, DML on Target










Only Select Allowed on Source Database
Insert/Update/Delete/Script allowed on Target
Database,
Refer source columns by “:”+column name
Query1/Table1 for Source SELECT Statement
Query2/Table2 for Target DML Statement
Basic Data Types Supported. Object Data Types not
Supported.
Array Operation to Reduce Network Roundtrips.
Direct Load Supported for Oracle.
Parallel Supported for Both Oracle and MySQL.
Parameter File Supported.
Database Connection



User1 Option for Source Database
User2 Option for Target Database
Oracle Connection




User/Password@Host:Port:Database
User/Password@tnsname
“sys” for SYSDBA logon (Oracle Database)
MySQL Connection


User/Password@Host:Port:Database
Default Port is 3306
Return Code

Windows


Linux/Unix



%ERRORLEVEL%
$?
Zero value for success without any errors.
Non-zero value for error, different error
different return code.
From Oracle To Oracle
DATACOPY
DATACOPY


Manipulate Data Between Oracle Databases.
Operations






Direct Load Insert
Insert
Update
Delete
PL/SQL Block
The SYNC option
Direct Load Insert (DATACOPY)



Using TABLE2 option to specify the table
name on target database.
Specify the “direct=yes” option.
Example

datacopy user1=scott/tiger@prod1
user2=scott/tiger@prod2 query1=“select * from
emp” table2=emp direct=yes
Insert (DATACOPY)



Using QUERY2 Option to Specify the Insert
Statement on Target Database
Refer the source column value by “:” plus
column name
Example

datacopy user1=scott/tiger@prod1
user2=scott/tiger@prod2 query1=“select eno,
ename from emp” query2=“insert into emp(eno,
ename) values (:eno, :ename)”
Update (datacopy)



Using QUERY2 Option to Specify the Update
Statement on Target Database
Refer the source column value by “:” plus
column name
Example

datacopy user1=scott/tiger@prod1
user2=scott/tiger@prod2 query1=“select eno,
ename from emp” query2=“update emp set
ename = :ename where eno = :eno”
Delete (DATACOPY)



Using QUERY2 Option to Specify the Delete
Statement on Target Database
Refer the source column value by “:” plus
column name
Example

datacopy user1=scott/tiger@prod1
user2=scott/tiger@prod2 query1=“select eno
from emp” query2=“delete from emp where eno
= :eno”
PL/SQL Block (DATACOPY)



Using QUERY2 Option to Specify the PL/SQL
Script on Target Database
Refer the source column value by “:” plus
column name
Example

datacopy user1=scott/tiger@prod1
user2=scott/tiger@prod2 query1=“select eno
from emp” query2=“begin delete_emp(:eno);
end;”
SYNC Option (datacopy)


Auto Generate Target SQL or PL/SQL Script
without specify the “QUERY2” option.
Cooperation with “TABLE2” option.


SYNC=INSERT
Cooperation with “TABLE2” and “UNIQUE”
option.


SYNC=UPDATE/DELETE
SYNC=DELINS/INSUPD/UPDINS
SYNC Option (DELINS)

Command


datacopy … table1=emp table2=emp
unique=eno sync=delins
Real QUERY2 Value

Begin delete from emp where eno=:eno; insert
into emp (…) values (…); end;
SYNC Option (UPDINS)

Command


datacopy … table1=emp table2=emp
unique=eno sync=delins
Real QUERY2 Value

Begin update emp set … where eno=:eno; if
sql%rowcount == 0 then insert into emp (…)
values (…); end if; end;
SYNC Option (INSUPD)

Command


datacopy … table1=emp table2=emp
unique=eno sync=delins
Real QUERY2 Value

Begin insert into emp (…) values (…); if unique
error then update emp set … where eno=:eno;
end if; end;
Tuning (datacopy)





Multiple Block Read (read=…)
Sort Area Size (sort= …)
Hash Area Size (hash=…)
Direct Path Read (serial=yes)
Parallel Query (/*+ PARALLEL … */ Hint)
Multiple Thread Copy






Automatically Split Into Pieces by ROWID Range.
Need “SELECT_CATALOG_ROLE” to access
“DBA_EXTENTS” view.
Using “SPLIT” and “DEGREE” Option.
“SPLIT” for the base table for ROWID range
analyze.
“DEGREE” for the parallel degree.
Example

datacopy … split=emp degree=4 …
Why “SPLIT” Option

Source Query Can be Complex.




select … from emp, deptno where emp.deptno =
dept.deptno and emp.rowid >= :minrid and
emp.rowid < :maxrid
select deptno, count(*) from emp where rowid
>= :minrid and rowid < :maxrid group by deptno
Parallel Can Only Be One Dimemsion.
Reference The ROWID Range by “:MINRID”
and “:MAXRID”.
Character Set

Source Database


Target Database



NLS_LANG environment variable
“CHARSET” option for basic character set.
“NCHARSET” option for national character set.
From US7ASCII to ZHS16GBK


export NLS_LANG=.US7ASCII
datacopy … charset=ZHS16GBK …
Parameter File

Text File (test.par)







user1=scott/tiger@prod1
user2=scott/tiger@prod1
query1=select * from emp
table2=emp
read=128
serial=yes
Command

datacopy parfile=test.par
From Oracle To MySQL
ORA2MYSQL
Reference

Multiple Thread Support Refer DATACOPY.
SYNC Option (ora2mysql)


Auto Generate Target SQL without specify
the “QUERY2” option.
Cooperation with “TABLE2” option.


SYNC=INSERT/ARRINS
Cooperation with “TABLE2” and “UNIQUE”
option.

SYNC=UPDATE/DELETE/INSUPD/ARRUPD
Target SQL (ora2mysql)

ARRINS


INSUPD


Insert into emp (…) values (…), (…), (…)
Insert into emp (…) values (…) on duplicate
key …
ARRUPD

Insert into emp (…) values (…) (…) (…) on
duplicate key …
Character Set


MySQL Character Set is Controlled By
“CHARSET” option.
Oracle Character Set is Controlled By
“NLS_LANG” Environment Variable.
From Oracle To Flat File
SQLULDR2
Reference

Multiple Thread Support Refer DATACOPY.
Flat File Format


Fixed Width Format
How to Split Different Records?



How to Split Different Fields?



Using the “FIELD” Option.
Using “0xXX” for Any Characters.
Using the “RECORD” Option.
Using “0xXX” for Any Characters.
Example

sqluldr2 … field=0x07 record=0x06 …
Output File Name

Dynamic File Name







%y=Year
%m=Month
%d=Day
%w=Week
%b=Batch Count
%p=Thread ID
%t=Timestamp (now() function)
Multiple Output Files

Split Output File by “SIZE” Options.



Unit Megabytes
sqluldr2 … size=500 file=data_%b.txt
Split Output File by “BATCH” Options.


Store each rows in a single file
sqlldr2 … rows=5000000 batch=yes
file=data_%b.txt …
SQL*Loader Control File




SQL * Loader need a parameter file (describing
the format of the flat file) to load flat text file
into Oracle database.
“TABLE” for the table name of target database.
“MODE” for the SQL * Loader option, default is
“INSERT”, other options are “APPEND”,
“REPLACE” and “TRUNCATE”.
“CONTROL” for the SQL*Loader control file
name, default is “<table name>_sqlldr.ctl”.
From MySQL to Oracle
MYSQL2ORA
Reference

Target Operation Please Refer DATACOPY.
Attention

LONG/LOB values larger than 64KB Not
Supported Now.
Multiple Thread Copy






Automatically Split Into Pieces by Given Column.
Using “SPLIT”, “SPLITKEY” and “DEGREE”
Option.
“SPLIT” for the base table.
“SPLITKEY” for the key prefix column of the
base table.
“DEGREE” for the parallel degree.
Example

mysql2ora … split=emp splitkey=empno degree=4 …
Why “SPLIT” Option

Source Query Can be Complex.




select … from emp, deptno where emp.deptno =
dept.deptno and emp.empno >= :minrid and
emp.empno < :maxrid
select deptno, count(*) from emp where empno
>= :minrid and empno < :maxrid group by
deptno
Parallel Can Only Be One Dimemsion.
Reference The ROWID Range by “:MINRID”
and “:MAXRID”.
The “SPLITKEY” Logic

Minimum Value


Maximum Value




SELECT <splitcol> FROM <table> ORDER BY
<splitcol> LIMIT 1
SELECT <splitcol> FROM <table> ORDER BY <splitcol> DESC
LIMIT 1
Split The Range Into Degree Pieces.
Only Number/Date/Char Columns Supported.
Data May Not Be Evenly Distributed.
SYNC Option (datacopy)


Auto Generate Target SQL or PL/SQL Script
without specify the “QUERY2” option.
Cooperation with “TABLE2” option.


SYNC=INSERT
Cooperation with “TABLE2” and “UNIQUE”
option.


SYNC=UPDATE/DELETE
SYNC=DELINS/INSUPD/UPDINS
From MySQL to MySQL
MYSQLCOPY
Reference

Multiple Thread Please Refer MYSQL2ORA.
Attention


Source & Target Database Connection Using
the Same Character Set.
Will Support Different Character Set Soon.
SYNC Option (mysqlcopy)


Auto Generate Target SQL without specify
the “QUERY2” option.
Cooperation with “TABLE2” option.


SYNC=INSERT/ARRINS
Cooperation with “TABLE2” and “UNIQUE”
option.

SYNC=UPDATE/DELETE/INSUPD/ARRUPD
Target SQL (mysqlcopy)

ARRINS


INSUPD


Insert into emp (…) values (…), (…), (…)
Insert into emp (…) values (…) on duplicate
key …
ARRUPD

Insert into emp (…) values (…) (…) (…) on
duplicate key …
From MySQL to Text File
MYSQLULDR2
Reference


Text File Format Please Refer SQLULDR2.
Multiple Thread Please Refer MYSQL2ORA.
Load Into Target Directly


Support In Memory “Load Local Infile”
Interface by “LOAD” and “TABLE” option with
File Format.
Example

mysqluldr2 user=/@::test load=/@::test
table=emp2
Resrouce
DOWNLOAD
Links










http://www.mydul.net/software/datacopy.zip
http://www.mydul.net/software/ora2mysql.zip
http://www.mydul.net/software/ora2mysql_linux64.zip
http://www.mydul.net/software/sqluldr.zip
http://www.mydul.net/software/mysql2ora.zip
http://www.mydul.net/software/mysql2ora_linux64.zip
http://www.mydul.net/software/mysqlcopy.zip
http://www.mydul.net/software/mysqlcopy_linux64.zip
http://www.mydul.net/software/mysqluldr2.zip
http://www.mydul.net/software/mysqluldr2_linux64.zip