java备份和恢复MySQL数据库

备份和恢复数据库作为一个实用的功能经常会被用到,因此我写了这篇博客,希望大家不要像我一样在这里卡个好几天
原理: java调用MySQL的mysqldump.exe进行数据备份,调用mysql.exe进行数据的恢复
Runtime.getRuntime().exec(command);//java调用外部软件exe执行命令的api,核心代码
代码实现 (亲测可用,亲测可用,亲测可用)

	/**
	 * @Description :通过mysqldump备份数据库
	 * @param savePath   	数据库备份文件保存目录
	 * @param mysqlPath  	数据库安装目录
	 * @param host       	主机地址
	 * @param username   	连接数据库用户名
	 * @param password   	连接数据库密码
	 * @param fileName   	数据库备份文件保存文件名
	 * @param databaseName  需要备份的数据库名字
	 * @return true 备份成功 false 备份失败
	 */
	public static boolean dataBackup(String savePath, String mysqlPath,	String host, String username, 
			String password, String fileName, String databaseName) {
		File saveFile = new File(savePath);
		// 如果目录不存在
		if (!saveFile.exists()) {
			// 创建目录
			saveFile.mkdirs();
		}
		// 在目录最后添加文件分隔符
		if (!savePath.endsWith(File.separator)) {
			savePath = savePath + File.separator;
		}
		// System.out.println("savePath:"+savePath);
		BufferedReader bufferedReader = null;
		InputStreamReader inputStreamReader = null;
		try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
				new FileOutputStream(savePath + fileName), ChangeCharset.UTF_8))) {
			StringBuffer cmdBuf = new StringBuffer();
			cmdBuf.append(mysqlPath);
			cmdBuf.append("mysqldump -h");
			cmdBuf.append(host);
			cmdBuf.append(" -u");
			cmdBuf.append(username);
			cmdBuf.append(" -p");
			cmdBuf.append(password);
			cmdBuf.append(" --set-charset=UTF8 ");
			cmdBuf.append(databaseName);
			String command = cmdBuf.toString();
			// System.out.println("backupCommand:"+command);
			Process process = Runtime.getRuntime().exec(command);
			inputStreamReader = new InputStreamReader(process.getInputStream(),
					ChangeCharset.UTF_8);
			bufferedReader = new BufferedReader(inputStreamReader);
			String str;
			while ((str = bufferedReader.readLine()) != null) {
				printWriter.println(str);
			}
			printWriter.flush();
			// 线程正常终止
			if (process.waitFor() == 0) {
				return true;
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (inputStreamReader != null) {
					inputStreamReader.close();
				}
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return false;
	}
/**
	 * @Description :通过mysql恢复数据库数据
	 * @param savePath   	数据库备份文件保存目录
	 * @param mysqlPath  	数据库安装目录
	 * @param host       	主机地址
	 * @param username   	连接数据库用户名
	 * @param password   	连接数据库密码
	 * @param fileName   	数据库备份文件保存文件名
	 * @param databaseName  需要备份的数据库名字
	 * @return true 备份成功 false 备份失败
	 */
	public static boolean dataRecovery(String mysqlPath, String host, String username, String password, 
			String databaseName, String savePath, String fileName) {
		Process process = null;
		OutputStream outputStream = null;
		BufferedReader bufferedReader = null;
		OutputStreamWriter outputStreamWriter = null;
		try {
			// 在目录最后添加文件分隔符
			if (!savePath.endsWith(File.separator)) {
				savePath = savePath + File.separator;
			}
			String sqlFile = savePath + fileName;
			// 拼接命令
			StringBuffer cmdBuf = new StringBuffer();
			cmdBuf.append(mysqlPath);
			cmdBuf.append("mysql -h");
			cmdBuf.append(host);
			cmdBuf.append(" -u");
			cmdBuf.append(username);
			cmdBuf.append(" -p");
			cmdBuf.append(password);
			cmdBuf.append(" ");
			cmdBuf.append(databaseName);
			String command = cmdBuf.toString();
			// System.out.println("recoverCommand:"+command);
			process = Runtime.getRuntime().exec(command);
			outputStream = process.getOutputStream();// 控制台的输入信息作为输出流
			String inStr;
			StringBuffer stringBuffer = new StringBuffer("");
			String outStr;
			bufferedReader = new BufferedReader(new InputStreamReader(
					new FileInputStream(sqlFile), "utf8"));
			while ((inStr = bufferedReader.readLine()) != null) {
				stringBuffer.append(inStr + "\r\n");
			}
			outStr = stringBuffer.toString();

			outputStreamWriter = new OutputStreamWriter(outputStream, "utf8");
			outputStreamWriter.write(outStr);
			// 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
			outputStreamWriter.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 别忘记关闭输入输出流
			try {
				if (outputStream != null) {
					outputStream.close();
				}
				if (bufferedReader != null) {
					bufferedReader.close();
				}
				if (outputStreamWriter != null) {
					outputStreamWriter.close();
				}
				// 线程正常终止
				if (process.waitFor() == 0) {
					return true;
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return false;
	}

注意 mysqlPath表示数据库的安装路径的bin目录下,如:C://Program Files (x86)//MySQL//MySQL Server 5.5//bin//
网上很多版本的代码都没有传这个数据库安装路径,我的MySQL是没有配置环境变量的,因此如果不传入这个路径的话程序应该是找不到对应的应用程序的。

以上就是java备份和恢复MySQL数据库的所有内容,如有错误,欢迎指正

你可能感兴趣的:(java,WEB)