2009-04-21 78 views
32

我正在考慮從MySQL切換到PostgreSQL。從MySQL切換到PostgreSQL - 提示,技巧和陷阱?

你使用PostgreSQL的技巧,竅門和陷阱是什麼?

MySQLer應該注意什麼?

參見:How different is PostgreSQL to MySQL?
參見:Migrate from MySQL to PostgreSQL

注 - 我不認爲這是一個重複。尤其是答案的類型是相當不同影響,這裏的反應有更多的實現細節,這正是我一直在尋找

+0

請注意:這實際上並不涉及有關Oracle和Sun的消息。我有一個Rails應用程序,需要多個數據庫並查看使用PostgreSQL模式。 – 2009-04-21 11:19:49

+0

請參閱:http://stackoverflow.com/questions/724867/how-different-is-postgresql-to-mysql – vartec 2009-04-21 11:30:14

回答

49

剛剛經歷過這個自己,我還是...

  • 區分大小寫文本
  • 缺乏 INSERT IGNORE
  • REPLACE
  • 顯式轉換需要幾乎無處不在
  • 沒有反引號
  • LOAD DATA INFILECOPY接近,但不夠緊密)
  • 變化autoincrementSERIAL
  • 雖然在MySQL中狀態不佳,Postgres裏,一個INNER JOIN沒有ON條款不能發生,使用CROSS JOIN或類似
  • COUNT(*)可以瘋狂慢
  • 數據庫編碼字符集的,而不是表
  • 你可以有多個數據庫,具有多種模式(MySQL的真的只有一個數據庫和多模式)
  • 劃分爲不同的
  • 的MySQL interval與Postgres的interval(時間間隔)
  • 隱式列重命名Postgres需要AS
  • 無法在Postgres中同時更新多個表
  • Postgres函數功能強大。所以沒有CALL proc();;重寫proc()作爲函數並且SELECT proc();
+0

+1:Auto_increment串行?不喜歡序列? – 2010-07-26 19:46:50

+1

@OMG小馬:在現代的PG版本中,您不必爲自動ID使用明確的序列。串行類型和bigserial類型隱藏了它的全部語義,但是它仍然是一個序列和所有的權力。他們創建一個自動命名序列並將該列的默認值設置爲nextval。 – rfusca 2010-07-26 22:06:12

8

你可以嘗試PostgreSQL gotchas包含最常見的問題。一般來說,PostgreSQL文檔也非常好,所以也要保存在你的枕頭下。

另外,在pgsql維基上的Converting from MySQL to PostgreSQL。 --transaction隔離= SERIALIZABLE --sql模式= ANSI

確保你不使用MyISAM表:

5

之前轉換,通過啓動服務器設置你的MySQL對ANSI-嚴格。

MySQL允許大量的轉換,它不應該; PG將需要演員。

您的存儲過程,函數和觸發器將不得不重寫。 pg爲您提供了這些語言的選擇,但您必須安裝語言;它不像MySQL那樣友好。

pg將只允許在一個選擇列表中的一個組中的列或聚合;如果你這樣做,MySQL將通過選擇組中的第一個值來作弊。

MySQL的增加一堆擴展:在不等於運算符可以是!=如C,它允許「& &」作爲「與」的同義詞,「||」 for'or'等。特別是,pg使用'||'意味着字符串連接。

基本上,pg是非常嚴格的ANSI,MySQL不是。我強烈建議在轉換爲pg之前儘可能嚴格遵守ANSI標準,然後在運行應用程序時檢查是否有任何警告。

9

這將是一個艱鉅的任務,你就必須測試整個代碼庫 - 每一個查詢,隨時隨地,爲

  • 語法
  • 正確的行爲(即返回相同的結果)
  • 表現 - 例如是否有任何績效迴歸/改進,你能處理它們嗎?
  • 錯誤處理 - 他們不循規蹈矩的錯誤條件下相同,也許你的代碼是依賴於特定的錯誤代碼

操作上,您將需要查看:

  • 備份/恢復
  • 磁盤空間利用率
  • 內存利用率
  • 一次性數據遷移 - 可能是一個大/耗時的任務
  • 回滾計劃如果失敗
  • 監控 - 你是如何監控你的MySQL,並可以將這些方法來適應
  • (如果適用) - 複製

你一定要做的主要量的性能測試,然後再考慮這樣的舉措。

這些成本使得移動到不同的數據庫對於大多數平凡的應用過於昂貴。考慮收益非常小心禁止做上述所有的廣闊,成本。

,如果你花不到三個月的時間,在一個平凡的應用程序,在此期間,你將無法繼續正常開發我會感到很驚訝。

6

,我發現這個腳本,將連接到您的MySQL數據庫和PostgreSQL數據庫和剛剛轉會的內容。它對我來說就像一個魅力。

https://github.com/philipsoutham/py-mysql2pgsql

任何文件夾中安裝了

$ pip install py-mysql2pgsql 

運行

$ py-mysql2pgsql 

,它會創建一個模板設置文件你(mysql2pgsql.yml),您可以編輯和在輸入您的數據庫的詳細信息。

我必須安裝argpars e爲它工作。

$ pip install argparse 

當你的數據庫的細節填寫,只是在同一個文件夾的設置文件,再威猛

$ py-mysql2pgsql 

運行它,你就完成了。它沒有在屏幕上打印任何內容,但之後我的數據庫被完全複製。

1

除了移動數據庫結構,在那裏你不能避免手動調整的...

傳輸數據的最可靠的方法(表由表,提供的結構相同):

mysql --default-character-set=utf8 -e "SELECT * FROM mytable" > mytable.txt 

psql 
\copy mytable from '/path/to/mytable.txt' WITH NULL AS 'NULL'; 

最近一直在嘗試使用其他方法(例如mysqldump有很多選項+ sed等),但沒有任何效果如此好。

此方法還可以有一定的靈活性,當結構沿途改變 - 只是寫一個合適的選擇。