MySQL的数据备份(脚本)

@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
指定的字符集
加读锁

发布了57 篇原创文章 · 获赞 3 · 访问量 1006

猜你喜欢

转载自blog.csdn.net/weixin_42502744/article/details/103137500
今日推荐