java还原mysql数据库_Java备份和还原MySQL数据库

2ff34e647e2e3cdfd8dca593e17d9b0a.png

​ 在项目中经常会用到Java程序备份和还原MySQL数据库的内容,都是大同小异,但程序也会出现各种各样的问题(运行时异常,乱码等)。实现上都是用Runtime执行MySQL的命令行工具,然后读写IO流数据;也有可能是由于使用Java的Runtime来实现备份还原功能,而由于大家的运行时环境有差异才导致代码运行不成功。在这里记录一下自己使用的工具和方法。

mysql-index.png

使用MySQL自带工具

备份

备份使用MySQL的mysqldump命令来实现,示例代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55final static Logger logger = LoggerFactory.getLogger(MySQLDatabaseBackupAndRestore.class);

* Java代码实现MySQL数据库导出

*

* @param hostIP MySQL数据库所在服务器地址IP

* @param userName 进入数据库所需要的用户名

* @param password 进入数据库所需要的密码

* @param savePath 数据库导出文件保存路径

* @param fileName 数据库导出文件文件名

* @param databaseName 要导出的数据库名

* @return 返回true表示导出成功,否则返回false。

* @author maxu

*/

public static boolean (String hostIP, String userName, String password, String databaseName, String savePath, String fileName) throws InterruptedException{

File saveFile = new File(savePath);

if (!saveFile.exists()) {// 如果目录不存在

saveFile.mkdirs();// 创建文件夹

}

if (!savePath.endsWith(File.separator)) {

savePath = savePath + File.separator;

}

PrintWriter printWriter = null;

BufferedReader bufferedReader = null;

try {

printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), "utf8"));

Process process = Runtime.getRuntime().exec(" D:\DevTools\MySQL\MySQL5.7\bin\mysqldump.exe -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName);

InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");

bufferedReader = new BufferedReader(inputStreamReader);

String line;

while ((line = bufferedReader.readLine()) != null) {

printWriter.println(line);

}

printWriter.flush();

if (process.waitFor() == 0) {//0 表示线程正常终止。

logger.info("数据库已备份到——>>" + savePath);

return true;

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (bufferedReader != null) {

bufferedReader.close();

}

if (printWriter != null) {

printWriter.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return false;

}

还原1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62final static Logger logger = LoggerFactory.getLogger(MySQLDatabaseBackupAndRestore.class);

* Java代码实现MySQL数据库还原

*

* @param hostIP MySQL数据库所在服务器地址IP

* @param userName 进入数据库所需要的用户名

* @param password 进入数据库所需要的密码

* @param path 需要还原数据库文件的路径

* @param fileName 需要还原数据库文件的名称

* @param databaseName 需要还原的数据库名称

* @return 返回true表示还原成功,否则返回false。

*/

public static boolean restoreDatabase(String hostIP, String userName, String password, String databaseName, String path, String fileName) throws InterruptedException{

OutputStream out = null;

BufferedReader br = null;

PrintStream ps = null;

try {

// 调用mysql的cmd:cmd命令在后台执行,没有命令窗口出现或者一闪而过的情况

Process process = Runtime.getRuntime().exec("cmd /c start /b D:\DevTools\MySQL\MySQL5.7\bin\mysql -h" + hostIP + " -u" + userName + " -p" + password + " --default-character-set=utf8 " + databaseName);

out = process.getOutputStream();//控制台的输入信息作为输出流

StringBuffer sb = new StringBuffer("");

br = new BufferedReader(new InputStreamReader(new FileInputStream(path + fileName), "utf8"));

String outStr;

String line;

while ((line = br.readLine()) != null) {

sb.append(line + "rn");

}

outStr = sb.toString();

ps = new PrintStream(out, true, "utf8");

ps.write(outStr.getBytes());

// OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");

// writer.write(outStr);

// 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免

// writer.flush();

// writer.close();

if (process.waitFor() == 0) { //0 表示线程正常终止。

return true;

}

} catch (Exception e) {

e.printStackTrace();

return false;

} finally {

try {

if (ps != null) {

ps.close();

}

if (br != null) {

br.close();

}

if (out != null){

out.close();

}

} catch (IOException e1) {

e1.printStackTrace();

}

}

return false;

}

测试1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23public static void main(String[] args){

//数据库备份

/*try {

if (backUpDatabase("localhost", "root", "root", "taotao", "D:/", "taotao.sql")) {

logger.info("数据库成功备份!!");

} else {

logger.info("数据库备份失败!!");

}

} catch (InterruptedException e) {

e.printStackTrace();

}*/

//数据库恢复

try {

if (restoreDatabase("localhost", "root", "root", "taotao", "D:/", "taotao.sql")) {

logger.info("数据库恢复成功!!");

} else {

logger.info("数据库恢复失败!!");

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

代码下载点击:下载

Windows下bat命令

工作环境 Windows Server 2003 ,MySQL安装目录 D:DevToolsMySQL ,

WinRAR 安装目录 C:Program FilesWinRARWinRAR.exe

备份数据存储的路径为 D:数据备份,好了下面开始写DOS批处理命令了。代码如下:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15color 9

rem ---------------------数据库备份开始-----------------------

set "Ymd=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%"

REM 日期格式:20170924200727

md "D:%ymd%"

"D:DevToolsMySQLMySQL5.7binmysqldump.exe" --opt -Q taotao -uroot -proot > D:%Ymd%taotao.sql

REM ..... 这里可以添加更多的命令,要看你有多少个数据库,其中 -Q 后面是数据库名称 -p紧跟后面是密码

REM echo Winrar loading...

REM "C:Program FilesWinRARWinRAR.exe" a -ep1 -r -o+ -m5 -df "D:数据备份%Ymd%.rar" "D:数据备份%Ymd%"

@echo on

rem ---------------------数据库备份完成-----------------------

pause

把上面的命令保存为 backup.bat ,双击运行,就开始备份数据了。

第 一句是建立一个变量 %Ymd% ,通过 %date% 这个系统变量得到日期,%date:~,4% 表示取日期的前面4个字符就是年份,%%date:~5,2% 表示取日期第5个字符开始的2个字符就是月份,%date:~8,2% 这个就是日期号数,如 2017-09-24 这个日期最后得到的结果是 20170924

第二句就是使用变量 %Ymd% 的值建立一个空的文件夹。

第三句开始就是使用MySQL的命令对数据库mysql进行备份,并存储在 D:数据备份%ymd% 这个文件夹下面,这里可以有很多类似的命令,备份多个数据库。

最后就是使用 WinRAR 对备份的数据进行压缩,并存储为以 %Ymd% 变量值建立的RAR文件名,同时删除备份的 %Ymd% 目录。

如果你想让系统自动定期备份,就可以通过系统的任务计划定期执行这个命令。

但是用windows下bat命令备份有一个致命缺点:备份时数据库会暂时断开。(30M断开5s左右)

总结

第二种方式的缺点太致命:备份时数据库会暂时断开。

所以第一种方式将会是我们在开发中首选的方式,因为第二种方式的缺点对用户体验的影响太大了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值