java 备份 mysql 数据库

本文介绍了如何使用mysqldump命令进行MySQL数据库的备份,包括备份所有数据库、多个数据库、单个数据库、多张表、单张表以及带有where条件的备份。还详细解释了--single-transaction选项确保数据一致性以及不同引擎的备份策略。
摘要由CSDN通过智能技术生成
package com.runta.asimss.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;

/**
 * MySQL 数据库备份
 *   命令:
 *      1. 备份所有数据库
 *          mysqldump -h主机IP -P端口号 -uroot -p密码 --all-database > 备份文件地址
 *            如:mysqldump -hlocalhost -P3306 -uroot -p123456 --all-database > /usr/dball.sql
 *      2. 备份多个数据库
 *          mysqldump -h主机IP -P端口号 -uroot -p密码 数据库1 数据库2 数据库3 > 备份文件地址
 *            如:mysqldump -hlocalhost -P3306 -uroot -p123456 db1 db2 db3 >/usr/db123.sql
 *      3. 备份单个数据库
 *          mysqldump -h主机IP -P端口号 -uroot -p密码 数据库 > 备份文件地址
 *            如:mysqldump -hlocalhost -P3306 -uroot -p123456 db >/usr/db.sql
 *      4. 备份多张表
 *          mysqldump -h主机IP -P端口号 -u用户名 -p密码 数据库 表1 表2 > 备份文件地址
 *            如:mysqldump -hlocalhost -P3306 -uroot -p123456 db table1 table2 > /data/db_table12.sql
 *      5. 备份单张表
 *          mysqldump -h主机IP -P端口号 -u用户名 -p密码 数据库 表  > 备份文件地址
 *            如:mysqldump -hlocalhost -P3306 -uroot -p123456 db table  > /data/db_table.sql
 *      6. 备份表时,使用 where 条件
 *          mysqldump -h主机IP -P端口号 -u用户名 -p密码 数据库 表  --where " 查询条件" > 备份文件地址
 *            如:mysqldump -hlocalhost -P3306 -uroot -p123456 db table  --where " 查询条件" >/data/db_table.sql
 *
 *    –opt 适用于备份大表,同时激活了-add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset 命令
 *    –single-transaction 开启一个事务,并设置备份事务为可重复读,保持备份数据一致性
 *    –master-data=2 表示在备份过程中记录主库的binlog和pos点,并且在dump文件中注释改行
 *    –all-databases 导出所有数据库,包括mysql库
 *
 *    –databases 指定备份的数据库
 *    –tables 指定备份的具体数据库表
 *    –no-data 申明不导出数据,只导出表结构
 *    –where 来指定具体的查询条件
 *    –no-create-db 申明不导出数据库创建等信息
 *    –no-create-info 申明不导出创建表等信息,这样就可以避免数据表被删除
 *
 *    1 、对于支持事务的引擎如 InnoDB , 参数上是在备份的时候加上 –single-transaction 保证数据一致性
 *      –single-transaction 实际上通过做了下面两个操作 :
 *          ① 在开始的时候把该 session 的事务隔离级别设置成 repeatable read ;
 *          ② 然后启动一个事务(执行 begin ),备份结束的时候结束该事务(执行 commit )
 *
 *    2 、对于不支持事务的引擎如 MyISAM ,只能通过锁表来保证数据一致性:
 *      ① 导出全库 : 加 –lock-all-tables 参数 , 这会在备份开始的时候启动一个全局读锁 ( 执行 flush tables with read lock ), 其他 session 可以读取但不能更新数据 , 备份过程中数据没有变化 , 所以最终得到的数据肯定是完全一致的 ;
 *      ② 导出单个库:加 –lock-tables 参数,这会在备份开始的时候锁该库的所有表,其他 session 可以读但不能更新该库的所有表,该库的数据一致;
 *
 *
 */
public class MySQLDatabaseBackupUtil {


    private static final Logger logger = LoggerFactory.getLogger(MySQLDatabaseBackupUtil.class);

    /**
     * 备份数据库
     *
     * @param host     ip地址
     * @param port     端口
     * @param userName 用户名
     * @param password 密码
     * @param dbName   数据库名
     * @param file     文件对象
     */
    public static void backup(String host, String port, String userName, String password, String dbName, File file, String... tableNames) {
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }

        String tableName = "";
        StringBuilder stringBuilder = new StringBuilder(" ");
        for (String name : tableNames) {
            if (!"".equals(name.trim())) {
                stringBuilder.append(name).append(" ");
            }
        }
        tableName = stringBuilder.toString();

        logger.info("*******************时间:【{}】, 系统开启数据库备份*******************", LocalDateTime.now());

        String os = System.getProperties().getProperty("os.name");
        if (tableNames.length > 0) {
            logger.info("备份环境信息:【{}】, 用户名:【{}】,密码:【{}】, 地址:【{}】, 端口:【{}】,数据库:【{}】, 表【{}】", os, userName, password, host, port, dbName, tableName);
        }else{
            logger.info("备份环境信息:【{}】, 用户名:【{}】,密码:【{}】, 地址:【{}】, 端口:【{}】,数据库:【{}】", os, userName, password, host, port, dbName);
        }

        String cmd = "mysqldump --opt --single-transaction" + " -h" + host + " -P" + port + " -u" + userName + " -p" + password + " " + dbName + tableName + "> " + file.getPath();

        if(os.toLowerCase().startsWith("win")){
            // Windows 需要加上 cmd /c
            cmd = "cmd /c " + cmd;
        }
        logger.info(String.format("cmd命令为:%s", cmd));

        try {
            Process process = Runtime.getRuntime().exec(cmd);

            if (process.waitFor() == 0) {
                logger.info(String.format(" 数据库:%s >>> %s 备份成功!", dbName, tableName));
            } else {
                logger.info(String.format(" 数据库:%s >>> %s 备份失败!", dbName, tableName));
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
            logger.error("备份异常 ", e);
        }

        logger.info("*******************时间:【{}】, 系统结束数据库备份*******************", LocalDateTime.now());
    }



}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值