Database PostgreSQL到MySQL的数据迁移

Database PostgreSQL到MySQL的数据迁移,database,postgresql,database-migration,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 executi

我正在尝试将包含所有数据的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)相关的任何内容,但找不到任何参考。所以如果有人能告诉我我到底做错了什么,那就太好了


谢谢

42P01
是一个通用错误,表示对象不存在

在本例中,不存在的是序列
public.psqlcfg\u lid\u seq
。 根据一系列错误消息,当工具尝试查询该序列的属性时(使用
SELECT…FROM schema\u name.sequence\u name
)会发生错误

假设此序列仍然在数据库中的某个位置被引用,即使ot不再存在。理论上,PostgreSQL中有针对这种情况的保护措施(依赖项跟踪),但我相信它们取决于您的服务器版本,也可能取决于依赖项的具体情况

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


一旦找到,可能一些
ALTER
语句可以删除引用。

这个错误将我带到这里

如果您的“psqlcfg_lid_seq”实际上包含大写和小写字符,请记住PostgreSQL会将名称转换为所有小写以便查询

一个基本知识是:为了执行大小写匹配的查询,名称必须用双引号(“)包装,这样就避免了转换

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

在位于Windows上%Program Files%\MySQL\MySQL Workbench(您的版本,例如“6.1 CE”)\modules中的db\u postgresql\u re\u grt.py中

第70行左右,您将在变量seq\u details\u 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工作台才能使用修改后的脚本。


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

我到底应该修改什么?你能给我一个关于应该修改什么的小例子吗?我已经找到了许多psqlcfg_lid_seq的条目…例如:创建序列“psqlcfg_lid_seq”“以1递增1开始无最小值无最大值缓存1;将表public.“PSQLCFG_LID_seq”所有者更改为postgres@麦克汉:根据最新的评论,它现在似乎是一个案件敏感性问题
PSQLCFG_LID_seq
必须用双引号括起来,因为它混合了大小写,而在错误消息中,它显示为所有小写:错误:关系“public.PSQLCFG_LID_seq”不存在