Linux 记录JAVA 与MYSQL 数据恢复与备份

事件回放:  服务器突然挂了,

mysql 无法启动;

服务启动后一直提示表不存在,

数据恢复后JAVA连接超时; 

java连接mysql 乱码;

linux mysql 定时数据备份;

一,mysql 无法启动

 由于服务器异常,导致系统卡死,然后强制关机,在开机后无法启动mysql服务;可以通过 查看日志来修改,这个我也还需要学习,是另一同事修改;

二 服务启动后一直提示表不存在

1146 - Table doesn't exist

出现这个问题最大原因就是表的结构跟ID 不匹配,也就是你你替换了mysql 的数据文件.ibd 文件造成的,具体应该可如何恢复数据参考正面这个连接,非常详细;

MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

用t_user.ibd文件恢复t_user表的数据

修改 window my.ini, Linux  /etc/my.cnf

、停掉数据库服务,将innodb_force_recovery = 6注释掉,然后启动数据库服务(若启动中出现1067错误,可以尝试删除data文件夹下ibdata1、ib_logfile0、ib_logfile1即可)并删除mytest下t_user表,并使用新导出的表结构创建t_user表,如下:


由于.ibd文件含有tablespace id,因此我们将需要恢复数据的t_user.ibd的tablespace id改为新创建的t_user.ibd的tablespace id,如下:使用了winHex, 或者  UltraEdit , 

tablespace id 位于第三行,所有数据表的ID 换成没数据表的ID

需要恢复数据的t_user.id的tablespace id:

新创建的t_user.ibd的tablespace id:


修改后的带数据的t_user.ibd如下:

停掉数据库服务,使用修改tablespace id的t_user.ibd文件覆盖mytest库下的t_user.ibd文件,并且将配置文件中innodb_force_recovery = 6去掉注释,进入mytest库内,使用select * from t_user查看数据,获取到数据如下:


④使用mysqldump导出表结构和数据即可。

恢复数据到此就完成了,可是现在这个表的数据是要依赖于innodb_force_recovery = 6,当所这一句删除就又提示找不到表;


本来以为这样数据就已经完全恢复好了,可以正常使用了,可以当使用java连接过来的时候,在连接的时候大概率性的报这个错误

 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 71 ms ago.

经常出现lost connect

百度一直以为是数据库wait_time 的问题,可是修改后还是一样,通过对比测试,随便新建一个数据库,使用JAVA进行连接,没有问题,就怀疑是这个数据库虽然数据是能够正常显示,但是在做其他操作的时候还是会出问题,或者 是因为不同片的ibd文件造成,但值得庆幸的是我们的数据已经完全恢复,怎么办呢?

导出现在这个数据库的成sql 文件,然后新那一个数据库,把数据导入进去;

导出文件还是使用mysqldump 具体 导出方式 ,CSDN 上也很多方法;

正面这是最简单的
1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u root -p student >d:/student.sql

2.导出一个数据库结构

mysqldump -u root -p -d --add-drop-table student >d:/student_structure.sql
-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

 

3.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u root -p schoolproject student>d:/schoolproject_student.sql


新建完数据库后在把导出的数据导入到新的数据库里面去,可以先登录mysql

mysql>  source  d:/student.sql

这样就完成新数据库的创建与数据的迁移。


很不幸的是由于数据库变化了,导致我JAVA tomcat 提交的数据都是乱码,都是??,我数据库本身里面是能够 显示中文的,所以怀疑问题应该出现在连接上面;

通过网上搜索,发现我的JDBC url 有差异,之前一直连接的是windos 下的mysql ,这次连接的是linux下的mysql; 这也许就是最大的差异了,经过修改URL乱码解决; 

window mysql url: url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true

linux mysql url: url=jdbc:mysql://localhost:3306/test?autoReconnect=true&characterEncoding=UTF-8

window 需要转译url 连接  &  基本在HTML 也就等于  &  ; 到此乱码问题也解决了;


最后就是要做数据库定时备份; 

Linux 定时使用的是crotab -e 来做定时任务;

同样参考来自CSDN : 

linux下如何实现mysql数据库每天自动备份定时备份


 创建目录:

cd /usr/local

mkdir mydata

cd mydata

创建备份Shell脚本

vi bkdb.sh

#!/bin/bash
mysqldump -uusername -ppassword DatabaseName > /home/backup/DatabaseName_$(date +%Y%m%d_%H%M%S).sql

#!/bin/bash
mysqldump -uusername -ppassword DatabaseName | gzip > /home/backup/DatabaseName_$(date +%Y%m%d_%H%M%S).sql.gz

注意: 
把 username 替换为实际的用户名; 
把 password 替换为实际的密码; 
把 DatabaseName 替换为实际的数据库名;

添加可执行权限:
chmod u+x bkdb.sh
添加可执行权限之后先执行一下,看看脚本有没有错误,能不能正常使用;

./bkdb.sh

添加计划任务
检测或安装 crontab
确认crontab是否安装: 

执行 crontab 命令如果报 command not found,就表明没有安装

添加计划任务
执行命令:
crontab -e
这时就像使用vi编辑器一样,可以对计划任务进行编辑。 
输入以下内容并保存:


0  1 * * 2 /usr/local/mydata/bkdb.sh

分,时,日,月,星期

意思就是每个星期二早上1点开始执行任务

至此大功告成,

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页