2012-07-06 286 views

回答

1

的H2數據庫允許您使用SCRIPT SQL語句或Script command line tool創建SQL腳本。可能你需要調整腳本,然後才能對MySQL數據庫運行它。

+0

我試圖做到這一點。但它失敗了。你能給我一個示例腳本嗎? – 2012-07-07 16:59:25

+0

正如我寫的,你可能必須修改腳本,然後才能對MySQL運行它。 – 2012-07-07 21:06:21

+0

我必須做些什麼修改?總是我得到錯誤。我使用MySQL 5.1.61。 – 2012-07-08 02:52:28

5

由H2數據庫生成的SQL腳本不與MySQL支持的SQL完全兼容。您將不得不手動更改SQL腳本。這要求你很好地瞭解H2和MySQL。

爲了避免這個問題,替代,可能簡單的從H2將數據複製到MySQL的方式是與SQuirreL DB Copy Plugin插件一起使用第三方工具,如SQuirreL SQL。 (首先,你需要SQuirrel安裝SQL以及對松鼠DB複製插件的頂部。)

+0

我將SQuirreL SQL與SQuirreL DB Copy Plugin插件一起使用。但它確實沒有工作,它給 複製失敗:未選擇(SQL埃羅代碼= 1046)數據庫 失敗的SQL是: CREARE表..... .... ... .. (沒有綁定變量) 如何解決這個問題。 – 2012-07-11 08:58:05

+0

好吧,我想你應該在SQuirreL DB Copy插件郵件列表中詢問。但是我想知道,如果錯誤消息是「沒有數據庫選擇」 - 你選擇了一個數據庫嗎? – 2012-07-11 10:07:55

+0

在左上角有一個名爲「目錄」的下拉列表,在那裏選擇要將表格複製到的數據庫。 此問題可能已經解決,但今天我遇到了同樣的問題,並將此評論添加到具有相同問題的其他人 – 2015-06-03 08:27:39

2

我創建一個Groovy腳本,它從H2到MySQL遷移。從那裏你可以做一個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

在回答托馬斯·穆勒,SquirrelSQL爲我工作得很好。 下面是該過程適用於Windows的H2數據庫轉換:

  1. 轉到「驅動列表」,這裏的一切都是由默認的紅色。

  2. 選擇「H2」驅動程序,並在「Extra Class Path」中指定「h2-1.3.173.jar」的完整路徑(例如 示例)。 H2驅動程序應在列表中顯示藍色 檢查。

  3. 選擇目標驅動器(PostgreSQL的,MySQL的),並且 做同樣的,例如對PostgreSQL,指定 的完整路徑「PostgreSQL相關9.4-1201.jdbc41.jar」中上等路徑。 H2:配置您的JDBC鏈,例如複製/粘貼您在啓動H2時獲得的jdbc鏈,然後針對您的目標數據庫執行相同的操作:單擊「別名」,然後單擊「+」在「+」上,配置和「測試」。

  4. 當你在你的別名雙擊,你應該看到一個新的標籤數據庫裏面的一切。轉到源數據庫中的表格,在所有表格上進行多重選擇,然後右鍵單擊:「複製表格」。

  5. 轉到從別名目標數據庫,並做了「粘貼表」。當完全複製所有表時,也會生成外鍵引用。

  6. 檢查您的主鍵:從H2到PostgreSQL,我失去了主鍵約束和自動遞增功能。 您也可以通過右鍵單擊重命名列和表:「重構」。我使用它在完全複製後重命名保留字列,方法是禁用名稱檢查選項。

    這對我很好。

相關問題