首页 > 数据库 >cover MySQL三部曲备份【逻辑备份+物理备份】脚本,生产实践

cover MySQL三部曲备份【逻辑备份+物理备份】脚本,生产实践

时间:2024-09-19 19:20:24浏览次数:14  
标签:-- 备份 mysql cover MySQL DATE home LOGFILE

前言:

  • 逻辑备份[mysqldump]
  • 物理备份[Xtrbackup]

1、mysqldump全备

建议手动制定库,不要选择–all ,容易在数据恢复时发生问题

  • –set-gtid-purged=OFF 选项,在备份时会记录binlog日志,如果不加,不记录binlog日志,所以在我们做主从用了gtid时,用mysqldump备份时就要加–set-gtid-purged=OFF,否则你在主上导入恢复了数据,主没有了binlog日志,同步则不会被同步。
  • –routines 用于在MySQL数据库备份时包含存储过程(Stored Procedures)和存储函数(Stored Functions)。
  • –master-data 选项,如果,遇到需要恢复从库的场景,需要使用 --master-data选项,参数会自动在导出的SQL文件中插入一个特殊的注释或者命令(CHANGE MASTER TO)。这个命令包含了备份时刻主服务器的二进制日志文件名(LOG_FILE)和位置(LOG_POS)。
  • --single-transaction 选项,数据一致性:通过使用事务,--single-transaction 确保备份在整个过程中看到的数据是一致的。这意味着备份的数据不会被插入、更新或删除操作影响,从而避免了在备份过程中数据的不一致性问题;非锁定:与 --lock-tables 参数不同,--single-transaction 不会锁定数据库表,而是通过事务隔离来保证数据的一致性。这有助于减少对数据库的锁定,允许读写操作继续进行,不会对数据库的正常使用产生过多影响。
  • –force 或者 -f , 忽略错误并继续备份表或数据库。

:::danger
备份前准备:需要创建一个.my.cnf 配置文件用来指定备份用户

:::

vim /home/.my.cnf
[mysqldump]
host=localhost
user=root
password='passwd'
 
[mysql]
host=localhost
user=root
password='passwd'

1.1通用备份脚本:

  • 找出需要备份的数据库
  • 配置备份数据路径
  • 配置备份数据需要保留的天数
[root@localhost bak]# cat /home/application/mysql/bak/back_full.sh
#!/bin/bash
source /etc/profile
DATE=`date '+%Y%m%d_%H%M'`
MYSQLDIR=/home/application/mysql/app/bin
BACKUP_PATH=/home/application/mysql/bak/backup_full



#找出需要备份的库名
name=`${MYSQLDIR}/mysql --defaults-extra-file=/home/.my.cnf -e "show databases;" | grep -Ev "^(Database|sys|information_schema|mysql|performance_schema)$" | tr "\n"  " "`
 
#备份数据,加上存储过程
${MYSQLDIR}/mysqldump --defaults-extra-file=/home/.my.cnf --routines --set-gtid-purged=OFF --single-transaction --databases $name > ${BACKUP_PATH}/full_${DATE}.sql 2>&1

# 使用 zip 压缩备份文件
cd ${BACKUP_PATH}
/usr/bin/zip full_${DATE}.sql.zip full_${DATE}.sql
rm ${BACKUP_PATH}/full_${DATE}.sql

#删除30天之前的备份
/usr/bin/find ${BACKUP_PATH} -name "full_*" -ctime +30 | xargs rm -rf

1.2 主从恢复备份脚本:

恢复步骤大致如下:

  1. mysqldump 备份主库数据,加上–master-data选项
  2. 登录从库,停止 主从同步,stop slave;
  3. source XXX.sql; 恢复数据
  4. start slave; 启动主从同步
  5. show slave status\G; 查看主从同步状态
  6. 查看主库 和 从库的 数据库 数量是否一致!!!

#找出需要备份的库名
name=`/home/application/mysql/app/bin/mysql --defaults-extra-file=/home/.my.cnf -e "show databases;" | grep -Ev "^(Database|sys|information_schema|mysql|performance_schema)$" | tr "\n"  " "`

#备份数据,加上存储过程,加上备份时刻主服务器的二进制日志文件名(LOG_FILE)和位置(LOG_POS)。
/home/application/mysql/app/bin/mysqldump --defaults-extra-file=/home/.my.cnf --master-data --routines --set-gtid-purged=OFF --single-transaction --databases $name > /home/application/mysql/bak/full_bak/full_`date +"%F"`.sql 2>&1

2、mysqldump分库备份

:::danger
备份前准备:需要创建一个.my.cnf 配置文件用来指定备份用户

:::

vim /home/.my.cnf

[mysqldump]
host=localhost
user=root
password='passwd'
 
[mysql]
host=localhost
user=root
password='passwd'

2.1 通用备份脚本:

  • 找出需要备份的数据库
  • 配置备份数据路径
  • 配置备份数据需要保留的天数
#!/bin/bash
source /etc/profile
DATE=$(date '+%Y%m%d-%H%M')
MYSQL_DIR=/home/application/mysql/app/bin
BACKUP_DIR=/home/application/mysql/bak/backup_fenku
BACKUP_DIR_DATE=${BACKUP_DIR}/${DATE}
LOGFILE=${BACKUP_DIR}/data_backup.log

# Ensure backup and log directories exist
mkdir -p "${BACKUP_DIR_DATE}"

# Initialize log file
echo " " >> $LOGFILE
echo " " >> $LOGFILE
echo "-----------------" >> $LOGFILE
echo "BACKUP DATE: $(date +"%Y-%m-%d %H:%M:%S")" >> $LOGFILE
echo "-----------------" >> $LOGFILE

# Retrieve databases to backup
databases=`$MYSQL_DIR/mysql --defaults-extra-file=/home/.my.cnf -e "show databases;" | grep -Ev "^(Database|sys|information_schema|mysql|performance_schema)$" | tr "\n"  " "`

backup_success=true

for dbname in ${databases}
do
  TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
  echo "Starting backup for database $dbname at $TIMESTAMP" >> $LOGFILE
  
   $MYSQL_DIR/mysqldump --defaults-extra-file=/home/.my.cnf --routines --set-gtid-purged=OFF --single-transaction -f -B $dbname > ${BACKUP_DIR_DATE}/${dbname}_${DATE}.sql 2>> $LOGFILE

  if [[ $? != 0 ]]; then
    echo "Backup of database $dbname failed at $TIMESTAMP!" >> $LOGFILE
    backup_success=false
  else
    echo "Backup of database $dbname completed successfully at $TIMESTAMP" >> $LOGFILE
  fi
  
  echo "-----------------" >> $LOGFILE
done

if [[ $backup_success == true ]]; then
  echo "All backups completed successfully!" >> $LOGFILE
else
  echo "One or more database backups failed!" >> $LOGFILE
fi

echo "-----------------" >> $LOGFILE

# Compress backup directory (Uncomment if needed)
cd ${BACKUP_DIR}
zip -r ${DATE}.zip ${DATE}
rm -r ${DATE}

# Delete backups older than 30 days (Uncomment if needed)
/usr/bin/find ${BACKUP_DIR}/ -ctime +30 -exec rm -rf {} \;

3、Xtrbackup备份

备注: --include 指定需要备份的数据库,多个用’|‘隔开,比如’srebro_auth|srebro_base|srebro_alarm’

[root@master ~]# vim /home/data/backup/xtrbackup_full.sh
#!/bin/bash
#Author: srebro.cn
####################################################
##
## xtrabackup script
##      backup data at remote host
##      you should config ssh trust
##
## Usage:
##   1.You must check and modify the variable
##     in variable section
##
##
####################################################
 
 
MSNAME=yz
BAKDIR=/home/data/backup/xtrbackup
BAKFILE=$MSNAME-`date +%Y%m%d%H%M`
LOGFILE=$MSNAME-`date +%Y%m%d%H%M`.log
ROOTPWD=r123d$&*#!
[email protected]
REMOTE_BAKDIR=/data/xtrbackup
MYCNF=/etc/my.cnf
 
 
 
/usr/bin/innobackupex --defaults-file=$MYCNF --user=root --password=$ROOTPWD --host=127.0.0.1 \
--lock-wait-threshold=40 --lock-wait-query-type=all --lock-wait-timeout=180 --kill-long-queries-timeout=20 --kill-long-query-type=all \
--stream=tar $BAKDIR 2>$BAKDIR/$LOGFILE | ssh $REMOTE_HOST  "cat - > $REMOTE_BAKDIR/$BAKFILE.tar"
 
 
# check backup log
CHECKOK=`tail -1 $BAKDIR/$LOGFILE | grep "completed OK\!" | wc -l`
if [ $CHECKOK -ne 1 ]
then
  echo "[ WARNING ] Backup failed!"
  exit
fi
 
 
# clean backup piece, delete 3 day before
ssh $REMOTE_HOST "find $REMOTE_BAKDIR/$MSNAME* -mtime +30 -type f -maxdepth 1 | xargs rm -rf {}"

标签:--,备份,mysql,cover,MySQL,DATE,home,LOGFILE
From: https://blog.csdn.net/weixin_38299857/article/details/142367956

相关文章

  • 基于SpringBoot+Vue+MySQL的智能物流管理系统
    系统展示系统背景  随着信息技术的飞速发展和电子商务的蓬勃兴起,智能物流管理系统的需求日益迫切。传统的物流管理方式已难以满足高效、精准、实时的管理需求。因此,基于SpringBoot、Vue和MySQL的智能物流管理系统应运而生。该系统旨在通过现代化的技术手段,实现物......
  • 2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;
    MySQL多表操作1多表关系简介1.1一对一关系比如1.2一对多/多对一关系比如:实现规则:1.3多对多关系举例:规则:2.多表联合查询简介多表查询有以下分类知识补充——笛卡尔积(了解即可)交叉连接查询[产生笛卡尔积]内连接查询(使用的关键字innerjoin--inner可以省......
  • 支持 128TB 超大存储,GaussDB (for MySQL) 如何轻松应对海量数据挑战
    本文分享自华为云社区《【选择GaussDB(forMySQL)的十大理由】之二:128TB超大存储》,作者:GaussDB数据库。大数据时代的挑战随着互联网、大数据等行业的迅猛发展,企业的数据流量呈现爆炸式增长,数据库作为数据存储的核心,其承载的数据量越来越大。近十年,企业数据量从GB发展到TB,甚......
  • mysql 将A库的表名和表字段注释,迁移到另外一个库中,生成alter 语句
    表备注--获取用于添加表备注的SQL语句SELECTCONCAT('ALTERTABLE目标数据库名.',TABLE_NAME,'COMMENT=\'',TABLE_COMMENT,'\';')ASalter_table_comment_sqlFROMINFORMATION_SCHEMA.TABLESWHERETABLE_SCHEMA='......
  • MySQL零基础入门教程-1 mysql安装卸载、启动关闭、常用命令、sql语句分类(非常详细),基础
    教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我自己听讲收集整理的课程的完整笔记,供大家学习交流吧:夸克网盘分享本文内容为完整笔记的第一篇一、数据库概述1、什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?P1、P2数据库英文单词DataBase,简称DB,......
  • 支持128TB超大存储,GaussDB(for MySQL)如何轻松应对海量数据挑战
    摘要:华为云数据库GaussDB(forMySQL)基于华为最新一代DFV存储,采用计算存储分离架构,最多支持128TB的海量存储。本文分享自华为云社区《【选择GaussDB(forMySQL)的十大理由】之二:128TB超大存储》,作者:GaussDB数据库。大数据时代的挑战随着互联网、大数据等行业的迅猛发展,企业的数据......
  • 2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单
    目录1MySQL数据库基本操作-DQL-基本查询1.2SQL概述1.3SQL类2.SQL语言的规则与规范2.1基本规则2.2SQL大小写规范推荐采用统一的书写规范:2.3注释2.4命名规则(了解即可)举例:两句是一样的,不区分大小写创建表格order使用``飘号,因为order和系统关键字或系统函数名......
  • 从源码角度,深度解读 MySQL 优化器的 GROUP BY 优化策略
    本文分享自华为云社区《【华为云MySQL技术专栏】MySQL优化器中GROUPBY优化策略介绍》,作者:GaussDB数据库。1.背景介绍在MySQL中,GROUPBY功能至关重要,它允许用户依据一个或多个列的值对结果集进行分组,通常与聚合函数(如COUNT,SUM,AVG等)结合使用。在日常查询中,包含GROUP......
  • 2024Mysql And Redis基础与进阶操作系列(4)作者——LJS[含MySQL FOREIGN KEY、CHECK 、D
    接上集1.FOREIGNKEY约束1.1作用限定某个表的某个字段的引用完整性。例如:员工表的员工所在部门的选择,必须在部门表能找到对应的部分。1.2关键字FOREIGNKEY1.3主表和从表/父表和子表主表(父表):被引用的表,被参考的表从表(子表):引用别人的表,参考别人的表例如:员工表的员工所在部门这......
  • mysql事务隔离级别和spring事务传播机制
    一、事务并发会出现的三个问题数据库事务具有ACID4个特性:A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;I:Isolation,隔离性,如果有多个事务并发执行,每个......