@TOC
mysql的数据备份
操作前的准备:
在mysql端安装软件:(为了脚本中的命令做准备)
nfs-utils
epel-release
sshpass
远程主机不建议使用默认的ssh 22端口,修改成大于5位数的端口号,并做好记录.
先准备NFS服务器
本地的另一台主机做NFS (172.16.14.8)
[root@backup ~]# yum install -y nfs-utils
[root@backup ~]# fdisk /dev/sda
[root@backup ~]# partx -a /dev/sda # 添加一个硬盘,是sdb
分区,如果空间不够,增加一个硬盘sdb
[root@backup ~]# pvcreate /dev/sda3 # sdb创建pv分区
[root@backup ~]# vgcreate vgmysql /dev/sda3 # sdb创建vg分区
[root@backup ~]# lvcreate -L 10G -n lvmysql vgmysql # sdb创建10G的lv分区
[root@backup ~]# mkfs.xfs /dev/vgmysql/lvmysql # sdb的文件格式
[root@backup ~]# mkdir -p /backup/51-mysql # 创建一个备份用的文件夹
[root@backup ~]# vim /etc/fstab # 编辑自动挂在的目录
/dev/mapper/vgmysql-lvmysql /backup/51-mysql xfs defaults 0 0
[root@backup ~]# mount -a # mount -a 是自动挂载 /etc/fstab 里面的东西
[root@backup ~]# df -h | tail -1 # 查看挂在明细是否有自动挂载的分区
/dev/mapper/vgmysql-lvmysql 10G 33M 10G 1% /backup/51-mysql
[root@backup ~]# vim /etc/exports # 编辑自动挂在的文件夹属性,172.16.14.2对应mysql的服务器地址
/backup/51-mysql 172.16.14.2(rw,sync,no_root_squash)
[root@backup ~]# systemctl restart nfs # 启动nfs服务
[root@backup ~]# systemctl enable nfs # 设置开机启动服务
mysql端操作
[root@mysql-bin ~]# yum install -y nfs-utils # 安装nfs-utils,为了有showmount命令
[root@mysql-bin ~]# showmount -e 172.16.14.8 # 查看nfs服务是否启动
Export list for 172.16.14.8: # nfs服务器ip
/backup/51-mysql 172.16.14.2 # mysql ip地址
搭建完成
远程主机的要求
远程主机必须将主机和防火墙的ip进行绑定,使用外网ip,主机用户名,密码,端口,就可以连接
MySQL服务端开始备份
set -x 调试脚本,可以加在开头,然后运行脚本
mysql (172.16.14.2)
实现本地备份,(本机存储,NFS存储)
要求:使用nfs服务之前需要安装 nfs
#!/bin/bash
# mysql的备份脚本
local_backup_dir="/mysql_backup" # /mysql_backup mysql的备份路径(mysql端)
nfs_mount_dir="/nfs_backup" # /nfs_backup mysql上,挂在nfs的文件夹(mysql端)
nfs_server_ip="172.16.14.8" # nfs-server的ip
nfs_backup_dir="/backup/51-mysql" # 51是对应mysql那端的ip建立的挂载目录
DATE=$(date "+%Y%m%d") # 设置日期变量,方便下边给备份的文件命名
# 1.本地备份
if [ ! -d ${local_backup_dir} ] # 检查mysql本地的备份路径是否存在,如果不存在就创建
then
mkdir ${local_backup_dir} # 创建备份路径
fi
# 开始备份db2 到备份路径/文件名
mysqldump -u root -p12345 db2 > ${local_backup_dir}/${DATE}-db2.sql 2> /dev/null # --set-gtid-purged=OFF 如果有gtid,需要在库名前添加选项--set-gtid-purged=OFF
# 开始备份全库 到备份路径/文件名
mysqldump -u root -p12345 --all-databases > ${local_backup_dir}/${DATE}-all.sql 2> /dev/null
# 压缩备份文件
cd ${local_backup_dir} # 进入备份路径
xz ${DATE}-db2.sql # 压缩
xz ${DATE}-all.sql
find /mysql_backup -mtime +7 -name "*.xz" -type f -exec rm -f {} \; # mtime+7表示7天前的 name xz后缀 -type f 指定文件为普通文件 -exec 静默执行
# 2.同机房异地备份
if [ ! -d ${nfs_mount_dir} ] # 检查mysql对应nfs的挂在目录是否存在,不存在就创建
then
mkdir ${nfs_mount_dir} # 创建挂在目录
fi
mount ${nfs_server_ip}:${nfs_backup_dir} ${nfs_mount_dir} # 挂在nfs共享目录到本地nfs目录
if [ $? -eq 0 ] # 如果操作成功
then
/bin/cp ${local_backup_dir}/${DATE}-db2.sql.xz ${nfs_mount_dir} #/bin/cp 可以不提示是否覆盖,直接操作拷贝文件
/bin/cp ${local_backup_dir}/${DATE}-all.sql.xz ${nfs_mount_dir}
fi
find /nfs_backup -mtime +7 -name "*.xz" -type f -exec rm -f {} \;
# 3.跨机房异地备份
ssh_server_ip="172.16.14.8" # 这里暂时把nfs当做远程主机进行访问
ssh_backup_dir="/tmp"
user="root" # 远程主机的用户
pass="123" # 远程主机的密码
port="13579" # 远程主机的端口号
sshpass -p $pass scp -P $port -o StrictHostkeyChecking=no ${local_backup_dir}/${DATE}-* ${user}@${ssh_server_ip}:${ssh_backup_dir}
设置计划任务–自动执行脚本
备份文件保存几天?
7天
find /mysql_backup -mtime +7 -name “.xz" -type f -exec rm -f {} ;
find /nfs_backup -mtime +7 -name ".xz” -type f -exec rm -f {} ;
计划任务:★★★★★
每天凌晨2:30 跑脚本。
30 2 * * * /root/mysql_backup.sh
[root@backup ~]# crontab -e
30 2 * * * /root/mysql_backup.sh
查看计划任务列表:
[root@backup ~]# crontab -l
参考
备份gtid模式的mysql
加选项 --set-gtid-purged=OFF
指定的字符集
加读锁
来源:CSDN
作者:Yeoman_Wayne
链接:https://blog.csdn.net/weixin_42502744/article/details/103137500