Mini Shell

Direktori : /opt/tier2c/
Upload File :
Current File : //opt/tier2c/check_mysql

#!/opt/imh-python/bin/python3
"""MySQL RADS tool - T2C version"""

import argparse
import configparser
import subprocess
from collections import Counter
import sys
import pymysql
from pymysql.optionfile import Parser as PyMySQLParser


def parse_args():
    """Parse commandline arguments"""
    parser = argparse.ArgumentParser(
        description='MySQL RADS tool - T2C version'
    )
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument(
        '--sockets',
        action='store_true',
        help='Show number of open connections vs max connections',
    )
    group.add_argument(
        '--active',
        action='store_true',
        help='Display databases with the most currently running queries',
    )
    args = parser.parse_args()
    return args


def get_max_connections() -> int:
    """Read mysqld:max_connections from /etc/my.cnf"""
    try:
        parser = PyMySQLParser(strict=False)
        if not parser.read('/etc/my.cnf'):
            return 100  # default
        return parser.get('mysqld', 'max_connections')
    except configparser.Error:
        return 100  # default


def count_mysql_conns() -> None:
    """Count used/available mysql connections
    using netstat in case the connections are exhausted"""
    try:
        # stderr will go to tty
        conns = subprocess.check_output(
            ['netstat', '-an'], encoding='utf-8'
        ).splitlines()
    except subprocess.CalledProcessError:
        sys.exit("netstat -an failed")
    conns = [x for x in conns if 'ESTABLISHED' in x or 'CONNECTED' in x]
    conns = [x for x in conns if ':3306' in x or 'mysql' in x]
    max_conns = get_max_connections()
    print(f'MySQL Connections: {len(conns)} / {max_conns}')


def show_active() -> None:
    """Show a count of active connections for each mysql user"""
    try:
        with pymysql.connect(
            host='localhost',
            database='INFORMATION_SCHEMA',
            read_default_file="/root/.my.cnf",
        ) as conn:
            with conn.cursor() as cur:
                cur.execute("SELECT USER FROM PROCESSLIST")
                active = Counter([x[0] for x in cur.fetchall()])
    except pymysql.Error as exc:
        sys.exit(str(exc))
    sorted_active = sorted(iter(active.items()), key=lambda x: x[1])
    for user, count in sorted_active:
        print(user, count, sep=': ')


def main():
    """Runs either count_mysql_conns() or show_active()"""
    args = parse_args()
    if args.sockets:
        return count_mysql_conns()
    if args.active:
        return show_active()
    raise NotImplementedError


if __name__ == '__main__':
    main()

Zerion Mini Shell 1.0