10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

第二のドワンゴAdvent Calendar 2019

Day 6

OracleからMySQLへデータ移行したお話

Last updated at Posted at 2019-12-05

はじめに

この記事は第二のドワンゴ Advent Calendar 2019の記事になります。

OracleDB → MySQL移行作業にて、テーブルデータを移行した時のお話です。

異なるデータベース間の移行作業は移行リスク、作業工数の観点から発議し辛い提案ですが、
実際に「異なるデータベース間にて、実データの移行作業はどうやるか」を主軸に進めたいと思います。

目次

  1. 移行方法の選定
  2. 環境と準備
  3. テーブル構造移行
  4. データ移行
  5. まとめ

1. 移行方法の選定

同じデータベース間であれば、

  1. dump
  2. import
    上記2手順で済みますが、SQL構造の異なる場合は単純には上手くいきません。

DDL/DMLを別にimportする上で、SQLのフォーマットをデータベースに合わせた形にconvertする必要があります。

今回はOracle to MySQL Migrationを用いたconvert方法を紹介させて頂こうと思います。

次にデータinsertのDML文は上記ツールでのconvertではなく、

  • 明示的なinsert文では、設定によりエラーになる可能性がある(mysql/STRICTモード等)1
  • csvの方がinsert文より柔軟性があるのも強み

上記理由からcsvファイルとしてデータexportし、csvとしてデータimportする事にしました。

2. 環境と準備

作業
移行元:Oracle 11g
移行先:MySQL 5.7

必要なアプリケーション
SQL Plus*
Oracle to MySQL Migration2
MySQL3

SQL Plus* install 時のメモ(クリックで展開) sqlplus コマンドが動作せず、libc.so.6 が読み込めないエラーは以下で対処した。
# 必要なパッケージを探す
yum whatprovides libc.so.6
# パッケージをインストールする
yum install libc.so.6 
 
# その他、インストールしたコマンド
## ld-linux.so.2
yum install ld-linux.so.2
## libstdc++.so.6 適正バージョンとインストール
yum whatprovides libstdc++.so.6
yum install libstdc++.so.6
yum install libstdc++-4.4.7-23.el6.i686
yum upgrade libstdc++
GNU lib install 時のメモ(クリックで展開) GNU lib のバージョン2.14が求められた
# version確認
# ldd --version
ldd (GNU libc) 2.12
 
# yum upgrade(2.12以上はupdateされない)
yum update glibc
 
# server からDL
wget https://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
tar zxf glibc-2.14.tar.gz
cd glibc-2.14
mkdir build && cd build
../configure --prefix=/opt/local
make -j8
sudo make install

# env追加
echo 'export LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH'  >> ~/.bash_profile
# 再起動
shutdown -r now

3. データ構造移行

Oracle Table Struct Dump

コマンドラインで実行

expdpを用いる4

EXPDP/IMPDP {ユーザー}/{パスワード}@{接続文字列} 
 DIRECTORY={ディレクトリ} DUMPFILE={ファイル名} LOG={ログファイル名} TABLES={テーブル} CONTENT=METADATA_ONLY

-- example
EXPDP test/pass@orcl DIRECTORY=dp_dir DUMPFILE=dmp_table.dmp 
 LOGFILE=exp.log TABLES=test.emp CONTENT=METADATA_ONLY

SQL DeveloperのUI上から実行

「ツール」→「データベース・エクスポート」
スクリーンショット 2019-12-04 17.26.04.png

「DDLのエクスポート」にチェック
「データのエクスポート」はチェックを外す
スクリーンショット 2019-12-04 17.26.16.png

Query Convert

Oracle to MySQL Migrationのsqllinesを用います

# DB移行ツール(sqllines)を用いる
ファイル名 - oracle_export.sql
./sqlines -s=oracle -t=mysql -in=oracle_export.sql
 
> oracle_export_output.sql が出力される

MySQL Query Struct Import

# mysqlコマンド
MYSQL_PWD='****' mysql -u(ユーザー名) -A -h (サーバー) < oracle_export_output.sql

4. データ移行

(1)Oracle Record Export

# oracleにログイン
sqlplus / nolog
 
# 接続
conn (ユーザー名)/(パスワード)@(ホスト):(ポート番号)/(スキーマ)
# データdump
exp (ユーザー名)/(パスワード)@(ホスト):(ポート番号)/(スキーマ) tables=(テーブル名) directory=export dumpfile=(dumpファイル名) logfile=(logファイル名)

(2)MySQL Record Import

MYSQL_PWD='****' mysql -u(ユーザー名) -A -h (ホスト)
use (スキーマ);LOAD DATA LOCAL INFILE '(logファイル名)' INTO TABLE (テーブル) FIELDS TERMINATED BY ',' ENCLOSED BY '"';

移行時に使ったScript

テーブル単位でデータ移行するScript
https://github.com/yuichi-sato/query-script

5. まとめ

Table、Materialized View も単純なデータレベルでの移行なら可能で、
型を精査する作業時間が短縮される恩恵は大きく、移行作業の助けになりました。

作業に一手間掛かりますが、sqlines / shellで完結するのは大きいです。


参考

sqlines
http://www.sqlines.com/oracle-to-mysql
oracle exp
https://oracle-chokotto.com/ora_export.html
oracle expdp
https://oracle-chokotto.com/ora_export_expdp.html

  1. insert query で errorが発生すると rollbackされるMySQLの設定

  2. Linux/Windows版のみ

  3. Macであれば brew install mysql

  4. 最新バージョンではexpdpコマンド推奨、古いバージョンはexpコマンドを用いることになる

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?