事件回放: 服务器突然挂了,
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 上也很多方法;
2.导出一个数据库结构
新建完数据库后在把导出的数据导入到新的数据库里面去,可以先登录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点开始执行任务
至此大功告成,