GaussDB 常见问题及解决方案汇总【玩转PB级数仓GaussDB(DWS)】

举报
福州司马懿 发表于 2023/02/26 23:45:18 2023/02/26
【摘要】 1. 连接 GaussDB 数据库建议使用什么工具开源免费的DBMS,可以考虑 DBeaver破解收费版的,可以考虑 Navicatdata studio连高斯可能会存在报文异常导致连接无法中断的问题,不建议用(2023-02-24)如果是网页版的,直接用华为云DAS即可(https://www.huaweicloud.com/product/das.html) 2. GaussDB的支持...

1. 连接 GaussDB 数据库建议使用什么工具

  1. 开源免费的DBMS,可以考虑 DBeaver
  2. 破解收费版的,可以考虑 Navicat
  3. data studio连高斯可能会存在报文异常导致连接无法中断的问题,不建议用(2023-02-24)
  4. 如果是网页版的,直接用华为云DAS即可(https://www.huaweicloud.com/product/das.html)
    图片.png

2. GaussDB的支持哪些hint

可以参考开发者指南:

  1. 分布式:https://support.huaweicloud.com/distributed-devg-v2-opengauss/devg_02_0276.html
    图片.png
  2. 主备版:https://support.huaweicloud.com/centralized-devg-v2-opengauss/devg_03_0308.html
    图片.png

3. 数据库存入空字符串会全部被转成NULL,这个能控制不转吗

不能。目前默认都是Oracle兼容性,没有单独的参数开关

4. GaussDB create sequence有if not exists 的类似写法吗

目前没有。create sequence 的语法格式如下

CREATE [LARGE] SEQUENCE name [INCREMENT [ BY ] increment ]
	[ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE ]
	[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ]
	[ OWNED BY { table_name.column_name | NONE } ];

5. GaussDB中的varchar(n)数据类型中的n是字符还是字节?存汉字的时候报错长度过长

VARCHAR(n),变长字符串。PG兼容模式下,n是字符长度。其他兼容模式下,n是指字节长度。
要存1个汉字用nvarchar2(1)。NVARCHAR2(n)变长字符串。n是指字符长度。

6. GausssDB有select * from DBA_INDEXS这样的视图吗

可以使用 select * from pg_indexes。GaussDB大部分都是PgSQL的源码,所以有问题不懂,直接查PG的语法即可

7. "cache lookup failed for type XXX"报错什么原因

自定义类型失败了,需要重新创建

8. GaussDB中文排序使用order by好像是不准确的,应该怎么解决

nlssort(string text, sort_method text)
描述:以 sort_method 指定的排序方式返回字符串在该排序模式下的编码值,该编码可用于排序,其决定了string在这种排序模式下的先后位置。目前支持的sort_method为nls_sort=schinese_pinyin_mnls_sort=generic_m_ci。其中,nls_sort=generic_m_ci仅支持纯英文不区分大小写排序
示例:

SELECT nlssort('A', 'nls_sort=chinese_pinyin_m');
SELECT nlssort('A', 'nls_sort=generic_m_ci');

参考SQL:

SELECT * FROM <> ORDER BY NLSSORT(<待排序的列>, 'NLS_SORT = SCHINESE_PINYIN_M');

9. 高斯数据库建表的ddl,如果有分区的话为什么看不到了

可以使用select pg_get_tabledef(<表名>)语句查看,如果使用DBeaver视图上是看不到的

10. 通过sys.db_tables查询到数据库的全量表信息,但是发现有些表的信息(行数、列数)不是当前最新的,请问有什么方法可以实现表信息定时更新吗

可以使用vacuum analyze更新表的统计信息
https://support.huaweicloud.com/distributed-devg-v2-opengauss/devg_02_0615.html
图片.png

table_name 要统计的表的名称(可以有模式修饰)。 取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。

也可以尝试下面SQL

use information_schema;
select sum(table_rows) from tables where TABLE_SCHEMA = "test" order by table_rows asc;

11. 什么场景会触发GaussDB主备切换

主机故障会触发主备切换,故障包括进程重启,磁盘故障,服务器掉电,重启,网络故障等等。升级版本时会重启进程,也会主备切换。
可以通过CPU的监控指标判断是否主备切换,主备切换时, 两个节点的CPU会交叉。主机CPU一般比较高,切换时,原来的主机CPU降低,备机升主CPU升高。

12. opengauss有行转列的函数吗

参考unnest
描述:扩大一个数组为一组行
返回类型:setof anyelement
示例:

openGauss=# SELECT unnest(ARRAY[1,2]) AS RESULT;
result
--------
1
2
(2 rows)

13. openGauss数据库连接串的参考样例

jdbc:opengauss://${DNS1}:8000,${DNS2}:8000,${DNS3}:8000/${database}?targetServerType=master&connectTimeout=3&tcpKeepAlive=true

14. GaussDB列存支持物化视图吗

astore支持,ustore不支持

15. 许多表预估行数为0,并且也没有自动分析,怎么解决

执行analyze可以分析全库

select pg_autovac_status('table_name'::regclass); 

可以找一个没分析的表看下为什么没有触发自动分析

16. java连接GaussDB的代码范例

连接代码如下:
public static void main(String[] args){
	// 驱动程序名
	String driver = "com.mysql.jdbc.Driver";
	// URL指向要访问的数据库名scutcs
	String url = "jdbc:mysql://127.0.0.1:3306/scutcs";
	// MySQL配置时的用户名
	String user = "root";
	// MySQL配置时的密码
	String password = "root";
	try {
		// 加载驱动程序
		Class.forName(driver);
		// 连续数据库
		Connection conn = DriverManager.getConnection(url, user, password);
		if(!conn.isClosed()) {
			//执行你的操作
			conn.close();
		}
	} catch(IOException e) {
		e.printStackTrace();
	}
}

17. 创建索引时报file size exceeds temp_file_limit,怎么处理

问题原因
SQL查询生成的临时表较大,超过了系统中临时表空间上限(temp_file_limit)
104857600KB = 1024102400KB = 102400MB = 1001024MB = 100GB
ERROR: temporary file size exceeds temp_file_limit (104857600kB)
这段错误提示的意思就是:临时文件的大小超出了temp_file_limit字段所设置的大小

解决方案
查看当前的临时表空间上限并增加该上限
1.进入你的DBMS,打开SQL控制台/SQL脚本
2.使用 show temp_show_limit 查看当前实例的临时表空间上限(返回结果是以kb为单位的值,就是上面报错时提示的 104857600kB)
3.使用 alter role all set temp_file_limit = [$Temp_File_Limit],增加临时表空间上限(单位为kb)
4.最后使用 show temp_show_limit 确认修改结果是否生效

注意: 如果需要查询的SQL语句只是临时操作,建议您在执行完SQL语句后,将临时表空间上限修改回原始值。否则可能会因为临时表空间过大致使实例磁盘满,进而被锁定。具体还是要根据当前设备的硬件水平、和预估数据量来决定

18. 查询JOB用什么办法

查询pg_job系统表

图片.png

PG_JOBS系统表存储用户创建的定时任务的任务详细信息,定时任务线程定时轮询pg_jobs系统表中的时间,当任务到期会触发任务的执行。该系统表属于Shared Relation,所有创建的job记录对所有数据库可见。

检查定时任务

  1. 检查数据库定时任务执行情况,确保后台任务正确执行,尤其关心统计信息收集等核心任务。SQL命令如下
select job,dbname,log_user,start_date,last_date,this_date,next_date,broken,status,interval,failures,what from user_jobs;
  1. 查询用户的定时任务(job)信息,确保任务在期望的时间执行成功,这是dba的重要工作之一。SQL命令如下
select job_id,dbname,log_user,start_date,last_satrt_date,this_run_date,next_run_date,interval,failure_count from pg_job;

19. 已经改了字段类型为date,为什么查询建表语句的时候还是timestamp

可以参考下这个文档:https://support.huaweicloud.com/centralized-devg-v2-opengauss/devg_03_0355.html

图片.png

A兼容性下,数据库将空字符串作为NULL处理,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。例如:4字节(兼容模式A下存储空间大小为8字节)

创建数据库时,可通过DBCOMPATIBILITY参数指定兼容的数据库的类型,DBCOMPATIBILITY取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。如果创建数据库时不指定该参数,则默认为ORA,在ORA兼容模式下,date类型会自动转换为timestamp(0)。

20. Data studio打开显示同一用户不能打开多个实例

图片.png

官网手册上显示 Data Studio 不支持同时打开多个实例

图片.png

本地datastudio工作空间实例锁未删除,需要手工删除安装目录下的.lock文件(关闭datastudio后再删除,或者删除整个用户空间)

21. 执行分区报错

执行SQL

CREATE TABLE list_list
(
  month_code VARCHAR2 ( 30 ) NOT NULL ,
  dept_code VARCHAR2 ( 30 ) NOT NULL ,
  user_no VARCHAR2 ( 30 ) NOT NULL ,
  sales_amt int
)
PARTITION BY LIST (month_code) SUBPARTITION BY LIST (dept_code)
(
	PARTITION p_201901 VALUES ( '201902' )
  (
    SUBPARTITION p_201901_a VALUES ( '1' ),
    SUBPARTITION p_201901_b VALUES ( '2' )
  ),
  PARTITION p_201902 VALUES ( '201903' )
  (
    SUBPARTITION p_201902_a VALUES ( '1' ),
    SUBPARTITION p_201902_b VALUES ( '2' )
  )
);

报错内容

SQL 错误 [0A000] ERROR: Un-support feature 详细:The distributed capability is not supported currently.

原因:分布式暂时不支持二级分区

22. 查询的时候偶尔会出息如下报错

org.postgresql.util.PSQLException: [***:30814/***:8000] ERROR: dn_6007_6008_6009: snapshot is not owned by resource owner TopTransaction

排查方向:看下pg_log/postgresql-xxx.log打印的内核堆栈

原因:自动提交读取的就是快照数据,这里出问题了

23. 数据API开发sql语句开启预编译后sql报错

在测试api的时候发现语句:(current_date - interval '${num}' day),会因为预编译而导致执行sql出错的问题。gaussdb原语句是(current_date - interval '30' day),因为涉及到多个参数且参数类型不同

  • 尝试过cast('${num}' as int)方法不成功
  • 也尝试过使用’'两个双引号来转义也不行
  • 取消勾选预编译后语句是可以正常运行的

请问是否还有其他方法可以在满足预编译的情况下成功执行这句话?

答:加强制类型转换

24. 如何使用java开发对openguass数据库的应用

  1. 分布式参考:https://support.huaweicloud.com/distributed-devg-v2-opengauss/devg_02_0073.html
    图片.png

  2. 集中式参考:https://support.huaweicloud.com/centralized-devg-v2-opengauss/devg_03_0055.html
    图片.png

25. 查询的时候报如下错误,怎么处理

ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed.Line Number: 1

问题原因

当备用服务器在WAL流中获取更新/删除,而且该更新/删除将使正在运行的查询当前正在访问的数据无效,在这种情况下将发生此类错误。

这种错误出现的主要场景是:备用服务器有长时间运行的查询来查看主服务器上具有重要活动的表。一个示例是主服务器上的管理员在备用服务器正在查询的表上运行DROP TABLE命令。显然,如果在备用数据库上应用了DROP TABLE命令,则备用服务器上的查询无法继续。当在主服务器上运行DROP TABLE命令时,主服务器并不知道备用服务器上运行了哪些查询,因此它不会等待备用服务器上的任何此类查询。当备用服务器上的查询仍在运行时,WAL的更改记录进入备用数据库,从而导致冲突。

当冲突的查询很短时,通常希望通过稍微延迟WAL应用进程来使它完成。但是WAL应用进程的长时间延迟通常是不可取的。因此,取消机制具有max_standby_archive_delay和max_standby_streaming_delay参数,它们定义WAL应用进程中允许的最大延迟。一旦超过max_standby_archive_delay或max_standby_streaming_delay指定的延迟,冲突的查询将被取消。这通常会导致取消错误。

备用服务器上的查询和WAL重放之间冲突的最常见原因是“早期清理”。通常,PostgreSQL允许在没有需要查看它们的事务时清除旧的行版本,以确保根据MVCC规则可以正确地查看数据。但是此规则只能应用于在主服务器上执行的事务。因此,主服务器上的清理可能会删除备用数据库上的事务仍然可见的行版本。

解决方案

有以下两种方案可以避免这种查询取消的情况:

  1. 在备用数据库上设置hot_standby_feedback=on,它将传递信息给主数据库,表示仍然需要表中的特定行,这可以防止VACUUM操作删除最近的死行,因此不会发生清除冲突。它允许备用服务器上的查询能够可靠地完成,但是将导致主服务器上的膨胀现象,当备用服务器上的查询长时间不结束时,此膨胀现象尤为明显。
  2. 提高max_standby_archive_delay或者max_standby_streaming_delay参数,它允许备用服务器特意增加复制延迟以允许查询的完成。如果备用服务器会频繁的连接和断开连接,您可能需要进行调整以处理hot_standby_feedback未提供反馈的时间段。例如,可以考虑增加max_standby_archive_delay,因此在断开连接期间WAL归档文件中的冲突不会迅速的将查询取消。您还应该考虑增加max_standby_streaming_delay以避免重新连接后新收到的流式WAL条目的快速取消。但如果将它们的值设置的过大(例如1小时),主服务器和备用服务器的状态可能会出现不一致的情况。

当备用服务器在WAL流中获取更新/删除,而且该更新/删除将使正在运行的查询当前正在访问的数据无效,在这种情况下将发生此类错误。

这种错误出现的主要场景是:备用服务器有长时间运行的查询来查看主服务器上具有重要活动的表。一个示例是主服务器上的管理员在备用服务器正在查询的表上运行DROP TABLE命令。显然,如果在备用数据库上应用了DROP TABLE命令,则备用服务器上的查询无法继续。当在主服务器上运行DROP TABLE命令时,主服务器并不知道备用服务器上运行了哪些查询,因此它不会等待备用服务器上的任何此类查询。当备用服务器上的查询仍在运行时,WAL的更改记录进入备用数据库,从而导致冲突。

当冲突的查询很短时,通常希望通过稍微延迟WAL应用进程来使它完成。但是WAL应用进程的长时间延迟通常是不可取的。因此,取消机制具有max_standby_archive_delay和max_standby_streaming_delay参数,它们定义WAL应用进程中允许的最大延迟。一旦超过max_standby_archive_delay或max_standby_streaming_delay指定的延迟,冲突的查询将被取消。这通常会导致取消错误。

备用服务器上的查询和WAL重放之间冲突的最常见原因是“早期清理”。通常,PostgreSQL允许在没有需要查看它们的事务时清除旧的行版本,以确保根据MVCC规则可以正确地查看数据。但是此规则只能应用于在主服务器上执行的事务。因此,主服务器上的清理可能会删除备用数据库上的事务仍然可见的行版本。

解决方案

有以下两种方案可以避免这种查询取消的情况:

  1. 在备用数据库上设置hot_standby_feedback=on,它将传递信息给主数据库,表示仍然需要表中的特定行,这可以防止VACUUM操作删除最近的死行,因此不会发生清除冲突。它允许备用服务器上的查询能够可靠地完成,但是将导致主服务器上的膨胀现象,当备用服务器上的查询长时间不结束时,此膨胀现象尤为明显。
  2. 提高max_standby_archive_delay或者max_standby_streaming_delay参数,它允许备用服务器特意增加复制延迟以允许查询的完成。如果备用服务器会频繁的连接和断开连接,您可能需要进行调整以处理hot_standby_feedback未提供反馈的时间段。例如,可以考虑增加max_standby_archive_delay,因此在断开连接期间WAL归档文件中的冲突不会迅速的将查询取消。您还应该考虑增加max_standby_streaming_delay以避免重新连接后新收到的流式WAL条目的快速取消。但如果将它们的值设置的过大(例如1小时),主服务器和备用服务器的状态可能会出现不一致的情况。

26. GaussDB怎么查询分区表的索引信息

1.pg_partition里有
2.或者用pg_get_tabledef查表定义,包含索引创建语句
3.或者查询PG_INDEXES视图

示例:
分区表上的索引分为:本地(局部)索引(local index) 和 全局索引(global index)

SELECT
    n.nspname AS schemaname, --schema名称
    c1.relname AS tablename, -- 表名
    c2.relname AS indexname, -- 索引名称
    s.conname AS conname,    -- 约束名称
    pg_get_constraintdef(s.oid) AS constraintdef, -- 如果是约束,输出约束定义
    CASE WHEN s.conname IS NULL THEN pg_get_indexdef(x.indexrelid) END AS indexdef -- 如果不是约束,

输出索引定义

FROM pg_index x
INNER JOIN pg_class c1 ON c1.oid = x.indrelid
INNER JOIN pg_class c2 ON c2.oid = x.indexrelid
INNER JOIN pg_namespace n ON n.oid = c1.relnamespace
LEFT JOIN pg_constraint s ON s.conrelid = x.indrelid AND s.conindid = x.indexrelid
WHERE (x.indisprimary = true OR x.indisunique = true)
AND c1.relkind = 'r'
AND x.indrelid >= 16384 AND x.indexrelid > 16384
AND (c1.reloptions IS NULL OR c1.reloptions::text not like '%internal_mask%')  -- 排除内置对象
ORDER BY schemaname, tablename, indexname

27. 自定义的函数,存储过程存在后台哪个目录?误删的数据怎么找回?

试下闪回功能

openGauss=#  SELECT * FROM tpcds.time_table TIMECAPSULE TIMESTAMP to_timestamp('2021-04-25 17:50:22.311176','YYYY-MM-DD HH24:MI:SS.FF');
 idx |          snaptime          | snapcsn |                                               timedesc
-----+----------------------------+---------+------------------------------------------------------------------------------------------------------
   1 | 2021-04-25 17:50:05.360326 |  107322 | time1
   2 | 2021-04-25 17:50:10.886848 |  107324 | time2
   3 | 2021-04-25 17:50:16.12921  |  107327 | time3
(3 rows)

参考:https://support.huaweicloud.com/centralized-devg-v2-opengauss/devg_03_0644.html

图片.png

28. 数据库导出的数据会默认省略整数位的0。知会省略0,例如0.11导出以后就变成 .1了,导入导致各种报错

这是Oracle兼容性导致的问题。想要显示整数位的0的话,可以试下在应用里调用Java的DecimalFormat接口进行设置

29. GaussDB添加索引报错

ERROR: temporary file size exceeds temp_file_limit (104857600kB)

添加索引要做排序,写临时文件超过了temp_file_limit的限制,可以调大一点,把索引先建上去

问题原因
SQL查询生成的临时表较大,超过了系统中临时表空间上限(temp_file_limit)
104857600KB = 1024102400KB = 102400MB = 1001024MB = 100GB
ERROR: temporary file size exceeds temp_file_limit (104857600kB)
这段错误提示的意思就是:临时文件的大小超出了temp_file_limit字段所设置的大小

解决方案

查看当前的临时表空间上限并增加该上限

  1. 进入你的DBMS,打开SQL控制台/SQL脚本
  2. 使用 show temp_show_limit 查看当前实例的临时表空间上限(返回结果是以kb为单位的值,就是上面报错时提示的 104857600kB)
  3. 使用 alter role all set temp_file_limit = [$Temp_File_Limit] ,增加临时表空间上限(单位为kb)
  4. 最后使用 show temp_show_limit 确认修改结果是否生效

注意: 如果需要查询的SQL语句只是临时操作,建议您在执行完SQL语句后,将临时表空间上限修改回原始值。否则可能会因为临时表空间过大致使实例磁盘满,进而被锁定。具体还是要根据当前设备的硬件水平、和预估数据量来决定

30. GaussDB的session_timeout参数可以设为0不?我们这边场景需要一个长连接

不建议维持长连接,容易导致OOM,每个会话缓存了大量的元数据和执行过的SQL及执行计划信息

(内容持续更新中,敬请期待)

【一起来玩转PB级数仓GaussDB(DWS),分享你的技术经验与体验心得,赢开发者大礼包!】第19期有奖征文火热进行中!
此外,在云声平台提出您的宝贵建议,标题以【云驻计划-定向征文】开头,还有机会赢取额外奖励。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。