如何將mysql轉換為postgresql?
我正在拼命尋找一種轉換工具來將大型 mysql 數據庫轉換為 postgresql。我需要工具/腳本是:
- 自由
- 在 Linux 下工作
- 簡單易用且不出錯
- 您實際上嘗試並確認有效
- 最好不要用 Java 或 Ruby 編寫
我嘗試了此處列出的不同工具,但沒有一個對我有用。
先感謝您。
在兩個非常不同的 DBMS 之間遷移需要的不僅僅是遷移數據。但是數據的遷移通常是最簡單的部分。
我嘗試過的方式是免費的,我可以確認它有效:
- 創建一個 mysql 模式只轉儲
- 使用文本編輯器和大量搜尋和替換調整 SQL
- 在 Postgres 中執行轉換後的 SQL
- 從 MySQL 創建純文字轉儲(例如 CSV 或其他一些分隔格式)
- 使用 PostgreSQL 的 COPY 命令導入數據
如果您依賴 MySQL 接受非法數據的行為(例如 2 月 31 日),導入數據實際上可能很困難
我的猜測是,這將比搜尋一個工具、評估一堆工具然後嘗試理解你選擇的工具要快。但這取決於您指的是哪種“大”。如果大是幾百個表,這可能不可行。如果 big 僅指行數,那麼這可能是最快的方法。
有一些工具可以以 DBMS 獨立 (XML) 格式轉儲數據庫模式,例如Liquibase、SchemaSpy或WbSchemaReport。Liquibase 可能是最容易使用的。其他人將需要一些手動工作來編寫/擴展 XSLT 以轉換生成的 XML。
如果您在 MySQL 中使用觸發器和儲存過程,我不相信會有任何自動化工具可以翻譯它們而無需事後進行大量手動修復 - 然後生成的過程可能不會使用目標 DBMS 的任何高級功能.
最近不得不這樣做,因為尋找一個工具並能夠用它做一些事情需要太長時間,所以我用 vim 和替換-foo 手動完成了
替換
INT NOT NULL AUTO_INCREMENT
(或類似的東西)SERIAL
將所有相關的字元串更改為 a (使用,或類似的
TEXT
沒有速度差異)TEXT``VARCHAR
擺脫那些該死的反引號 ```
* no storage engines in Postgres, so remove
ENGINE InnoDB` (or whatever)remove
UNSIGNED
every BLOB field is
BYTEA
strings use single quotes
'
and nothing elsebe carecul if you use string concatenation somewhere, starting from 9.1, Postgres support
CONCAT
as a fallback for non-standard string concatenation, before 9.1 it was done using'string' || ' string'
re-write any procedural code…
take care of names that are reserved (e.g. table, name,…) as well as upper case names. They need to be double quoted
"
Indexed should be pretty much the same since the syntax doesn’t vary
For everything that I have forgotten, check out the wikibooks on this topic
Each of those bullets should be done with a single substitution.
I exported the schema and the data seperatly. Make sure that you use
INSERT
s instead ofCOPY
. If there is no fance stuff going on, the data should require (almost) no clean up. Make sure everything is onUTF-8
. With 2 seperate files, the schema gets more managable and you don’t have a 1GB file to edit.When loading the schema, you get pretty detailed information where an error is, so debugging should be pretty simple.`