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());
}
}
java 备份 mysql 数据库
最新推荐文章于 2024-08-22 13:54:39 发布
本文介绍了如何使用mysqldump命令进行MySQL数据库的备份,包括备份所有数据库、多个数据库、单个数据库、多张表、单张表以及带有where条件的备份。还详细解释了--single-transaction选项确保数据一致性以及不同引擎的备份策略。
摘要由CSDN通过智能技术生成