忍者ブログ

インフラ構築手順書

はじめてのインフラ、サーバ構築時に役に立つように構築手順情報をまとめました。


HOME   »  DB構築 MySQL構築手順

[PR]

広告 

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



OracleからMySQLへのマイグレーション時に発生した問題点

広告 

OracleからMySQLへのマイグレーション時に発生した問題点

Oracle10gからMysql5.5へマイグレーションを行った際に遭遇したエラーや問題点をまとめました。
Mysqlのマイグレーションを考えている方の参考にして頂ければ幸いです。
OracleからMySQLへのマイグレーション時に発生した問題点

・行サイズの上限問題
・カラムの中の改行問題(explanation)
・Nullインポート問題
・OracleのDATE型(yy-mm-dd)をMysqlにインポートする際の不具合
・余分な空白が入る
・OracleのCLOB出力問題
・ミリ秒問題
・文字化け




行サイズの上限問題

InnoDBは、テーブルスペースのページサイズの約半分で、ページサイズのデフォルトは16KBなのでデフォルトの行サイズは約8KBです。
ページサイズを変更するには、MySQLをソースからコンパイルして、さらにテーブルスペースとログファイルを再作成する必要があります。 ページサイズの上限は64KBであるので、その場合の1行の最大サイズは32KBとなります。
MySQL Clusterは1行あたり最大8KB。
16Kb以外のテーブルサイズのサポートはMySQL5.6以降となります。

行サイズの上限問題に関するMysqlインポート時のエラーメッセージ
ERROR 1118 (42000): Row size too large. The maximum row si
■行サイズの上限問題の解決策
使用していない不要なカラムがあったので、不要カラムを削除することで回避しました。



カラムの中の改行問題(explanation)

SqlPlusは、カラム中に改行がある場合、空行を挿入する仕様となっているため、 Mysqlにインポートする際に空行の部分が、そのままインポートされてしまう。
つまり、余分なデータがインポートされます。

■カラムの中の改行問題の解決策
OracleからエクスポートしたCSVから手動で空行を削除し、MySQLへインポートすることで回避しました。



Nullインポート問題

Nullインポート問題として、「MysqlのDate型やint型のNull問題」と「UNIQUEKEYが指定されている場合、空カラムを複数登録できない」 という問題に遭遇した。
MysqlのDate型やint型のNull問題
Date型やint型がカラムが空の場合、OracleからエクスポートしたCSVをインポートすると値が[0]となり、インポートされてしまいます。 ※マイグレーションツールを使った場合は、NULLとしてインポートされました。

UNIQUEKEYが指定されている場合、空カラムを複数登録できない
Mysqlの場合、UNIQUEKEYが設定されているカラムに、空カラムをインポートできるが、複数あるとユニーク違反となり、 インポートできない。しかしNULLを明示すれば複数登録可能である。


■MysqlのDate型やint型のNull問題の解決策
カラムが空の場合、\Nに置き換える。 ※NULLに置き換えるとNULLとして認識されてなかった。 ※一部のカラムでNULLでは警告がでるので、NULLと同じ意味を持つ「\N」とする。 CSVインポートする際は、NULLを「NULL」と記述するより、「\N」と記述した方がいいようである。下記事象は「\N」とすることで解決しました。 (桁数が4桁以内の場合、「NUL」、「NU」の様に中途半端に入り、NULLではなくなる。)
Oracle側で空カラムをNULL文字列に置換してエクスポートする。
(マイグレーションツールの場合、デフォルトでNULL文字列に置換される)
・Null置換を考慮したSQL
set echo off
set linesize 32767
set pages 0
set trimspool on
set feed off
spool CSV_m_agencyhoge.csv
select
          '~' || DECODE(AGENCY_CD, '', '\N',AGENCY_CD  ) || '~'
 ||','||  '~' || DECODE(AGENCY_NAME, '', '\N',AGENCY_NAME  ) || '~'
 ||','||  '~' || DECODE(DELETE_FLG, '', '\N',DELETE_FLG  ) || '~'
 ||','||  '~' || DECODE(UPD_DATE, '', '\N',TO_CHAR(UPD_DATE , 'YYYY-MM-DD HH24:MI:SS' ) ) || '~'
 ||','||  '~' || DECODE(UPD_USER_ID, '', '\N',UPD_USER_ID  ) || '~'
 ||','||  '~' || DECODE(INS_DATE, '', '\N',TO_CHAR(INS_DATE , 'YYYY-MM-DD HH24:MI:SS' ) ) || '~'
 ||','||  '~' || DECODE(INS_USER_ID, '', '\N',INS_USER_ID  ) || '~'
from m_agencyhoge ;
spool off
※区切り文字[,]、文字列の囲み[~]としています。環境に合わせてください。




OracleのDATE型(yy-mm-dd)をMysqlにインポートする際の不具合

Oracle側で99-12-31というデータはMAX年(9999)を意味しているがMysqlにインポートすると1999-12-31と解釈されてしまう。

■OracleのDATE型をMysqlにインポートする際の不具合の解決策
Oracle側でエクスポートする際にDATE型のフォーマットをYYYY-MM-DDとしてエクスポートする。
上記SQLの「TO_CHAR(INS_DATE , 'YYYY-MM-DD HH24:MI:SS' )」の部分




余分な空白が入る問題

Oracleからエクスポートする際に、「set colsep ','」を使うと余分な空白が入り、Mysqlへインポートされる。

■余分な空白が入る問題の解決策
Oracle側でエクスポートする際に「set colsep ','」を使わず、下記の様にカラムをひとつひとつ書くと回避できる。
 
select emp_id ||','|| dept_id ||','|| first_name ||','|| last_name ||','||salary from emp;




OracleのCLOB出力問題

CLOB型が含まれているデータをCSV形式にエクスポートすると正常に出力されない現象が発生

調べてみるとsqlplus で文字数が制限があるためCLOB型のデータを全文表示できないことが分かった。

■OracleのCLOB出力問題の解決策
そのため「set long 数字」で文字数制限を広げる必要がある。
set PAGESIZE 0
set LINESIZE 500
set long 6000
select CLOB_TAG_INFO from t_event_html_info;




ミリ秒問題

Mysqlではミリ秒に対応していないため、Oracle側のミリ秒をインポートするとエラーがでてしまう。
OracleからエクスポートしたCSVファイルでは、ミリ秒単位まで格納されている場合、Mysqlにインポートすると「0000-00-00 00:00:00」という値でインポートされる。
ミリ秒問題に関するMysqlインポート時のエラーメッセージ
| Warning | 1264 | Out of range value for column 'upd_date' at row 1 |
■ミリ秒問題の解決策
エクスポート時にフォーマットを指定する。
または時間として取り扱っていないのであれば、CHARA型に変更し、文字列として扱う。




文字化け

マイグレーションツールを利用する場合、CSVファイルの文字コードと特殊文字により文字化けすることがある。
OracleデベロッパーなどをクライアントPC(Windows)にCSVファイルを作成する場合も注意が必要!!
※文字コードだけの問題であれば、変換コマンド(iconv)で変換できるが、特殊文字(ー)などがあるとエラーとなる。

■文字化けの解決策
マイグレーションツールを利用せず、手動でエクスポート・インポートする場合は、SSHの文字コードを合わせることで回避できる。



拍手[2回]



Yahoo!ブックマーク Googleブックマーク はてなブックマーク livedoorClip del.icio.us FC2 ニフティクリップ iza Buzzurl 


最新記事
(09/17)
(04/09)
(04/09)
(03/22)
(01/16)
(12/30)
(12/26)
(09/21)
(09/21)
(09/20)
(09/12)
(06/13)
(06/13)
(03/14)
(02/15)
(01/03)
(01/03)
(10/04)
(09/20)
(09/15)
(09/14)
(09/14)
(09/14)
(09/06)
(08/30)
最古記事
(10/29)
(10/29)
(10/29)
(10/29)
(10/29)
(04/12)
(04/12)
(06/12)
(06/12)
(06/20)
(06/22)
(07/22)
(07/22)
(07/30)
(07/30)
(08/18)
(08/18)
(08/22)
(08/24)
(08/24)
(08/24)
(08/24)
(08/24)
(08/24)
(08/24)


PR

Copyright © インフラ構築手順書 : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]

管理人限定

検索フォーム

カスタム検索

フリーエリア

ESXiの基本設定・運用設定
ESXiのSSH設定
ESXiの NTP設定
VMware ESXiでの時刻同期(NTP)ペストプラクティス
ESXiのゲストOS(仮想マシン)複製
ESXiのOVF形式で複製
異なるESXiバージョン間の複製(移行)
クローン作成後の後処理
仮想マシンのLVM追加
仮想共有ディスクファイルの作成
ESXi上でハイパーバイザーを稼動させる
パフォーマンスがでないとき確認すること


サーバ構築手順
ESXi上でRACを構築する
GFS2+DRBD構築
PaceMaker+MySQLレプリケーション構築
PaceMaker+DRBD構築
HeartBeat2+DRBD構築


Solarisの構築手順
Solarisのネットワーク設定変更
Solarisのホスト名変更
Solaris11のresolv.conf変更手順
Solaris11のHDD増設手順


AWS(Amazon Web Service)の基本設定・運用設定
S3 WEBサイトの構築
S3 WEBサイトのアクセス制限
S3 WEBサイトのリダイレクト設定


Windows Azureの基本設定・運用設定
AzureでWordpress構築
英語版Wordpressを日本語化する
AzureWebサイトの独自ドメイン設定
AzureWebサイトのモード変更
WEBアクセスログ解析ツールの比較


WordPressの基本設定・運用設定
WordPressの基本構造
WordPressのインストール手順
Wordpressマルチサイト機能
「続き読む(more)」カスタマイズ
Wordpressの独自PHP
Wordpressをサブディレクトリに移す
既存サブディレクトリをルートディレクトリとする
Wordpressが利用可能な共用ホスティング


Postfix構築
Postfixにおける暗号化したSMTP認証設定


SoftEtherVPNの構築
ESXi上のSoftEtherVPN構築
DDNSと組み合わせたSoftEtherVPNの設定


LinuxのAD連携
LinuxのActiveDirectory連携について
PAM認証でAD連携
ApacheでAD連携(LDAP認証)
ApacheでAD連携(Kerberos認証)
SAMBAで2台目DCサーバを構築
RedmineとGitのLDAP(AD)認証設定
JenkinsのLDAP(ActiveDirectory)認証設定


Redmine設定
Alminium(RedmineとGit/SVN)のインストール手順
RedmineとGitのLDAP(AD)認証設定
RedmineとGitの移行
JenkinsのLDAP(ActiveDirectory)認証設定


サーバの基本設定・運用設定
Apache
Apacheの基本設定
Apacheの仮想ホスト設定
PHPの基本設定
Nginxのロードバランサ設定
WebDAV構築手順
アンチウィルス
無償アンチウィルス(ClamAV)の導入手順
システム監視
システム監視ソフトMuninの導入手順
システム監視ソフトZabbixの導入手順
sarによるリソース使用情報取得


サーバ移行
Mysqlマイグレーション
MySQLマイグレーション時の問題点と解決策
Windows
Windows OS評価版からの移行
SQL Server評価版からの移行
クラスタソフト
クラスタソフトの比較

ツリーカテゴリ

広告ーSEO





人気ブログランキングへ
にほんブログ村 IT技術ブログ Webサイト構築へ

ブログ王ランキングに参加中!


最新トラックバック

バーコード

アフィリエイト2