2013-09-10 4 views
1

Я пытаюсь переместить мою базу данных PostgreSQL со всеми данными внутри нее в базу данных MySQL, поэтому я использую MySQL Workbench> Инструмент переноса данных.Перенос данных PostgreSQL в MySQL

На «Обратный инженер Источник» шаг я получил странную ошибку:

ERROR: Reverse engineer selected schemata: ProgrammingError("('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)')"): error calling Python module function DbPostgresqlRE.reverseEngineer Failed 

Полный журнал ошибок, где появляется это сообщение об ошибке в его конце:

Starting... 
Connect to source DBMS... 
- Connecting... 
Connecting to ... 
Opening ODBC connection to DSN=InventoryDBDS... 
Connected 
Connect to source DBMS done 
Reverse engineer selected schemata.... 
Reverse engineering public from InventoryDB 
- Reverse engineering catalog information 
Traceback (most recent call last): 
    File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_postgresql_re_grt.py", line 335, in reverseEngineer 
return PostgresqlReverseEngineering.reverseEngineer(connection, catalog_name, schemata_list, context) 
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_generic_re_grt.py", line 228, in reverseEngineer 
catalog = cls.reverseEngineerCatalog(connection, catalog_name) 
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_generic_re_grt.py", line 388, in reverseEngineerCatalog 
cls.reverseEngineerSequences(connection, schema) 
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_postgresql_re_grt.py", line 76, in reverseEngineerSequences 
min_value, max_value, start_value, increment_by, last_value, is_cycled, ncache = cls.execute_query(connection, seq_details_query % (schema.name, seq_name)).fetchone() 
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\db_generic_re_grt.py", line 76, in execute_query 
return cls.get_connection(connection_object).cursor().execute(query, *args, **kwargs) 
pyodbc.ProgrammingError: ('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)') 

Traceback (most recent call last): 
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\workbench\wizard_progress_page_widget.py", line 192, in thread_work 
self.func() 
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\migration_schema_selection.py", line 160, in task_reveng 
self.main.plan.migrationSource.reverseEngineer() 
File "C:\Program Files\MySQL\MySQL Workbench CE 6.0.6\modules\migration.py", line 335, in reverseEngineer 
self.state.sourceCatalog = self._rev_eng_module.reverseEngineer(self.connection,  self.selectedCatalogName, self.selectedSchemataNames, self.state.applicationData) SystemError: ProgrammingError("('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)')"): error calling  
Python module function DbPostgresqlRE.reverseEngineer 
ERROR: Reverse engineer selected schemata: ProgrammingError("('42P01', '[42P01] ERROR: relation "public.psqlcfg_lid_seq" does not exist;\nError while executing the query (7) (SQLExecDirectW)')"): error calling Python module function DbPostgresqlRE.reverseEngineer Failed 

Я искал сеть для чего-либо, связанного с (ошибка 42P01), появляющаяся в журнале, но не могла найти никакой ссылки. Поэтому, если кто-то может рассказать мне, что именно я делаю неправильно здесь, это будет действительно здорово.

Благодаря

ответ

1

42P01 общая ошибка означает, что объект не существует.

В этом случае это последовательность public.psqlcfg_lid_seq, которой не существует. Исходя из серии сообщений об ошибках, то ошибка происходит, когда инструмент пытается запросить атрибуты этой последовательности (с SELECT ... FROM schema_name.sequence_name)

Предположительно эта последовательность еще ссылается где-то в базе данных, даже если ВЗ больше не существует. Теоретически в PostgreSQL есть гарантии относительно этой ситуации (отслеживание зависимостей), но я полагаю, что они зависят от вашей версии сервера и, возможно, от специфики зависимости.

Чтобы найти ссылки на эту последовательность, одним из подходов было бы сбросить схему базы данных в текстовый файл SQL (с pg_dump -s) и найти в нем текст psqlcfg_lid_seq.

После обнаружения, возможно, некоторые операторы ALTER могут удалять ссылки.

+0

Что мне делать ALTER точно? Не могли бы вы предоставить мне небольшой пример того, что должно быть изменено? – MChan

+0

Я нашел много записей для psqlcfg_lid_seq ... например: CREATE SEQUENCE "PSQLCFG_LID_seq" НАЧАТЬ С 1 Инкримент 1 NO MinValue NO MAXVALUE КЭШ 1; ALTER TABLE public. "PSQLCFG_LID_seq" ВЛАДЕЛЬЦЕВ В postgres; – MChan

+0

@MChan: основанный на последнем комментарии, теперь он выглядит как проблема чувствительности к регистру. 'PSQLCFG_LID_seq' должен быть заключен в двойные кавычки, поскольку в нем есть сочетание верхнего и нижнего регистра, тогда как в сообщении об ошибке оно появляется во всех строчных случаях: _ERROR: отношение" public.psqlcfg_lid_seq "не существует_ –

2

Эта ошибка привела меня сюда.

Если ваш «psqlcfg_lid_seq» на самом деле содержит как прописные, так и строчные символы, помните, что PostgreSQL преобразует это имя во все строчные буквы для запроса.

Основное знание:. Для выполнения запроса тематического соответствия, то имя должно быть завернуто в двойных кавычках ("), так что Convertion будет избегать

Однако в MySQL Workbench, они забывают чтобы сделать это, когда пытаются принести последовательности.

в db_postgresql_re_grt.py. Расположенный в% Program Files% \ MySQL \ MySQL Workbench (Ваша версия, например, "6.1 CE") \ модули на Windows.

Строка вокруг 70, вы найдете SQL-запрос в переменной seq_details_query, это будет что-то вроде:

 seq_details_query = """SELECT min_value, max_value, start_value, 
increment_by, last_value, is_cycled, cache_value 
FROM %s.%s""" 

Изменить что:

 seq_details_query = """SELECT min_value, max_value, start_value, 
increment_by, last_value, is_cycled, cache_value 
FROM \"%s\".\"%s\"""" 

Таким образом, последовательности могут быть выбраны, и поэтому весь поток можно продолжить.

Обратите внимание: вам может потребоваться перезапустить Workbench MySQL, чтобы использовать измененные скрипты.

Я удивлен, что ребята из MySQL все еще не исправляют эту проблему. Может быть, мне нужно сообщить об ошибке? : P

Смежные вопросы