前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >从mysqldump中提取某个表的备份的方法

从mysqldump中提取某个表的备份的方法

原创
作者头像
保持热爱奔赴山海
发布2025-03-17 09:42:45
发布2025-03-17 09:42:45
840
举报
文章被收录于专栏:数据库相关数据库相关

目前生产环境还有部分小规模的MySQL实例用的是mysqldump逻辑备份方式,这种对于要恢复某个指定的表稍微有点费事,可以使用下面的方法。

step1 提取表结构

代码语言:txt
复制
sed -n '/^-- Table structure for table `表名`/,/^-- Dumping data for table/p' 备份文件.sql > 表名_struct.sql

step2 提取insert语句

代码语言:txt
复制
下面提供3种方法,适用于不同的数据量场景
方法1、备份文件比较小的话,可以直接grep
grep -i 'INSERT INTO `表名`' 备份文件.sql >> 表名_data.sql

方法2、备份文件比较大(几十GB),建议先split拆分下
split -l 10000 备份文件.sql split_

for file in split_*; do
	grep -i 'INSERT INTO `表名`' $file >> 表名_data.sql
done

方法3:
split出的文件比较多,for循环太慢了,用find并行执行grep操作(这里的-P 10使用10个并发,具体需要根据split切分的文件的数量)
find ./ -name "split_*" -print0 | xargs -0 -P 10 -I {} grep "INSERT INTO \`表名\`" {}  >> 表名_data.sql

可以找个生产备份数据测试下,如下

代码语言:bash
复制
#!/bin/bash

echo '----------- 方案1 ------------------------'
echo `date`
grep -i 'INSERT INTO `core_user`' test.sql >> tb_data_1.sql
echo `date`

echo '-----------------------------------'

echo '--------- 方案2和3的 公共的split步骤 ----------------'
rm -f split_*
echo `date`
split -l 500 test.sql split_
echo `date`


echo '-----------------方案2 ------------------'
echo `date`
for file in split_*; do
    grep -i 'INSERT INTO `core_user`' $file >> tb_data_2.sql
done
echo `date`

echo '----------------- 方案3 ------------------'
echo `date`
find ./ -name "split_*" -print0 | xargs -0 -P 4 -I {} grep "INSERT INTO \`core_user\`" {}  >> tb_data_3.sql
echo `date`

可以看到方案3比起2快很多

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档