注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle、MySQL资料及经验

.

 
 
 

日志

 
 

从MySQL分库备份的文件中恢复一张表  

2015-11-19 16:24:19|  分类: MySQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
从分库备份的文件中恢复一张表

MySQL逻辑备份一般用mysqldump,以下是一个分库备份的脚本:
#!/bin/bash
#初始化环境变量
source /home/mysql/.bash_profile
MYUSER=system
MYPASS=123456
SOCKET=/data/mysqldata/3305/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET -B"

for database in `$MYCMD -e "show databases;" | grep -Evi "database|information|performance"`
do
    $MYDUMP -d $database | gzip > /data/mysqldata/backup/${database}_struct_$(date +%F).sql.gz  #只备份表结构,不花多少时间按,下面有可能会用到。
    $MYDUMP     $database | gzip > /data/mysqldata/backup/${database}_$(date +%F).sql.gz             #分库备份
done

经常会遇到单独恢复一张或几张表的情况,而以上这个脚本是按库进行备份的,最终文件个头很大,从中找某个表比较困难,于是有人实现了分表备份,但又带来了额外问题:备份时间和存储空间翻倍。我觉得可以克服困难利用分库备份的文件恢复某一张表,以下是思路:

以下是mysqldump备份一张表时记录的主要信息:
$ mysqldump -usystem -p123456 -S /data/mysqldata/3305/mysql.sock testdb t_idb1 > t_idb1.sql
$ cat t_idb1.sql
DROP TABLE IF EXISTS `t_idb1`;
CREATE TABLE `t_idb1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `v1` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_t` (`v1`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
LOCK TABLES `t_idb1` WRITE;
INSERT INTO `t_idb1` VALUES (1,'ABCASDF'),(3,'ABCASDF'),(6,'ABCASDF'),(7,'ABCASDF'),(2,'DBCASDF'),(4,'DBCASDF'),(8,'DBCASDF'),(5,'NHUDFG');
UNLOCK TABLES;
由于表结构在上面的脚本已经备份出来,同时查找也不困难,所以恢复某表时还需要的主要信息是insert语句,可以通过以下方式把insert语句找出来,放到一个文件中。

cat t_idb1.sql | grep "INSERT INTO \`t_idb1\`" > t_idb1_insert.sql 或
grep "INSERT INTO \`t_idb1\`" t_idb1.sql > t_idb1_insert.sql 

想在insert前后加上LOCK TABLES和UNLOCK TABLES语句的话,可以用以下命令:
sed -i '1i\LOCK TABLES \`t_idb1\` WRITE;'  t_idb1_insert.sql
echo "UNLOCK TABLES;" >> t_idb1_insert.sql

查看此时t_idb1_insert.sql 的内容:
$ cat t_idb1_insert.sql 
LOCK TABLES `t_idb1` WRITE;
INSERT INTO `t_idb1` VALUES (1,'ABCASDF'),(3,'ABCASDF'),(6,'ABCASDF'),(7,'ABCASDF'),(2,'DBCASDF'),(4,'DBCASDF'),(8,'DBCASDF'),(5,'NHUDFG');
UNLOCK TABLES;

如果没有t_idb1的表结构信息,可以在以上表结构备份的脚本文件中找到相应的建表语句,表结构有了后,可以执行插入恢复了:
mysql -usystem -p123456 -S /data/mysqldata/3305/mysql.sock testdb < t_idb1_insert.sql


我这里是用的cat把相应的insert信息找出来,不一定高效,用sed命令应该也可以(也许会更高效)。

后补充:
sed方式为:
sed -n "/INSERT INTO/p" jssdb_2015-11-22.sql > 1.sql
实测sed方式跟cat方式效率一样。
  评论这张
 
阅读(68)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017