mysql在线更改表可用工具 pt-online-schema-change 更改,或者用gh-ost更改。pt-online-schema-change 在原表创建索引,跟踪新插入的数据。gh-ost则根据日志应用到更改后的表。

下面把pt-online-schema-change封装为脚本化

#!/usr/bin/python
#coding:utf8# 使用方法 例如 python mysql_osc.py -s 192.168.x.x -p 3306 -d test -t test -a 'add column `name16` varchar(200)'
import sys
import os
import commands
import argparse
##自定义mysql链接类
from mysqlmodel import mysqlconn
general_user = cf.get('mysqlinfo','user')
general_passwd = cf.get('mysqlinfo','passwd') def osc(server_ip,server_port,dbname,tabname,ddlstmt):
try:
conn=mysqlconn(server_ip,server_port)
sql1="SELECT COUNT(1) as dbcount FROM information_schema.tables WHERE TABLE_SCHEMA not in ('mysql','performance_schema','information_schema','sys','test') and TABLE_SCHEMA='%s' and TABLE_NAME='%s';" % (dbname,tabname)
sql2="select COUNT(1) as inxcount from information_schema.STATISTICS where TABLE_SCHEMA='%s' and TABLE_NAME='%s' AND NON_UNIQUE=0 ;" % (dbname,tabname)
sql3="show slave status"
check_table=conn.myquery(sql1)
check_index=conn.myquery(sql2)
check_slave=conn.myquery(sql3)
if len(check_slave)!=0:
print "%s:%s 不是主节点,更改失败" % (server_ip,server_port)
sys.exit()
if check_table[0]["dbcount"]!=1:
print "表名 %s.%s 不存在" % (dbname,tabname)
sys.exit()
if check_index[0]["inxcount"]<1:
print "表名 %s.%s 不存在唯一索引" % (dbname,tabname)
sys.exit()
except Exception as error:
print "error: %s " % (error)
print "mysql 链接错误"
sys.exit()
try:
cmd = """/usr/local/toolkit/bin/pt-online-schema-change p='%s',u=%s,A=utf8mb4,h='%s',P=%s,D=%s,t=%s --alter='%s' --execute """ % (general_passwd,general_user,server_ip,server_port,dbname,tabname,ddlstmt)
#print cmd
status=commands.getstatusoutput(cmd)
mystatus=status[1]
if status[1].find("Successfully altered")>0 and status[0]==0:
mystatus="Successfully altered"
return mystatus
except Exception as error:
print "error: %s " % (error)
return "执行失败"
if __name__ == '__main__':
#参数:
parser = argparse.ArgumentParser(description='请输入 -s ip , -p 端口 ,-d 数据库名称,-t 表名, -a 更改语句')
parser.add_argument('-s','--host', type=str,required=True,help="数据库地址")
parser.add_argument('-p','--port', type=int,required=True,help="数据库端口")
parser.add_argument('-d','--db', type=str,required=True,help="数据库名")
parser.add_argument('-t','--table', type=str,required=True,help="表名")
parser.add_argument('-a','--ddlstmt', type=str,required=True,help="更改语句")
args = parser.parse_args()
server_ip = args.host
server_port = args.port
dbname = args.db
tabname = args.table
ddlstmt = args.ddlstmt
if server_ip=="" or server_port=="" or dbname=="" or tabname=="" or ddlstmt=="":
print "输入完整信息"
sys.exit()
status=osc(server_ip,server_port,dbname,tabname,ddlstmt)
print status

pt-online-schema-change 脚本化的更多相关文章

  1. Javascript学习8 - 脚本化文档(Document对象)

    原文:Javascript学习8 - 脚本化文档(Document对象) 每个Web浏览器窗口(或帧)显示一个HTML文档,表示这个窗口的Window对象有一个document属性,它引用了一个Doc ...

  2. JavaScript权威指南--脚本化CSS

    知识要点 客户端javascript程序员对CSS感兴趣的是因为样式可以通过脚本编程.脚本化css启用了一系列有趣的视觉效果.例如:可以创建动画让文档从右侧“滑入”.创造这些效果的javascript ...

  3. JavaScript权威指南--脚本化文档

    知识要点 脚本化web页面内容是javascript的核心目标. 第13章和14章解释了每一个web浏览器窗口.标签也和框架由一个window对象所示.每个window对象有一个document对象, ...

  4. 深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法

    × 目录 [1]动态样式 [2]CSS类[3]setAttribute()[4]CSSRule对象添加[5]空样式覆盖[6]CSSRule对象删除 前面的话 我们可以通过计算样式来读取伪元素的样式信息 ...

  5. 深入理解脚本化CSS系列第四篇——脚本化样式表

    × 目录 [1]CSSStyleSheet [2]CSSRule 前面的话 关于脚本化CSS,查询样式时,查询的是计算样式:设置单个样式时,设置的是行间样式:设置多个样式时,设置的是CSS类名.脚本化 ...

  6. 深入理解脚本化CSS系列第三篇——脚本化CSS类

    前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...

  7. 深入理解脚本化CSS系列第一篇——脚本化行内样式

    × 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样 ...

  8. (转)mongodb常用命令脚本化-自动化运维

    mongodb常用命令脚本化-自动化运维 把一些运维中常用到的mongodb命令写成shell脚本,极大的方便了维护   1 设置副本集   #!/bin/bash#mongodb 进入client ...

  9. JavaScript 客户端JavaScript之脚本化HTTP(通过XMLHttpRequest)

    XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应:但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话.   大多数浏览的客户端JavaScri ...

  10. JavaScript 客户端JavaScript之 脚本化浏览器窗口

    1.计时器 客户端Javascript以全局函数setTimeOut().clearTimeOut().setInterval().clearInterval()提供这一功能.   前者是从运行的那一 ...

随机推荐

  1. Bootstrap组件介绍

    一.下拉菜单 用于显示链接列表的可切换.有上下文的菜单.下拉菜单的 JavaScript 插件让它具有了交互性. 1.实例 将下拉菜单触发器和下拉菜单都包裹在 .dropdown 里,或者另一个声明了 ...

  2. CentOS 7 学习笔记

    Centos7 命令行   快捷键: 上方向键, 查看上一条命令 Ctrl+C 强制终止程序运行   新版 nmtui 配置网络 旧版 setup(已经没了)   网络接口   ip a = ip a ...

  3. 运用Edraw为WPF应用程序嵌入Office文档的方法总结

    具体描述了运用Edraw Office Viewer Component为WPF应用长须嵌入MS Word,Excel以及Power Point的方法. 打开Visual Studio,并创建一个新的 ...

  4. Ckrule业务规则管理系统简介

    1.   简述 Ckrule业务规则管理系统(BRMS)是一个集成的应用程序存储.管理.执行和测试的平台,允许组织定义.部署.监控和维护运营系统使用的各种复杂决策逻辑.Ckrule BRMS 独立于核 ...

  5. android,getExternalStorageDirectory()和getExternalFilesDir()的区别

    转载地址:https://blog.csdn.net/nugongahou110/article/details/48154859 之前看到一位网友的吐槽:当我把手机连接到电脑上时,在SD卡根目录看到 ...

  6. jquery-tags-input 使用经历

    源代码里有这么一段,是在tagsInput这里,第一次初始化的时候是正常的,但当第二次初始化的时候就会出现问题,id的值会组合为  id+new Date().getTime() 暂时不清楚作用是什么 ...

  7. 在同一网关下ping不通其他电脑

    最近在做数据库相关的程序,所以想先用ping试下和主机连没连着,但发现虽然两台电脑在同一网关下,但却互相ping不通,后来才发现,原来是防火墙在作怪. Omg!感慨一下!默认的情况下,保守的windo ...

  8. ABAP git客户端

    Jerry习惯把自己写的小程序放到自己的github上:https://github.com/i042416 对于写的ABAP程序,需要先把SAPGUI里的代码手动拷贝到本地,然后用git客户端pus ...

  9. [转]Linux学习

    Linux简介与厂商版本 http://www.cnblogs.com/vamei/archive/2012/09/04/2671103.html Linux开机启动(bootstrap) http: ...

  10. Spring+Velocity+Mybatis入门

    转自:https://blog.csdn.net/duqi_2009/article/details/47752169 一.开发工具 开发过程中使用的操作系统是OS X,关于软件安装的问题请大家移步高 ...