windows下mysql增量备份和全量备份

本文介绍了如何在Windows环境下对MySQL进行增量备份和全量备份,包括配置步骤、脚本编写、以及利用Java编程实现定时任务执行。详细讲解了配置binlog日志、脚本编写过程以及在Java中调用bat脚本进行备份操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

Windows下mysql的增量备份和全量备份,并利用java定时任务执行bat脚本。

一、增量备份

1. 准备工作

首先在进行增量备份之前需要查看一下配置文件,查看log_bin是否开启 。首先,进入到 mysql 命令行,输入如下命令:

show variables like '%log_bin%';

如下命令所示,则为未开启

mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+

修改配置文件my.ini

[mysqld]
#开启binlog日志
#指定备份文件目录
log-bin="E:/mysql-5.7.32-winx64/backup/logbin.log"
#服务唯一标识
server_id = 1

修改之后,重启 mysql 服务,输入:

show variables like '%log_bin%';

如下证明已开启

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------------------+
| Variable_name                   | Value                                      |
+---------------------------------+--------------------------------------------+
| log_bin                         | ON                                         |
| log_bin_basename                | E:\mysql-5.7.32-winx64\backup\logbin       |
| log_bin_index                   | E:\mysql-5.7.32-winx64\backup\logbin.index |
| log_bin_trust_function_creators | OFF                                        |
| log_bin_use_v1_row_events       | OFF                                        |
| sql_log_bin                     | ON                                         |
+---------------------------------+--------------------------------------------+
2. 增量备份

查看当前使用的 logbin.000*** 日志文件,输入:

show master status;

状态如下:

+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| logbin.000011 |      154 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.09 sec)

当前正在记录日志的文件名为 logbin.000011 。

增量备份的关键命令:通过执行如下命令,使用新的日志文件:

mysqladmin -uroot -123456 flush-logs

如此,已经完成增量备份,下面用脚本实现。

3. 脚本
  • Incremental_backup.bat
@echo off

::服务器数据库 用户名 密码
set suser=root
set suserpwd=123456
::mysql 二进制日志文件存放的位置
set filePath=E:\mysql-5.7.32-winx64\backup


::当前系统日期 20210804
set now=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

::备份文件夹
set backup=E:\mysql-5.7.32-winx64\backup
if not exist %backup% md %backup%

::以日期命名的文件夹
set nowfile=%backup%\%now%-Increase
if not exist %nowfile% md %nowfile%

::前一次日志文件名
set logbin=%nowfile%\logbin.txt

mysql -u%suser% -p%suserpwd% -e "show master status"|findstr -B logbin.>%logbin%

::处理日志文件名  复制到目标文件夹
FOR /F "delims=	" %%i in (%logbin%) do  copy %filePath%\%%i %nowfile%

::刷新日志产生新的日志
mysqladmin -u%suser% -p%suserpwd% flush-logs

exit@echo off

::服务器数据库ip 用户名 密码
set suser=root
set suserpwd=123456
::mysql 二进制日志文件存放的位置
set filePath=E:\mysql-5.7.32-winx64\backup


::当前系统日期 20210804
set now=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

::备份文件夹
set backup=E:\mysql-5.7.32-winx64\backup
if not exist %backup% md %backup%

::以日期命名的文件夹
set nowfile=%backup%\%now%-Increase
if not exist %nowfile% md %nowfile%

::前一次日志文件名
set logbin=%nowfile%\logbin.txt

mysql -u%suser% -p%suserpwd% -e "show master status"|findstr -B logbin.>%logbin%

::处理日志文件名  复制到目标文件夹
FOR /F "delims=	" %%i in (%logbin%) do  copy %filePath%\%%i %nowfile%

::刷新日志产生新的日志
mysqladmin -u%suser% -p%suserpwd% flush-logs

exit
4. java后端
  • com.xx.xx.task.DatabaseBackupTask
@Component
public class DatabaseBackupTask {

    // 增量备份 周一至周六凌晨3点触发
    @Scheduled(cron = "0 0 3 ? * MON-SAT")
    public void IncrementalBackupTask() {
        DatabaseBackupUtils.Incremental_backup();
    }
}
  • com.xx.xx.utils.DatabaseBackupUtils;
public class DatabaseBackupUtils {
    
    // 增量备份
    public static void Incremental_backup() {
        String batPath = "E:/mysql-5.7.32-winx64/Incremental_backup.bat"; // 把你的bat脚本路径写在这里
        File batFile = new File(batPath);
        boolean batFileExist = batFile.exists();
        System.out.println("batFileExist:" + batFileExist);
        if (batFileExist) {
            callCmd(batPath);
        }
    }

    // 执行bat脚本
    private static void callCmd(String locationCmd) {
        StringBuilder sb = new StringBuilder();
        try {
            Process child = Runtime.getRuntime().exec(locationCmd);
            InputStream in = child.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            in.close();
            try {
                child.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("callCmd execute finished");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

二、全量备份

1. 脚本
::******Backup MySQL Start******
@echo off
::设置时间变量
set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%"

::本机安装的mysql的bin目录路径
set mysqlBinPath=E:\mysql-5.7.32-winx64\bin\

::备份文件存储的目标路径
set backupPath=E:\mysql-5.7.32-winx64\backup

::备份文件的名字前半部分-后半部分使用的是上面的时间参数
set backupFileName=Full_backup_

::备份文件的保存天数1
set days=1

::要备份的数据库服务器的ip
set host=127.0.0.1

::要备份的数据库服务器的端口
set port=3306

::要备份的数据库登录名
set user=root

::要备份的数据库登录密码
set password=123456

::要备份的数据库名
set dbName=test

::默认的字符集
set charSet=utf8

::创建存储的文件夹
if not exist %backupPath% md %backupPath%

::根据上面设置的days参数删除以前的备份数据
forfiles /p "%backupPath%" /m %backupFileName%*.sql /d -%days% /c "cmd /c del @path"

::进入mysql安装目录的bin目录下
cd %mysqlBinPath%
 
::执行备份操作
mysqldump --opt --single-transaction=TRUE --user=%user% --password=%password% --host=%host% --protocol=tcp --port=%port% --default-character-set=%charSet% --routines --events %dbName% > %backupPath%\%backupFileName%%Ymd%.sql
echo %backupPath%\%backupFileName%%Ymd%.sql
 
@echo on
::******Backup MySQL End******
2. java后端
  • com.xx.xx.task.DatabaseBackupTask
@Component
public class DatabaseBackupTask {
   
    // 全量备份 周一至周六凌晨3点触发
    @Scheduled(cron = "0 0 3 ? * MON-SAT")
    public void FullBackupTask() {
        DatabaseBackupUtils.Full_backup();
    }

}
  • com.xx.xx.utils.DatabaseBackupUtils;
public class DatabaseBackupUtils {
    
      // 全量备份
    public static void Full_backup() {
        String batPath = "E:/mysql-5.7.32-winx64/Full_backup.bat"; // 把你的bat脚本路径写在这里
        File batFile = new File(batPath);
        boolean batFileExist = batFile.exists();
        System.out.println("batFileExist:" + batFileExist);
        if (batFileExist) {
            callCmd(batPath);
        }
    }
}

参考

<think>好的,我现在需要回答用户关于MySQL增量备份全量备份的区别及实现方法的问题。首先,我需要回忆一下这两种备份的基本概念,然后结合提供的引用内容来整理信息。 全量备份应该是指备份整个数据库,包括所有数据结构。用户提到的引用中多次出现mysqldump命令,比如引用[1][5],这可能就是全量备份实现方式。特别是引用[5]中的命令使用了--all-databases参数,说明是备份所有数据库。而增量备份则是备份自上次备份以来发生变化的部分,可能需要用到二进制日志,比如引用[2][4]提到的flush logs查看备份是否成功,可能涉及到日志文件的处理。 接下来,我需要明确两者的区别。全量备份数据量大,恢复快,但耗时;增量备份数据量小,但恢复时需要先恢复全量备份再逐步应用增量日志,步骤更多。引用[3]提到恢复完全备份是用mysql命令导入sql文件,而增量可能需要用到mysqlbinlog处理日志。 关于实现方式,全量备份使用mysqldump,而增量备份可能需要启用二进制日志,并通过flush logs来生成新的日志文件,然后备份这些日志。引用[5]中的命令有--flush-logs--delete-master-logs,这可能是在全量备份后重置日志,为增量备份做准备。 需要检查引用中的具体命令步骤,确保信息准确。比如,全量备份脚本可能包含mysqldump命令,而增量备份可能涉及备份二进制日志文件,并配合定时任务执行,如引用[2]提到的Java定时任务执行bat脚本。 最后,整理回答的结构,先解释两者的定义区别,再分别说明实现方法,引用相关的引用来源,并在末尾生成相关问题。需要注意使用中文,数学表达式用$...$格式,独立公式用$$...$$,但这里可能用不上数学公式,所以重点在代码块引用标注。</think>### MySQL增量备份全量备份的区别及实现方法 #### 1. **全量备份** **定义**:全量备份指一次性备份数据库的所有数据(包括表结构、索引、存储过程等)[^1]。 **实现方式**: - 使用`mysqldump`命令导出完整数据: ```bash mysqldump -u用户 -p密码 --all-databases --single-transaction > backup.sql ``` 参数说明: - `--all-databases`:备份所有数据库[^5]; - `--single-transaction`:保证备份一致性(适用于InnoDB引擎)[^5]。 **特点**: - 备份文件较大,耗时较长; - 恢复时直接导入SQL文件即可(如`mysql -u root -p < backup.sql`)[^3]。 --- #### 2. **增量备份** **定义**:仅备份自上次备份后发生变化的数据,通常依赖二进制日志(Binary Log)记录所有数据变更操作[^2]。 **实现方式**: 1. **启用二进制日志**: 在MySQL配置文件中设置: ```ini [mysqld] log-bin=mysql-bin ``` 2. **定时备份增量日志**: - 手动刷新日志生成新文件:`mysqladmin -u用户 -p密码 flush-logs`[^5]; - 备份最近未备份的二进制日志(如`mysql-bin.000002`)。 **恢复流程**: 1. 先恢复最近的全量备份; 2. 使用`mysqlbinlog`工具按顺序应用增量日志: ```bash mysqlbinlog mysql-bin.000002 | mysql -u用户 -p密码 ``` **特点**: - 备份文件小,频率高; - 恢复需结合全量备份所有增量日志[^4]。 --- #### 3. **核心区别** | **维度** | **全量备份** | **增量备份** | |----------------|----------------------------------|----------------------------------| | **数据范围** | 完整数据库 | 仅变更数据 | | **备份速度** | 慢 | 快 | | **恢复速度** | 快(一步完成) | 慢(需逐步应用日志) | | **存储占用** | 大 | 小 | | **适用场景** | 初始备份或低频备份 | 高频备份以减少资源消耗 | --- #### 4. **典型应用场景** - **全量备份**:每周/月定期执行(如`backup_sunday_1_PM.sql`)[^3]; - **增量备份**:每日结合定时任务(如Java调用Windows批处理脚本备份日志)。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值