2012-07-06 5 views

答えて

1

H2データベースでは、SCRIPT SQLステートメントまたはScript command line toolを使用してSQLスクリプトを作成できます。 MySQLデータベースに対してスクリプトを実行する前に、スクリプトを微調整する必要があります。

+0

私はそれを試みました。しかしそれは失敗する。 –

+0

私が書いたように、あなたはMySQLに対してそれを実行する前にスクリプトを修正する必要があるかもしれません。 –

+0

私は何をしなければならないのですか?いつもエラーが出ます。私はMySQL 5.1.61を使用しています。 –

5

H2データベースによって生成されたSQLスクリプトは、MySQLがサポートするSQLと完全に互換性がありません。 SQLスクリプトを手動で変更する必要があります。これには、H2とMySQLの両方をかなりよく知っている必要があります。

H2からMySQLにデータをコピーする代わりに、などのサードパーティのツールをSQuirreL DB Copy Pluginプラグインと併用することもできます。 (最初にSQuirreL SQLをインストールする必要があります。その上にSQuirereL DB Copyプラグインをインストールしてください)

+0

私はSQuirreL SQLをSQuirreL DB Copy Pluginプラグインとともに使用しました。 .. ... クレアーレ表..... .... :いいえ選択したデータベース(SQLエロコード= 1046) 失敗したSQLはなかった。しかし、それはコピーが失敗した を与える仕事何もしません(バインド変数なし) これを修正する方法。 –

+0

さて、SquirreL DB Copy Pluginメーリングリストにお尋ねください。しかし、私は、エラーメッセージが "No database select"であれば - データベースを選択したのでしょうか? –

+0

左上隅に「カタログ」というドロップダウンがあり、そこにテーブルをコピーするデータベースが選択されています。 この問題は解決されている可能性がありますが、今日同じ問題が発生し、同じ問題を抱えている他の人にこのコメントを追加しました –

2

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) 
} 
6

Thomas Muellerに答えて、SquirrelSQLはうまく機能しました。

  1. ゴーへの「ドライバのリスト」、すべてがデフォルトでは赤です: はここでWindowsがH2データベースを変換するための手順です。

  2. "H2"ドライバを選択し、 "Extra Class Path"に "h2-1.3.173.jar"( の場合)のフルパスを指定します。 H2ドライバーは青の チェックをリストに表示する必要があります。

  3. ターゲットドライバ(PostgreSQLのは、MySQL)を選択し、 は同じことを行うには、PostgreSQL用たとえば、エクストラクラスパスに 「のpostgresql-9.4-1201.jdbc41.jar」へのフルパスを指定します。

  4. H2を起動するときに取得するjdbcチェーンのコピーや貼り付けなど、JDBCチェーンを設定する場合は、「+」をクリックしてH2に「+」をクリックします。 "+"で構成し、 "テストする"。

  5. エイリアスをダブルクリックすると、データベース内のすべてが新しいタブに表示されます。ソースデータベースのテーブルに移動し、すべてのテーブルで複数選択し、右クリックします: "テーブルのコピー"。

  6. エイリアスからターゲットデータベースに移動し、「ペーストテーブル」を実行します。すべての表がすべてコピーされると、外部キー参照も生成されます。

  7. 主キーを確認してください:H2からPostgreSQLに、私は主キー制約と自動インクリメント機能を失いました。 右クリックしてカラムとテーブルの名前を変更することもできます: "refactor"。私はフルコピーの後に予約語列の名前を変更するために、名前のチェックインオプションを無効にすることによってそれを使用しました。

    これは私にとってはうまくいきました。

関連する問題