问答题整理人员:杨有田、黄超、彭冲、高云龙
问:MogDB支持哪些隔离级别?
答:隔离级别有四种,分别是未提交读、已提交读、可重复读及序列化,而MogDB目前支持READ COMMITTED和REPEATABLE READ两种,默认是已提交读。
问:事务有几种状态?
答:事务状态有四种,分别是IN_PROGRESS事务正在进行中,COMMITTED事务已提交,ABORTED事务已中止和SUB_COMMITTED子事务。
问:读已提交事务和可重复读事务会有哪些现象?
答:读已提交隔离级别事务可能出现不可重复度和幻读,而可重复读隔离级别事务可能出现不可重复读的现象。其中不可重复读指:一个事务重新读取之前读取过的数据,发现该数据已经被另一个事务(在初始读之后提交)修改;幻读指:一个事务重新执行一个返回符合一个搜索条件的行集合的查询, 发现满足条件的行集合因为另一个最近提交的事务而发生了改变。
问:如何控制事务执行?
答:控制事务执行的命令有begin、START TRANSACTION、commit、end、rollback、savepoint 和 rollback to savepoint; 其中savepoint 和 rollback to savepoint 控制子事务。
问:可以关闭事务自动提交功能么?
答:事务自动提交是客户端的一个选项,并不是数据库自身的特性,所以数据库本身是无法控制的,可以通过修改客户端的选项来决定是否开启事务自动提交。这里以gsql为例,连接数据库后可以执行\set autocommit off关闭此选项,关闭后再执行query后,需要手工执行commit/rollback来完成事务提交或回滚。
问:数据库会话有几种状态?
答:一共有6种状态,分别是
active: 后台正在执行一个查询;
idle: 后台正在等待一个新的客户端命令;
idle in transaction: 后台在事务中,但事务中没有语句在执行;
idle in transaction (aborted): 后台在事务中,但事务中有语句执行失败;
fastpath function call: 后台正在执行一个fast-path函数;
disabled: 如果后台禁用track_activities,则报告这个状态。
问:什么是schema(模式),有什么作用?
答:schema在数据库里是一个逻辑集合,schema 之间的数据库对象是可以相互访问的,默认在数据库下会有一个public模式,自定义schema可以通过create schema 语法。
问:public模式是否建议使用或是否可以强制删除?
答:public模式需要小心使用,注意控制安全,不建议强制删除,以免某些场景无可用schema而陷入的窘境。
问:如何访问指定schema下的数据库对象?
答:访问指定schema下的数据库对象有以下几种方法:1.对象前面带 schema名称;2.设置search_path;3.连接时指定current_schema;4.创建同义词
问:user 和 role 有什么区别?
答:user 和 role的唯一区别是user是具有login用户属性的,而role默认不带logins属性,可以通过alter role方式添加,在其他方面二者没有区别。
问:用户属性有哪些?
答:用户属性包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN和LOGIN,这些属性是不可以被继承的,且只能通过alter user/role方式来修改。
问:database的owner是否具有当前数据库下任意权限?
答:数据库的owner只是对数据库自身有操作权限,database下的schema还是可以有自己的所有者,database的owner并不能管理非owner下的schema对象
问:什么是三权分立分立?
答:默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。但为了避免系统管理员拥有过度集中的权利带来高风险,将系统管理员的部分权限分立给安全管理员和审计管理员,形成系统管理员、安全管理员和审计管理员三权分立,三权分立后,系统管理员将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力。
问:数据库有全局只读用户么?
答:MogDB暂时没有全局只读用户,但是可以通过alter default privileges语法给未来数据库对象只读权限,从而达到只读用户的效果。
问:私有用户有什么特殊之处?
答:私有用户的数据不能被其他用户访问,即使是超级用户也只能查看私有用户下的对象结构,而看不到其数据,私有用户的用户属性仅其自己可以移除,超户没有权限。
问:MogDB有诊断报告么?
答:MogDB 提供了性能诊断报告WDR,类似于oracle的AWR报告,WDR依赖数据库的snapshot,若要生成此报告需要开启数据库参数enable_wdr_snapshot,且至少要两份snapshot。
问:怎么做数据库snapshot?
答:开启enable_wdr_snapshot参数后,数据库默认会每小时做一次snapshot,snapshot数量默认保留8天,我们也可以通过函数create_wdr_snapshot()来手工创建快照。
问:怎么生成WDR报告?
答:当snapshot数量符合要求后,我们可以先通过类似'toggle between unaligned and aligned output mode'这样的方式指定WDR报告的位置和报告格式,然后通过generate_wdr_report()函数来生成wdr报告。详细信息参考https://docs.mogdb.io/zh/mogdb/v3.0/wdr-snapshot-schema#wdr-snapshot%E7%94%9F%E6%88%90%E6%80%A7%E8%83%BD%E6%8A%A5%E5%91%8A
问:MogDB如何显示SQL的执行计划信息?
答:MogDB可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种:
EXPLAIN statement:只生成执行计划,不实际执行。其中statement代表SQL语句。
EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。
EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。
问:可以显示运行时SQL的状态进度么?
答:MogDB3.0新增一个"SQL运行状态观测功能",此功能可以帮忙找到某条正在运行SQL的性能瓶颈,详细信息参考https://docs.mogdb.io/zh/mogdb/v3.0/22-sql-running-status-observation#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF
问:可以查看历史SQL的执行计划么?
答:在statement_history视图中有个query_plan字段用来记录历史SQL的执行计划,默认情况下这个字段是空值,需要修改track_stmt_stat_level参数为L1才会记录执行计划。
PS:目前只支持在主库查询历史SQL
问:如何收集MogDB的统计信息?
答:信息收集可以全库进行,也可以指定数据库对象,收集统计信息有两种方式,分别是主动收集和自动收集,默认情况由数据库参数来控制,由autovacuum线程对达到参数阈值的SQL进行统计分析;我们也可以手动执行analyze来主动进行收集。
问:什么时候需要手动收集统计信息?
答:当我们发现数据库性能下降、进行索引维护、导入大量数据或进行大量数据变更后,都需要主动执行analyze操作,使数据库及时更新统计信息。
问:如何查看某个表是否需要进行analyze?
答:可以在视图pg_stat_user_tables中查看每个表的analyze的执行情况,包括analyze执行次数和最近一次执行时间,同时结合n_live_tup、n_dead_tup两个字段的占比来决定是否需要手工处理。
问:数据库节点有几种角色?
答:MogDB目前支持3种数据库角色:primary、standby和cascade standby,其中primary负责数据读写并将wal信息传给standby;standby可以接收primary发过来的wal,也能将wal传给cascade_standby角色,同时也提供数据读服务;cascade_standby可以接收standby发过来的wal也可以提供数据读服务。
问:三种角色在架构部署有什么限制么?
答:primary和standby两种角色之间可以是同步关系也可以是异步关系,在逻辑区域划分上可以在不同的AZ;cascade_standby只能提供异步关系,同时要求必须要与standby在同一个AZ。
问:如何进行角色切换?
答:角色切换分为计划内切换(switchover)和故障切换(failover),需要手工或借助高可用工具来完成,基础工具是gs_ctl。当primary和standby角色状态正常情况下可以使用switchover,如果primary角色不可用,则需要使用failover。
问:应该将多少服务器内存分配给数据库?
答:MogDB数据库有个参数max_process_memory来限制整个实例可以使用服务器内存的总大小,以此来规避操作系统的OOM报错,一般情况我们会在一台服务器上部署一个数据库实例,这时我们建议将服务器内存的80% - 90%给这个实例,剩余内存给其他程序,比如监控;但如果服务器上部署多套数据库实例,那就需要根据实例所承载的业务进行提前规划好内存分配规则。
问:如何当前实例数据库内存使用情况?
答:当前实例下数据库内存的分配可以通过gs_total_memory_detail视图来查看,这个视图里需要特别关注带 max、used 和 peak 的字段,分别代表参数最大值,已使用情况及历史峰值。
问:如何查看与会话相关内存使用情况?
答:可以通过视图gs_session_memory_detail来查看内存的总体分布情况,建议使用SQL: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支持哪些类型索引?
答:行存表(ASTORE存储引擎)支持的索引类型:btree(行存表缺省值)、hash、gin、gist、brin、bloom。行存表(USTORE存储引擎)支持的索引类型:ubtree。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。全局临时表不支持GIN索引和Gist索引。
问:如何查看索引的定义?
答:可以通过视图pg_indexes视图的indexdef字段查看索引定义,执行sql:select schemaname,tablename,indexname,indexdef from pg_indexes ;
问:如何判断索引是否失效,索引失效的原因有哪些?
答:在pg_index视图中有个字段indisvalid表示该索引是否有效,但这个字段的含义是指索引是否完整创建完成,并不代表索引是否被引用,我们所说的索引失效更多的是索引状态正常但一直未使用;索引正常却为被引用的原因有:1、数据倾斜 2、非query检索条件 3、索引创建不合理 4、有重复索引
问:对于索引创建有什么建议?
答:添加索引可以提高查询效率,但也会为数据变更效率降低,因为数据变更不仅仅要维护表,还需要维护对应的索引,所以并不是索引数量也多越好,建议热表的索引数量不超过5个,且注意普通索引与多列索引配合。
问:添加/删除索引会阻塞读写么?
答:添加/删除索引属于DDL操作,会个表添加一个SHARE锁,所以会阻塞数据读写,为了减少索引维护对读写的影响,增加了CONCURRENTLY选项来降低锁级别,可以在不阻塞读写的情况下添加索引,但代价是创建维护时间将变长。
问:如何维护索引?
答:重建索引有以下两种方式:1.先删除索引(DROP INDEX),再创建索引(CREATE INDEX)。2.使用REINDEX重建索引,1)使用REINDEX TABLE语句重建索引。2)使用REINDEX INTERNAL TABLE重建desc表(包括列存表的cudesc表)的索引。
问:MogDB是否支持视图?
答:MogDB支持普通视图和物化视图,普通视图是虚拟表,相当于子查询sql的别名;而物化视图是一种特殊的物理表,其实际是存储SQL结果集,起到缓存的作用,所以物化视图要比普通视图在性能上有极大的提升。
问:如何刷新物化视图?
答:物化视图目前支持全量刷新和增量刷新,暂不支持自动刷新数据,需要用户手动REFRESH [INCREMENTAL] MATERIALIZED VIEW [view_name]。具体使用方法参考:https://docs.mogdb.io/zh/mogdb/v3.0/2-incremental-materialized-view-usage
问:视图是否支持增删改操作?
答:对于简单的普通视图,执行update/insert/delete 操作会真实的作用在底层物理表,但是物化视图不支持增删改操作,只支持查询语句。
问:运维关注点有哪些?
答:日常数据库运维,数据库管理员需要关注硬件服务器资源使用情况,关注主备延迟,关注慢SQL,关注数据库刷盘的速度,关注连接数使用情况,关注数据库日志的错误信息以及数据库备份状态。
问:常用的系统表或者视图有哪些?
答:pg_stat_activity:查看当前数据库连接数使用情况,当前是否有执行时间较长的SQL;
statement/statement_history: 查看历史慢SQL
pg_stat_replications: 查看主备角色之间同步状态,主备之间同步延迟;
gs_total_memory_detail: 查看当前实例内存分布及使用情况;
pg_get_replication_slots() : 查看复制槽的状态,失效复制槽需要及时清理;
local_pagewriter_stat(); 查看本地刷盘情况,是否有脏页堆积;
pg_lock : 查看锁等待信息;
dbe_perf.wait_events : 查看等待事件
问:数据库最大连接数有限制么?
答:MogDB是线程类型数据库,数据库可以支持的连接数上限取决于给实例分配内存的大小,内存越小可以支持的连接数越少,默认一个空连接大约占用5MB的内存。
问:FATAL:Too many clients already, current/active: 1000/7 , max_connections/reserved: 1000/3 是什么原因?
答:三种可能:1是业务设置的minidle连接数过多,且没有timeout参数没有生效;2是数据库实例设置的最大连接数过低,无法满足业务访问需求;3是数据库本身bug,但这种可能性非常低。
问:FATAL: Forbid remote connection with trust method! 是什么原因?
答:安全因素,除了数据库本机可以通过127.0.0.1免密登陆,其他用户及ip需要通过认证登陆,可以通过修改pg_hba.conf文件来处理;建议非DBA不要直接在数据库服务器登陆数据库,业务系统应单独部署在MogDB服务器外部,否则可能会影响数据库运行性能。
问:启动时报 The socket file already exists. Port:26000.
答:类似的问题都是冲突造成的,冲突的原因可能是没有提前规划好,但也有可能是数据库突然crash,一些文件没有及时释放,比如postmaster.pid文件。
问:MogDB和Oracle在MVCC的实现上有什么区别?
答:Oracle:基于SCN,块级别,循环undo segment实现,支持闪回功能,存在大事务回滚、快照过旧ORA-01555问题。
MogDB:基于事务编号txid,行级别,无需undo,大事务可瞬间回滚,存在数据块(block page)空间及性能消耗问题。
问:Mogdb如何屏蔽或优化原生PostgreSQL中遇到的XID用尽问题?
答::MogDB将transactionid由int32改为了int64,64位的xid永远不可能耗尽,虽然xid改为了64位,但是过期的xid依旧需要freeze清理,只是永远不用担心会发生xid回卷宕机的风险。
问:MogDB中double write 与mysql 二次commit有什么区别?
答:实现原理与mysql机制相同,其目的是为了保证数据的强一致性,防止因为坏块导致数据丢失,从而导致数据无法恢复。
问:MogDB支持闪回特性么?
答:从2.1版本开始支持闪回和回收站功能,但是2.1版本非常稳版本,以3.0版本支持为准;若要使用闪回功能,需要使用ustore存储方式才有效。
问:闪回特性支持哪些场景?
答:闪回特性支持闪回查询和闪回恢复,闪回查询可以查询过去某个时间点表的某个snapshot数据;而闪回恢复支持两种方式,分别是基于MVCC多版本的数据恢复和基于数据库回收站的恢复。
问:闪回恢复适用哪些场景?
答:基于MVCC多版本的数据恢复:适用于误删除、误更新、误插入数据的查询和恢复。基于类似windows系统回收站的恢复:适用于误DROP、误TRUNCATE的表的恢复。
问:数据库参数分为哪几种类型?
答:数据库参数类型一共分6类,分别是INTERNAL、POSTMASTER、SIGHUP、BACKEND、SUSET、USERSET,其中INTERNAL是数据库内置参数不可以修改,POSTMASTER类型参数需要重启数据库实例才可以生效,其他类型的参数可以加载生效。
问:在对mogdb进行参数调优时,哪些参数是对数据库性能影响较大?
答:对数据库性能影响较大的比较多,有内存参数、存储参数、统计参数及同步参数,大家比较常关注的参数是内存参数,比如max_process_memory 、shared_buffers 和 work_mem.
问:在主备下场景的同步参数,对数据库性能影响很大吗?
答:同步配置参数synchronrous_commit共有5个参数值off、local、remote_receive、remote_write/on、remote_apply,默认值是on,随着参数级别升高数据安全性越高,但对主库性能影响越大。
问:MogDB支持数据库定时任务么?
答:MogDB 提供了PKG_SERVICE接口来实现定时任务管理,其中PKG_SERVICE.JOB_SUBMIT实现提交任务,PKG_SERVICE.JOB_UPDATE实现修改任务属性,PKG_SERVICE.JOB_FINISH实现是否禁用任务,PKG_SERVICE.JOB_CANCEL实现删除任务。
问:定时任务的接口如何使用,有没有参考用例?
答:可以参考官方网站https://docs.mogdb.io/zh/mogdb/v3.0/pkg-service#%E6%8E%A5%E5%8F%A3%E5%AE%9A%E4%B9%89%E5%92%8C%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B,这里不仅有定时任务使用示例,还有各个接口参数的使用说明,可以知其然知其所以然,即学即用。
问:MogDB的定时任务和PG的定时任务有哪些区别?
答:PG的定时任务是需要通过pg_cron插件来实现的,PG的定时任务更像操作系统的crontab,但对定时任务的维护方面还是比较像的,两者之间的具体差异,可以参考https://www.modb.pro/db/540333
问:MogDB支持审计日志么?
答:支持的,可以通过audit_enabled参数来控制是否开启数据库审计线程,默认是开启的,此参数的修改是可以动态加载生效,审计相关的参数有点多,建议在使用之前详细了解各个参数的含义。
问:哪些系统视图与审计信息相关?
答:GS_AUDITING:显示对数据库相关操作的所有审计信息;GS_AUDITING_ACCESS:显示对数据库DML相关操作的所有审计信息;GS_AUDITING_PRIVILEGE:显示对数据库DDL相关操作的所有审计信息;但需要注意的一点是:需要有系统管理员或安全策略管理员权限才可以访问这些视图。
问:审计记录存储的位置有哪些?如何清理审计日志呢?
答:常用的记录审计内容的方式有两种: 记录到数据库的表中、记录到OS文件中。MogDB采用记录到OS文件的方式来保存审计结果,保证审计结果的可靠性。清理审计日志有2种方式,1是通过数据库参数(时间/文件大小)来自动删除审计日志;2是可以使用审计接口命令pg_delete_audit进行手动删除,例如:SELECT pg_delete_audit('2012-09-20 00:00:00','2012-09-21 23:59:59')
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




