Mysqldump是安装mysql的时候自带的,但是只能逻辑备份,还是存在着备份的时候会被插入新的数据,貌似会自动锁表?但是又有人说不能开启这个权限,会导致出问题,待研究。。
我是Docker安装了MySqL5.7,然后宿主机是没安装的,本来是想在容器里面备份好以后放在映射的路径下,但是想想太麻烦还是宿主机安装一个相同版本的Mysql,然后不要启动就好了。
以下是我备份的脚本,其中账号密码我放在了/etc/my.cnf里面了。这样子就不会报下面这个警告了,因为账号等私密信息放在脚本里面还是挺不安全的。
mysqldump: [Warning] Using a password on the command line interface can be insecure.
这个脚本会在BACKUP_PATH路径存储备份,然后会自动清除7天以前的文件。
注意,这里是判断要清除的文件是根据修改时间,而不是文件名。
脚本还有很多小bug,比如就算出现错误也会进行下一步,懒得改了。
#!/bin/bash
# 定义备份的数据库名、用户名、密码,备份文件存放路径等变量
DATABASE="lchs"
BACKUP_PATH="/pathTo/backupData/mysql"
# 定义要删除多少天以前的备份文件
DAYS_TO_KEEP=7
# 生成备份文件名,格式为 "dbname_YYYYmmdd_HHMMSS.sql.gz"
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$DATABASE"_"$DATE".sql.gz
# 输出备份开始信息
echo "Starting backup of database $DATABASE at $(date +"%Y/%m/%d %H:%M:%S")"
# 备份 MySQL 数据库
# mysqldump -h "$HOST" -u "$USER" -p"$PASSWORD" "$DATABASE" | gzip > "$BACKUP_PATH/$BACKUP_FILE"
mysqldump "$DATABASE" | gzip > "$BACKUP_PATH/$BACKUP_FILE"
# 输出备份完成信息
echo "Backup of database $DATABASE completed at $(date +"%Y/%m/%d %H:%M:%S")"
# 查找 n 天前的备份文件
# -mtime指的是文件的修改时间
echo "Finding backups older than $DAYS_TO_KEEP days..."
FILES_TO_DELETE=$(find "$BACKUP_PATH" -maxdepth 1 -type f -name "lchs_*.sql.gz" -mtime +$DAYS_TO_KEEP)
# 输出要删除的备份文件列表
echo "The backup files to delete:"
echo "$FILES_TO_DELETE"
# 逐个删除备份文件
for file in $FILES_TO_DELETE; do
echo "Deleting $file"
rm "$file"
done
# 输出备份文件清理完成信息
echo "Backup files older than $DAYS_TO_KEEP days removed"
在/etc/my.cnf里面添加上下面的代码,改动相对应信息的即可。
[mysqldump]
host=yourhost
user=youruser
password='你的密码'
建议建立一个备份账号,给以下这些权限就可以了
在使用 mysqldump 工具备份 MySQL 数据库时,需要使用一个 MySQL 账号,该账号需要具备以下权限:
- SELECT,读取数据库表的权限。
- LOCK TABLES,锁定数据库表的权限,以避免备份时出现并发问题。
- SHOW VIEW,查看视图的权限。
- RELOAD,重新加载 MySQL 权限表的权限。
- EVENT,创建和修改触发器的权限。
- TRIGGER,创建和修改事件的权限。
- CREATE ROUTINE,创建和修改存储过程和函数的权限。
- CREATE VIEW,创建和修改视图的权限。
注意,如果要备份所有数据库,则该账号需要具备所有数据库的权限。