背景
生产环境使用的宝塔面板,一般会使用自带的数据库备份功能,那个功能不能跳过一些不需要备份的表,数据量大起来之后,备份耗时增加影响业务。
脚本
#!/usr/bin/bash
#用户名
USER=test
#密码
PASSWORD='test'
#数据库名
DATABASE=test
#mysqldump
# --ignore-table : 备份中需要排除的表的表名,可以单个可以多个
DUMP="mysqldump --skip-opt --skip-lock-tables -q --single-transaction -u${USER} -p${PASSWORD} --ignore-table=${DATABASE}.table_a --ignore-table=${DATABASE}.table_b --ignore-table=${DATABASE}.table_c --databases ${DATABASE} "
#如果目录不存在则进行创建
BACKUP_DIR="/data/backup-cron/database"
if [ ! -d "${BACKUP_DIR}" ]; then
mkdir ${BACKUP_DIR} -p
fi
#执行备份
${DUMP} | gzip >${BACKUP_DIR}/${DATABASE}_$(date +%Y%m%d_%H%M%S).sql.gz
上面这个脚本可以正常备份数据库,但是运行后会有下面两个提示。
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
第一个提示可以通过在配置文件中增加 mysqldump
命令对应的用户名和密码去除。
第二个提示可以通过给当前用户授予 PROCESS
权限去除掉。
- 使用 root 用户登录数据库
- 执行如下命令,就可以了
GRANT PROCESS ON . TO ‘test‘@’localhost’;
FLUSH PRIVILEGES;
一般是选择备份 7 天的数据,可以配合一个磁盘清理脚本
#数据库备份文件定时清理(保留7天的备份)
find /data/backup-cron/database -mtime +7 -name "*.*" -exec rm -rf {} \;