当前位置: 首页 > 编程笔记 >

postgresql 切换 log、xlog日志的实现

司徒嘉祥
2023-03-14
本文向大家介绍postgresql 切换 log、xlog日志的实现,包括了postgresql 切换 log、xlog日志的实现的使用技巧和注意事项,需要的朋友参考一下

os: centos 7.4

db: postgresql 9.6

切换log:

select pg_rotate_logfile();

切换xlog:

select pg_switch_xlog();

补充:postgresql流复制主从切换+resetxlog

主 192.168.3.46

从 192.168.3.47

现象:由于46主库的xlog日志达到7T以上,磁盘空间不足,需要通过pg_resetxlog命令清日志。

解决:

1.修改postgresql参数

checkpoint_timeout = 60min   # range 30s-1d
max_wal_size = 4GB 
min_wal_size = 1GB 
checkpoint_completion_target = 0.9
wal_keep_segments = 50

2.pg_resetxlog命令清日志

操作过程:

1.停主机

#46
pg_ctl stop -D /data/postgresql/data

2.从节点提升

#47
pg_ctl promote -D /data/postgresql/data

以上两步操作完后,发现无法连接pgpool,有以下提示:

11370 Apr 10 21:04:00 usvr47 pgpool[21766]: [11-1] 2019-04-10 21:04:00: pid 21766: LOG: new connection received
11371 Apr 10 21:04:00 usvr47 pgpool[21766]: [11-2] 2019-04-10 21:04:00: pid 21766: DETAIL: connecting host=usvr47.cityre.cn port=26224
11372 Apr 10 21:04:00 usvr47 pgpool[21766]: [12-1] 2019-04-10 21:04:00: pid 21766: LOG: failed to connect to PostgreSQL server on "192.168.3.46:5432", getsockopt() detected error "Connection refused"
11373 Apr 10 21:04:00 usvr47 pgpool[21766]: [13-1] 2019-04-10 21:04:00: pid 21766: LOG: degenerate backend request for node_id: 0 from pid [21766] is canceled because failover is disallowed on the node
11374 Apr 10 21:04:00 usvr47 pgpool[21766]: [14-1] 2019-04-10 21:04:00: pid 21766: FATAL: failed to create a backend connection
11375 Apr 10 21:04:00 usvr47 pgpool[21766]: [14-2] 2019-04-10 21:04:00: pid 21766: DETAIL: executing failover on backend

第3行是pgpool的健康检查health_check(配置文件没有设置定期检查),发现主库无法连接;

第4行是pgool触发故障转移,将从库提升为主库(配置文件没有配置自动故障转移,需命令pg_ctl premote手动切换);

但是pgpool中配置backend_flag1 = ‘DISALLOW_TO_FAILOVER' ,意思为不允许故障转移,因此通过psql -p 9999 -h 192.168.3.45 -U postgres 无法登录;将命令改为backend_flag0 = ‘ALLOW_TO_FAILOVER' 并reload后,可以登录。

此参数导致pgpool在主库无法连接的情况下,pgpool也无法登录,导致客户端无法连库的现象。

此时通过show pool_nodes命令可以看到主库(node id 为0)的状态为down。

3.清除原主节点xlog

#46
#查看oid xid
pg_controldata -D /data/postgresql/data
#清日志
pg_resetxlog -o 24579 -x 58288 -f /data/postgresql/data

7T空间,清理时间大约30min。

4.重新同步数据

46作为47的slave,重新同步数据

pg_basebackup -D /data/postgresql/data -Fp -Xs -v -P -h 192.168.3.47 -p 5432 -U repl

默认会等待主库checkpoint后同步,为避免长时间等待,在主控手动checkpoint。

同步完成后:

mv recovery.done recovery.conf
pg_ctl start /data/postgresql/data

此时新的主从即可建立。

5.查看pgpool

[postgres@usvr-3-46 ~]$ psql -p 9999 -h 192.168.3.45 -U postgres
Password for user postgres: 
psql (9.6.3)
Type "help" for help.
postgres=# show pool_nodes;
 node_id |  hostname  | port | status | lb_weight | role  | select_cnt | load_balance_node | replication_delay 
---------+--------------+------+--------+-----------+---------+------------+-------------------+-------------------
 0    | 192.168.3.46 | 5432 |down   | 0.500000 | standby | 66014   | false       | 72
 1    | 192.168.3.47 | 5432 | up   | 0.500000 | primary | 66559   | true       | 0
(2 rows)

此时发现 3.46在pgpool状态仍然为down,需通过pcp命令将失效的节点重新加入集群

pcp_attach_node -U postgres -h 192.168.3.45 -p 9898 -n 0

其中0为node_id。

注意:

pcp命令的密码读取的文件为pcp.conf,如果忘密码,可进行如下操作:

[root@usvr47 ~]# pg_md5 postgres
e8a48653851e28c69d0506508fb27fc5
[root@usvr47 ~]# echo "postgres:e8a48653851e28c69d0506508fb27fc5" >> pcp.conf

而不是通过命令pg_md5 -m -u postgres -p 生成密码,放在pool_passwd文件中,此文件密码为连接postgresql的密码,一定要注意。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持小牛知识库。如有错误或未考虑完全的地方,望不吝赐教。

 类似资料:
  • 本文向大家介绍Golang logrus 日志包及日志切割的实现,包括了Golang logrus 日志包及日志切割的实现的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍 Golang 中最佳日志解决方案,包括常用日志包logrus 的基本使用,如何结合file-rotatelogs 包实现日志文件的轮转切割两大话题。 Golang 关于日志处理有很多包可以使用,标准库提供的 log 包功能

  • DoitPHP所提供的Log类主要用于日志处理。当主配置文件中开启日记记录功能时(日记功能开启,Debug调试功能关闭),若程序运行异常时会在logs目录内生成log日志文件,这样便于监控程序运行。Log类只提供两个类方法write()和show()。 类方法使用说明: 1、write($message, $level = 'Error', $logFileName = null) 日志写入操作

  • NSLog方法 为了打印日志,我们使用Objective-C编程语言中的NSLog方法,我们在Hello World示例中使用了该方法。 让我们看一下打印“Hello World”字样的简单代码 - #import <Foundation/Foundation.h> int main() { NSLog(@"Hello, World! \n"); return 0; } 现在,当我们

  • log4j API提供org.apache.log4j.jdbc.JDBCAppender对象,该对象可以将日志记录信息放在指定的数据库中。 JDBCAppender配置 属性 描述 bufferSize 设置缓冲区大小。 默认大小为1。 driver 将驱动程序类设置为指定的字符串。 如果未指定驱动程序类,则默认为sun.jdbc.odbc.JdbcOdbcDriver 。 layout 设置要

  • Apache log4j提供了各种Layout对象,每个对象都可以根据各种布局格式化日志记录数据。 还可以创建一个Layout对象,以特定于应用程序的方式格式化日志记录数据。 所有Layout对象都从Appender对象接收LoggingEvent对象。 然后,Layout对象从LoggingEvent中检索消息参数,并应用适当的ObjectRenderer来获取消息的String表示形式。 布局

  • 由来 准确的说,Hutool-log只是一个日志的通用门面,功能类似于Slf4j。既然像Slf4j这种门面框架已经非常完善,为何还要自己做一个门面呢?下面我列举实践中遇到的一些问题: 已有门面存在问题 log对象创建比较复杂 很多时候我们为了在类中加日志不得不写一行,而且还要去手动改XXX这个类名 private static final Logger log = LoggerFactory.ge