一、MySQL数据备份

Linux环境:Ubuntu 20.04.6,MySQL版本:8.2,在服务器端操作

1. MySQL客户端

mkdir -p /home/backup/mysql && cd /home/backup/mysql
mkdir day && mkdir week
sudo apt install mysql-client-core-8.0 # 备份需要
sudo apt install mysql-server-core-8.0 # 日志还原需要
  • 查询MySQL版本信息
mysqladmin -h127.0.0.1 -P3306 -uroot -p123456 version
  • 登录、查询log_bin是否开启(ON)、查询当前使用日志
mysql -h127.0.0.1 -P3306 -uroot -p123456
mysql> show variables like 'log_bin';
mysql> show master status;

2. 数据增量备份

  • backup.sh
#!/bin/bash
backupDir=/home/backup/mysql/day				# 增量备份目录
backupLogFile=$backupDir/backup.log				# 增量备份日志
mysqlDir=/home/mysql/data						# mysql-bin.*日志存放目录
binFile=/home/mysql/data/mysql-bin.index		# mysql-bin.index位置

mysqladmin -h127.0.0.1 -P3306 -uroot -p123456 flush-logs
echo `` >> $backupLogFile
echo `date +"%Y-%m-%d %H:%M:%S"` backup >> $backupLogFile
count=`wc -l $binFile |awk '{print $1}'`
num=0
for file in `cat $binFile`
do
    base=`basename $file`
    num=`expr $num + 1`
    if [ $num  -ne $count ] && (! test -e $backupDir/$base)
    then
		cp $mysqlDir/$base $backupDir
		echo $base >> $backupLogFile
	fi
done

3. 数据增量还原

  • 数据库客户端操作
mysql> flush logs;										# 刷新日志
mysql> show binlog events in 'mysql-bin.000023';		# 分析需要还原的日志数据
  • Shell环境操作
mysqlbinlog --stop-position=509 mysql-bin.000023 | mysql -h127.0.0.1 -P3306 -uroot -p123456
  • 参数说明
--start-position= 起始pos点
--stop-position= 结束pos点
--start-datetime= 起始时间点
--stop-datetime= 结束时间点
-d 指定数据库

4. 数据全量备份

  • backupAll.sh
#!/bin/bash
backupDir=/home/backup/mysql/week				# 备份目录
backupLogFile=$backupDir/backup.log				# 备份日志
dbName=manage									# 需要备份的数据库
day=3											# 保留几天的备份

mysqldump -h127.0.0.1 -P3306 -uroot -p123456 --single-transaction $dbName|gzip > $backupDir/$dbName-`date +%Y%m%d%H%M%S`.sql.gz
echo `` >> $backupLogFile
echo "backup $dbName-`date +%Y%m%d%H%M%S`.sql.gz" >> $backupLogFile

find $backupDir -type f -name "$dbName-*" -mtime +$day -exec rm {} \;

5. 数据全量还原

  • Shell环境操作
gzip -d 数据库名-20231211121350.sql.gz
mysql -h127.0.0.1 -P3306 -uroot -p123456
mysql> drop database 数据库名;
mysql> create database 数据库名;
mysql> use 数据库名;
mysql> source 数据库名-20231211121350.sql;

二、Minio数据备份

Linux环境:Ubuntu 20.04.6,Minio版本:2023-12-13T23-28-55Z,在服务器端操作

1. Minio客户端

mkdir -p /home/backup/minio && cd /home/backup/minio && mkdir day
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
  • 设置别名、查询桶
./mc alias set minio_backup http://127.0.0.1:9000 admin 123456
./mc ls minio_backup

2. 数据备份

  • backup.sh
#!/bin/bash
backupDir=/home/backup/minio/day				# 备份目录
backupLogFile=$backupDir/backup.log				# 备份日志
bucket=test										# 存储桶名称
directory=										# 存储桶中的目录, 例如 $(date +%Y%m), 空为桶
day=3											# 保留几天的备份
backupFile=$bucket$directory-$(date +%Y%m%d%H%M%S).tar.gz	# 备份文件名

mkdir $backupDir/tmp
/home/backup/minio/mc alias set minio_backup http://127.0.0.1:9000 admin 123456
/home/backup/minio/mc cp --recursive minio_backup/$bucket/$directory $backupDir/tmp

cd $backupDir/tmp
tar -zcf $backupDir/$backupFile *
rm -rf $backupDir/tmp
echo `` >> $backupLogFile
echo "backup $backupFile" >> $backupLogFile

find $backupDir -type f -name "$bucket$directory-*" -mtime +$day -exec rm {} \;

3. 数据还原

tar -xzvf 备份文件.tar.gz -C 数据文件夹
/home/backup/minio/mc cp --recursive 数据文件夹 minio_backup/桶或目录

三、其他参考

1. 设置定时备份

  • /etc/crontab
0 1 * * * root bash /home/backup/minio/backup.sh		# 每天1点执行
0 2 * * * root bash /home/backup/mysql/backup.sh   		# 每天2点执行
0 3 ** 1 root bash /home/backup/mysql/backupAll.sh		# 每周一3点执行
0 4 * * * root bash /home/backup/copyData.sh			# 每天4点执行
  • 使crontab生效
crontab /etc/crontab

2. 数据拷贝到其他服务器

  • 安装expect, 自动输入密码
sudo apt install expect
  • copyData.sh
#!/usr/bin/expect
# 只传输变化部分、支持断点续传、同步服务器都需要安装rsync

set timeout -1
spawn rsync -auxvLP  -e "ssh -p 22" /home/backup root@192.168.6.213:/home/
expect "*password*"
send "密码\r"
expect eof
  • 执行
expect copyData.sh

3. MySQL其他语句

show variables like 'long_query_time';		# 慢查询时间阈值
show variables like '%slow_query_log%';		# 慢查询是否开启
show global status like '%Slow_queries%'	# 查询慢查询记录条数
# 记录集最多的10个SQL
mysqldumpslow -s r -t 10 /home/mysql/data/0be775e9b5ed-slow.log | more
# 访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /home/mysql/data/0be775e9b5ed-slow.log | more
# 时间排序的前10个SQL
mysqldumpslow -s t -t 10 /home/mysql/data/0be775e9b5ed-slow.log | more
12-15 10:59