python管理mysql,请叫我雷锋

#!/usr/bin/env python

#coding:utf8

import os,sys,glob,time,MySQLdb,re

DIRNAME = os.path.dirname(__file__)

OPSTOOLS_DIR = os.path.abspath(os.path.join(DIRNAME,‘..‘))

sys.path.append(OPSTOOLS_DIR)

from library.mysqlconfig import MySQLDConfig,getMyVariables

from optparse import OptionParser

from subprocess import Popen

from subprocess import PIPE

from mysql_config import comain

MYSQL_DATA_DIR = "/var/mysqlmanager/data"

MYSQL_CONF_DIR = "/var/mysqlmanager/conf"

MYSQL_BACK_DIR = "/var/mysqlmanager/backup"

EPLICATION_USER="username"

EPLICATION_PASS="passwd"

def opts():

parser = OptionParser(usage="usage %prog options")

parser.add_option("-n","--name",

dest="name",

default="mysqlinstance",

action="store",

)

parser.add_option("-p","--port",

dest="port",

default="3306",

action="store",

)

parser.add_option("-c","--cmd",

dest="cmd",

default="check",

action="store",

)

"""

parser.add_option("-s","--socket",

dest="socket",

default="socket",

action="store",

)

"""

return parser.parse_args()

def _init():

if not os.path.exists(MYSQL_DATA_DIR):

os.makedirs(MYSQL_DATA_DIR)

if not os.path.exists(MYSQL_CONF_DIR):

os.makedirs(MYSQL_CONF_DIR)

def readconf():

confs=glob.glob(os.path.join(MYSQL_CONF_DIR,"*.cnf"))

return [MySQLDConfig(i) for i 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‘:os.path.join(MYSQL_DATA_DIR,name,"%s.pid" %name),

‘socket‘:"/tmp/%s.socket" %name,

"port":port,

‘datadir‘:os.path.join(MYSQL_DATA_DIR,name),

"log-error":os.path.join(MYSQL_DATA_DIR,name,"%s.error" %name),

}

def mysql_install_db(cnf):

cmd=[‘mysql_install_db‘,‘--defaults-file=%s‘%cnf]

p=Popen(cmd,stdout=PIPE)

#stdout,stderr=p.communicate()

return p.returncode

def setOwner(datadir):

os.system("chown -R mysql.mysql %s" %datadir)

def run_mysql(cnf):

cmd=‘mysqld_safe --defaults-file=%s &‘ %cnf

p=Popen(cmd,stdout=PIPE,shell=True)

time.sleep(5)

return p.returncode

def startInstance(name,port,dbtype="master",**kw):

cnf = os.path.join(MYSQL_CONF_DIR,"%s.cnf" %name)

datadir = os.path.join(MYSQL_DATA_DIR,name)

if not os.path.exists(cnf):

c=_genDict(name,port)

c.update(kw)

mc=MySQLDConfig(cnf,**c)

mc.save()

else:

mc=MySQLDConfig(cnf)

mc.save()

if not os.path.exists(datadir):

mysql_install_db(cnf)

time.sleep(1)

setOwner(datadir)

run_mysql(cnf)

cur=connMySQL(name)

setReplMaster(cur)

else:

run_mysql(cnf)

cur=connMySQL(name)

setReplMaster(cur)

def setReplMaster(cur):

sql = "grant replication slave on *.* to %[email protected]‘%%‘ identified by ‘%s‘" %(EPLICATION_USER,EPLICATION_PASS)

cur.execute(sql)

def stop_mysql(name):#,socket):

socket="/tmp/%s.socket" %name

cmd=[‘mysqladmin‘,‘shutdown‘,‘-S‘,‘%s‘ %socket]

p=Popen(cmd,stdout=PIPE)

return p.returncode

def getCNF(name):

return os.path.join(MYSQL_CONF_DIR,"%s.cnf"%name)

def connMySQL(name):

cnf = getCNF(name)

#print cnf

if os.path.exists(cnf):

mc=MySQLDConfig(cnf)

#    print mc

host=‘127.0.0.1‘

port=int(mc.mysqld_vars[‘port‘])

user=‘root‘

conn=MySQLdb.connect(host=host,port=port,user=user)

cur=conn.cursor()

return cur

def diffvariavles(name):

cnf = getCNF(name)

cur = connMySQL(name)

vars = getMyVariables(cur)

#conf_dic=comain()

if os.path.exists(cnf):

k=k.replace(‘-‘,‘_  ‘)

if k in vars and vars[k] !=v:

print k,v,vars[k]

def setVariable(name,variable,value):

cnf=getCNF(name)

if os.path.exists(cnf):

mc=MySQLDConfig(cnf)

mc.set_var(variable,value)

mc.save()

def findLogPos(s):

rlog=re.compile(r"MASTER_LOG_FILE=‘(\S+)‘,",re.I)

rpos=rpos=re.compile(r"MASTER_LOG_POS=(\d+);$",re.I)

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 getLogPos(f):

with open(f) as fd:

for l in fd:

f,p=findLogPos(l)

if f and p:

return f,p

def find_log_pos(s):

pass

def get_log_pos(f):

with open(f) as fd:

while True:

fr=fd.readline()

if "CHANGE MASTER TO MASTER_LOG_FILE" == fr.split("=")[0]:

log_file=fr.split("=")[1].split(",")[0].split("‘")[1]

log_pos=fr.split("=")[2].split(";")[0]

break

else:

pass

return log_file,int(log_pos)

#def chageMaster(cur,host,port,user,passwd,log_file,log_pos):

#    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,passwd)

def ChangeMaster(cur,host,port,user,passwd):

sql = "change master to master_host=‘%s‘,master_port=%s,master_user=‘%s‘,master_password=‘%s‘" %(host,port,user,passwd)

cur.execute(sql)

def changeMaster(cur,host,port,user,passwd,log_file,log_pos):

cur.execute(sql)

def backupMySQL(name):

cnf=getCNF(name)

if os.path.exists(cnf):

mc=MySQLDConfig(cnf)

import datetime

now = datetime.datetime.now()

timestamp=now.strftime("%Y-%m-%d.%H.%M,%S")

backup_file=os.path.join(MYSQL_BACK_DIR,name,timestamp+‘.sql‘)

_dir=os.path.dirname(backup_file)

if not os.path.exists(_dir):

os.makedirs(_dir)

cmd="/usr/local/mysql/bin/mysqldump -A -x -F --master-data=1 --host=127.0.0.1 --user=root --port=%s > %s" %(mc.mysqld_vars[‘port‘],backup_file)

runMySQLCmd(cmd)

def runMySQLCmd(cmd):

p=Popen(cmd,stdout=PIPE,shell=True)

stdou,stderr=p.communicate()

return p.returncode

def restoreMySQL(name,port,sqlfile,**kw):

startInstance(name,port,**kw)

cnf=getCNF(name)

if os.path.exists(cnf):

mc=MySQLDConfig(cnf)

cmd = "mysql --host=127.0.0.1 --user=root --port=%s < %s" %(mc.mysqld_vars["port"],sqlfile)

runMySQLCmd(cmd)

def main():

_init()

opt,args=opts()

instance_name=opt.name

instance_port=opt.port

command=opt.cmd

#socket=opt.socket

#print instance_name,instance_port,command

comm_list=["create","start","stop","status","check","abjust","backup","restore"]

if command in comm_list:

if command == "create":

if not args:

exists_conf=readconf()

if checkPort(exists_conf,instance_port):

print >> sys.stderr,"Port exists"

sys.exit(-1)

else:

startInstance(instance_name,instance_port)

else:

dbtype_list=["master","slave"]

if args[0] in dbtype_list:

dbtype=args[0]

serverid=args[1]

mysqld_options={"server-id":serverid}

if dbtype==‘master‘:

mysqld_options["logbin"]=‘mysql-bin‘

startInstance(instance_name,instance_port,dbtype,**mysqld_options)

elif dbtype=="slave" :

host=args[2]

port=args[3]

user=EPLICATION_USER

passwd=EPLICATION_PASS

"""

mysqld_options["master-host"]=master_host

mysqld_options["master-port"]=master_port

mysqld_options["master-user"]=EPLICATION_USER

mysqld_options["master-password"]=EPLICATION_PASS

"""

mysqld_options["replicate-ignore-db"]="mysql"

mysqld_options["skip-slave-start"]=None

startInstance(instance_name,instance_port,dbtype,**mysqld_options)

cur=connMySQL(instance_name)

ChangeMaster(cur,host,port,user,passwd)

else:

print >> sys.stderr,"\033[31;1minput dbtype error! please ‘master/slave‘\033[0m"

elif command == "start":

startInstance(instance_name,instance_port)

elif command == "stop":

stop_mysql(instance_name)#,socket)

elif command == "status":

socket="/tmp/%s.socket" %instance_name

if os.path.exists(socket):

print "\033[32;1mmysql--%s is runing!!\033[0m" %instance_name

else:

print "\033[31;1mmysql--%s is not runing!!\033[0m" %instance_name

elif command == "check":

diffvariavles(instance_name)

elif command == "abjust":

variable=args[0]

value=args[1]

setVariable(instance_name,variable,value)

elif command == "backup":

backupMySQL(instance_name)

elif command == "restore":

serverid=args[0]

master_host=args[1]

master_port=args[2]

master_user=EPLICATION_USER

master_password=EPLICATION_PASS

sqlfile=args[3]

#master_log_file,master_log_pos=getLogPos(sqlfile)

master_log_file,master_log_pos=get_log_pos(sqlfile)

mysqld_options={"server-id":serverid}

mysqld_options["replicate-ignore-db"]="mysql"

mysqld_options["skip-slave-start"]=None

restoreMySQL(instance_name,instance_port,sqlfile,**mysqld_options)

cur=connMySQL(instance_name)

changeMaster(cur,master_host,master_port,master_user,master_password,master_log_file,master_log_pos)

else:

print >> sys.stderr,"\033[31;1mcommand is not found! please ‘create/start/stop/status/check/abjust/backup/restore‘\033[0m"

if __name__ =="__main__":

main()

python管理mysql,请叫我雷锋

时间: 2024-10-30 03:30:39

python管理mysql,请叫我雷锋的相关文章

Python 管理 MySQL

Python 连接 MySQL Python 创建 MySQL 表 Python 增加 MySQL 数据 Python 删除 MySQL 数据 Python 查询 MySQL 数据 Python 修改 MySQL 数据 原文地址:https://www.cnblogs.com/pzk7788/p/10404397.html

python管理mysql思路

mysql主从复制: 常见问题: 1.主从不同步(同步延迟) 主从复制考虑的自动化问题: 备份自动化: 1.全量备份 2.增量备份 恢复自动化 添加从库自动化 智能监控 : pytondns

python自动化管理mysql主从同步

mysql 多实例 1.my.cnf 通过定义mysqldconfig类   mysqld_vars = {}  从里面获得很多配置文件相关参数写入字典 mysql.py 2.init DB 初始化数据库 3.修改权限 4.rc脚本启动 5.check 检查一下配置文件,配置文件与mysql变量同步 6.值其实一样,不让显示 7.Popen 调用 mysql -e 命令 SQL IO Seconds_Behind_Master:0    看这个阀值.大于两秒 8.mysql主从 主配置文件: b

Ansible 管理MySQL主从复制

mysql_replication - 管理MySQL复制 1.3版新功能 概要 要求(在执行模块的主机上) 选项 例子 笔记 状态 支持 概要 管理MySQL服务器复制,从属,主状态获取和更改主控主机. 要求(在执行模块的主机上) MySQLdb的 选项 参数 需要 默认 选择 注释 CONFIG_FILE (2.0 加入) no ?/ .my.cnf   指定要从中读取用户和密码的配置文件. connect_timeout (2.1 加入) no 30   连接到MySQL服务器时的连接超时

python数据库(mysql)操作

一.软件环境 python环境默认安装了sqlite3,如果需要使用sqlite3我们直接可以在python代码模块的顶部使用import sqlite3来导入该模块.本篇文章我是记录了python操作mysql数据库,mysql数据库下载 由于我之前安装的是wampserver,默认安装了php.mysql和apache这3个环境,因此我没有在单独安装mysql数据库,只是下载了一个mysql管理工具Navicat for MySQL.在使用Navicat for MySQL连接本地mysql

使用 Ansible 管理 MySQL 复制

Ansible 是一个新兴的 IT 自动化工具.本文将介绍如何通过 Ansible 配置及管理 MySQL 主.从复制环境,实现部署过程自动化,体验 Ansible 简单快速带来的快感. 简介: Ansible 是一个配置管理和应用部署工具,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack.Ansible 是通过 Python 语言开发.Ansible 平台由 Michael DeHaan 创建,他同时也是知名软件 Cobbler 与 Func 的作者.Ansible

Python学习(20)python操作mysql数据库_安装

win7系统下python3.4连接mysql数据库 1.到python官方网站下载最新python程序.根据系统有32,64位. 直接下一步,就可以安装成功. 2.在python官网中去下载ez_setup.py文件. 此工具是python管理包工具,通过它可以下载很多服务. 请根据系统下载相关文件. 在https://pypi.python.org/pypi/setuptools#windows-simplified网址中去下载ez_setup.py文件. 3.在python中执行pytho

用Python对MySQL同步状态进行监控

用Python对MySQL同步状态进行监控 使用Python对MySQL数据库服务器是否可访问,及主从同步是否中断进行监控,是一件非常简单的事情.感谢Python给我们带来了如此简单,强大,快捷的开发环境. 本文使用到的Python模块 使用telnetlib校验服务器是否可被访问 使用SMTP向管理员发送通知邮件 使用MySQL官方的驱动对数据库进行访问 使用optparse实现命令行参数的提取 实现原理 使用optparse模块获取命令行参数.读取defaults-file设置文件内容(如果

python操作MySQL 模拟简单银行转账操作

一.基础知识 1.MySQL-python的安装 下载,然后 pip install 安装包 2.python编写通用数据库程序的API规范 (1).数据库连接对象 connection,建立python客户端与数据库的网络连接,创建方法为 MySQLdb.Connect(参数) 参数有六个:     host(MySQL服务器地址,一般本地为127.0.0.1) port(MySQL服务器端口号) user(用户名) passwd(密码) db(数据库名称) charset(连接编码) con