前陣子想利用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次導出,這個次數可以自己定,最終成功導出。