SQL SERVER ORACLE MYSQL 的系统表一个比一个多,系统表如同一个个小密探,如果你恰巧知道他们的名字,并且还知道他们的身世,那很快你就会如同找到一个蜜洞 secret broadcast, 然后就对你要操作的系统一目了然。
PostgreSQL 数据库也同样具有这样的系统表,并且通过各种组合,你的秘密库会不断的被填满。PostgreSQL系统目录是一个模式,其中的表和视图包含数据库中所有其他对象的元数据。PostgreSQL将数据库和集群的元数据信息存储在模式“pg_catalog”中。尽管PostgreSQL像其他应用程序一样将所有这些信息存储在表中,但表中的数据完全由PostgreSQL自己管理,除非绝对紧急情况,否则不应修改这些数据。在目录中查询的大部分表是“系统范围”的表,无论连接到哪个数据库,数据都代表整个集群,而不是单个数据库。
1 查看数据库的信息,从 pg_database 中可以看到数据库的信息,其中 pg_database 是可以进行修改的,可以限制对整体库的写入,例如你可以把你自己定义的库作为模板库 等等
SELECT oid,* FROM pg_database WHERE datname = 'dvdrental';
2 select * from pg_stat_database;
事务信息可以在xact_commit和xact_rollback列中找到,这两个列分别包含数据库提交和回滚的事务数。这将有助于显示数据库有多活跃,以及发现那些可能以惊人速度出错/回滚的程序可能出现的故障。关于是否从磁盘或内存检索数据的信息存储在blks_read和blks_hit列中。Blks_read显示从磁盘读取的数据库块的数量,而blks_hit显示在PostgreSQL的缓冲区缓存中找到的块的数量(由shared_buffers参数表示)。由于RAM比磁盘快得多,所以理想情况下,我们将看到blks_hit始终高于blks_read,如果不是这样,我们可以重新评估可用内存。
如果所涉及的数据库是备用服务器,则列冲突可以方便地跟踪由于与处于“恢复模式”的备用服务器发生冲突而取消了多少查询。如果不是备用集群,则可以忽略此列。
查询需要写入临时文件。当分配给连接的work_mem的数量用完,并且需要在磁盘上而不是在内存中继续排序操作时,可能会发生这种情况。列temp_files跟踪所创建的这些文件的数量,而temp_bytes跟踪所使用的所有临时文件的总大小。这些数据可以帮助进行work_mem调优,甚至在临时文件太大时查找需要重写的查询。死锁列跟踪死锁发生的次数。由于死锁可能会导致本来不会出错的查询出现错误,所以最好跟踪这个问题,并确保应用程序不会互相干扰。
3 SELECT
*
FROM
pg_stat_bgwriter;
PostgtreSQL集群以几种不同的方式管理向磁盘写入数据。至于“脏缓冲区”(内存中的数据从磁盘读取后已经更改,但尚未将更改写入磁盘),可以通过检查点或后台写入器完成。由于脏缓冲区必须在释放或重新分配之前写入磁盘,因此确保对这些进程进行了良好的调优是至关重要的,这个表有助于说明它是如何工作的。
检查点要么按预定时间发生(由checkpoint_timeout参数表示),要么在上一次检查点之后使用了最大数量的WAL文件时发生,并且需要强制执行检查点。无论哪种方式,检查点都将脏缓冲区写入磁盘,并且有四列跟踪它。
列checkpoints_timing和checkpoints_req显示发生的计划检查点的数量(计时的)和请求的检查点的数量(也称为强制的)。如果checkpoint_req的值很高,则说明max_wal_size值不足。
列checkpoint_write_time和checkpoint_sync_time记录检查点进程写入和同步到磁盘的总时间(以毫秒为单位), buffer_backend_fsync 是一个记录 ba
后台写入器是一个单独的进程,它将脏缓冲区写入磁盘,这在理想情况下减少了checkpointer需要做的工作。
buffers_clean列,表示后台进程写入磁盘的缓冲区数量。与buffers_checkpoint相比,它显示了每个进程处理了多少工作负载(如果后台写入器经常更改,那么它可以多次写入缓冲区,而如果使用定时的检查点,那么写入缓冲区的频率就会降低。
Maxwritten_clean表示后台写入器每次运行时刷新的最大页面数(由bgwriter_lru_maxpages参数控制)。
buffers_backend_fsync 是一个记录有多少次必须要进行fsync 调用对于 buffers_backend 写到磁盘的次数。
4 select * from pg_stat_activity;
pg_stat_activity视图显示了到数据库的每个连接的一行,以及关于它的一些基本信息。列datname表示连接实际连接到的数据库,pid是数据库主机本身上连接的进程ID, usesysid和usename表示连接的数据库用户。
四个时间戳列显示当某些事情开始:backend_start实际上是建立连接时,xact_start是当前事务开始时(null如果客户没有打开的事务),query_start是当前或最近的查询开始时,和state_change最后连接的状态改变的时候。
pg_stat_activity的最后一部分包含连接的实际状态。如果查询正在等待另一个释放锁,那么wait_event_type包含关于它是哪种等待事件的一些信息,而wait_event列将显示等待事件的名称。
state”显示当前连接的状态,如活动、空闲、事务中的空闲,查询列将显示正在运行的实际查询,或最近运行的查询。
5 SELECT * FROM pg_locks;
pg_locks表与pg_stat_activity是协同工作的。每当对关系进行锁操作时,该信息都存储在pg_locks中。使用来自pg_stat_activity的pid,我们可以查询pg_locks来查看一个连接可能具有哪些锁,这些锁是什么类型的锁,以及是否授予了锁。最重要的列是' pid ',它与pg_stat_activity中的pid相匹配,' relation '与pg_class中的OID相匹配,' mode '显示所持有的锁模式的名称,' granted '表示所讨论的锁是否已被授予。
5 关于复制的系统表 可以查看
View pg_stat_replication:
包含每个WAL发送器进程的行,其中包含关于其状态的信息、正在处理的WAL文件的位置,以及接收用于复制的WAL数据的备用主机的连接信息。
View pg_stat_subscription:
如果将WAL数据发送到备用节点,这里的每一行将表示订阅,并包含关于订阅状态的信息。
View pg_stat_wal_receiver:
如果集群是备用的,那么它将包含一行,显示关于主机接收进程的统计信息。
View pg_replication_slots:
包含集群中所有复制槽的列表及其当前状态。
关于postgresql 的metadata 也的说一下,在每个数据库中都有一组目录表,其中包含特定于正在查询的数据库的信息。如果我们要从这些表中查找特定的数据,我们必须确保在发出查询时连接到正确的数据库。
关于用户表的元数据存储在以下两个表中,它们分别对应于系统中创建的每个用户表。表pg_stat_user_tables包含用户对表的访问统计信息,而pg_statio_user_tables包含每个表的I/O统计信息。
6 pg_stat_user_tables
由于更新和删除,可能存在不再是活动数据的死元组,而真空过程最终将释放它们。列' n_tup_ins '和' n_tup_ins '分别跟踪存活和死亡元组的数量。当死元组到达某个点时,将根据自动真空设置启动自动真空。表的维护是通过VACUUM或AUTOVACUUM完成的,统计信息是通过ANALYZE或AUTOANALYZE收集的。接下来的四列包含这些操作最后一次运行的日期:“last_vacuum”、“last_autovacuum”、“last_analyze”、“last_autoanalyze”
7 select * from pg_statio_user_tables;
当客户机从表中访问数据时,它直接或通过索引进行访问。列' seq_scan '计算接收到的连续扫描表的数量,' seq_tup_read '计算通过该进程读取的元组的数量。' idx_scan '列计算表上的索引用于获取数据的次数。
8 SELECT * FROM pg_statio_user_tables ;
I/O输出有助于理解如何在幕后访问数据。列“heap_blks_read”表示为该表读取的磁盘块的数量,而“heap_blks_hit”表示从该表的内存中读取的缓冲区块的数量。这有助于了解访问表的查询是必须经常访问磁盘,还是从内存中获取数据。表上的索引统计信息显示了' idx_blks_read '和' idx_blks_hit '列的相同信息。
9 SELECT * FROM pg_stat_user_indexes;
与对应的表非常相似,该表包含关于索引的特定信息。每个索引一行,这个表显示了使用' idx_scan '列扫描索引的次数,使用' idx_tup_read '读取了多少元组,以及使用' idx_tup_fetch '实际获取了多少活动行。
10 select * from pg_statio_user_indexes;
数据可用的两列是“idx_blks_read”和“idx_blks_hit”,表示从磁盘和内存读取的块的数量
如果一个大的表经常被自动清理,随着时间的推移跟踪活到死的元组,那么它可能特别需要对自动清理进行调整,以便更快地完成,或者甚至可能需要对表进行分区。我们还可以创建一个随时间变化的内存与磁盘的比率,如果该比率在一天中的任何时候下降,我们就可以精确地确定这个比率。
实际上系统表在PG 11 有 93个 在 PG12 有95个,上面仅仅是很少的一部分,“神秘花园”很深,等着你自己去继续发掘。