Данные миграции BLOB-объектов из Informix в Postgres

Я переношу БД Informix (11.7) на PostgreSQL (9.2). Есть только одна проблема: как переместить blob(image) из Informix в PostgreSQL(9.2)? Спасибо заранее.


person Yuri Levinsky    schedule 21.10.2012    source источник
comment
Вам нужен тип данных postgres или у вас есть какая-то конкретная проблема? Тип данных, который вы ищете, это bytea в postgres.   -  person mistapink    schedule 21.10.2012
comment
Как вы переносите данные, не являющиеся большими двоичными объектами, в PostgreSQL? Какие форматы PostgreSQL предпочитает для загрузки данных больших двоичных объектов? Сколько таблиц с большими двоичными объектами вы переносите? Сколько строк в этих таблицах? Насколько велики капли (мин., среднее, макс.)? С какими типами Informix TEXT, BYTE, BLOB и CLOB вы имеете дело? Все они типа blob.   -  person Jonathan Leffler    schedule 21.10.2012
comment
@JonathanLeffler: Каковы спецификации для хранения данных Informix TEXT, BYTE, BLOB и CLOB?   -  person Frank R.    schedule 22.10.2012
comment
Что ты имеешь в виду, @FrankComputer? Большие двоичные объекты TEXT и BYTE старше (версия 4.00), чем два других типа (версия 9.00), и их можно хранить в таблице или в пространстве больших двоичных объектов. Типы BLOB и CLOB предназначены для «умных BLOB-объектов» и хранятся в пространстве интеллектуальных BLOB-объектов (различном). Существуют сложные правила о том, как получить значения в БД и обратно. Существует набор правил о том, как они выгружаются, если вы используете формат UNLOAD. И так растет список вопросов без ответов...   -  person Jonathan Leffler    schedule 22.10.2012
comment
Я имею в виду: доступны ли какие-либо спецификации, которые объясняют, как эти типы данных хранятся внутри, чтобы можно было определить, переносимы ли они из одной базы данных в другую. Как бы выглядели эти типы данных, если бы их нужно было выгрузить в простой текстовый файл или получить их через ODBC?   -  person Frank R.    schedule 22.10.2012
comment
@FrankComputer: они хранятся внутри в непрозрачных форматах, которые невероятно неясны. Большие участки дискового пространства — это, конечно, просто данные, но управляющая информация сложна — и некоторые из них находятся в дескрипторе BLOB-объектов в строке таблицы, а некоторые — в пространстве BLOB-объектов или интеллектуальном пространстве BLOB-объектов, где хранится BLOB-объект. (за исключением случаев, когда он хранится в таблице). Нет никакой внешней документации (материал, который вы можете видеть) о том, как получить необработанные данные большого двоичного объекта.   -  person Jonathan Leffler    schedule 24.10.2012
comment
Итак, можно ли получить внешний доступ к Informix BLOB/CLOB через ODBC? Каков наилучший способ их переноса в другую БД?   -  person Frank R.    schedule 27.10.2012


Ответы (2)


Я сделал несколько таких преобразований между различными базами данных, используя Jython и JDBC.

Все, что вам нужно, это драйверы Informix и PostgreSQL JDBC в CLASSPATH.

У меня есть таблица Informix со столбцом BYTE и таблица PostgreSQL со столбцом BYTEA:

-- Informix
CREATE TABLE _blob_test (
  id integer PRIMARY KEY,
  image BYTE
)

-- PostgreSQL
CREATE TABLE _blob_test (
  id integer PRIMARY KEY,
  image BYTEA
)

Затем вы можете использовать методы JDBC getObject()/setObject() для копирования данных:

#!/usr/bin/env jython
# -*- coding: utf8 -*-

from java.sql import DriverManager
from java.lang import Class

Class.forName("com.informix.jdbc.IfxDriver")
Class.forName('org.postgresql.Driver')

def copy_table(db_from, db_to):
    col_count = 2
    insert_stmt = db_to.prepareStatement('INSERT INTO _blob_test (id, image) VALUES (?, ?)')
    pstm2 = db_from.createStatement()
    pstm2.setFetchSize(10000)
    rs_in = pstm2.executeQuery('SELECT * FROM _blob_test')
    try:
        batch_buffer = 0
        batch_size = 100
        while (rs_in.next()):
            for i in range(1, col_count + 1):
                insert_stmt.setObject(i, rs_in.getObject(i))
            insert_stmt.addBatch()
            batch_buffer += 1
            if (batch_buffer % batch_size == 0):
                insert_stmt.executeBatch()
                batch_buffer = 0
        if (batch_buffer > 0):
            insert_stmt.executeBatch()
    finally:
        rs_in.close()
        pstm2.close()


db_from = DriverManager.getConnection('jdbc:informix-sqli://informix-test:9088/infdb:informixserver=ol_testifx;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250', 'informix', '12345')
db_to   = DriverManager.getConnection('jdbc:postgresql://pg-test:5490/pg_test?stringtype=unspecified', 'postgres', '12345')

copy_table(db_from, db_to)
person Michał Niklas    schedule 23.10.2012

Я знаю, что ответ запоздал, но это может помочь другим людям, ищущим решение.
Мы выполнили аналогичную миграцию в нашей компании.
Для переноса двоичных файлов мы использовали инструмент под названием SQL-workbench, мы использовали помпа данных (инструменты меню). Пампер данных позволяет копировать данные из исходной БД в целевую БД. СУБД могут быть разными (в данном случае Informix и Postgres).
Вам необходимо зарегистрировать оба драйвера в «Файл > Управление драйверами» и создать 2 профиля: исходный профиль, ориентированный на вашу базу данных Informix, и целевой профиль, ориентированный на вашу Postgres. ДБ. Затем профили будут выбраны из Data pumper. Окно перекачки данных Если у вас есть несколько таблиц для копирования одновременно, прочтите документацию по использованию функции Wbcopy (очень полезно)

person Arthur bauer    schedule 24.11.2017