返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >【C/C++】ghost ddl脚本简单实现
  • 778
分享到

【C/C++】ghost ddl脚本简单实现

2023-06-03 09:06:58 778人浏览 泡泡鱼
摘要

目的:本篇是自己用c++实现的ddl的简单脚本(改写自自己的shell,但是还有一部分没完成),用来锻炼自己写C++的能力头文件exec_ddl.h```#include <regex>#include <cstdlib&

目的:本篇是自己用c++实现的ddl的简单脚本(改写自自己的shell,但是还有一部分没完成),用来锻炼自己写C++的能力

头文件exec_ddl.h

```

#include <regex>
#include <cstdlib>
#include <time.h>
#include <unistd.h>
#include <sys/wait.h>
size_t GetStrCurrTime(std::string &);
#ifndef header_cpp_fun_h
#define header_cpp_fun_h
class CDdlGhost {
private:
//数据库账号,端口,DDL用户,密码,
std::string host;
int port;
std::string user;
std::string passWord;
std::string database;
std::string tableName;
int threadRunning = 500;
int cthreadRunning = 500;
int maxLagMillis = 3000;
std::string cutOver = "default";
int chunkSize = 1000;
int lockSeconds = 60;
int retries = 3;
static CDdlGhost* instance;
CDdlGhost(std::string host,int port,std::string database,std::string tableName,std::string user,std::string password);

public:
static CDdlGhost* GetSingleInstance(std::string host,int port,std::string database,std::string tableName,std::string user,std::string password);
int GetGhostCmd(std::string sql,std::string &cmd);
int ExecDdlCmd(std::string &cmd);
};
#endif

```

exec_ddl.cpp

```

#include "exec_ddl.h"
//类中静态变量为什么不在类中初始化,是因为静态变量具有外部链接性,文件作用域
CDdlGhost* CDdlGhost::instance = nullptr;

//构造函数
CDdlGhost::CDdlGhost(std::string host,int port,std::string database,std::string tableName,std::string user,std::string password){
    //这里以后正则表达式安全性过滤
    this->host = host;
    this->port = port;
    this->database = database;
    this->tableName = tableName;
    this->user = user;
    this->password = password;

}
//获取类的单实例函数,这里为什么返回的是指针而不是引用是因为我要用空指针才判断是否单实例
CDdlGhost* CDdlGhost::GetSingleInstance(std::string host,int port,std::string database,std::string tableName,std::string user,std::string password){
    if(nullptr == instance){
        instance = new CDdlGhost(host,port,database,tableName,user,password);
    }

    return instance;

}
//获得表结构更改的命令字符串
int CDdlGhost::GetGhostCmd(std::string sql,std::string &ghostCmd){
    //获取环境变量
    const char* pathEnv = std::getenv("PATH");
    std::string ghostLog;
    //这个变量用来获取当前时间戳
    std::string strTime;
    size_t ret = GetStrCurrTime(strTime);
    if(ret <= 0){
        std::cout<<"获取当前时间戳失败"<<std::endl;
        return 0;
    }
    
    ghostLog=ghostLog+"/data1/upload/ghost_"+tableName+"_"+strTime+".log";
    ghostCmd="gh-ost --ok-to-drop-table --initially-drop-ghost-table --skip-foreign-key-checks --allow-on-master --switch-to-rbr --allow-master-master --exact-rowcount --verbose --initially-drop-old-table ";
    
    ghostCmd=ghostCmd + "--max-load=Threads_running="+std::to_string(threadRunning)+" --critical-load=Threads_running="+std::to_string(cthreadRunning)+" --chunk-size="+std::to_string(chunkSize)+" --cut-over="+cutOver+" --max-lag-millis="+std::to_string(maxLagMillis)+" --cut-over-lock-timeout-seconds="+std::to_string(lockSeconds)+" --default-retries="+std::to_string(retries)+" --host=\'"+host+"' --user='"+user+"' --password='"+password+"' --database='"+database+"'  --table='"+tableName+"' --alter='"+sql+"' --panic-flag-file=/tmp/"+tableName+".ghost.panic.flag --execute  > "+ghostLog+" 2>&1";    

    return 1;
    

}
int CDdlGhost::ExecDdlCmd(std::string &ghostCmd){
    
    pid_t pidGhost;
    int GhostStatus;
    //这里我还要fork一个扫描ghost产生的日志的子进程,但是现在暂时没打开
    //pid_t pidScan;
    
    if((pidGhost = fork()) < 0){
        std::cout<<"pidGhost子进程fork失败"<<std::endl;
        return -2;

    }

    
    //子进程要执行修改表结构命令了
    if(0 == pidGhost){
        //为什么不用system,因为不想子进程fork子进程
        if(execl("/bin/sh","sh","-c",ghostCmd.c_str(),(char *) 0)<0){
            std::cout<<"卧槽,执行命令失败了"<<std::endl;

        }
        _exit(127);

    }
    //另一个子进程,每一秒检查下日志文件,看看是否有,有锁就kill,暂时没启用
    

        //等待子进程结束
    if(waitpid(pidGhost,&GhostStatus,0) < 0){
        std::cout<<"等待子进程出现异常"<<std::endl;
        return -1;

    }
        
        

    if(WIFEXITED(GhostStatus)){
        return 0;

    }
    return -3;

}
//获取格式化后的日期字符串
size_t GetStrCurrTime(std::string &strTime){
    time_t now = time(NULL);
    struct tm timeinfo = *localtime(&now);
    char buf[30];
    size_t ret = strftime(buf, sizeof(buf), "%Y%m%d%H%M%S", &timeinfo);
    std::string str(buf);
    strTime = str;
    return ret;}

```

ddl_main.cpp

```

#include <iOStream>
#include "exec_ddl.h"
int main(){
    int i=0,ret;
    CDdlGhost *pDdlGhost=CDdlGhost::GetSingleInstance("10.17.4.23",3306,"test","test1","zaixinyuan","test123456");
    if (pDdlGhost == nullptr){
        std::cout<<"分配对象内存失败"<<std::endl;
        return 1;
    }
    std::string ghostCmd;
    i = pDdlGhost->GetGhostCmd("add index cname(c)",ghostCmd);
    ret = pDdlGhost->ExecDdlCmd(ghostCmd);
    std::cout<<"返回结果是:"<<i<<"|"<<ghostCmd<<"|"<<ret<<std::endl;
    if(ret <0){
        std::cout<<"更改表结构失败"<<std::endl;
    }

    delete pDdlGhost;
}

```

编译命令

```

g++ -std=gnu++11 -o ddl_ghost ddl_main.cpp exec_ddl.cpp

```

执行结果:

程序返回结果

【C/C++】ghost ddl脚本简单实现

数据库查看结果

【C/C++】ghost ddl脚本简单实现

--结束END--

本文标题: 【C/C++】ghost ddl脚本简单实现

本文链接: https://lsjlt.com/news/233921.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【C/C++】ghost ddl脚本简单实现
    目的:本篇是自己用C++实现的ddl的简单脚本(改写自自己的shell,但是还有一部分没完成),用来锻炼自己写C++的能力头文件exec_ddl.h```#include <regex>#include <cstdlib&...
    99+
    2023-06-03
  • C#实现简单计算器功能的脚本怎么写
    这篇文章主要介绍了C#实现简单计算器功能的脚本怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#实现简单计算器功能的脚本怎么写文章都会有所收获,下面我们一起来看看吧。先来张效果图吧(5分钟写好,莫怪)代码...
    99+
    2023-06-29
  • C++ vector的简单实现
    目录向量成员函数cpp总结向量 向量是序列容器,表示可以更改大小的数组。 就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,...
    99+
    2024-04-02
  • C语言实现简单的文本编辑器
    本文实例为大家分享了C语言实现简单的文本编辑器的具体代码,供大家参考,具体内容如下 预期实现三个功能,第一,可以对指定的行输入字符串;第二,删除指定行的字符串;第三,显示编辑器的行数...
    99+
    2024-04-02
  • 怎么用C语言脚本实现简易通讯录
    这篇文章主要介绍“怎么用C语言脚本实现简易通讯录”,在日常操作中,相信很多人在怎么用C语言脚本实现简易通讯录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言脚本实现简易通讯录”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • C++ map的简单使用实现
    map和set的底层都是通过红黑树来实现的,但并不是原生态的红黑树,而是经过改造后的红黑树。且容器都会在各自的类中添加一些独特的函数来解决各自适配的问题 map和set底层是改造后的...
    99+
    2024-04-02
  • C#实现简单点餐系统
    本文实例为大家分享了C#实现简单点餐系统的具体代码,供大家参考,具体内容如下 实现简单点餐系统剖析 1、设计界面(给菜品的序号(index),名称(name),单价(money)加上...
    99+
    2024-04-02
  • C++内存池的简单实现
    目录一、内存池基础知识1、什么是内存池1.1 池化技术1.2 内存池2、内存池的作用2.1 效率问题2.2 内存碎片3、内存池技术的演进二、简易内存池原理1、整体设计1.1 内存池结...
    99+
    2024-04-02
  • C#实现简单串口通信
    串口通信(Serial Communications)是指外设和计算机间通过数据信号线、地线等按位(bit)进行传输数据的一种通信方式,属于串行通信方式,能够实现远距离通信,长度可达...
    99+
    2024-04-02
  • C++简单实现shared_ptr的代码
    一、一些说明 1.智能指针用于资源管理,为了保证资源的操作得到顺利的执行防止资源泄露,因此大多数实现都以noexcept在参数列表后声明为不抛出异常。 2.对于有些明确不需要更改调用...
    99+
    2024-04-02
  • C#实现简单工厂模式
    情景:有一个怪兽,HP是100,现在勇士有可以使用武器将其打败,有三种武器,木剑每次打击20血,铁剑每次50血,金刚剑每次100血,如果想要使用简单工厂方式,怎么设计? 一.啥是简单...
    99+
    2024-04-02
  • C#实现简单订单管理程序
    本文实例为大家分享了C#实现订单管理程序的具体代码,供大家参考,具体内容如下 订单管理的控制台程序,能够实现添加订单、删除订单、修改订单、查询订单、序列化与反序列化订单功能。 主要的...
    99+
    2024-04-02
  • Shell脚本实现简单分割字符串
    我们有这样一个字符串: info='abcd;efgh' 现在想获取abcd和efgh,我们可以简单地用cut工具来获取: fstr=`echo $info | cut -d ; -f 1` sst...
    99+
    2022-06-04
    字符串 脚本 简单
  • 通过简单脚本实现MYSQL的起停
    本文主要给大家介绍通过简单脚本实现MYSQL的起停,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下通过简单脚本实现MYSQL的起停吧。对于多insta...
    99+
    2024-04-02
  • C语言如何实现简单的文本编辑器
    这篇文章将为大家详细讲解有关C语言如何实现简单的文本编辑器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下预期实现三个功能,第一,可以对指定的行输入字符串;第二,删除指定行的字符串;第三,显示编...
    99+
    2023-06-15
  • Linux C线程池简单实现实例
    Linux C线程池 三个文件 1 tpool.h typedef struct tpool_work { void (*routine)(void *); void ...
    99+
    2022-06-04
    线程 实例 简单
  • C#实现简单串口通讯实例
    本文实例为大家分享了C#实现简单串口通讯的具体代码,供大家参考,具体内容如下 参数设置界面代码: using System; using System.Collections.Gen...
    99+
    2024-04-02
  • C语言实现简单计算器
    本文实例为大家分享了C语言实现简单计算器的具体代码,供大家参考,具体内容如下 实现效果如图: 实现代码如下: #include<stdio.h> #include...
    99+
    2024-04-02
  • C#实现简单的聊天窗体
    本文实例为大家分享了C#实现简单的聊天窗体的具体代码,供大家参考,具体内容如下 一、要使用(学习)到的知识点 1、textBox控件 (1)功能:允许用户输入文本,并提供多行编辑和密...
    99+
    2024-04-02
  • C++矩阵运算的实现简单
    利用C++实现矩阵的构造,通过运算符的重载实现矩阵的乘法、加法等。并且实现矩阵形状的打印,矩阵的打印。 #include<iostream> #include<...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作