背景
- 目标库版本------ 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. 前端报错
获取元数据出错,数据迁移失败:
2. 日志报错
- 通过 org.opengauss 字样可以看出,问题出现在 og 源端;
- 报错显示 ERROR: syntax error at or near ""char"" ,是在执行图中的 sql 时遇到了语法错误。
3. 报错 sql 分析
- 查看 sql 中出现的几个 char, 都是起到显式类型转换的作用,比如 's'::char, 但其中有一个 char 带了双引号,为 's'::"char" 的形式,判断是报错位置:
- 查看过往问题,判断报错可能和 ANSI_QUOTES 参数有关,为 dolphin.sql_mode 的一个选项:
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 选项。




