py脚本
#!/usr/local/python3/bin/python3
import sys
import os
import logging
import datetime
import pymysql
from colorama import init, Fore, Back, Style
from sys import argv
LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(pathname)s %(message)s "
DATE_FORMAT = '%Y-%m-%d %H:%M:%S %a '
logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT,datefmt = DATE_FORMAT ,filename=r"execute.log")
class Colored(object):
def red(self,s):
return Fore.RED + s + Fore.RESET
def green(self,s):
return Fore.GREEN + s + Fore.RESET
def yellow(self,s):
return Fore.YELLOW + s + Fore.RESET
def blue(self,s):
return Fore.BLUE + s + Fore.RESET
def magenta(self, s):
return Fore.MAGENTA + s + Fore.RESET
def cyan(self, s):
return Fore.CYAN + s + Fore.RESET
def white(self, s):
return Fore.WHITE + s + Fore.RESET
def black(self, s):
return Fore.BLACK
def white_green(self, s):
return Fore.WHITE + Back.GREEN + s + Fore.RESET + Back.RESET
class MySQL(Colored):
def __init__(self,host,user,passwd,port,db):
self.host=host
self.user=user
self.passwd=passwd
self.port=port
self.db=db
self.connect=pymysql.connect(host=self.host,user=self.user,password=self.passwd,port=self.port,database=self.db)
self.cursor=self.connect.cursor()
def mysql_dml(self,sql):
try:
self.cursor.execute(sql)
self.connect.commit()
print(self.green("%s execute sucess" %sql ))
logging.info(sql)
except:
logging.error(sql)
print(self.red("%s is fail" %sql ))
self.connect.rollback()
def mysql_query(self,sql):
try:
self.cursor.execute(sql)
results=self.cursor.fetchall()
print(self.green("%s execute sucess" %sql ))
return results
except:
print(self.red("%s execute fail" %sql ))
logging.error(sql)
def mysql_control(self,sql):
try:
self.cursor.execute(sql)
logging.info(sql)
print(self.green("%s execute success" %sql))
except:
print(self.red("%s execute fail" %sql ))
logging.error(sql)
def dbs():
c=Colored()
print(c.yellow("[1]hgame"))
print(c.yellow("[2]passport"))
print(c.yellow("[3]ptgame"))
print(c.yellow("[4]log"))
print(c.yellow("[5]mmc"))
print(c.yellow("[6]lock"))
print(c.yellow("[q]quit"))
second=input("please input db: ")
if second=="1":
print("hgame")
db="hgame"
elif second=="2":
print("passport")
db="passport"
elif second=="3":
print("ptgame")
db="ptgame"
elif second=="4":
print("log")
db="log"
elif second=="5":
print("mmc")
db="mmc"
elif second=="6":
print("hgame_lock")
db="hgame_lock"
elif second.lower()=="q":
db=second.lower()
else:
db=False
return db
def put():
c=Colored()
while True:
print(c.cyan("1.备份"))
print(c.cyan("2.进入"))
print(c.cyan("q.退出"))
first=input("please input the choice(q/Q退出): ")
if first=="1":
while True:
db=dbs()
if db=="q":
break
if not db:
continue
tables=input("please input table: ")
if len(tables)>=2:
tables=tables.split(",")
backup(tables,db)
elif first=="2":
while True:
db=dbs()
if db=="q":
break
if not db:
continue
come(db)
elif first.lower()=="q":
break
def get_dbinfo():
with open("/data/shell/mysql/user.json") as f:
for line in f:
result=line
result=eval(result)
return result
def execute(command):
color=Colored()
status=os.system(command)
if status==0:
logging.info(command)
print(color.green("%s successful" %command))
else:
logging.error(command)
print(color.green("command %s error" %command))
def backup(tables,dbname):
#host,user,passwd,port,db
dbinfo=get_dbinfo().get(dbname)
formatted_today=datetime.datetime.now().strftime("%Y%m%d%H%M%S")
bak_format="bak_%s" %formatted_today
#conn=MySQL('10.140.0.10','manager','oracle',3306,'hgame')
conn=MySQL(*dbinfo)
for table in tables:
bak_table_format="%s_%s" %(bak_format,table)
query_sql="show table status like \"%s\"" %(table)
try:
results=conn.mysql_query(query_sql)[0][4]
except:
print("%s the table is not exist" %table)
return
if results > 200000:
db=get_dbinfo().get(dbname+"_bak")
print(db)
dump_com="mysqldump -h%s -u%s -p%s -P%s %s %s > /data/shell/mysql/backup_sql/%s.sql" %(db[0],db[1],db[2],db[3],db[4],table,bak_table_format)
print(dump_com)
execute(dump_com)
continue
create_sql="create table %s like %s" %(bak_table_format,table)
conn.mysql_control(create_sql)
insert_sql="insert into %s select * from %s" %(bak_table_format,table)
conn.mysql_dml(insert_sql)
def come(dbname):
dbinfo=get_dbinfo().get(dbname)
print("coming %s:%s" %(dbinfo[0],dbinfo[4]))
command="mysql -h%s -u%s -p%s -P%s %s -A" %(dbinfo[0],dbinfo[1],dbinfo[2],dbinfo[3],dbinfo[4])
execute(command)
def query(sql,dbname,flag,mail=""):
nowtime=datetime.datetime.now().strftime("%Y%m%d%H%M%S")
dbinfo=get_dbinfo().get(dbname+"_bak")
conn=MySQL(*dbinfo)
if flag=="send":
sql=sql+" into outfile \"/tmp/%s.csv\" " %nowtime
conn.mysql_control(sql)
command="scp %s:/%s/%s.csv /tmp/" %(dbinfo[0],"tmp",nowtime)
#print(command)
execute(command)
execute("python /data/shell/mysql/mail.py %s %s %s /tmp/%s.csv" %(mail,"sql 查询结果","",nowtime))
elif flag=="print":
results=conn.mysql_query(sql)
num=len(results[0])
format_num=num * "%s "
for i in results:
print (format_num %(i))
if __name__ == '__main__':
if len(argv)==4:
if argv[1] not in ("hgame","passport","ptgame","log","sincailog","mmc","hgame_lock"):
print("db not exits")
sys.exit()
if argv[3]!="print":
print ("please input send or print")
sys.exit()
query(argv[2],argv[1],argv[3])
#0 db #1 sql #3 print
elif len(argv)==5:
if argv[1] not in ("hgame","passport","ptgame","log","sincailog","mmc","hgame_lock"):
print("db not exits")
sys.exit()
if argv[4]!="send":
print ("please input send or print")
sys.exit()
query(argv[2],argv[1],argv[4],argv[3])
else:
put()