问答题整理人员:杨有田、黄超、彭冲、高云龙
问:gs_om 使用的XML配置文件丢失了怎么办?
答:如果是使用PTK安装的数据库,可以借助PTK的配置文件来生成XML,使用命令是:ptk gen-om-xml -f CONFIG_FILE [flags]
问:如果集群静态配置文件损坏怎么办?
答:可以重新生成静态文件并发送到所有节点:gs_om -t generateconf -X /opt/software/openGauss/clusterconfig.xml --distribute
问:已经运行的数据库节点如何修改IP或hostname,集群不可用怎么办?
答:可以使用ptk distribute -f config.yaml 方式重新生成集群内的静态文件cluster_static_config;也可以使用gs_om -t generateconf --old-values=old --new-values=new --distribute 方式来修改
问:如何从控制会话的连接超时?
答:数据库提供了一个参数session_timeout来控制断开多长时间不进行任何操作的会话,默认是10min,但是在最佳实践中常常把这个参数关闭,因为不同的业务系统对会话连接超时的控制不一样,所以最好由业务程序来控制。
问:如何判断一个会话连接了多长时间?
答:在视图pg_stat_activity中有个backend_start字段,这个字段记录的是会话建立连接的时间,可以通过now() - backend_start 的方式来计算会话存活了多长时间。
问:如何断开指定会话?
答:数据库提供了两个函数来断开指定的会话,分别是pg_cancel_backend()和pg_terminate_backend(),其中和pg_terminate_backend()是强制断开会话,常用来处理hang死的SQL会话。
问:数据库会不会发生脑裂?
答:单从数据库角度来说,不会发生脑裂,因为数据库本身没有不会发生角色切换,数据库角色切换需要手工执行切换命令或者借助高可用切换工具MogHA或CM。
问:脑裂了会不会发生数据丢失?
答:对于数据会不会丢失的问题与我们设置同步级别有关系,如果设置了强同步,当主库宕机时,业务数据已经同步到同步备库,那这时把同步备切换为主库,是不会有数据丢失的,如果这时原主库即使重新启动,只要没有新的业务数据写入,也是安全的。
问:发生脑裂后怎么恢复集群?
答:当原主库重新启动后会变成单主,并不会自动加入集群,这时需要手工执行gs_ctl build的命令可以将原主以standby的角色重新加入集群。
问:直接访问数据库是没问题的,但应用程序却无法访问数据库是什么原因?
答:可以通过gsql tcp/ip的方式访问数据库,使用mogeaver客户端访问数据库也是正常的,这说明数据库本身是没有问题的,程序连接失败的常见原因是程序接口不支持或没有修改加密方式,默认使用的是md5。常见的解决方法是修改pg_hba.conf白名单的访问方式,或调整业务接口的加密方式。
问:业务访问数据库数据,第一次查询能查到,第二次查询消失,过一会又可以查到,是什么问题?
答:数据库默认是读已提交的隔离级别,一旦数据写入成功且事务提交,就不会出现业务查不到的情况(排除更新删除操作),这种闪丢的现象,更多的是需要检查应用程序的连接池配置,是否设置了schema,是否连接被多业务重用,是否没有及时提交事务,是否访问到错误的schema下的表。
问:业务访问从mysql迁移过来的数据,发现生僻字是乱码,怎么处理?
答:MogDB默认使用的UTF8的字符集是可以支持生僻字的,所以关于生僻字的乱码问题更多的需要在mysql判断一下,mysql是可以支持字段级别的字符集修改的,所以数据库字符集可以与字段字符集不一致,需要查看具体字段的字符集来判断源端是不是乱码。
问:一个表中有id,user,ctime 三个字段,我使用id查询是有数据返回的,但用user却没有,这是什么原因?
答:在数据库中,user是保留关键字,可以通过添加双引号来查询,但在创建数据库对象时应避免使用关键字作为对象名,关键字列表可以通过pg_get_keywords()函数获取。
问:统计信息不准怎么办?
答:统计信息存储在系统表PG_STATISTIC中。执行计划生成器需要使用表的统计信息,以生成最有效的查询执行计划,提高查询性能。因此统计信息不准时候,建议手动执行ANALYZE语句生成最新的表统计信息。
问:调用函数报错ERROR: invalid memory alloc request size XXXXXX
答:函数接收的参数长度超过限制,字符串处理函数除了length相关函数,其他函数和操作符不支持大于1GB CLOB作为参数。合规长度最大值是268435454,2的28次方-2.
问:列存储的页面是如何组织的?
答:列存储引擎的存储基本单位是CU(Compression Unit,压缩单元),即表中一列的一部分数据组成的压缩数据块。列存储引擎使用了CUDesc(压缩单元描述符)表来记录一个列存储表中CU对应的元信息。每个CU 对应一个CUDesc的记录,在CUDesc里记录了整个CU 的事务时间戳信息、CU的大小、存储位置、magic校验码、min/max等信息
问:列存表适用什么场景?
答:适用数据量较大(如数据仓库),列的数据特征比较相似,重复度比较高的业务场景,适合按列进行压缩,不但压缩比很高,还会节省大量磁盘空间,同时也会提高单位作业下的IO效率。
问:列存为什么会减少IO负载?
答:列存储会根据数据属性进行编码及压缩处理,对计算方式做了优化,对于表中列数比较多,但是访问的列数比较少时,列存储可以按需读取列数据,大大减少不必要的读IO,提高查询性能。
问:如何查看当前数据库的大小?
答:可以直接在gsql客户端执行\l+,也可以通过函数来查询select pg_size_pretty(pg_database_size(datname)) from pg_database, 函数查询的方式更适合用来做监控巡检指标。
问:如何查看某张表大小?
答:可以直接在gsql客户端执行\dt+,也可以通过函数pg_relation_size()或pg_table_size()来查指定表的大小;如果要查询所有表占用的磁盘空间可以使用函数pg_total_relation_size(),这个函数会计算索引。
问:如果查看索引的大小?
答:可以直接在gsql客户端执行\di+,也可以使用pg_relation_size()来查看指定索引的大小,如果想查一个表中所有索引的大小,可以使用pg_indexes_size()函数来查询。
问:什么场景下需要重做备库?
答:重做备库一般有以下几种方式:1、手工搭建主备集群,重做备库的情况下 2、当备库与主库延时较大,或者主备关系断开且无法追上 3、备库故障无法启动的情况下需要重做备库 4、原主库故障修复后以备库角色加入集群的情况下也需要
问:重做备库有哪些方式?
答:最常用的重做备库的方式是通过gs_ctl build命令来重做备库,默认情况下是优先使用增量bild的方式,如果增量build失败则会转换到全量build;也可以考虑使用全量备份+wal归档日志的方式,需要配置restore_command命令或者将归档日志直接放到wal目录中。
问:可以从备库做build么?
答:默认情况下,备库/级联备做build是去找主库,但也可以从指定的备库去做build,需要使用参数-b standby_full -C "localhost=xxx.xxx.xxx.1 localport=$standby2_port remotehost=xxx.xxx.xxx.1 remoteport=$standby1_port" 的方式
问:表连接方式的hint有哪些?
答:Plan Hint是特殊SQL语法,可用于手工干预SQL执行计划的选择,在SQL中加入hint语法,可以明确指导SQL优化器选择特定执行计划。用于禁用或使用nestloop/hashjoin/mergejoin进行连接:/*+ [no] nestloop/hashjoin/mergejoin(table1 table2) */
问:表访问方式的hint有哪些?
答:用于单独禁用或使用顺序扫描:/*+ [no] tablescan(table) */;用于单独禁用或使用索引/只索引扫描:/*+ [no] indexscan/indexonlyscan(table index) */
问:表连接顺序的hint有哪些?
答:指定表连接的顺序:/*+ leading(join_table_list) */
例:/*+ leading(t1 (t2 t3)) */ t2与t3表先进行join,再和t1进行join
问:报错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。
问:报错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;
问: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
问:MogDB支持序列吗?
答:支持。MogDB的序列可以产生一组等间隔的数值,能自增,主要用于表的主键,主要的sql语句是create sequence、alter sequence、drop sequence、alter。
问:什么是MogDB的虚拟索引?
答:MogDB的虚拟索引功能支持用户在数据库中直接进行操作,本功能将模拟真实索引的建立,避免真实索引创建所需的时间和空间开销,用户基于虚拟索引,可通过优化器评估该索引对指定查询语句的代价影响。
问:MogDB的虚拟索引使用步骤?
答:1.使用函数hypopg_create_index创建虚拟索引。2.开启GUC参数enable_hypo_index。3.执行EXPLAIN + 查询语句 来对比创建虚拟索引后的优化效果。4.使用函数hypopg_drop_index删除指定oid的虚拟索引。
问:程序提示密码错误怎么办?
答:业务程序提示账号或密码错误,需要判断一下填写的账号密码是否正确,可以通过直连数据库的方式验证,如果直连数据库没有问题,说明可能是程序的密码加密方式有问题,需要检查程序是否支持sha256及数据库pg_hba.conf文件中是否配置一致;如果直连数据库有问题也提示账号密码不对,且无法找回,可以考虑重制密码。
问:gs_om显示的实例状态有几种,分别是什么含义?
答:实例状态中P、S、C 分别表示是数据库初始化时的角色,数据库安装好以后就不会在改变,除非修改了静态文件;还有7种状态表示实例当前的角色状态,分别是Primary、Standby、Cascade Standby、Secondary、Pending、Unknown、Down,其中Secondary:表示实例为从备实例;Pending:表示该实例在仲裁阶段;Unknown:表示实例状态未知;Down:表示实例处于宕机状态。
问:如何手工设置replconninfo,搭建一主一备一级联备?
答:配置主备级联环境,除了要配置available_zone、application_name 和 remote_read_mode参数外,最重要的就是要配置replconninfo参数,如果有3个ip分别是01、02和03,03准备做级联,那么01服务器上需要replconninfo1 和 replconninfo2,replconninfo1写02的信息,replconninfo2写03的信息 + iscascade=true;02服务器和03服务器也依次配置,配置好以后,可以直接通过build的方式搭建集群。
问:为什么数据库日志里会出现“字段长度不够”的报错?
答:长度不够的报错更多的是出现在字符类型的字段上,报错的原因可能是在数据库对象设计之初没有规划好字符长度;但对于数据库迁移来说,源端数据库与目标端数据库字符集不匹配导致存储相同字符占用不同的字节,从而导致长度不够的情况比较多。
问:报错gsql: wait xxx.xxx.xxx.xxx:xxxx timeout expired
答:gsql在向数据库发起连接的时候,会有5分钟超时机制,如果在这个超时时间内,数据库未能正常的对客户端请求进行校验和身份认证,那么gsql会退出当前会话的连接过程,并报出如上错误。
一般来说,此问题是由于连接时使用的-h参数及-p参数指定的连接主机及端口有误(即错误信息中的xxx部分),导致通信故障;极少数情况是网络故障导致。要排除此问题,请检查数据库的主机名及端口是否正确。
问:json函数存在,但是调用的时候却报错函数不存在 function xxx does not exist
答:json的函数,若是用在跟表字段相关,需要特殊处理,字段::json。例如json_extract_path(json, VARIADIC text[]),调用是select json_extract_path(字段::json,'xxxx') from table_name where ......
问:为什么要创建索引?
答:合理恰当的索引可以提高数据库查询性能,但如果索引过多也会会影响数据写入的性能,所以并不是索引越多越好,一般建议一张表的有效索引不超过5个。
问:怎么知道一张表中的索引是否有效?
答:查看索引是否有效,一是看PG_INDEX中的indisvalid字段值是否为真,如果为真说明这个索引本身是有效的,可以使用;二是看PG_STAT_USER_INDEXES这个视图中idx_scan扫描的次数,如果这个值很高说明索引利用率高,如果扫描次数很低,需要进一步排查是否是无用索引。
问:MogDB数据库分区表支持哪些类型的索引?
答:分区表索引分为LOCAL索引与GLOBAL索引,LOCAL索引与某个具体分区绑定,而GLOBAL索引则对应整个分区表。无论是local索引还是global索引,在创建索引的语法上与普通索引没有特殊差别,分区表默认创建的是global索引。分区表仅支持B-tree索引。
问:分区表的索引有哪些约束?
答:分区表上不支持创建部分索引,GLOBAL索引不支持表达式索引,也不支持列存表;在相同属性列上,分区LOCAL索引与GLOBAL索引不能共存;GLOBAL索引,最大支持31列;如果alter语句不带有UPDATE GLOBAL INDEX,那么原有的GLOBAL索引将失效,查询时将使用其他索引进行查询。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




