暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

【磐维数据库】DTP迁移报错_syntax error at or near char

原创 磐维数据库 2025-07-31
261


背景

- 目标库版本------ panwei 3.1.0_B01

- 模式---------------- B

- 源库版本-------- openGauss 5.0.1

- dtp版本--------- 3.1.1_B01

概要

1. ANSI_QUOTES 参数的作用,及关闭时的特征报错:ERROR: syntax error at or near ""xxx""

2. 使用 ALTER USER 在用户级别设置参数, 及查看方式(使用 pg_db_role_setting 系统表)。

问题

- og -> pw 全量数据迁移报错:ERROR: syntax error at or near ""char""

- 任务为勾选了增量的全量任务,对象迁移正常,报错在全量日志中。

分析

1. 前端报错

获取元数据出错,数据迁移失败:

IMG_256

2. 日志报错

- 通过 org.opengauss 字样可以看出,问题出现在 og 源端;

- 报错显示 ERROR: syntax error at or near ""char"" ,是在执行图中的 sql 时遇到了语法错误。

3. 报错 sql 分析

- 查看 sql 中出现的几个 char, 都是起到显式类型转换的作用,比如 's'::char, 但其中有一个 char 带了双引号,为 's'::"char" 的形式,判断是报错位置:

IMG_256

- 查看过往问题,判断报错可能和 ANSI_QUOTES 参数有关,为 dolphin.sql_mode 的一个选项:

https://docs.opengauss.org/zh/docs/latest/docs/ExtensionReference/dolphin-GUC%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E.html

IMG_256

4. 本地测试

测试 ANSI_QUOTES 行为,如果关闭会报同样错:

5. 验证(失败)

- 客户og环境的 ANSI_QUOTES 没有关闭,将报错 sql 中的绑定变量替换,可正常执行:

- 此时又测试了不勾选增量迁移,报同样错误,判断问题与增量无关。

6. dtp 分析

确认 dtp 不会将 ANSI_QUOTES 关掉。此时怀疑在客户环境未能复现报错 可能和没有使用迁移用户测试有关。

7. 验证

- 在客户环境使用迁移用户执行报错 sql,问题复现:

- 使用迁移用户查看参数设置,没有开启 ansi_quotes;

- 使用下面的 sql 查看 pg_db_role_setting,发现客户实际针对大部分用户(不包括迁移用户)手动开启了 ansi_quotes;但在 postgresql.conf 中是关闭状态,为默认值:

```sql

select setdatabase, setrole, rolname, setconfig

from pg_db_role_setting a

left join pg_roles b

on a.setrole = b.oid

where

EXISTS (

    SELECT 1

    FROM unnest(a.setconfig) AS elem

    WHERE elem LIKE '%sql_mode%'

);

```


原因

源端迁移用户未开启 ansi_quotes 参数,执行 select 'a'::"char"; 时,会把 char 当成字符串而不是数据类型,导致报错 syntax error at or near ""char"".

解决

使用 ALTER USER username SET paraname TO value; 修改源端迁移用户的 dolphin.sql_mode 参数,加上 ansi_quotes 选项。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论