首页 > 数据库 >批量执行mysql文件

批量执行mysql文件

时间:2023-05-22 10:33:39浏览次数:67  
标签:文件 log 批量 备份 db mysqldump mysql import append

mysqldump Mysql数据备份恢复

目录

一、需求

  • 实现Mysql数据库备份与恢复
/**
 * mysqldump命令
 * 备份库
 * 备份所有数据库:mysqldump -h 主机IP -uroot -p --all-database > /usr/dball.sql
 * 备份多个数据库:mysqldump -h 主机IP -uroot -p db1 db2 db3 >/usr/db123.sql
 * 备份单个数据库:mysqldump -h 主机IP -uroot -p db >/usr/db.sql
 * <p>
 * 备份表
 * 备份多张表:mysqldump -h 主机IP -uroot -p db table1  table2 >/data/db_table12.sql
 * 备份单张表:mysqldump -h 主机IP -uroot -p db table   >/data/db_table.sql
 * 备份表时用 where 筛选:mysqldump -h 主机IP -uroot -p db table  --where " 查询条件" >/data/db_table.sql
 * <p>
 * 还原:mysqldump -h 主机IP -uroot -p db < /root/db.sql
 * source命令:source /root/db.sql
 */

二、Java 实现Mysql备份与恢复

备份单个数据库:mysqldump -h 主机IP -uroot -p db >/usr/db.sql

pom.xml

 <dependencies>
        <!--mysql 测试8.0.13 生产5.1.35-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <!--            <version>1.2.16</version>-->
            <version>1.1.12</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180130</version>
        </dependency>

        <!-- log4j的依赖 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-reload4j</artifactId>
            <version>1.7.36</version>
        </dependency>

    </dependencies>



    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.gtja.main.SinkMysqlMain</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

main

  • com.gtja.main.MysqlDump
package com.gtja.main;

import com.gtja.model.MysqlBackups;
import com.gtja.model.MysqlReduction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
 * @Description: mysql数据安全(备份与还原)
 * @Auther: wsy
 * @Date: 2023/05/17/13:29
 */

/**
 * mysqldump命令
 * 备份库
 * 备份所有数据库:mysqldump -h 主机IP -uroot -p --all-database > /usr/dball.sql
 * 备份多个数据库:mysqldump -h 主机IP -uroot -p db1 db2 db3 >/usr/db123.sql
 * 备份单个数据库:mysqldump -h 主机IP -uroot -p db >/usr/db.sql
 * <p>
 * 备份表
 * 备份多张表:mysqldump -h 主机IP -uroot -p db table1  table2 >/data/db_table12.sql
 * 备份单张表:mysqldump -h 主机IP -uroot -p db table   >/data/db_table.sql
 * 备份表时用 where 筛选:mysqldump -h 主机IP -uroot -p db table  --where " 查询条件" >/data/db_table.sql
 * <p>
 * 还原:mysqldump -h 主机IP -uroot -p db < /root/db.sql
 * source命令:source /root/db.sql
 */
public class MysqlDump {
    //TODO  需求:备份还原单个数据库
    private static Logger log = LoggerFactory.getLogger(MysqlDump.class);

    public static void main(String[] args) {

        if (args.length != 2) {
            log.error("参数传入错误,需要传入两个参数 {} {},例: java -jar mysqlDump.jar bf wjdm ", "model", "dbName");
            log.warn("{} bf: 表示备份mysql数据,hy: 表示还原备份数据", "model");
            log.warn("{} 数据库用户名,使用 {} 拼接 conf.properties,来定制不同数据库的不同配置文件", "dbName", "dbName");

            System.exit(1);
        }

        if (args[0].equals("bf")) {
            //备份 mysql 表
            log.info("开始备份mysql数据!");
            MysqlBackups.Backup(args[1], log);
        } else if (args[0].equals("hy")) {
            //还原备份至mysql
            log.info("开始还原mysql备份数据至mysql!");
            MysqlReduction.Reduction(args[1], log);
        } else {
            log.error("参数传入错误,第一个参数,备份请传入:bf ,还原请传入:hy");
            System.exit(1);
        }

    }
}

MysqlBackups

  • com.gtja.model.MysqlBackups
package com.gtja.model;

import com.gtja.utils.ConfProp;
import org.slf4j.Logger;

import java.io.File;
import java.io.IOException;
import java.util.Properties;

/*
 * @Description: 备份 mysql 单个库
 * @Auther: wsy
 * @Date: 2023/05/17/14:11
 */
public class MysqlBackups {
    //备份单个数据库:mysqldump -h 主机IP -uroot -p db >/usr/db.sql

    //TODO 备份单个 mysql 库
    public static void Backup(String dbName, Logger log) {

        long start = System.currentTimeMillis();

        Properties prop = new Properties();
        ConfProp.getConf(prop, dbName, log);

        //获取备份路径
        String savePath = prop.getProperty("savePath");
        File saveFile = new File(savePath);
        if (!saveFile.exists()) {
            //如果目录不存在,则创建文件夹
            saveFile.mkdirs();
        }

        //数据库备份文件地址
        String filePath = savePath + "/" + dbName + ".sql";
        log.info("数据库备份文件地址:" + filePath);

        //TODO 开始备份逻辑
        StringBuilder cmd = new StringBuilder();
        cmd.append("mysqldump")
                .append(" --single-transaction  ")
                .append(" --opt")
                .append(" --host=").append(prop.getProperty("host"))
                .append(" --databases ").append(dbName)
                .append(" --user=").append(prop.getProperty("user"))
                .append(" --password=").append(prop.getProperty("password"))
                .append(" --result-file=").append(filePath)
                .append(" --default-character-set=utf8 ");

        try {
            //调用外部执行exe文件的javaAPI
            Process process = Runtime.getRuntime().exec(cmd.toString());
            long end = System.currentTimeMillis();

            long timeElapsed = (end - start)/1000;
            if (process.waitFor() == 0) {// 0 表示线程正常终止
                log.info(dbName + " 数据库备份完成! 执行时间:{} 秒",timeElapsed);
            } else {
                log.error(dbName + " 数据库备份失败! 执行时间:{} 秒",timeElapsed);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

MysqlReduction

  • com.gtja.model.MysqlReduction
package com.gtja.model;

import com.gtja.utils.ConfProp;
import org.slf4j.Logger;

import java.io.IOException;

import java.util.Properties;

/*
 * @Description: 还原备份文件
 * @Auther: wsy
 * @Date: 2023/05/17/14:11
 */
public class MysqlReduction {
    public static void Reduction(String dbName, Logger log) {

        long start = System.currentTimeMillis();

        Properties prop = new Properties();
        ConfProp.getConf(prop, dbName, log);

        //获取备份路径
        String savePath = prop.getProperty("savePath");

        //数据库备份文件地址
        String filePath = savePath + "/" + dbName + ".sql";
        log.info("获取数据库备份文件地址:" + filePath);

        StringBuilder cmd = new StringBuilder();
        cmd.append("mysql")
                .append(" -u ")
                .append(prop.getProperty("user"))
                .append(" -p")
                .append(prop.getProperty("password"))
                .append(" ")
                .append(dbName)
                .append(" < ")
                .append(filePath);

        //执行命令
        String[] command = {"/bin/bash", "-c", cmd.toString()};

        try {

            Process process = Runtime.getRuntime().exec(command);

            long end = System.currentTimeMillis();

            long timeElapsed = (end - start) / 1000;
            if (process.waitFor() == 0) {// 0 表示线程正常终止
                log.info(dbName + " 数据库还原完成! 执行时间:{} 秒", timeElapsed);
            } else {
                log.error(dbName + " 数据库还原失败! 执行时间:{} 秒", timeElapsed);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ConfProp

  • com.gtja.utils.ConfProp
package com.gtja.utils;

import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;

import java.io.File;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

/*
 * @Description: 获取配置文件配置【本地、生产】
 * @Auther: wsy
 * @Date: 2023/03/15/13:20
 */
public class ConfProp {
    public static boolean debug;

    static {
        String osName = System.getProperties().getProperty("os.name");
        if (osName.startsWith("Windows") || osName.startsWith("Mac OS X")) {
            debug = true;
        } else {
            debug = false;
        }
    }

    public static  Properties getConf(Properties props, String dbName,Logger log) {
        try {
            File file;
            FileInputStream fis;
            if (ConfProp.debug) {
                //本地执行
                file = new File("src/main/resources/"+dbName+"conf.properties");
                fis = new FileInputStream(file);
                props.load(fis);
            } else {
                //服务器执行
                PropertyConfigurator.configure("../conf/log4j.properties");
                file = new File("../conf/"+dbName+"conf.properties");
                fis = new FileInputStream(file);
                props.load(fis);
            }
            if(!file.exists() || file.length() == 0) {
                log.error("conf 配置文件为空!");
                System.exit(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return props;
    }


}

resources

  • bigdataconf.properties
host=node01
user=root
password=123456

savePath=/Users/ailian/Documents/WorkTasks/mysqlCheckpoint/mysqlDump/data/dbFile

执行

  • mysqlDump.sh
#!/bin/bash
model=$1
dbName=$2

java -jar ../lib/mysqlDump.jar $1 $2

标签:文件,log,批量,备份,db,mysqldump,mysql,import,append
From: https://www.cnblogs.com/ChloeAilian/p/17419969.html

相关文章

  • 遇到的问题之"数据库编写SQL-》子查询中加入limit报错:This version of MySQL doesn't
    一、问题 >1235-ThisversionofMySQLdoesn'tyetsupport'LIMIT&IN/ALL/ANY/SOMEsubquery'二、原因/解决方案这个错误通常是由于MySQL版本太旧导致的。在旧版本的MySQL中,无法在子查询中使用LIMIT和IN/ALL/ANY/SOME子查询。您需要升级到MySQL的较新版本,以解决......
  • Git忽略已经提交过一次文件Git忽略文件
    1、从未提交过的文件可以用.gitignore   也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件该文件只能作用于未跟踪的文件(UntrackedFiles),也就是那些从来没有被git记录过的文件比如,忽略log/下的日志文件,可以在.gitignore中写cat.gitignore......
  • 通用 Mapper 的批量插入实现
    具体的SQL模板实现如下所示:importorg.apache.ibatis.mapping.MappedStatement;importtk.mybatis.mapper.MapperException;importtk.mybatis.mapper.entity.EntityColumn;importtk.mybatis.mapper.mapperhelper.EntityHelper;importtk.mybatis.mapper.mapperhelper.Map......
  • java使用阿里云oss上传文件测试案例+上传策略包装类
    产品文档地址:https://help.aliyun.com/product/31815.html产品购买地址:https://www.aliyun.com/search?scene=all&k=oss在官网首先购买产品,开通oss服务后进入控制台:在https://developer.aliyun.com/ask/2061查看相关的endpoint地址(找到自己所在的区域)在控制台https://oss.c......
  • Python直连MySQL数据库
        Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:GadFlymSQLMySQLPostgreSQLMicrosoftSQLServer2000InformixInterbaseOracleSybase你可以访问Pytho......
  • 使用ln命令在Linux系统中创建连接文件
    在Linux中ln命令用来为文件创建连接,连接类型分为硬连接(HardLink)和符号连接(SymbolicLink)两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。关于软硬连接解释硬连接硬连接是指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是......
  • Oracle与DB2、MySQL取前10条记录的对比
    Oralce的示例:1.最佳选择:利用分析函数row_number()over(partitionbycol1orderbycol2)比如想取出100-150条记录,按照tname排序selecttname,tabtypefrom(selecttname,tabtype,row_number()over(orderbytname)rnfromtab)whe......
  • Graphql(五)Apollo 文件传输
    本文介绍如何在ApolloGraphQL中实现文件的传输文件传输在GrapqhQL中官方建议文章ApolloServerFileUploadBestPractices提及了实现文件上传的几种方式,分别是:SignedURLsUsinganimageuploadserviceMultipartUploadRequests本文介绍我所尝试过的第一种和第三种。......
  • maven静态资源配置文件问题
    由于src-main-java里面的文件默认只加载.java类型的文件,如果需要将xml文件或者其他文件放到java文件夹中需要在pom文件中进行配置1<resources>2<resource>3<directory>src/main/java</directory>4<includes>......
  • mysql联合索引详解
    所有的MySQL列类型能被索引。在相关的列上的使用索引是改进SELECT操作性能的最好方法。一、前缀索引对于CHAR和VARCHAR列,你可以索引列的前缀。这更快并且比索引整个列需要较少的磁盘空间。在CREATETABLE语句中索引列前缀的语法看起来像这样:KEYindex_name(col_name(length))下面......