目前生产环境还有部分小规模的MySQL实例用的是mysqldump逻辑备份方式,这种对于要恢复某个指定的表稍微有点费事,可以使用下面的方法。
step1 提取表结构
sed -n '/^-- Table structure for table `表名`/,/^-- Dumping data for table/p' 备份文件.sql > 表名_struct.sql
step2 提取insert语句
下面提供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
可以找个生产备份数据测试下,如下
#!/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 删除。