PostgreSQL到MySQL的数据迁移

时间:2013-09-10 22:33:00

标签: database postgresql database-migration

我正在尝试将我的PostgreSQL数据库中的所有数据移动到MySQL数据库,因此我使用的是MySQL Workbench>数据迁移工具。

在“逆向工程师来源”步骤中,我收到了一个奇怪的错误:

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),但找不到任何引用。所以,如果有人可以请告诉我,我在这里做错了什么,这真的很棒。

由于

2 个答案:

答案 0 :(得分:2)

这个错误让我来到这里。

如果你的" psqlcfg_lid_seq"实际上包括大写和小写字符,请记住,PostgreSQL会将名称转换为ALL小写进行查询。

基本知识是:为了执行大小写匹配的查询,名称必须用双引号括起来("),这样就可以避免转换。

然而,在MySQL Workbench中,他们在尝试获取序列时忘记这样做。

db_postgresql_re_grt.py 中。位于Windows上的%Program Files%\ MySQL \ MySQL Workbench(您的版本,例如" 6.1 CE")\ modules。

在70左右,您将在变量 seq_details_query 中找到SQL查询,它将类似于:

        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\""""

因此可以获取序列,因此可以进行整个流程。

请注意:您可能需要重新启动MySQL Workbench才能使用修改过的脚本。

我很惊讶MySQL家伙仍然没有解决这个问题。也许我需要以某种方式报告错误? :P

答案 1 :(得分:1)

42P01是一般错误,意味着该对象不存在。

在这种情况下,它是不存在的序列public.psqlcfg_lid_seq。 根据一系列错误消息,当工具尝试查询该序列的属性时会发生错误(使用SELECT ... FROM schema_name.sequence_name

据推测,即使不再存在,该序列仍会在数据库中的某处引用。从理论上讲,PostgreSQL中存在针对这种情况的保护措施(依赖性跟踪),但我认为它们依赖于您的服务器版本,可能依赖于依赖项的具体细节。

要查找对此序列的引用,一种方法是将数据库架构转储到SQL文本文件(使用pg_dump -s)并在其中搜索文本psqlcfg_lid_seq

一旦找到,大概有些ALTER语句可能会删除引用。