1. 备份脚本
#!/bin/bash
# MySQL连接信息
DB_HOST="localhost"
DB_USERNAME="root"
DB_PASSWORD="password"
# 要备份的数据库名称
DATABASES=("database1" "database2")
# 备份文件存放路径
BACKUP_DIR="/path/to/backup/"
DATE=$(date +%Y-%m-%d)
TIMESTAMP=$(date +%H:%M:%S)
FILENAME="${BACKUP_DIR}/backup_${DATE}_${TIMESTAMP}.tar.gz"
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
for db in ${DATABASES[@]}; do
# 使用mysqldump命令进行备份,并重定向输出到tar压缩文件中
mysqldump --host=$DB_HOST --user=$DB_USERNAME --password=$DB_PASSWORD --default-character-set=utf8mb4 $db > "$BACKUP_DIR/$db.sql"
done
# 使用tar命令将每个数据库的备份文件压缩为一个tar.gz文件
tar -czvf "$FILENAME" -C "$BACKUP_DIR" *.sql
# 删除单个备份文件
rm -f "$BACKUP_DIR"/*.sql
echo "数据库备份完成!"
这个脚本将使用mysqldump命令备份每个数据库,并将结果保存为单独的SQL文件。然后,使用tar命令将这些文件压缩为一个.tar.gz格式的压缩文件。最后,删除备份的SQL文件,并输出提示消息“数据库备份完成”。
2. 清理脚本
#删除七天前备份,也就是只保存7天内的备份
#!/bin/bash
# 备份文件存放路径
BACKUP_DIR="/path/to/backup/"
find $BACKUP_DIR -name "*.tar.gz" -type f -mtime +7 | xargs -I {} rm -rf {}
3. 设置定时任务
1.输入 crontab -e 并按回车键,这会打开cron定时任务的配置文件。
2.在配置文件中,添加以下行来设置每天凌晨执行备份、清理脚本:
0 1 * * * /path/to/backup_script.sh
0 2 * * * /path/to/clean_script.sh
4. 可能遇到的问题
4.1 mysql部署在容器中
docker exec mysql sh -c 'exec mysqldump --host=$DB_HOST --user=$DB_USERNAME --password=$DB_PASSWORD --default-character-set=utf8mb4 $db' > "$BACKUP_DIR/$db.sql"
脚本通过如上命令进行备份无效,因为容器内读不到变量,可以将脚本放置容器内,或者建mysql的时候设置env
4.2 导出的sql文件存在乱码
这个可能和服务器及文件的字符集有关。
实践过程中我遇到cat中文显示正常,vim中文显示异常的现象,通过vim中的set fileencoding 查看文件编码,异常的sql文件编码为latin1,通过:set fileencoding=utf-8转换仍是显示异常?并且导出多个库只有一个sql文件存在这种问题?求指教
vim编码方面的基础知识:
存在3个变量:
encoding—-该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本文件等等。你可以把 ‘encoding’ 选项当作是对 Vim 内部运行机制的设定。
fileencoding—-该选项是vim写入文件时采用的编码类型。
termencoding—-该选项代表输出到客户终端(Term)采用的编码类型。
此3个变量的默认值:
encoding—与系统当前locale相同,所以编辑文件的时候要考虑当前locale,否则要设置的东西就比较多了。
fileencoding—vim打开文件时自动辨认其编码,fileencoding就为辨认的值。如果fileencoding为空则保存文件时采用encoding的编码,如果没有修改encoding,那值就是系统当前locale了。
termencoding—默认空值,也就是输出到终端时不进行编码转换。
4.3 source导入乱码
登录时候加上编码
mysql --host=$DB_HOST --user=$DB_USERNAME --password=$DB_PASSWORD --default-character-set=utf8mb4
4.4 高版本mysqldump导出低版本mysql数据报错
出现如下报错信息:
Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
这是由于在mysqldump 8中默认启用了一个新标志,
可以通过添加--column-statistics=0 来禁用它
4.5 crontab不生效
现象:手动执行命令可以成功,cron定时任务发现失败
原因:传入了一个日期参数$(date +%Y%m%d),但是 %在crontab文件里是个特殊符号,相当于回车,因此命令不能正常执行
解决:在%前加上反斜杠\,进行转义就可以了
另外cron执行docker失败是可能因为exec加了-it参数