データベースマイグレーションについて藤井 元雄
はじめに
この資料は個人の見解に基づくものであり、所属する組織の公式の見解ではありませんのでご了承ください。
1
自己紹介
名前 :藤井 元雄
現在 :株式会社 シー・エス・イー
客先常駐でサーバーの構築をしています
過去 :金融機関で富士通、IBMの運用・保守・開発
オープン系のシステム開発
パッケージソフトのプリセールス・ヘルプデスク
客先常駐でインフラエンジニアとして構築・保守・開発標準策定、製品検証その他・・・・
2
アジェンダ
データベースマイグレーションツール
SQLの動作の違い
3
データベースマイグレーションツール
4
データベース・マイグレーションとは
データベースの定義やデータをDBの新バージョンや別のDB
製品に移行する
移行先データベースに適合するようにミドルウェアやアプリケーションの変更等を行う
5
データベース・マイグレーションツールとは
データベースのオブジェクト(テーブル、ファンクション等)、およびデータを移行先DBMSに合わせて変換して移行するためのツールです。
SQL Server、Oracleについては以下のツールが無償提供されています。
6
対象 ツール名 開発元
SQLServerへ移行 SQL Server Migration Assistant(SSMA) Microsoft
Oracleへ移行 SQL Developer Oracle
SQL Server Migration Assistant
SSMAはマイクロソフトが無償で提供している、他のDBからSQL Serverへのマイグレーションツールです。
以下のステップに分けてマイグレーションできます
移行性評価(レポートの作成)
スキーママイグレーション
データマイグレーション
SQL Serverにないファンクションは、SSMA独自のファンクションで代替することができます。
移行元のデータベース毎に、インストールするモジュールが異なります。
7
SSMAの対応DB
移行元
Oracle 9i-12c
MS-Access
MySQL
DB2
Sybase ASE
移行先
SQL Server 2008 – 2016 / 2017 Preview ( Windows / Linux)
Azure SQL Database
Azure SQL Data Warehouse ※Oracleのみ
8
SSMA for Oracle の構成例 9
Oracle DataBase SSMA for Oracle
Oracle Net ClientSQL Server
SSMA ExtentionPack for Oracle
Oracle Data Provider
同居可能
移行元DB ②移行先DB①SSMA
SSMA for Oracle の動作環境 10
SSMA 7.6 (2017/10/19 最新)の動作環境は以下の通り
対象 OS ソフトウェア 備考
①SSMA 64 Bit Windows SSMA for Oracle .Net Framework 4.5.2以上が必要
Oracle Net Client 移行元Oracleのバージョン用以降のもの
②移行先 Windows SSMA for Oracle Extention
Pack
.Net Framework 4.5.2以上が必要
SQL Server 任意のバージョン
Oracle Data Provider 移行元Oracleのバージョン用以降のもの.NET / oledb用どちらでも可
SSMA for Oracleのマイグレーション対象
表
索引
ビュー
マテリアライズド・ビュー
データタイプ
プロシージャ
ファンクション
トリガー
データ
ユーザー、ロール、データベース、データベースファイル等は対象外
11
SSMAの入手
マイクロソフトのダウンロードセンターから入手できます。ユーザー登録は不要です。
SSMA for OracleとSSMA for Oracle Extention Pack の2つを同時にダウンロードできます。
12
Downloadをクリックするとファイル選択画面が表示されるので、すべてチェックします。
インストール手順①
①SSMA
SSMA for Oracle.7.6.0.msi を実行してインストールします→インストーラーの設定に従いますインストール完了後、デスクトップに右のアイコンが作成されます
Oracle Net Clientをインストールする→インストーラー版とXCOPY版がありますので、付属のドキュメントを参考にインストールします
13
XCOPY版は以下をコマンドプロンプトで実行します。> cd /d (インストールファイル展開フォルダ)
> install_odpm.bat [ x86 | x64 | both ] (インストール先フォルダ)
インストール手順②-1
②移行先DB
SQL Serverをインストールします(インスタンス作成)。
SSMA for Oracle Extension Pack.7.6.0.msi を実行します。
途中、以下のOracle Data Providerのダウンロード画面に誘導するボタンが表示されます。別途入手できますので、無視しても構いません。
14
インストール手順②-2
SSMA用データベース作成のため、移行先インスタンスの接続情報を入力します。
接続ユーザーには、sysadmin権限が必要です。
15
接続先インスタンス選択 接続パラメータ入力パスワード(Windows認証のみ)
インストール手順②-3
データベース作成の確認をされますので、Nextクリックで確定します。
インストールが完了すると、上記で接続したインスタンスに、2つのデータベースが作成されます:
ssmatesterdb → マイグレーションテスト用DB sysdb → SSMAの追加ファンクション等のスキーマ
16
インストール手順②-3
sqmcmd、SSMSで以下のSQLを実行し、インスタンスでCLRを使用可能にします(SSMAのアセンブリを動作可能にします)。
Oracle Data Providerをインストールします。→インストーラーの指示に従ってインストールします。
17
sp_configure ‘clr enabled’, 1
GO
RECONFIGURE
GO
SQL Server(マイグレーション先)
の準備
SQL Serverでマイグレーション先のデータベースを作成します。→移行元のデータベース名と違っても問題ありません。
TCP/IPで接続できるよう設定してください。
18
SSMAの起動
デスクトップのSSMAのアイコンから起動するか、スタートメニューからSSMAを起動します。
19
SSMAの画面 20
メニュー
Oracleオブジェクトのエリア(移行元)
SQL Serverオブジェクトのエリア(移行先)
メッセージエリア(起動時は未表示)
マイグレーションの手順
①プロジェクトの作成(開く)
②Oracle接続
③マイグレーションレポート作成
④SQL Server接続
⑤スキーママイグレーション
⑥データマイグレーション
21
① ② ③④ ⑤
大きな流れとしては、画面上部のメニューを左から順番にたどっていきます。(例外あり)
⑥
プロジェクト作成①
マイグレーションを行うためには、まずプロジェクトを作成します。
プロジェクト名
プロジェクトファイル保存先
マイグレーションターゲットのSQL Serverバージョンを選択します。
22
プロジェクトの作成②
プロジェクト作成後のオプションを設定します。(いつでも可能です)
「Tools」-「ProjectSettings」でオプション画面を表示します。
設定可能なもの
プロジェクトの情報
一般設定
コンバート方法
マイグレーション時の動作
Oracleシステムオブジェクトのマイグレーション対象
データの同期
GUIの設定
データタイプの変換マッピング
23
プロジェクトの作成③
コンバート方法で設定できるもの例
SSMAの独自関数を使用するかtrunc(日付型)、trim( 文字列, 除去する文字)など、SQL Serverが持っていない関数を、SSMAの拡張関数に置き換える
Order BYのNULLの扱いのエミュレーション
ROWID列のエミュレート(すべてのテーブルにROWID列を追加)
等
24
Oracle接続
Oracleを接続します。下記のいずれかのモードを選択します。
Provider : Oracle Client / OLEDB / ODBC
Mode : Standard mode /TNSNAMES Connect / Connect String
接続に必要な情報を入力し、「Connect」をクリックします。
Oracle接続に成功すると、SSMAにOracleのスキーマ情報が保存されます。
25
レポート作成①
スキーママイグレーションのレポートを作成します。
マイグレーションのツールでの変換結果を評価します。
レポートを作成するには、レポート作成対象オブジェクトをチェックした後、「Schemas」または「Syanonyms」を選択後、「Create Report」をクリックします。
26
レポート作成②
レポートが完成すると、Webブラウザでレポートが表示されます。
レポートはプロジェクトファイルのフォルダに「report¥report(作成日時)」フォルダが作成されます。
レポートはフォルダ全体をコピーして他のPCで確認できます。トップページ : report¥report(作成日時)¥mainindex.html
27
レポート作成③
レポートで確認できるもの
マイグレーション対象数
エラー、警告の数
エラー、警告の割合
マイグレーションしたプロシージャ、パッケージ、ファンクション(変換前、後の比較)
28
SQL Server接続
SQL Serverに接続します。
SQL Serverに接続する前に、SQL Server Agentサービスを起動する必要があります。
29
スキーママイグレーション①
マイグレーションするOracleのスキーマを選択し、「Convert
Schema」をクリックます。
※この時点では、まだSQL Serverへマイグレーションされていません。
30
スキーママイグレーション③
SQL Serverのマイグレーション先のスキーマを選択し、右クリックメニュー「Synchronize with Database」をクリックします。
31
スキーママイグレーション④
マイグレーションさせるオブジェクト画面が表示されるので、対象を選択し、「OK」をクリックします。
32
マイグレーション先 SSMAのデータ
双方向同期
同期しない
マイグレーション先に同期
SSMAに同期
Action
スキーママイグレーション⑤
SSMA独自の拡張データタイプ、ファンクションなどはここで同期することで、初めてマイグレーション先のSQL Serverに保存されます。
33
データマイグレーション①
Oracleのマイグレーション対象テーブルを選択し、「Migrate Data」をクリックします。
Oracle、SQL Serverへの接続要求がされるので接続します。
文字コードの変換は、マイグレーション先のSQL ServerにインストールされたOracle Data Providerに任されます。
34
データマイグレーション②
マイグレーションが完了すると、結果が表示されれるので「Close」で終了します。
「Save Report」クリックで結果をCSVファイルに保存できます。
35
マイグレーション結果
マイグレーションしたテーブルのほかに、SSMA用のテーブル、ビューが作成されます。
36
マイグレーションツールの使い方(例)
事前調査として、マイグレーションの変換率、手動変換箇所、難易度等をレポートで確認する
自動変換可能なオブジェクト、データだけマイグレーションし、マイグレーション全体の負荷を軽減する
ファンクション、プロシージャのマイグレーション機能を利用し、SQLを他のDB用に変換した記述を確認する。(ファンクション1つだけでレポート作成可能なため)
37
(参考)モジュール入手元 38
SSMA for Oracle / SSMA Extention Pack for Oracle
https://docs.microsoft.com/ja-jp/sql/ssma/sql-server-migration-assistant※上記はマニュアル。ダウンロードURLはここのリンクから辿ります。
Oracle Net Client
http://www.oracle.com/technetwork/database/enterprise-
edition/downloads/oracle12c-windows-3633015.html?ssSourceSiteId=otnjp
Oracle Data Provider(ODAC)
http://www.oracle.com/technetwork/jp/database/windows/downloads/inde
x-214820-ja.html
SQL Developer
SQL Developerは、Oracleが提供する無償のGUIのデータベース管理ツールです。
Oracle Databaseに同梱されていますが、別途入手可能です。
以下のステップに分けてマイグレーションできます
移行性評価(レポートの作成)
スキーママイグレーション
データマイグレーション
39
SQL Developerの構成例 40
SQL Server SQL Developer
JKD8
jtds
Oracle Database
同居可能
移行元DB 移行先DB①SQL Developer
SQL Developer の動作環境 41
SQL Developer 17.2 Linux版(2017/10/19 最新)の動作環境は以下の通り
RPMでのインストールになります。
対象 OS ソフトウェア 備考
①SSMA Linux SSMA for Oracle GUI環境が必要です。
JDK8
Jtds オープンソースのjdbc
※MicrosoftのJDBCは使用できません
(参考)検証環境Oracle Linux 7.3(64bit)
ベース構成 : サーバー追加アドオン: 開発ツール、互換性ライブラリ
SQL Developerの対応DB
移行元
SQL Server 7.0, 2000, 2005
MS-Access
Teradata
MySQL
DB2
Sybase ASE
Infomix
移行先
Oracle Database ~ 12c
42
SQL Developerの入手
Oracleのサイトから入手できます。
ユーザー登録は不要です。
ライセンスに同意後、任意のソフトをダウンロードします。
43
インストール手順①
① SQL Developer
JDK8をインストールします。
SQL Developerをインストールします。
→ /opt/sqldeveloper にインストールされます。
SQL Developerの設定ファイルを編集します。
44
# rpm – ivh jdk-8u144-linux-x64.rpm
# rpm -ivh 17.2.0.188.1159-1.noarch.rpm
設定ファイル名: ~/.sqldeveloper/4.2.0/product.conf
(以下の行を追加)SetJavaHome /usr/java/jdk1.8.0_144
Oracle Database(マイグレーション先) の準備
Oracle Databaseでマイグレーション先のデータベースを作成します。→移行元のデータベース名と違っても問題ありません。
jtdsのJDBCドライバファイル(jtds1.3.1.jar)を任意のディレクトリにコピーします。
マイグレーション情報を保存するリポジトリにするスキーマを作成します(任意)。
→権限として:resource, create session, create viewが必要
45
SQL Developerの起動
GUIが使用できる環境で、以下のシェルを実行します。
46
$ /opt/sqldeveloper/sqldeveloper.sh
SQL Developerの画面 47
マイグレーションの手順
SQL Server接続
移行オプション設定
ウィザードでのマイグレーション
48
メニューの「ツール」ー「プリファレンス」で画面を表示します。
画面左のツリーメニューの「データベース」ー「サードパーティJDBCドライバ」を選択します。
「エントリの追加」をクリックし、jtdsのドライバファイル(jtds-1.3.1.jar)を選択します。
「OK」で画面を閉じます。
SQL Server接続① 49
SQL Server接続②
「新規追加」をクリックします。
50
SQL Server接続③
SQL Serverのタブを選択します。
接続名、接続に必要な情報を入力して「接続」をクリックします。※データベースの設定が必須です。
接続に成功すると、SQL DeveloperにSQL Serverのオブジェクトツリーが表示されます。
51
移行オプションの設定①
「ツール」-「プリファレンス」-ツリーアイテム「移行」で選択します。移行対象オブジェクトのほか、12cへの対応を行うか選択します。
Teradata → エクスポートの最小、最大数
データ移行オプション → NULLデータの扱い、データ形式等
トランスレータ → 移行元のデータ形式、変数などの形式等
識別子オプション → 移行元の識別子の付加
生成オプション
移行スクリプト作成の作成単位
移行時の付加情報
移行対象オブジェクト
52
ウィザードでのマイグレーション①
SQL Serverのマイグレーション対象を右クリックし、「Oracleへ移行」をクリックします。
53
ウィザードでのマイグレーション②
移行ウィザード画面が起動します。「次」をクリックします。
54
ウィザードでのマイグレーション③
移行の情報を保存するリポジトリDBを選択し、「次」をクリックします。
接続情報が未作成の場合は、「新しい接続」をクリックして追加します。
55
「新しい接続」で、接続情報を入力する
ウィザードでのマイグレーション④
プロジェクト移行エンティティ名、保存ディレクトリを選択し、「次」をクリックします。
56
ウィザードでのマイグレーション⑤
移行元のDBを選択して「次」をクリックします。
57
ウィザードでのマイグレーション⑥
移行対象のデータベースを選択し、「次」をクリックします。
58
ウィザードでのマイグレーション⑦
データ形式の変換オプションを登録し、「次」へを選択します。
59
ウィザードでのマイグレーション⑧
移行対象のオブジェクトを選択し、「次」をクリックします。
60
ウィザードでのマイグレーション⑨
移行先のDB接続先を選択し、「次」を選択します。接続ユーザーは、SYSTEMまたはDBA権限があるユーザーにしまs。
61
ウィザードでのマイグレーション⑩
データの移動に使用する接続情報を選択し、「次」をクリックします。
62
ウィザードでのマイグレーション⑪
変換内容を確認し、問題なければ「終了」をクリックします。
63
ウィザードでのマイグレーション⑫
完了後、移行のツリーが表示されます。実行日付をクリックすると結果の確認ができます。
64
オブジェクトのコピー①
SQL Serverから表を単体でコピーできます。
対象の表を右クリック、「Oracleへのコピー」をクリックします。
65
オブジェクトのコピー②
コピーするOracle接続先を選択し、コピーのオプションを設定後に「OK」をクリックします。
事前にマイグレーション先のデータベースに接続する必要があります。
66
オブジェクトのコピー③
コピー結果のログが表示されるので確認します。
67
(参考)モジュール入手元
SQL Developer
http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html
JDK8
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-
downloads-2133151.html
jTDShttps://sourceforge.net/projects/jtds/
68
SQLの動作の違いについて
69
演算の動作の違い①
SQL Serverでは整数同士の結果は小数点以下を切り捨てた整数を返します。
Oracleは結果によって整数または少数を返します。
SQL Server
Oracle
70
1> select 1/2, 2/2, -1/2
2> go
----------- ----------- -----------
0 1 0
SQL> select 1/2, 2/2, -1/2 from dual;
1/2 2/2 -1/2
---------- ---------- ----------
.5 1 -.5
演算の動作の違い②
演算の動作による影響
整数同士の割り算している箇所
日時計算→ SQL Serverでは日の計算のみ反映されます。
例) 2017/01/01 00:00:00 に + 1 + 2/24 + 3/(24 *60) + 4/(24*60*60)
SQL Server → 2017/01/02 00:00:00
Oracle → 1027/01/02 02:03:04
71
演算の動作の違い③
対応例
Oracle → SQL Server演算するどちらか一方の辺を少数付きの数字型することで小数点以下の計算が出来でます。ただし、答えが整数の場合でも答えが少数付きの数字になります。固定値の場合: 1/2 → 1/2.0
列の場合 : A/B → A/ cast (B as numeric)
SQL Server → Oracle計算結果をtruncで小数点以下を切り捨てます。固定値、列共通: 1/2 , A/B → trunc(1/2) , trunc(1/2)
72
NULLの扱い①
SQL Server では、空文字’’ と NULLは明確に区別されますが、Oracleでは区別されないため、出力結果が異なります。
例)SELECT * FROM tbl1 WHERE col1 is null
→ Oracle NULLと空文字を出力SQL Server NULLのみを出力
73
NULLの扱い②
NULL行を含む列でソートを行うと、SQL ServerとOracleでは出力順序が異なります。SQL Server → 最初に出力(最小値)Oracle → 最後に出力(最大値)
SQLの操作でNULLの出力順序を操作することもできます。SQL Sever : NULLを最後に出力
SELECT ~ FROM 表 ORDER BYCASE WHEN列 IS NULL THEN 1 ELSE 0 END, 列
Oracle : NULLを最初に出力SELECT ~ FROM表 ORDER BY 列 NULLS FIRST (NULLS LAST)
74
検索結果の出力行数制限
行の検索結果を制限を行う場合、以下の違いがあります。
Oracle 11gselect rownum, * from tbl1 where rownum <= 10 order by 列
SQL ServerSELECT TOP 10 * from tbl1 order by 列
Oracle12cSELECT * from tbl1 FETCH FIRST 10 order by 列
75
照合順序の違い
SQL Serverはインスタンス作成時に言語の照合順序を設定します。
Oracleは基本的にはバイナリ順になります。照合順序を設定する際に、言語ソート機能により、照合順序を決めます。
例)
SQLで設定SELECT ~ ORDER BY NLSSORT(列, ’NLS_SORT=japanese’);
セッション全体で設定ALTER SESSION SET NLS_SORT=japanese;
SELECT ~ ORDER BY列
76