前阵子想利用mysqldump导出某数据库部分表数据,遇到下面这几种情况。
1.只导出某几张表,可以添加--tables参数,后面接对应的表名就可以,如果多张表,以空格隔开。
mysqldump --single-transaction -hxxxxx -uxxxx -pxxxx -Pxxx --databases xxx \
--tables table1 table2 table3 --set-gtid-purged=OFF >> /temp.sql
2.只有几张表不导出,其他大部分表都导出,可以添加--ignore-table参数。
mysqldump --single-transaction -hxxxxx -uxxxx -pxxxx -Pxxx --databases xxx \
--ignore-table=table1 --ignore-table=table2 --ignore-table=table3 --set-gtid-purged=OFF >> /temp.sql
3.导出某张表,而这张表是作为100张分表在数据库中存储的,并且如果一次性导出这1001张分表,cpu占用率有很快达到100%,从而导致程序中断,并报错误mysqldump: Error 2013: Lost connection to MySQL。我也试过修改net_write_timeout等参数,但都无效,最后只得写了个shell脚本,分批导出。
#!/bin/bash
i=0
list=' '
for num in {0..7..1}
do
for tablename in `mysql -hxxxxx -uxxx -pxxxx --port=xxxx \
-Bse "show tables from xxx where tables_in_xxx like '%order%'"`
do
let k=$i%8
let i+=1
if [ $k == $num ]; then
list="$list $tablename"
else
continue
fi
done
echo $list
sleep 2
mysqldump --single-transaction -hxxxxx -uxxx -pxxxx -Pxxx --databases xxx \
--tables $list --set-gtid-purged=OFF >> /temp.sql
list=' '
done
exit
这里假设我这张分表的关键字是order,并将这100张分表平均分成8次导出,这个次数可以自己定,最终成功导出。