Mysql से postgresql तक बड़ी ब्लॉब टेबल कैसे माइग्रेट करें?


14

अब मैं अपने MySQL डेटाबेस को PostgreSQL में माइग्रेट करने की प्रक्रिया में हूँ। लगभग सब कुछ ठीक हो गया (ठीक है, सही mysqldump params आदि के लिए बहुत से googling के बाद) मेरे पास एक टेबल को छोड़कर - वास्तव में मेरे ऐप में सबसे महत्वपूर्ण तालिका है।

तालिका संरचना बहुत सरल है:

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 जीबी)।

मैंने mysqldump के --hex-blob पैरामीटर का उपयोग करने की कोशिश की है - लेकिन इस प्रारूप में डेटा को PostgreSQL द्वारा स्वीकार नहीं किया जाता है जब मैंने कमांड फ़ाइल के रूप में डंपफाइल का उपयोग करने की कोशिश की थी। एक और विकल्प जो मैंने आजमाया है --tab विकल्प का उपयोग सिर्फ एक डंप पाने के लिए और फिर उसे COPg कमांड के साथ PostgreSQL में डालें - लेकिन --hex-blob --tab और PostgreSQL के साथ काम नहीं कर रहा है फिर भी डंपफाइल को वहां स्वीकार नहीं करता है इसमें अमान्य वर्ण हैं।

मुझे इस मामले में कोई सलाह मिलने पर बहुत खुशी होगी - हालाँकि मैं यह सोचना शुरू कर रहा हूं कि कस्टम माइग्रेशन टूल लिखना एक बुरा विचार नहीं है ...


अंतिम मैंने जाँच की, PostgreSQL का डब्लिंक केवल अन्य PostgreSQL उदाहरणों से जुड़ सकता है। मुझे नहीं लगता कि MySQL प्रॉक्सी किसी भी बेहतर है। PostgreSQL में सम्मिलित करने के लिए आपको MySQL से पढ़ने के लिए अपनी पसंदीदा भाषा (IE: Java, आदि) का उपयोग करने की आवश्यकता हो सकती है ...

@OMG: जैसा कि मैंने प्रश्न में देखा है, मैं इस तरह से जाने के लिए लगभग तैयार हूं - बस थोड़ी सी उम्मीद है कि कोई इस मामले पर कुछ जानता है।

Pgsql के अंत में कौन सा डेटा प्रकार आप इसे सम्मिलित करने का प्रयास कर रहे हैं? मैं अपने आप को bytea करना चाहते हैं।

@ कोट: हां, बेशक यह बायटिया है।

2
posgresql 9 सीधे बाइट के लिए हेक्स सिंटैक्स का समर्थन करता है, यहां देखें: postgresql.org/docs/9.0/interactive/… (आपको हालांकि थोड़ा सा sed की आवश्यकता होगी)

जवाबों:


12

मुझे लगता है कि सरल तरीका यह है कि उस --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'

एक सुझाव के लिए धन्यवाद, Grzegorz, मैं इसे एक कोशिश करूँगा और परिणामों की रिपोर्ट करूँगा।

एक आकर्षण की तरह काम किया :) सही ढंग से आयात की गई 10 फाइलें, सभी चेकसम मूल मिलान कर रहे हैं। आपका बहुत बहुत धन्यवाद!

1
यदि आपके पास अन्य क्षेत्र हैं, तो आप नहीं चाहेंगे कि यह कॉमा या ट्रेलिंग कोष्ठक से मेल खाए। यह काम करना चाहिए:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.