MYSQL 通过 python 监控半同步参数设置

本文介绍如何使用Python连接MYSQL 8.0.26及以上的版本,并检查与配置半同步复制功能。通过安装mysql-connector-python,实现对半同步状态的监控及必要参数的展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

77ba8d3fda9a20a9e642da8218f9f58c.png

MYSQL 的半同步是MYSQL 复制的核心,通过半同步可以让MYSQL复制在一定的时间和状态下尽量两端的数据是一致的。

要监控半同步的情况,首选需要安装python connector for mysql ,

pip3 install mysql-connector-python

696ff6f955b0d94e5cb321942793dc12.png

通过安装 mysql-connector-python 来对MYSQL 8.X的数据库进行访问

5282a9ed7b1a21635bf449c509ef57c5.png

 MYSQL 官网中关于联通MYSQL 的版本的说明在上图,请注意不同的版本可以操作的MYSQL的数据库。

下面的PTYHON 是针对8.026 检查和打开半同步功能的程序

请配置一个远程的账号,在MYSQL 中以及对应的主机地址

6296929ea8111326bd774ef596c717b1.png

程序会进行两次判断  

1  如果MYSQL的版本不是8.026 及以上,可以通过选择退出程序   

2  如果半同步未打开,可以通过选择 直接打开当前主机的半同步功能  

同时程序后面会针对关键的半同步参数进行展示和相关参数的说明

下图为程序运行结果

86affd8b4860e1f6c2fcbe5c8d7635c7.png

以下为相关的代码

#!/usr/bin/python3

import mysql.connector
from mysql.connector import errorcode
import sys
import os
import datetime

def mconn():

    config = {
             'user':'admin',
             'password':'1234.Com',
             'host': '192.168.198.200',
             'database': 'mysql',
             'use_pure':True,
             'raise_on_warnings':True
             }

    con = mysql.connector.connect(**config)

    cur = con.cursor()

    query = ("select plugin_name,plugin_status from information_schema.plugins where plugin_name = 'rpl_semi_sync_source';")

    cur.execute(query)
    res = cur.fetchall()
    print('__________________________________________________')
     
    if len(res) != 0:
        print('如果下方的信息中rpl_semi_sync_source 不是active,请激活,当前配置有问题')
        print('-----------------------------------------------------------------------')
        for row in res:
            print (row)
    else:
        print('半同步源服务并未开启')       


    query = ("select plugin_name,plugin_status from information_schema.plugins where plugin_name = 'rpl_semi_sync_replica';")

    cur.execute(query)
    res = cur.fetchall()
    print('__________________________________________________')
     
    if len(res) != 0:
        print('如果下方的信息中rpl_semi_sync_replica 不是active,请激活,当前配置有问题')
        print('-----------------------------------------------------------------------')
        for row in res:
            print (row)
    else:
        print('半同步目的服务并未开启')   
    
    print('如上面有问题,程序将开启source 和 replica 半同步,同意请按 1 不同意请按 0')
    code = input("请输入1 或 0")
    if code == '1':
       query1 = ('SET GLOBAL rpl_semi_sync_source_enabled = 1;')
       query2 = ('SET GLOBAL rpl_semi_sync_replica_enabled = 1;')
       cur.execute(query1)
       cur.execute(query2)
       print('操作完成,请重新运行程序检测')
    else:
       print('操作停止')



    con.close()



def mconn_p():
    config = {
             'user':'admin',
             'password':'1234.Com',
             'host': '192.168.198.200',
             'database': 'mysql',
             'use_pure':True,
             'raise_on_warnings':True
             }
    con = mysql.connector.connect(**config)

    cur = con.cursor()

    query1 = ("show variables like 'rpl_semi_sync_replica_enabled';")
    query2 = ("show variables like 'rpl_semi_sync_source_enabled';")
    query3 = ("show variables like 'rpl_semi_sync_source_timeout';")
    query4 = ("show variables like 'rpl_semi_sync_source_wait_for_replica_count';")
    query5 = ("show variables like 'rpl_semi_sync_source_wait_no_replica';")
    query6 = ("show variables like 'rpl_semi_sync_source_wait_point';")

    querys = [query1,query2,query3,query4,query5,query6]
    
    for query in querys:
        cur.execute(query)
        res = cur.fetchall()
        for row in res:
            if row[0] == 'rpl_semi_sync_replica_enabled':
                print('打开半同步复制从库端')
            elif row[0] == 'rpl_semi_sync_source_enabled':
                print('打开半同步复制主库端')
            elif row[0] == 'rpl_semi_sync_source_timeout':
                print('半同步等待超时时间')
            elif row[0] == 'rpl_semi_sync_source_wait_for_replica_count':
                print('多少复制端参与半同步复制')
            elif row[0] == 'rpl_semi_sync_source_wait_no_replica':
                print('如果复制端不够预期设置,是否还进行复制')
            elif row[0] == 'rpl_semi_sync_source_wait_point':
                print('等待复制的属性after_sync为数据复制到从库即为返回成功,after_commit 为数据在从库commit后返回成功')
            else:
                print ('----------------------------------------------------------------------------------------------')
            print (row)
            print ('--------------------------------------------------------------------------------------------------')
             

    con.close()

f8bcef9401d25916b2aee3a9a2778e3d.png

### MySQL 主从同步配置教程 MySQL主从同步是一种常见的数据库复制技术,通过该技术可以实现数据的高可用性和负载均衡。以下是关于MySQL主从同步的具体配置方法以及常见问题及其解决方案。 #### 配置步骤概述 1. **环境准备** 在开始配置之前,需要确保主服务器和从服务器均已正确安装并运行MySQL服务[^3]。此外,还需要确认两台服务器之间的网络连通性正常,并设置好相应的防火墙规则以允许必要的端口通信(默认为3306)。 2. **主服务器配置** - 授权从服务器连接:在主服务器上执行`GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'password';`命令授予从服务器权限。 - 修改主服务器配置文件(通常是`my.cnf`),添加以下内容: ```ini log-bin=mysql-bin server-id=1 binlog-do-db=test_db ``` 上述配置启用了二进制日志功能,并设置了唯一的server-id[^4]。 - 重启MySQL服务使更改生效。 - 登录MySQL控制台,验证二进制日志是否已启用:`SHOW MASTER STATUS;` 3. **从服务器配置** - 修改从服务器的配置文件,同样需要指定唯一的服务ID号: ```ini server-id=2 relay-log=mysql-relay-bin replicate-do-db=test_db ``` - 重启MySQL服务。 - 执行以下命令完成剩余参数配置: ```sql CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.xxxxxx', MASTER_LOG_POS=yyyyyy; START SLAVE; ``` 4. **验证同步状态** 使用`SHOW SLAVE STATUS\G;`查看同步状态。如果一切正常,则可以看到`Slave_IO_Running: Yes` 和 `Slave_SQL_Running: Yes` 的输出结果。 --- ### 常见问题及解决方案 1. **UUID冲突问题** 当启动从库时遇到错误提示:“Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs”,这表明主从服务器具有相同的UUID值。可以通过删除旧的数据目录下的auto.cnf文件来解决此问题[^1]。 2. **初始数据导入不一致** 若未先将主服务器中的现有数据导出至从服务器,在后续同步过程中可能出现数据丢失或异常情况。建议按照以下方式处理: - 锁定主服务器上的表格以防修改:`FLUSH TABLES WITH READ LOCK;` - 导出整个数据库结构与数据:`mysqldump --all-databases --single-transaction > dbdump.sql` - 将生成好的备份文件传输到从服务器并恢复之[^2]。 3. **延迟过高现象** 如果发现从节点落后于主节点较多时间单位,可能是因为某些大型事务耗尽了资源所致。优化策略包括但不限于调整缓冲区大小、增加硬件性能指标或者考虑采用半同步机制减少潜在风险。 4. **SQL线程停止工作** 出现类似“Last_Error”的报错信息意味着存在语法差异或者其他兼容性障碍阻止进一步操作继续推进下去。仔细检查对应位置处具体发生了什么状况之后再采取相应措施予以纠正即可恢复正常运作模式。 --- ```python # 示例Python脚本用于监控MySQL主从延时 import mysql.connector def check_replication_delay(host, user, password): cnx = mysql.connector.connect(user=user, password=password, host=host,database="information_schema") cursor = cnx.cursor() query = ("SELECT Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master FROM SLAVE_STATUS;") cursor.execute(query) result = cursor.fetchone() io_running, sql_running, delay = result if not (io_running == "Yes" and sql_running == "Yes"): print(f"Replication is broken! IO Running:{io_running}, SQL Running:{sql_running}") elif delay > 60: print(f"High Replication Delay detected ({delay} seconds).") check_replication_delay('localhost','root','your_password') ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值