はじめに

他のデータベース(以下、DB)からVerticaへの移行概要については、「Verticaへの移行について」でご紹介しました。今回は、MySQLを例にあげてテーブル、SQL文をVerticaで利用するまでの具体的な手順を解説します。

はじめに

MySQLからの移行ステップ

Verticaに移行するまでのステップと各ステップにおける作業対象のDBは、以下のとおりです。

MySQLからの移行ステップ

ステップ1. Verticaインストール、DB作成

まず、はじめにVerticaのインストールを行い、DBを作成します。Verticaのインストールは、Vertica Community Edition(無償)をダウンロードし、rpmを展開するだけなので簡単です。

ステップ2. テーブルのDDL出力

MySQLのテーブルをVertica用のテーブルに置換えるために「show create table」コマンドや「mysqldump」コマンドでテーブルのDDLを出力します。「MySQL Workbench」などのツールを使うことで、簡単にDDLを出力することもできます。

構文1
mysql> show create table <テーブル名>;

実行例1


構文2

# mysqldump <データベース名> <テーブル名> -u <ユーザ名> -p <パスワード> --no-data

実行例2


ステップ3. テーブルのDDL変換

MySQLとVerticaで利用可能なデータ型を比較して、Verticaが対応しているデータ型に置換えます。以下は、MySQLとVerticaのデータ型のマッピング表です。

数値型

MySQLVertica
データ型分類データ型データ範囲データ型データ範囲
整数型TINYINT-128~127TINYINT-9,223,372,036,854,775,807~
9,223,372,036,854,775,807

※INT,INTEGER,
 INT8,SMALLINT,
 TINYINT,BIGINT
 は全て同じ64bit 整数データ型の
 シノニムです。
SMALLINT-32,768~32,767SMALLINT-9,223,372,036,854,775,807~
9,223,372,036,854,775,807

※INT,INTEGER,
 INT8,SMALLINT,
 TINYINT,BIGINT
 は全て同じ64bit 整数データ型の
 シノニムです。
MEDIUMINT-8,388,608~8,388,607----(対応データ型無し)
INT
INTEGER
-2,147,483,648~2,147,483,647INT
INTEGER
-9,223,372,036,854,775,807~
9,223,372,036,854,775,807

※INT,INTEGER,
 INT8,SMALLINT,
 TINYINT,BIGINT
 は全て同じ64bit 整数データ型の
 シノニムです。
BIGINT-9,223,372,036,854,775,808~
9,223,372,036,854,775,807
BIGINT-9,223,372,036,854,775,807~
9,223,372,036,854,775,807

※INT,INTEGER,
 INT8,SMALLINT,
 TINYINT,BIGINT
 は全て同じ64bit 整数データ型の
 シノニムです。
固定小数点型DECIMAL任意の精度及びスケール指定
(整数部小数部併せて65桁まで)
DECIMAL任意の精度及びスケール指定
(整数部小数部併せて1024桁まで)

※NUMERIC,DECIMAL,
 NUMBER,MONEY
 は全て同じ数値データ型の
 シノニムです。
NUMERIC任意の精度及びスケール指定
(整数部小数部併せて65桁まで)
NUMERIC任意の精度及びスケール指定
(整数部小数部併せて1024桁まで)

※NUMERIC,DECIMAL,
 NUMBER,MONEY
 は全て同じ数値データ型の
 シノニムです。
浮動小数点型FLOAT-3.402823466E+38~
-1.175494351E-38
0
1.175494351E-38~3.402823466E+38
FLOAT64ビットのIEEE-754浮動小数点形式で格納
(指定できる最大精度は53桁まで)

※DOUBLE PRECISION,
 FLOAT(n),FLOAT8,REALは、
 FLOATのシノニムです。
DOUBLE-1.7976931348623157E+308~
-2.2250738585072014E-308
0
2.2250738585072014E-308~
1.7976931348623157E+308
DOUBLE64ビットのIEEE-754浮動小数点形式で格納
(指定できる最大精度は53桁まで)

※DOUBLE PRECISION,
 FLOAT(n),FLOAT8,REALは、
 FLOATのシノニムです。

文字列型

MySQLVertica
データ型分類データ型データ範囲データ型データ範囲
文字列型CHAR(M) 固定長文字列
Mは文字数を指定、
0から255文字
CHAR(M) 固定長文字列
Mはバイト数を指定、
1 から65,000バイト
VARCHAR(M)可変長文字列
Mは文字数を指定、
0から65535バイト
VARCHAR(M)可変長文字列
Mはバイト数を指定、
1から65,000バイト
TINYTEXT最長255(2の8乗-1)バイト----(対応データ型無し)
TEXT最長65,535
(2の16乗-1)バイト
VARCHAR(M)可変長文字列
Mはバイト数を指定、
1から65,000バイト
MEDIUMTEXT最長16,777,215
(2の24乗-1)バイト
LONG VARCHAR(M)可変長文字列
Mはバイト数を指定、
1 から32,000,000バイト
LONGTEXT最長4,294,967,295
または
4GB(2の32乗-1)バイト

日付/時刻型

MySQLVertica
データ型分類データ型データ範囲データ型データ範囲
日付/時刻型DATEフォーマット:
 'YYYY-MM-DD'
範囲:
 '1000-01-01'~
 '9999-12-31'
DATEフォーマット:
 'YYYY-MM-DD'
範囲:
 '22500983562558975-11-30 BC'~
 '22500983562558974-02-02 AD'
DATETIMEフォーマット:
 'YYYY-MM-DD HH:MM:SS'
範囲:
 '1000-01-01 00:00:00'~
 '9999-12-31 23:59:59'
DATETIMEフォーマット:
 'YYYY-MM-DD HH:MM:SS'
範囲:
 '290279-12-22 19:59:05.224194 BC'~
 '294277-01-09 04:00:54:775806'

※DATETIME,
 SMALLDATETIMEは
 TIMESTAMPのシノニムです。
TIMESTAMPフォーマット:
 'YYYY-MM-DD HH:MM:SS'
範囲:
 '1970-01-01 00:00:01.000000'~
 '2038-01-19 03:14:07.999999'
TIMESTAMPフォーマット:
 'YYYY-MM-DD HH:MM:SS'
範囲:
 '290279-12-22 19:59:05.224194 BC'~
 '294277-01-09 04:00:54:775806 AD'

※DATETIME,
 SMALLDATETIMEは
 TIMESTAMPのシノニムです。
TIMEフォーマット:
 'HH:MM:SS'
範囲:
 '-838:59:59.000000'~
 '838:59:59.000000'
TIMEフォーマット:
 'HH:MM:SS'
範囲:
 '00:00:00.00'~
 '23:59:60.999999'
YEAR[(2|4)]フォーマット:
 YYYY
範囲:
 1901~2155 (4桁の場合)
 70~69 (2桁の場合)
デフォルトは4桁
----(対応データ型無し)

バイナリ/BLOB型

MySQLVertica
データ型分類データ型データ範囲データ型データ範囲
バイナリ型BINARY(M)固定長バイナリバイト文字列
Mはバイト数を指定、
0から255バイト
BINARY(M) 固定長バイナリバイト文字列
Mはバイト数を指定、
1 から65,000バイト
VARBINARY(M)可変長バイナリバイト文字列
Mはバイト数を指定、
0から65535バイト
VARBINARY(M)可変長バイナリバイト文字列
Mはバイト数を指定、
1から65,000バイト
BLOB型TINYBLOB最長255(2の8乗-1)バイト----(対応データ型無し)
BLOB最長65,535
(2の16乗-1)バイト
BINARY(M)
VARBINARY(M)
BINARY(M)
固定長のバイナリ文字列
Mはバイト数を指定、
1から65,000バイト

VARBINARY(M)
可変長のバイナリ文字列
Mはバイト数を指定、
1から65,000バイト
※BYTEA,RAWは
 VARBINARYのシノニムです。
MEDIUMBLOB最長16,777,215
(2の24乗-1)バイト
LONG VARBINARY(M)可変長rawバイトのデータを保持
Mはバイト数を指定、
1から32,000,000バイト
LONGLOB最長4,294,967,295
または
4GB(2の32乗-1)バイト

ENUM/SET型

MySQLVertica
データ型分類データ型データ範囲データ型データ範囲
ENUM/SET型ENUM列挙値の数
(最大 65,535 個の値)
1 または 2 バイト
----(対応データ型無し)
SETセットメンバーの数
(最大 64 メンバー)
1、2、3、4、または 8 バイト
----(対応データ型無し)


ステップ4. テーブル作成

置換えたテーブル定義をもとに、Verticaでテーブルを作成します。一例ですが、MySQLからVerticaに置換えて、テーブルを作成した結果は以下のとおりです。

【MySQL】


【Vertica】


MySQLからVerticaに置換えるまでのポイントを簡単に纏めました。

・Verticaは列指向DBのため、インデックスは存在しません。作成は不要です。
・MySQLで指定していた「ENGINE」や「CHARSET」の指定はできません。DBキャラクタセットは「UTF8」のみに対応しています。
・Verticaではオブジェクト名を「`」(バッククォーテーション)で囲むことはできません。
・「MySQL:varchar(30)」から「Vertica:varchar(90)」に変更しています。MySQLのカラムサイズの指定は「文字数」ですが、Verticaは「バイト数」の指定のためです。 VerticaのDBキャラクタセットはUTF8なので、マルチバイト1文字は「3バイト」で扱われます。そのため、VerticaのカラムサイズをMySQLの3倍に指定しています。
・Verticaの「tinyint型」は「int型」のシノニムなので、テーブル定義を確認すると「int型」になります。
・Verticaの「datetime型」は「timestamp型」のシノニムなので、テーブル定義を確認すると「timestamp型」になります。

ステップ5. データのCSV出力

Verticaのテーブルにデータを取り込むため、MySQLからデータを「SELECT .. INTO OUTFILE」コマンドでCSVに出力します。MySQLに対応しているETLツールの場合、ETLツールからCSVの出力をすることもできます。

構文
mysql> SELECT * FROM <テーブル名> INTO
OUTFILE ‘<CSV出力先>’ FIELDS TERMINATED BY ‘<区切り文字>‘;

実行例


ステップ6. CSVの文字コード変換

VerticaがサポートしているDBキャラクタセットはUTF8のみです。そのため、対象CSVファイルの文字コードがUTF-8形式ではない場合には、以下のコマンドを利用し、エンコーディングする必要があります。文字コードの変換に対応しているETLツールもあるので、ETL側で変換することもできます。MySQLのDBキャラクタセットが、SJISの場合は出力されたCSVファイルもSJISで出力されるので、注意してください。

構文
# nkf -wx <変換元ファイル名> > <変換先ファイル名>
または
# iconv -f <変換元コード名> -t UTF8 <変換元ファイル名> > <変換先ファイル名>
エンコードを確認する場合には、以下のコマンドを実行します。
# nkf -g <変換先ファイル名>

※「iconv」コマンドには文字コードを判定する機能がありません。
※「nkf」コマンドがOS標準パッケージに含まれていない場合には、ソースなどからインストールしてください。

実行例


ステップ7. CSVのデータロード

UTF8に変換したCSVファイルをVerticaの各テーブルに「COPY」コマンドで、ロードします。

構文
dbadmin=> COPY test1 FROM ‘<CSV配置先>’ DELIMITER ‘<区切り文字>‘ <オプション>;

実行例



ステップ8. プロジェクションの最適化

各テーブルへのロード完了後、「admintools」もしくは「Management Console」を利用し、プロジェクションの最適化を実行します。Vertica独自の作業であり、他のDBと大きく違うポイントです。プロジェクションについては、「プロジェクションの概要」で詳しく紹介しています。

ステップ9. アプリの実行SQL洗出し

Verticaで実行できるSQL文に置換えるために、MySQLに対して実行しているSQL文の洗出しをおこないます。アプリーケションで実行しているSQL文のつくりは、恐らく類似しているものが多いと思います。Vertica用にSQL文を置換える場合、以下のように進めると効果的かもしれません。

・幾つかパターンの違うSQL文をピックアップする。そのSQL文に対して、修正ポイントを整理する。
・整理したポイントをもとに、全てのSQL文に対して横展開を実施する。

ステップ10. SQL変換

MySQLに対して実行していたSQL文をVerticaで実行できるようにSQL文を置換えます。Verticaは「ANSI SQL99」に準拠しているため、基本的には他のDBで実行しているSQL文をそのまま利用することができます。ただし、一例となりますが、以下の構文はMySQLから、Verticaに移行する場合は置換えが必要になります。
MySQLVertica説明
SELECT col1, col2, CONCAT(col1,' ',col2) as col3 FROM test1;SELECT col1, col2, col1 || ' '|| col2 as col3 FROM test1;CONCAT関数 → 「 || 」に置換する必要があります。
SELECT col1, if(col1='あ','○','×') as col2 FROM test1;SELECT col1, CASE WHEN col1='あ' THEN '○' ELSE '×' END as col2 FROM test1;IF文 → CASE文 に置換する必要があります。
SELECT cast(col1 as SIGNED) as cast_value FROM test1;SELECT cast(col1 as int) as cast_value FROM test1;CAST関数で、数値型を指定する方法が違います。
SELECT (CASE WHEN SUBSTRING( ' ',2 ,1 ) = 1 THEN 1 ELSE 0 END) as test1 FROM dual;SELECT (CASE WHEN SUBSTRING( ' ',2 ,1 ) = '1' THEN 1 ELSE 0 END) as test1 FROM dual;CASE文とSUBSTRING関数を利用し、文字データを比較する場合、指定方法が違います。
SELECT IFNULL(SUBSTRING('1234',2,1),0) + 1 FROM dual;SELECT IFNULL(SUBSTRING('1234',2,1),'0')::int + 1 FROM dual;IFNULL文とSUBSTRING関数を利用し、取得結果を加算する場合、データ型の指定する方法が違います。
SELECT DATE_FORMAT(SYSDATE(),'%Y%m') FROM dual;SELECT TO_CHAR(SYSDATE(),'yyyymmdd') FROM dual;DATE_FORMAT関数 → TO_CHAR関数 に置換する必要があります。
SELECT DATE_ADD(SYSDATE(),INTERVAL -1 MONTH) FROM dual;SELECT ADD_MONTHS(SYSDATE(),-1) || ' ' || TO_CHAR(SYSDATE(),'HH24:MI:SS') FROM dual;(月の計算) DATE_ADD関数 → ADD_MONTHS関数 に置換する必要があります。
SELECT DATE_ADD(SYSDATE(),INTERVAL -1 DAY) FROM dual;SELECT SYSDATE() -1 FROM dual;(日の計算) DATE_ADD関数 → SYSDATE関数 に置換する必要があります。
SELECT col1, CASE WHEN col1="あ" THEN "○" ELSE "×" END as col2 FROM test1;SELECT col1, CASE WHEN col1='あ' THEN '○' ELSE '×' END as col2 FROM test1;文字データを指定する場合、ダブルコーテェーションは使用できません。
SELECT * FROM test1 where col1 in (1,2);SELECT * FROM test1 where col1 in ('1','2');IN句で条件を指定する場合、文字データの指定方法が違います。
SELECT test1.col1 FROM test1 LEFT JOIN test2 on test1.col1 = test2.col1 GROUP BY col1;SELECT test1.col1 FROM test1 LEFT JOIN test2 on test1.col1 = test2.col1 GROUP BY test1.col1;複数テーブルで同一列名が存在する場合、曖昧指定はできません。
SELECT col1, col2 FROM test1 GROUP BY col1;SELECT col1, col2 FROM test1 GROUP BY col1,col2;GROUP BY句の曖昧指定はできません。


ステップ11. SQL変換後の動作確認

Vertica用に置換えたSQL文の動作確認をおこないます。トライ&エラーの繰り返しの作業です。SQL文が実行できない場合のエラーですが、Verticaは詳しいエラー内容を教えてくれます。そのため、デバッグ作業ですが、比較的容易にできると思います。

実行例


検証バージョンについて

この記事の内容はMySQL5.7(InnoDB)、Vertica 7.2で確認しています。






※OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。
 文中の社名、商品名等は各社の商標または登録商標である場合があります。