为了能够帮助大家循序渐进地了解MogDB、认识其特性和能力、熟悉它的使用,我们特推出「MogDB百问百答」连载,每期放出20个FAQ,希望能对您有参考价值!(感谢问题整理与回答人员:高云龙、彭冲、黄超、杨有田)
往期回顾
Q 141
调用函数报错ERROR: invalid memory alloc request size XXXXXX
函数接收的参数长度超过限制,字符串处理函数除了length相关函数,其他函数和操作符不支持大于1GB CLOB作为参数。合规长度最大值是268435454,2的28次方-2。
Q 142
列存储的页面是如何组织的?
列存储引擎的存储基本单位是CU(Compression Unit,压缩单元),即表中一列的一部分数据组成的压缩数据块。列存储引擎使用了CUDesc(压缩单元描述符)表来记录一个列存储表中CU对应的元信息。每个CU对应一个CUDesc的记录,在CUDesc里记录了整个CU的事务时间戳信息、CU的大小、存储位置、magic校验码、min/max等信息。
Q 143
列存表适用什么场景?
适用数据量较大(如数据仓库),列的数据特征比较相似,重复度比较高的业务场景,适合按列进行压缩,不但压缩比很高,还会节省大量磁盘空间,同时也会提高单位作业下的IO效率。
Q 144
列存为什么会减少IO负载?
列存储会根据数据属性进行编码及压缩处理,对计算方式做了优化,对于表中列数比较多,但是访问的列数比较少时,列存储可以按需读取列数据,大大减少不必要的读IO,提高查询性能。
Q 145
如何查看当前数据库的大小?
可以直接在gsql客户端执行\l+,也可以通过函数来查询:
select pg_size_pretty(pg_database_size(datname)) from pg_database
函数查询的方式更适合用来做监控巡检指标。
Q 146
如何查看某张表大小?
可以直接在gsql客户端执行\dt+,也可以通过函数pg_relation_size()或pg_table_size()来查指定表的大小;如果要查询所有表占用的磁盘空间可以使用函数pg_total_relation_size(),这个函数会计算索引。
Q 147
如果查看索引的大小?
可以直接在gsql客户端执行\di+,也可以使用pg_relation_size()来查看指定索引的大小,如果想查一个表中所有索引的大小,可以使用pg_indexes_size()函数来查询。
Q 148
什么场景下需要重做备库?
重做备库一般有以下几种方式:
1、手工搭建主备集群,重做备库的情况下;
2、当备库与主库延时较大,或者主备关系断开且无法追上;
3、备库故障无法启动的情况下需要重做备库;
4、原主库故障修复后以备库角色加入集群的情况下也需要。
Q 149
重做备库有哪些方式?
最常用的重做备库的方式是通过gs_ctl build命令来重做备库,默认情况下是优先使用增量bild的方式,如果增量build失败则会转换到全量build;也可以考虑使用全量备份+wal归档日志的方式,需要配置restore_command命令或者将归档日志直接放到wal目录中。
Q 150
可以从备库做build么?
默认情况下,备库/级联备做build是去找主库,但也可以从指定的备库去做build,需要使用参数-b standby_full -C "localhost=xxx.xxx.xxx.1 localport=$standby2_port remotehost=xxx.xxx.xxx.1 remoteport=$standby1_port" 的方式。
Q 151
表连接方式的hint有哪些?
Plan Hint是特殊SQL语法,可用于手工干预SQL执行计划的选择,在SQL中加入hint语法,可以明确指导SQL优化器选择特定执行计划。用于禁用或使用nestloop/hashjoin/mergejoin进行连接:
/*+ [no] nestloop/hashjoin/mergejoin(table1 table2) */
Q 152
表访问方式的hint有哪些?
用于单独禁用或使用顺序扫描:
/*+ [no] tablescan(table) */
用于单独禁用或使用索引/只索引扫描:
/*+ [no] indexscan/indexonlyscan(table index) */
Q 153
表连接顺序的hint有哪些?
指定表连接的顺序:
/*+ leading(join_table_list) */
例:
/*+ leading(t1 (t2 t3)) */
t2与t3表先进行join,再和t1进行join。
Q 154
报错ERROR unsupported view for memory protectionfeature is disabled.
把参数enable_memory_limit打开:
gs_guc set -N all -I all -c "enable_memory_limit=on"
若max_process_memory-sharedbuffer-cstore buffers少于2G,openGauss强制把enable_memory_limit设置为off。
Q 155
报错memory is temporarily unavailable
可能动态内存不足,请检查动态内存使用情况:
select contextname,pg_size_pretty(sum(totalsize)),pg_size_pretty(sum(freesize)) from gs_session_memory_detail group by contextname order by sum(totalsize) desc limit 10;
Q 156
MogDB 2.0.1 导入数据库报错out of memory
用gsql导入容易导致out of memory,建议用二进制方式导出和导入。举例:
gs_dump -U xxx -W xxx@123 -h 127.0.0.1 -p 51000 -F c -f /home/omm/xxx_local_db.dmp
gs_restore xxx_local_db.dmp -p 51000 -d xxx -U xxx -U xxx -W xxx@123
Q 157
MogDB 支持序列吗?
支持。MogDB 的序列可以产生一组等间隔的数值,能自增,主要用于表的主键,主要的SQL语句是create sequence、alter sequence、drop sequence、alter。
Q 158
什么是 MogDB 的虚拟索引?
MogDB 的虚拟索引功能支持用户在数据库中直接进行操作,本功能将模拟真实索引的建立,避免真实索引创建所需的时间和空间开销,用户基于虚拟索引,可通过优化器评估该索引对指定查询语句的代价影响。
Q 159
MogDB 的虚拟索引使用步骤?
1、使用函数hypopg_create_index创建虚拟索引;
2、开启GUC参数enable_hypo_index;
3、执行EXPLAIN + 查询语句 来对比创建虚拟索引后的优化效果;
4、使用函数hypopg_drop_index删除指定oid的虚拟索引。
Q 160
程序提示密码错误怎么办?
业务程序提示账号或密码错误,需要判断一下填写的账号密码是否正确,可以通过直连数据库的方式验证;如果直连数据库没有问题,说明可能是程序的密码加密方式有问题,需要检查程序是否支持sha256及数据库pg_hba.conf文件中是否配置一致;如果直连数据库有问题也提示账号密码不对,且无法找回,可以考虑重置密码。
关注我们
回复关键词“MogDB”
了解有关 MogDB 产品的更多信息。