首页 > 数据库 >PostgreSQL 通过python 监控逻辑复制

PostgreSQL 通过python 监控逻辑复制

时间:2023-06-21 12:03:39浏览次数:50  
标签:rows PostgreSQL cur python 复制 print conn row


PostgreSQL 通过python 监控逻辑复制_java

上期是讲逻辑复制,本期是通过PYTHON 来对逻辑复制中的配置参数,publication 定义, 打印不适合进行逻辑复制的表,打印没有在使用的复制槽,另外包含当前发布端和接收端两边的LSN对比。

以下是代码,对于逻辑复制中主要的监控点有

1  是不是存在复制槽不使用的情况

2  是不是存在主库和从库之间的复制延迟(异步)

3  当前库是不是存在不适合进行逻辑复制的表

4  当前库是不是有设置发布

#!/usr/bin/python3

import os
import sys
import psycopg2
import re
import subprocess

#检测当前PG是否具备进行逻辑复制的参数配置
def parameter():
    conn = None
    conn = psycopg2.connect(database="postgres",user="postgres",password="",host="localhost",port="5432")
    conn_sub = psycopg2.connect(database="postgres",user="admin",password="admin",host="192.168.198.101",port="5432")

    cur = conn.cursor()
    cur.execute("""show wal_level;""")
    rows = cur.fetchall()
    for row in rows:
        print("启用逻辑复制wal_level必须为logical")
        print("________________")
        print(row)
    cur = conn.cursor()
    cur.execute("""show max_worker_processes;""")
    rows = cur.fetchall()
    for row in rows:
        print("启用逻辑复制,请注意max_worker_process的数字")
        print("________________")
        print(row)
    cur = conn.cursor()
    cur.execute("""show max_replication_slots""")
    rows = cur.fetchall()
    for row in rows:
        print("启用逻辑复制,请注意复制槽的数字")
        print("________________")
        print(row)
    cur = conn.cursor()
    cur.execute("""show max_wal_senders;""")
    rows = cur.fetchall()
    for row in rows:
        print("启用逻辑复制,请注意最大max_wal_sender数字")
        print("________________")
        print(row)
    cur = conn.cursor()
    cur.execute("""show max_logical_replication_workers;""")
    rows = cur.fetchall()
    for row in rows:
        print("启用逻辑复制,请注意最大max_logical_replication_workers数字")
        print("________________")
        print(row)    cur = conn.cursor()
    cur.execute("""show max_sync_workers_per_subscription;""")
    rows = cur.fetchall()
    for row in rows:
        print("启用逻辑复制,请注意最大max_sync_workers_per_subscription数字")
        print("________________")
        print(row)

     cur = conn.cursor()
    cur.execute("""select pubname,puballtables,pubinsert,pubupdate,pubdelete,pubtruncate from pg_publication;""")
    rows = cur.fetchmany(100)
    print("当前库publication定义发布信息")
    print("-----------------------------")
    print("发布定义名  是否对全库表进行发布定义  追踪插入  追踪更新  追踪删除        追踪truncate")
    for row in rows:
        print(row)    print("----------------------------------------------")

    cur = conn.cursor()
    cur.execute("""select pubname,tablename from pg_publication_tables;""")
    rows = cur.fetchmany(100)
    print("当前库发布的数据表")
    print("------------------")
    print("发布定义名  发布表名")
    for row in rows:
        print(row)

    print("----------------------------------------------")



    cur = conn.cursor()
    cur.execute("""select relname,relhasindex 
from pg_catalog.pg_class as c
inner join pg_namespace as n on 
(c.relnamespace = n.oid and n.nspname NOT IN ('information_schema', 'pg_catalog') and c.relkind='r') where c.relhasindex = 'f';""")
    rows = cur.fetchmany(100)
    print("当前库不适合建立逻辑复制表list")
    print("_______________________________")
    print("表名  无主键")
    for row in rows:
        print(row)

    print("----------------------------------------------")

    cur = conn.cursor()
    cur.execute("""SELECT slot_name,slot_type,active FROM pg_replication_slots where active= 'f';""")
    rows = cur.fetchmany(100)
    print("注意当前没有被使用的复制槽,确认不使用请立即删除")
    print("_______________________________")
    print("复制槽名   复制槽类型   目前不在使用")
    for row in rows:
        print(row)
    print("删除复制槽语句 select pg_drop_replication('复制槽名')")
    print("------------------------------------------------------")

    cur = conn.cursor()
    cur.execute("""select sent_lsn,replay_lsn from pg_stat_replication;""")
    rows = cur.fetchmany(100)
    print("主库lsn信息")
    print("_______________________________")
    print("发送LSN     回执LSN")
       for row in rows:
        print(row)
    print("------------------------------------------------------")



    cur = conn_sub.cursor()
    cur.execute("""select subname,received_lsn,latest_end_time::varchar(20) from pg_stat_subscription;""")
    rows = cur.fetchmany(100)
    print("查看目的端数据接收状态")
    print("-----------------------")
    print("接收端名    接收到的LSN    最后接收到LSN时间")
    for row in rows:
        print(row)

    conn.commit()
    conn_sub.commit()
    conn_sub.close
    conn.close

if __name__ == "__main__":
    parameter()

下图为执行后的效果

PostgreSQL 通过python 监控逻辑复制_java_02

下面有两个地方需要注意

1  设定subscription 的连接,需要在接收端的位置设置用户密码

2  可以将连接设置为及时输入的模式,会更方便,这里没有写死了。

PostgreSQL 通过python 监控逻辑复制_mysql_03

另逻辑复制中最怕的是接收端数据出现问题,导致复制停止,目前需要通过日志来查询出现的问题。程序里面并未有及时分析日志的部分。

PostgreSQL 通过python 监控逻辑复制_python_04

标签:rows,PostgreSQL,cur,python,复制,print,conn,row
From: https://blog.51cto.com/u_14150796/6528070

相关文章

  • 十五、python文件IO操作
    十五、python文件IO操作python文件操作的步骤python文件的操作就三个步骤:1.先open打开一个要操作的文件2.操作此文件(读,写,追加等)3.close关闭此文件python文件访问模式简单格式:file_object=open(file_path,mode="")mode:r只读模式,不能写(文件必须存在,不存在会......
  • Python 修改ha配置文件
    Python修改ha配置文件任务要求1、用户输入字符串{"backend":"test.oldboy.org","record":{"server":"100.1.7.9","weight":20,"maxconn":30}}2、在对应的backend下,添加一条新记录backend不存在时,创建3、删除一条记录ba......
  • Porting Code to Python 3 with 2to3
    参考https://www.cmi.ac.in/~madhavan/courses/prog2-2012/docs/diveintopython3/porting-code-to-python-3-with-2to3.html......
  • 根据ubuntu:20.04制作python环境docker镜像
    因为有个算法是python写的,要在服务器上调用,之前是直接根据jdk镜像制作的环境,现在要装python,jdk双环境,只能自己制作一个镜像出来了,命令如下FROMubuntu:20.04ENVTZ=Asia/ShanghaiENVLANGC.UTF-8RUNmv/etc/apt/sources.list/etc/apt/sources.list.bakCOPYsources.li......
  • 【python基础】类-类属性
    在初始类中,我们介绍了如何访问类属性,除了访问类属性外还有其他操作类属性的情况,我们将在这里做详细介绍:1.给类属性指定默认值类中的每个属性都必须有初始值,哪怕这个值是0或者空字符串。在有些情况下,如设置默认值时,在方法__init__方法内指定这种初始值是可行的,如果对某个属性这样......
  • PostgreSQL 新闻速递 谷歌基于POSTGRESQL 兼容数据库提供更大规模的数据库服务
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。谷歌正在将针对PostgreSQL的AlloyDB数据库服务扩展至16个新区域。AlloyDB是一个兼容PostgreSQL的托管数据库服务,于去年......
  • python 生成小学计算练习 docx
    python3生成二年级下计算练习,有口算,有竖式。 importrandomimportosfromdocx.sharedimportPtfromdocximportDocumentdefcreate_page(document):#口算document.add_paragraph('一、口算')operators='+-×÷'columnsNumber=3rowsNumbe......
  • python编写下载小工具。下载YouTube视频
    确保下载环境pipinstallpytubefrompytubeimportYouTube#1.导入工具包。如果没有就下载\fromtqdmimporttqdm#2.定义下载函数defdownload_YouTube_video(url):try:yt=YouTube(url)#创建下载链接。这段代码使用提供url创建一个YouTube对象......
  • python: Reading and Writing JSON to a File
     #importjsonjsondata={'sqlserver':[{"server":"DESKTOP-NQK85G5\GEOVIN2008","useid":"sa","password":"......
  • [复习随笔]python_dcgan网络复习小知识:模型定义
    定义参数dataroot-thepathtotherootofthedatasetfolder.Wewilltalkmoreaboutthedatasetinthenextsection.workers-thenumberofworkerthreadsforloadingthedatawiththeDataLoader.batch_size-thebatchsizeusedintraining.TheD......