Mysql'den postgresql'e büyük damla tablo nasıl taşınır?


14

Şimdi MySQL veritabanımı PostgreSQL'e geçiriyorum. Hemen hemen her şey iyi gitti (iyi, doğru mysqldump params için googling bir sürü sonra) bir tablo dışında - aslında benim app en önemli tablo.

Masa yapısı çok basit:

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

ancak çok büyük (> 20 Gb).

Komut dosyası olarak ortaya çıkan dumpfile kullanmaya çalıştığımda - mysqldump --hex-blob parametresini kullanmaya çalıştım - ama bu biçimdeki veriler PostgreSQL tarafından kabul edilmiyor. Denediğim başka bir seçenek - sadece bir döküm almak ve sonra COPY komutuyla PostgreSQL'e eklemek için --tab seçeneğini kullanmaktır - ancak --hex-blob --tab ile çalışmaz ve PostgreSQL hala orada söyleyerek dökümü kabul etmiyor içinde geçersiz karakterler var.

Bu konuda herhangi bir tavsiye almaktan memnuniyet duyarım - özel bir taşıma aracı yazmanın sonuçta kötü bir fikir olmadığını düşünmeye başlasam da ...


Son kontrol ettiğimde, PostgreSQL'in dblink'i sadece diğer PostgreSQL örneklerine bağlanabilirdi. MySQL Proxy'nin daha iyi olduğunu düşünmüyorum . PostgreSQL'e eklemek için MySQL'den okumak için en sevdiğiniz dili (IE: Java, vb.) Kullanmanız gerekebilir ...

@OMG: Sözünü ettiğim gibi, neredeyse bu şekilde gitmeye hazırım.

Pgsql'nin ucunda hangi veri türünü eklemeye çalışıyorsunuz? Kendimi bayırdım.

@Scott: Evet, elbette bytea.

2
posgresql 9, doğrudan bytea için hex sözdizimini destekler, buraya bakın: postgresql.org/docs/9.0/interactive/… (biraz

Yanıtlar:


12

Bence bu en basit yol bu --hex-blobaçma mysqldumpve psql tarafından geri yükleme kullanmaktır decode(string text, type text). Ancak bu o kadar basit değil, çünkü bu kod çözme işlevini ekleyerek biraz üretilen bir dökümü (sed, awk) değiştirmeniz gerekiyor. Örneğin:

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 oturumu:

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

\i 'path/to/pg.dump'

Bir öneriniz için teşekkürler, Grzegorz, bunu bir deneyeceğim ve sonuçları rapor edeceğim.

Bir cazibe gibi çalıştı :) Test 10 dosyaları doğru ithal, tüm sağlama toplamları eşleşen orijinalleri. Çok teşekkür ederim!

1
Başka alanlarınız varsa, virgüllerle veya sondaki parantezle eşleşmesini istemezsiniz. Bu işe sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
yarar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.