记一次 MySQL 数据库单表恢复事故处理

算法云阙客
• 阅读 2424

公司 web 服务架设在阿里云全家桶上,数据库用的也是 RDS

记一次 MySQL 数据库单表恢复事故处理

昨晚 10 点,运营同事在社区发文章,提示创建失败,查看接口项目的日志,是 detail 字段的类型为 text,可能是不够,需要加长,我选择了 mediumtext 类型。

数据类型 长度
TINYTEXT 256 bytes
TEXT 65,535 bytes~64kb
MEDIUMTEXT 16,777,215 bytes~16M
BLONGTEXT 4,294,967,295 bytes~4GB

然后执行一个 DDL 语句,如下:

ALTER TABLE `databasename`.`tablename` CHANGE COLUMN `question_detail` `question_detail` mediumint  DEFAULT NULL COMMENT '内容';

执行完了,好的,告诉运营同事,看下可以发文章了么?

记一次 MySQL 数据库单表恢复事故处理

还是不行,哦,DDL 写错了,应该是【mediumtext】,这里错了,把正确的 DDL 语句执行一遍,再问下运营同事

ALTER TABLE `databasename`.`tablename` CHANGE COLUMN `question_detail` `question_detail` mediumtext  DEFAULT NULL COMMENT '内容';

记一次 MySQL 数据库单表恢复事故处理

基于一个好的习惯,我再去社区确认下,运营同事的新帖子内容挺不错,在随便点点别的帖子。

嗯?我凑???社区全部帖子的内容变成 0 了,如下

记一次 MySQL 数据库单表恢复事故处理

懵逼了,生产事故吖,看看咋回事,一个想法闪过,sql 有问题,我用 navicat 生成的 sql 语句,更新后的数据类型应该是【mediumtext】,结果我敲到 med 的时候,他就主动补全了【mediumint】,没有看清,就放到生产执行了,一下子把所有 detail 的内容,强制转换成了数字??

黑人问号脸.jpg

ok,开始想办法恢复数据,中间各种想办法,最后依靠阿里云提供的数据备份管理功能,和本人一瞬间暴涨的工作效率和好运气,在今天凌晨 1 点搞定了。

记一次 MySQL 数据库单表恢复事故处理

记一次 MySQL 数据库单表恢复事故处理

记一次 MySQL 数据库单表恢复事故处理

记一次 MySQL 数据库单表恢复事故处理

至此,我得到了这个表本来的数据了,好在备份时间和发成事故的时间很相近,又是过年期间发帖频率很低,查一下表内行数,好的,备份库的贴子表只差一个生产库一行,应该就是运营那一篇了,哈哈哈。

执行一个兜底命令,重命名帖子表,先不要删掉这个表,避免一错再错

RENAME TABLE  aws_question to aws_question_bak;

然后把导出来的.sql 文件上传到可以连接生产库的服务器,然后把这个.sql 执行下,导入到生产库里

$ mysql -h hostname -u username -p < restore.sql 
Enter password:   #输入root用户的密码。

再回来看看贴子,好的,数据恢复了。

记一次 MySQL 数据库单表恢复事故处理

回过头来,我们在执行一遍更新字段数据类型的 sql

ALTER TABLE `databasename`.`tablename` CHANGE COLUMN `question_detail` `question_detail` mediumtext  DEFAULT NULL COMMENT '内容';

把运营同事新写的文章,从 bak 表拿出来,导入到本表中,至此,数据完全存进去了。

?Happyending?

记一次 MySQL 数据库单表恢复事故处理

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
10个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
天翼云RDS数据库如何修改数据库参数
天翼云RDS数据库支持修改数据库参数。最近遇到几个用户反馈要求天翼云对MySQLRDS数据库的库表名修改为大小写不敏感,这可以通过修改RDS数据库的参数来实现。今天就用这个实例来讲解一下天翼云RDS如何修改数据库参数。MySQL数据库对库表名称大小写是否敏感和MySQL运行的操作系统有关,因为Windows操作系统对大小写不敏感所以运行在Windows上的
Stella981 Stella981
4年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
4年前
mysql数据库查询操作
\mysql数据库\知识要点:1\.单表查询2\.子查询3\.联表查询4\.事务在进行查询之前,我们要先建好关系表,并往数据表中插入些数据。为查询操作做好准备。\五张关系表的创建:\\\mysql创建并进入数据库:mysqlCREATEDATABASE\
Wesley13 Wesley13
4年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Wesley13 Wesley13
4年前
Mysql迁移到highgoDB如何实现ID自增长
目录环境文档用途详细信息环境系统平台:MicrosoftWindows(64bit)2012版本:5.6.4文档用途Mysql数据库迁移到HighGo数据库后,原Mysql表中自增长的ID如何保持自增长?详细信息分两种情况进行处理,具体如下:(1)数据库中已经存在表(tab1),而且已经有数据,而且
Wesley13 Wesley13
4年前
thinkphp 基本配置
12returnarray(34//定义数据库连接信息5'DB\_TYPE''mysql',//指定数据库是mysql67'DB\_HOST''localhost',89'DB\_NAME''uchome',//数据库名1011'DB\_USER''root
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究