MySQL备份时排除指定数据库或表的方法
在进行 MySQL 备份时,若需跳过特定数据库(如 system schemas)或排除某个库内的部分无关表,手动编写 --databases 列表十分繁琐。本文将演示如何通过命令行管道快速生成包含所有有效库的转储文件,以及如何通过 Shell 脚本灵活控制备份粒度。
动态备份全库并排除特定数据库
使用 mysqldump 时,--all-databases 会备份所有数据,而 --ignore-table 仅能排除具体表,无法直接排除整个数据库。面对数十个数据库实例,逐个列举既低效又容易出错。
我们可以通过组合 SQL 查询命令与 Linux 文本处理工具来自动提取待备份的数据库名,从而构建一条高效的备份指令。基本逻辑如下:
- 获取库名列表:使用
mysql -e 'show databases;'获取当前所有数据库名称。 - 过滤无关库:使用
grep剔除不需要的库(如information_schema,mysql,test等)。注意需同时过滤掉输出头部的 “Database” 字样。 - 拼接 mysqldump 参数:将过滤后的库名单传递给
xargs,追加到--databases参数后执行 dump。
适用于大多数场景的基础命令如下:
mysql -uroot -pPASSWORD -e 'show databases;' | \
grep -E -v "Database|information_schema|mysql|test" | \
xargs mysqldump -uroot -pPASSWORD --databases > all_backup.sql
第1步:处理 performance_schema 兼容性问题
在 MySQL 5.5 及以上版本中,performance_schema 库可能会导致 xargs 拼接时的语法异常,或者由于该库体积庞大且无需备份。建议将其加入黑名单:
- 方法一:在 mysqldump 阶段跳过
# 先列出所有非关键库,再通过 --skip-lock-tables 显式包含 performance_schema 但通常建议直接排除
grep -E -v "Database|information_schema|mysql|test" ...
# 或者直接再次 grep 移除 performance_schema
推荐使用更简洁的 方法二:直接从列表中过滤掉 performance_schema:
mysql -uroot -pPASSWORD -e 'show databases;' | \
grep -E -v "Database|information_schema|mysql|test|performance_schema" | \
xargs mysqldump -uroot -pPASSWORD --databases > full_backup.sql
该命令会生成一个不包含被屏蔽库的完整 SQL 转储文件。

按表级别排除指定表格
如果目标是一个单独的数据库,但其中某些日志表或临时表不需要备份,可以通过遍历该库下的表名来实现有条件导出。
第1步:准备环境
- 操作目的:确定需要忽略的具体表名集合。
- 示例场景:假设在
spservice库中,需要排除mo_log,mt_log,report_info三个表。
第2步:编写过滤循环脚本
以下脚本展示了两种排除策略。第一种是硬编码排除列表,第二种是将需要排除的表名作为参数传入。
#!/bin/sh
# 定义要排除的表列表,这里通过命令行参数 $@ 传入
# 用法: sh exclude.sh mo_log mt_log report_info
for j in $(mysql -uroot -e "USE spservice; SHOW TABLES" | grep -v Tables); do
# 检查当前表是否在排除列表中
# 如果不在排除列表中(grep 找不到),则执行 dump
echo "$@" | grep -wq "$j"
if [ $? -ne 0 ]; then
mysqldump -uroot --default-character-set=utf8mb4 spservice $j >> ${j}.sql
fi
done
注意事项:
- 字符集建议根据实际数据库配置调整(如
utf8mb4)。 - 此方法为逐表导出,文件较多;若只需合并为一个文件,可去掉
>>重定向中的文件名部分,直接追加到一个总文件中。
自动化日常备份实战
结合上述思路,可以编写一个简单的生产用备份脚本。此脚本每日执行,包含数据库全量导出及配置文件备份,并通过邮件通知。
#!/bin/bash
# Description: backup mysql data
FILE="mysql_$(date +%F)"
BACKDIR="/mysqlbackup"
CONF_FILE="/etc/my.cnf"
# 1. 执行备份,排除系统库
mysql -uroot -e 'show databases' | egrep -v "Database|information_schema|performance_schema" \
| xargs mysqldump -uroot --databases > $BACKDIR/$FILE.sql
# 2. 备份配置文件
[[ -f $CONF_FILE ]] && cp $CONF_FILE $BACKDIR/$FILE.cnf
# 3. 发送完成通知
echo "Machine: ServerHost\nIP: 172.16.10.12\nStatus: Backup completed successfully" | \
mail -s "MySQL BackUP Complete" admin@example.com
exit 0
将此脚本保存至 /etc/cron.daily/mysql-backup 或通过 cron 设置定时任务,即可实现无人值守的增量/全量保障。
以上就是通过命令行管道高效备份 MySQL 及排除指定内容的详细内容,更多关于 MySQL 运维备份的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













