Mysql

如何將大型 blob 表從 mysql 遷移到 postgresql?

  • August 1, 2011

我現在正在將我的 MySQL 數據庫遷移到 PostgreSQL。幾乎一切都很順利(好吧,經過大量Google搜尋以獲取正確的 mysqldump 參數等),除了我擁有的一張表 - 實際上是我的應用程序中最重要的表。

表結構很簡單:

mysql> show create table samples;
.. skipped ...
CREATE TABLE `samples` (
     `File_ID` int(11) NOT NULL,
     `File` longblob,
     PRIMARY KEY (`File_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=binary

但它非常大(> 20 Gb)。

我嘗試使用 mysqldump 的 –hex-blob 參數 - 但是當我嘗試將生成的轉儲文件用作命令文件時,PostgreSQL 不接受這種格式的數據。我嘗試過的另一個選項是使用 –tab 選項來獲取轉儲,然後使用 COPY 命令將其插入到 PostgreSQL - 但是 –hex-blob 不能使用 –tab 並且 PostgreSQL 仍然不接受轉儲文件說那裡是其中的無效字元。

我很高興在這個問題上得到任何建議 - 儘管我開始認為編寫自定義遷移工具畢竟不是一個壞主意……

我認為最簡單的方法是使用該--hex-blob開關打開mysqldump並通過 psql 恢復,使用decode(string text, type text). 然而它並不是那麼簡單,因為你需要改變一點產生的轉儲(sed,awk),添加解碼功能。例如:

mysqldump -u root -p --skip-quote-names --hex-blob --skip-triggers \
   --compact --no-create-info mysql samples > prepg.dump

sed "s/0x\([0-9,A-F]*\))/decode('\1','hex'))/g" prepg.dump > pg.dump

psql 會話:

CREATE TABLE samples
(
   file_id integer PRIMARY KEY,
   file bytea
);

\i 'path/to/pg.dump'

引用自:https://dba.stackexchange.com/questions/4211