mysql备份恢复云端之核心:更新扫描MySQL库里的所有表的UPDATE_TIME,若发生变动就mysqldump
背景
#!/bin/bash # MySQL连接信息 MYSQL_USER="root" MYSQL_PASSWORD="123!" MYSQL_DATABASE="dev_flow_table" # 记录上次查询的更新时间的文件 LAST_RESULT_FILE="last_result.txt" CURRENT_RESULT_FILE="current_result.txt" DUMP_FILE="database_dump.sql" # 初始化当前结果文件 > $CURRENT_RESULT_FILE # 如果上次检查时间文件不存在,则创建一个新的文件 if [ ! -f "$LAST_RESULT_FILE" ]; then touch "$LAST_RESULT_FILE" fi # 获取当前时间戳 CURRENT_TIME=$(date +%s) # 获取所有表名 TABLES=$(mysql -h 127.0.0.1 -u"$MYSQL_USER" --password="$MYSQL_PASSWORD" -D "$MYSQL_DATABASE" -e "SHOW TABLES;" 2>/dev/null | tail -n +2) # 遍历每个表 for TABLE in $TABLES; do echo "check Table $TABLE" # 获取表的最近更新时间 mysql -h 127.0.0.1 -u"$MYSQL_USER" --password="$MYSQL_PASSWORD" -D "$MYSQL_DATABASE" -e "ANALYZE TABLE $MYSQL_DATABASE.$TABLE ;" >/dev/null 2>&1 UPDATE_TIME=$(mysql -h 127.0.0.1 -u"$MYSQL_USER" --password="$MYSQL_PASSWORD" -D "$MYSQL_DATABASE" -e "SELECT UPDATE_TIME FROM information_schema.TABLES WHERE TABLE_SCHEMA='$MYSQL_DATABASE' AND TABLE_NAME='$TABLE';" 2>/dev/null | tail -n +2) # 从上次查询的更新时间文件中读取上次更新时间 LAST_UPDATE_TIME=$(grep "^$TABLE " "$LAST_RESULT_FILE" | awk -F ' ' '{print $2}') # 如果表的更新时间大于上次查询的更新时间,则备份数据 if [ "$UPDATE_TIME" != "$LAST_UPDATE_TIME" ]; then echo "Table $TABLE has been updated. $LAST_UPDATE_TIME to $UPDATE_TIME Performing backup....................." # 更新上次查询的更新时间文件(追加方式) # echo "$TABLE $UPDATE_TIME" >> "$CURRENT_RESULT_FILE" fi # 记录 之后对比用 echo "$TABLE $UPDATE_TIME" >> "$CURRENT_RESULT_FILE" done # 比较当前结果和上次结果 if ! cmp -s $CURRENT_RESULT_FILE $LAST_RESULT_FILE; then # 结果不同,执行 mysqldump # mysqldump -u$DB_USER --password=$DB_PASSWORD $DB_NAME 2>/dev/null > $DUMP_FILE echo "Database dumped to $DUMP_FILE" # 更新上次结果文件 cp $CURRENT_RESULT_FILE $LAST_RESULT_FILE else echo "No changes detected." fi # 清理当前结果文件 # rm $CURRENT_RESULT_FILE echo "Table update check and backup process completed."