admin管理员组文章数量:1037775
从mysqldump中提取某个表的备份的方法
目前生产环境还有部分小规模的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快很多
从mysqldump中提取某个表的备份的方法
目前生产环境还有部分小规模的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快很多
本文标签: 从mysqldump中提取某个表的备份的方法
版权声明:本文标题:从mysqldump中提取某个表的备份的方法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748261588a2276807.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论