PostgreSQL 恢复模式错误日志增强 - 提供正在恢复的WAL(XLOG)文件位置

简介: 标签PostgreSQL , the database system is starting up , the database system is in recovery mode背景当数据库异常停库,再次启动时。

标签

PostgreSQL , the database system is starting up , the database system is in recovery mode


背景

当数据库异常停库,再次启动时。又或者由于进程CRASH后自动重启时。需要进入恢复模式,恢复完成后,数据库才能正常交互。

在启动过程中,正在恢复时,如果此时连接数据库,会报错如下:

the database system is starting up  

用户只看这个信息,并不知道数据库还要启动多久,现在已经恢复到什么状态了?

内核层面可以稍作改进,报错时,同时输出正在恢复的WAL位点,以及距离最后一个文件的WAL位点差多少MB没有恢复。这样用户大概就还知道还需要多久。

src/backend/postmaster/postmaster.c

/*  
 * Read a client's startup packet and do something according to it.  
 *  
 * Returns STATUS_OK or STATUS_ERROR, or might call ereport(FATAL) and  
 * not return at all.  
 *  
 * (Note that ereport(FATAL) stuff is sent to the client, so only use it  
 * if that's what you want.  Return STATUS_ERROR if you don't want to  
 * send anything to the client, which would typically be appropriate  
 * if we detect a communications failure.)  
 */  
static int  
ProcessStartupPacket(Port *port, bool SSLdone)  
{  
  
.......  
  
        /*  
         * If we're going to reject the connection due to database state, say so  
         * now instead of wasting cycles on an authentication exchange. (This also  
         * allows a pg_ping utility to be written.)  
         */  
        switch (port->canAcceptConnections)  
        {  
                case CAC_STARTUP:  
                        ereport(FATAL,  
                                        (errcode(ERRCODE_CANNOT_CONNECT_NOW),  
                                         errmsg("the database system is starting up")));  
                        break;  
                case CAC_SHUTDOWN:  
                        ereport(FATAL,  
                                        (errcode(ERRCODE_CANNOT_CONNECT_NOW),  
                                         errmsg("the database system is shutting down")));  
                        break;  
                case CAC_RECOVERY:  
                        ereport(FATAL,  
                                        (errcode(ERRCODE_CANNOT_CONNECT_NOW),  
                                         errmsg("the database system is in recovery mode")));  
                        break;  
                case CAC_TOOMANY:  
                        ereport(FATAL,  
                                        (errcode(ERRCODE_TOO_MANY_CONNECTIONS),  
                                         errmsg("sorry, too many clients already")));  
                        break;  
                case CAC_WAITBACKUP:  
                        /* OK for now, will check in InitPostgres */  
                        break;  
                case CAC_OK:  
                        break;  
        }  
  
        return STATUS_OK;  
}  

src/backend/access/transam/xlog.c

/*  
 * This must be called ONCE during postmaster or standalone-backend startup  
 */  
void  
StartupXLOG(void)  
{  
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的服务器日志文件
本文介绍了PostgreSQL数据库的物理存储结构,重点讨论了服务器日志文件。通过`pg_ctl`命令启动PostgreSQL实例时,使用`-l`参数指定日志文件位置,记录数据库启动、运行及关闭过程中的关键信息。附有相关视频讲解和日志文件示例。
614 0
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
403 2
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
3035 28
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
609 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
557 1
【赵渝强老师】Oracle的控制文件与归档日志文件
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的WAL预写日志文件
PostgreSQL数据库的物理存储结构包含多种文件,其中WAL(预写日志)用于确保数据完整性和高效恢复。WAL机制允许在不频繁刷新数据至磁盘的情况下,通过先写日志再改数据的方式,减少I/O操作,提高性能。每个WAL文件默认大小为16MB,位于pg_wal目录下,支持手动和自动切换。WAL不仅有助于数据恢复,还能显著降低I/O成本。
625 4
|
存储 SQL 关系型数据库
【赵渝强老师】PostgreSQL的运行日志文件
PostgreSQL的物理存储结构包括数据文件、日志文件等。运行日志默认未开启,需配置`postgresql.conf`文件中的相关参数如`log_destination`、`log_directory`等,以记录数据库状态、错误信息等。示例配置中启用了CSV格式日志,便于管理和分析。通过创建表操作,可查看生成的日志文件,了解具体日志内容。
681 3
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
492 4
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
568 1
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多