mysql管理工具(python)

#!/usr/bin/env python2.7

import sys
from os import path
import os
import MySQLdb
DIRNAME = path.dirname(__file__)
OPSTOOLS_DIR = path.abspath(path.join(DIRNAME, ‘..‘))
sys.path.append(OPSTOOLS_DIR)

from library.mysql import MySQLDConfig, getMyVariables
from optparse import OptionParser
from subprocess import Popen, PIPE

import time
import re

MYSQL_DATA_DIR = "/var/mysqlmanager/data"
MYSQL_CONF_DIR = "/var/mysqlmanager/cnfs"
MYSQL_BACK_DIR = "/var/mysqlmanager/backup"

REPLICATION_PASS = "123qwe"
REPLICATION_USER = "repl"

def opts():
    parser = OptionParser(usage="usage: %prog options")
    parser.add_option("-c", "--cmd", 
                      dest="cmd", 
                      action="store",
                      default="check",)
    parser.add_option("-n", "--name", 
                      dest="name", 
                      action="store",
                      default="mysqlinstance",)
    parser.add_option("-p", "--port", 
                      dest="port", 
                      action="store",
                      default="3306",)
    return parser.parse_args()

def readConfs():
    import glob
    confs = glob.glob(path.join(MYSQL_CONF_DIR,‘*.cnf‘))
    return [MySQLDConfig(c) for c in confs]

def checkPort(d, p):
    for m in d:
        if p == m.mysqld_vars[‘port‘]:
            return True
    return False

def _genDict(name, port):
    return {
        "pid-file": path.join(MYSQL_DATA_DIR, name,"%s.pid" % name ),
        "socket": "/tmp/%s.sock" % name,
        "port": port,
        "datadir": path.join(MYSQL_DATA_DIR, name),
        "log-error": path.join(MYSQL_DATA_DIR,name,"%s.log" % name),
    }

def mysql_install_db(cnf):
    p = Popen("mysql_install_db --defaults-file=%s"%cnf, stdout=PIPE, shell=True)
    stdout, stderr = p.communicate()
    return p.returncode

def run_mysql(cnf):
    cmd = "mysqld_safe --defaults-file=%s &" % cnf
    p = Popen(cmd, stdout=PIPE, shell=True)
    #stdout, stderr = p.communicate()
    time.sleep(5)
    return p.returncode

def setOwner(p, user):
    os.system("chown -R mysql:mysql %s" % p) 

def getCNF(name):
    return path.join(MYSQL_CONF_DIR, "%s.cnf" % name)

def setReplMaster(cur):
    sql = "GRANT REPLICATION SLAVE ON *.*  TO %[email protected]‘localhost‘  IDENTIFIED BY ‘%s‘" % (REPLICATION_USER, REPLICATION_PASS)
    cur.execute(sql)

def createInstance(name, port, dbtype="master", **kw):
    cnf = path.join(MYSQL_CONF_DIR, "%s.cnf" % name)
    datadir = path.join(MYSQL_DATA_DIR, name)
    exists_cnfs = readConfs()
    if checkPort(exists_cnfs, port):
        print >> sys.stderr, "Port exist"
        sys.exit(-1)
    if not path.exists(cnf):
        c = _genDict(name, port)
        c.update(kw)
        mc = MySQLDConfig(cnf, **c)
        mc.save()
    else:
        mc = MySQLDConfig(cnf)
    if not path.exists(datadir):
        mysql_install_db(cnf)
        setOwner(datadir, mc.mysqld_vars[‘user‘])
        run_mysql(cnf)
        cur = connMySQLd(mc)
        setReplMaster(cur)

def connMySQLd(mc):
     host = ‘127.0.0.1‘
     user = ‘root‘
     port = int(mc.mysqld_vars[‘port‘])
     conn = MySQLdb.connect(host, port=port, user=user)
     cur = conn.cursor()
     return cur

def diffVariables(instance_name):
    cnf = getCNF(instance_name)
    if path.exists(cnf):
         mc = MySQLDConfig(cnf)
         cur = connMySQLd(mc)
         vars = getMyVariables(cur)
         for k,v in mc.mysqld_vars.items():
             k = k.replace(‘-‘,‘_‘)
             if k in vars and vars[k] != v:
                  print k, v, vars[k]

def setVariable(instance_name, variable, value):
    cnf = getCNF(instance_name)
    if path.exists(cnf):
         mc = MySQLDConfig(cnf)
         cur = connMySQLd(mc)
         cur.execute("set global %s = %s" % (variable, value))
         mc.set_var(variable, value)
         mc.save()

def findLogPos(s):
    """
    >>> findLogPos("CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000006‘, MASTER_LOG_POS=106;")
    (‘mysql-bin.000006‘, 106)
    """
    rlog = re.compile(r"MASTER_LOG_FILE=‘(\S+)‘,",re.IGNORECASE)
    rpos = re.compile(r"MASTER_LOG_POS=(\d+),?",re.IGNORECASE)
    log = rlog.search(s)
    pos = rpos.search(s)
    if log and pos:
        return log.group(1), int(pos.group(1))
    else:
        return (None, None)

def getBinlogPOS(f):
    with open(f) as fd:
        for l in fd:
            f,p = findLogPos(l)
            if f and p:
                return f,p

def runMySQLdump(cmd):
    p = Popen(cmd, stdout=PIPE, shell=True)
    stdout, stderr = p.communicate()
    return p.returncode

def backupMySQL(instance_name):
    cnf = getCNF(instance_name)
    if path.exists(cnf):
        mc = MySQLDConfig(cnf)
        import datetime
        now = datetime.datetime.now()
        timestamp = now.strftime(‘%Y-%m-%d-%H%M%S‘)
        backup_file = path.join(MYSQL_BACK_DIR, instance_name, timestamp+‘.sql‘)
        _dir = path.dirname(backup_file)

        if not path.exists(_dir):
            os.makedirs(_dir)
        cmd = "mysqldump -A -x -F --master-data=1 --host=127.0.0.1 --user=root --port=%s > %s" % (mc.mysqld_vars[‘port‘], backup_file)
        runMySQLdump(cmd)

def changeMaster(
        cur,
        host,
        port,
        user,
        mpass,
        mf,
        p):
    sql = """ CHANGE MASTER TO
                MASTER_HOST=‘%s‘,
                MASTER_PORT=%s,
                MASTER_USER=‘%s‘,
                MASTER_PASSWORD=‘%s‘,
                MASTER_LOG_FILE=‘%s‘,
                MASTER_LOG_POS=%s;""" % ( host,
                port,
                user,
                mpass,
                mf,
                p)
    cur.execute(sql)
    
def restoreMySQL(instance_name, instance_port, sqlfile, **kw):
    createInstance(instance_name, instance_port, **kw)
    cnf = getCNF(instance_name)
    if path.exists(cnf):
        mc = MySQLDConfig(cnf)
        cur = connMySQLd(mc)
        cmd = "mysql -h 127.0.0.1 -P %s -u root < %s" % (
            mc.mysqld_vars[‘port‘],
            sqlfile
        )
        f, p = getBinlogPOS(sqlfile)
        runMySQLdump(cmd)
        changeMaster(cur,
            host=kw[‘master-host‘],
            port=kw[‘master-port‘],
            user=REPLICATION_USER,
            mpass=REPLICATION_PASS,
            mf=f,
            p = p
            )

def _init():
    if not path.exists(MYSQL_DATA_DIR):
        os.makedirs(MYSQL_DATA_DIR)
    if not path.exists(MYSQL_CONF_DIR):
        os.makedirs(MYSQL_CONF_DIR)
    if not path.exists(MYSQL_BACK_DIR):
        os.makedirs(MYSQL_BACK_DIR)

def main():
    _init()
    opt, args = opts()
    instance_name = opt.name
    instance_port = opt.port
    command = opt.cmd
    if command == "create":
        if not args:
            createInstance(instance_name, instance_port)
        else:
            dbtype = args[0]
            serverid = args[1]
            mysqld_options = {‘server-id‘:serverid}
            if dbtype == ‘master‘:
                mysqld_options[‘log-bin‘]=‘mysql-bin‘
            elif dbtype == ‘slave‘:
                master_host = args[2]
                master_port = args[3]
                mysqld_options[‘master-host‘] =master_host
                mysqld_options[‘master-port‘] = master_port
                mysqld_options[‘master-user‘] = REPLICATION_USER
                mysqld_options[‘master-password‘] = REPLICATION_PASS
                mysqld_options[‘skip-slave-start‘] = None
                mysqld_options[‘replicate-ignore-db‘] = ‘mysql‘
                mysqld_options[‘read-only‘] = None
            createInstance(
                instance_name, 
                instance_port,
                dbtype=dbtype,
                **mysqld_options
                )
    elif command == "check":
        diffVariables(instance_name)
    elif command == "adjust":
        variable = args[0]
        value = args[1]
        setVariable(instance_name, variable, value)
    elif command == "backup":
        backupMySQL(instance_name)
    elif command == "restore":
        serverid = args[0]
        mhost = args[1]
        mport = args[2]
        sqlfile = args[3]
        mysqld_options = {
            "master-host":mhost,
            "master-port":mport,
            "server-id":serverid,
            "skip-slave-start":None,
        }
        restoreMySQL(instance_name, instance_port, sqlfile,**mysqld_options)

if __name__ == ‘__main__‘:
    main()
时间: 2024-07-28 19:22:50

mysql管理工具(python)的相关文章

MySQL管理工具-phpMyAdmin管理平台搭建

4 MySQL管理工具 4.1 问题 本案例要求基于LAMP平台部署一套phpMyAdmin应用系统,实现对MySQL服务器的Web方式管理. 4.2 方案 使用2台RHEL6虚拟机 + 1台Windows 7真机,如图-2所示.其中192.168.4.10是MySQL服务器,授权操作在此服务器上执行:另一台Linux服务器192.168.4.6上部署phpMyAdmin管理平台,实现从浏览器访问的Web管理方式. 图-2 4.3 步骤 实现此案例需要按照如下步骤进行. 步骤一:在MySQL服务

分享几款常用的MySQL管理工具

MySQL数据库以体积小.速度快.总体拥有成本低等优点,深受广大中小企业的喜爱,像我们常见的MySQL管理工具都有那些呢?下面给大家推荐六个常用的MySQL管理工具!      phpMyAdmin           phpMyAdmin是我们常用的MySQL管理工具之一,它是用PHP开发的基于Web方式架构在网站主机上的MySQL管理工具,支持中文,管理数据库也十分方便.主要缺点在对大数据库的备份和恢复不是十分方便.     NO.2 Navicat      Navicat是一款桌面版My

MySQL Study之--MySQL管理工具sqlyog

MySQL Study之--MySQL管理工具sqlyog SQLyog 是一个易于使用的.快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库! sqlyog可以连接到mysql主机.http管道.ssh隧道以及ssl加密.它是一款功能强大的MYSQL数据库管理工具,内置多个高级工具,可以导入外部数据,SQL调度器和报告工具向导会引导您通过若干步骤调度查询的执行,结果可以发送给多个接收者,您还可以使用该功能执行例如 ANALYZE, REPAIR等维护查询.可视化

涂抹mysql笔记-mysql管理工具

五花八门的mysql管理工具<>mysql提供的命令行工具 mysql_install_db:mysql建库工具,在源码安装mysql环节我们使用过. mysql_safe:mysql启动工具 mysqld:mysql主进程,mysql_safe也是调用mysqld进程.启动关闭数据库.查询或修改数据.执行各项维护操作等实际上都是基于mysqld进程的操作. 系统参数:mysql服务启动时的参数 系统变量:mysql服务运行时参数.比如查看与log相关的系统变量使用show global va

15款最佳的MySQL管理工具和应用程序

工欲善其事,必先利其器.几乎每个开发人员都有最钟爱的 MySQL 管理工具,它帮助开发人员在许多方面支持包括 PostgreSQL,MySQL,SQLite,Redis,MongoDB 等在内的多种数据库:提供各种最新的特性,包括触发器.事件.视图.存储过程和外键,支持导入.数据备份.对象结构等多种功能. 这篇文章收集了15款最佳的 MySQL 管理工具和应用软件,帮助你轻松快速完成工作. 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3

DBA必备的15款MySQL管理工具

原文:http://www.techxue.com/techxue-11898-1.html 如今,Web应用程序的响应速度是成功的关键法宝之一.它与用户互动,用户对网站的看法,甚至谷歌网站排名情况都有着密不可分的关系.数据库性能是响应速度最重要的因素之一,一旦出错,所有程序都将会宕机. 工欲善其事,必先利其器.几乎每一个Web开发人员都有一个最钟爱的MySQL管理工具,它帮助开发人员在许多方面支持包括PostgreSQL,MySQL,SQLite,Redis,MongoDB等在内的多种数据库:

密码恢复及设置,用户授权及撤销,MySQL管理工具

密码恢复及设置 1.1 问题 本案例要求熟悉MySQL管理密码的控制,完成以下任务操作: 练习重置MySQL管理密码的操作 通过正常途径设置MySQL数据库的管理密码 1.2 步骤 实现此案例需要按照如下步骤进行. 步骤一:重置MySQL管理密码 1)首先停止已运行的MySQL服务程序 [[email protected] ~]# systemctl stop mysqld.service         //停止服务 [[email protected] ~]# systemctl statu

26_多表查询 MySQL管理工具 、 用户授权及撤销

版本:5.7.28服务器:mysql 192.168.4.20 1.MySQL管理工具 部署LAMP+phpMyAdmin平台安装httpd.mysql.php-mysql及相关包启动httpd服务程序解压phpMyAdmin包,部署到网站目录配置config.inc.php,指定MySQL主机地址创建授权用户浏览器访问.登录使用 1.1 准备软件的运行环境 lamp]# yum -y install httpd php php-mysql]# systemctl start httpd]# s

MySQL管理工具MySQL Utilities — 介绍与安装(1)

MySQL Utilities介绍 MySQL Utilities 提供一组命令行工具用于维护和管理 MySQL 服务器,包括: 管理工具 (克隆.复制.比较.差异.导出.导入) 复制工具 (安装.配置) 一般工具 (磁盘使用情况.冗余索引.搜索元数据) MySQL Utilities是一系列的命令行工具以及Python库更容易完成管理的任务.库是用Python语言写的,这就意味着不需要安装其他任何工具和库.当前是基于Python2.6版本设计的,不支持Python3.1版本. MySQL Ut