H2Databaseファイルにいくつかのデータがあり、それを MySQL.sql
データベース ファイルに変換したいと考えています。私が従うことができる方法は何ですか?
5 に答える
Thomas Mueller への回答として、SquirrelSQL はうまく機能しました。Windows で H2 データベースを変換する手順は次のとおりです。
デフォルトですべてが赤になっている「ドライバーリスト」に移動します。
「H2」ドライバーを選択し、「Extra Class Path」に「h2-1.3.173.jar」などのフルパスを指定します。H2 ドライバーは、リストに青いチェックを表示する必要があります。
ターゲット ドライバー (PostgreSQL、MySQL) を選択し、同じことを行います。たとえば、PostgreSQL の場合は、Extra Class Path で "postgresql-9.4-1201.jdbc41.jar" へのフル パスを指定します。
「エイリアス」に移動し、H2 の「+」をクリックします: JDBC チェーンを構成します。たとえば、H2 を起動したときに取得した jdbc チェーンをコピーして貼り付け、ターゲット データベースに対して同じことを行います。「+」をクリックし、構成して「テスト」します。
エイリアスをダブルクリックすると、データベース内のすべてが新しいタブに表示されます。ソースデータベースのテーブルに移動し、すべてのテーブルで複数選択を行い、右クリックして「テーブルのコピー」を実行します。
Alias からターゲット データベースに移動し、「テーブルの貼り付け」を実行します。すべてのテーブルがまとめてコピーされると、外部キー参照も生成されます。
主キーを確認してください: H2 から PostgreSQL へ、主キーの制約と自動インクリメント機能を失いました。右クリックで列とテーブルの名前を変更することもできます:「リファクタリング」。オプションで名前チェックを無効にすることにより、フルコピー後に予約語列の名前を変更するために使用しました。
これは私にとってはうまくいきました。
H2 データベースによって生成された SQL スクリプトは、MySQL によってサポートされている SQL と完全には互換性がありません。SQL スクリプトを手動で変更する必要があります。これには、H2 と MySQL の両方を十分に理解している必要があります。
この問題を回避するには、H2 から MySQL にデータをコピーするためのおそらくより簡単な代替方法は、SQuirreL SQLなどのサードパーティ ツールをSQuirreL DB Copy Pluginプラグインと一緒に使用することです。(最初に SQuirreL SQL をインストールし、その上に SQuirreL DB Copy Plugin をインストールする必要があります。)
h2 から mysql への移行を行う Groovy スクリプトを作成しました。そこから、mysqldump を実行できます。テーブルが Mysql データベースに存在する必要があります。マイナーな変更を加えれば、他の DBMS でも機能するはずです。
@Grapes(
[
@Grab(group='mysql', module='mysql-connector-java', version='5.1.26'),
@Grab(group='com.h2database', module='h2', version='1.3.166'),
@GrabConfig(systemClassLoader = true)
])
import groovy.sql.Sql
def h2Url='jdbc:h2:C:\\Users\\xxx\\Desktop\\h2\\sonardata\\sonar'
def h2User='sonar'
def h2Passwd='sonar'
def mysqlUrl='jdbc:mysql://10.56.xxx.xxx:3306/sonar?useunicode=true&characterencoding=utf8&rewritebatchedstatements=true'
def mysqlUser='sonar'
def mysqlPasswd='xxxxxx'
def mysqlDatabase='sonar'
sql = Sql.newInstance(h2Url, h2User, h2Passwd, 'org.h2.Driver' )
def tables = [:]
sql.eachRow("select * from information_schema.columns where table_schema='PUBLIC'") {
if(!it.TABLE_NAME.endsWith("_MY")) {
if (tables[it.TABLE_NAME] == null) {
tables[it.TABLE_NAME] = []
}
tables[it.TABLE_NAME] += it.COLUMN_NAME;
}
}
tables.each{tab, cols ->
println("processing $tab")
println("droppin $tab"+"_my")
sql.execute("DROP TABLE IF EXISTS "+tab+"_my;")
sql.execute("create linked table "+tab+"_my ('com.mysql.jdbc.Driver', '"+mysqlUrl+"', '"+mysqlUser+"', '"+mysqlPasswd+"', '"+mysqlDatabase+"."+tab.toLowerCase()+"');")
sql.eachRow("select count(*) as c from " + tab + "_my"){println("deleting $it.c entries from mysql table")}
result = sql.execute("delete from "+tab+"_my")
colString = cols.join(", ")
sql.eachRow("select count(*) as c from " + tab){println("starting to copy $it.c entries")}
sql.execute("insert into " + tab + "_my ("+colString+") select "+colString+" from " + tab)
}
SCRIPT
H2 データベースでは、 SQL ステートメントまたはスクリプト コマンド ライン ツールを使用して SQL スクリプトを作成できます。おそらく、MySQL データベースに対してスクリプトを実行する前に、スクリプトを微調整する必要があります。
fullconvert を使用してデータベースを変換できます。使いやすいです。
ここに示されている手順に従ってください