Mysql
如何將大型 blob 表從 mysql 遷移到 postgresql?
我現在正在將我的 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'