Mysql 全量增量备份教程及脚本(一)

Mysql 全量增量备份脚本记录

使用XtraBackup程序进行备份

centos8.0 与 rocky 9.0 安装XtraBackup

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

yum install -y percona-xtrabackup-80.x86_64
安装完成之后,如果数据库做了读写分离,以下操作就在从库操作,如果是单机则无所谓。

登录 mysql 数据库

创建备份用户
create user 'bkupuser'@'localhost' identified by '123';
grant backup_admin,process,reload,lock tables,replication client on *.* to 'bkupuser'@'localhost';
grant select on *.* to 'bkupuser'@'localhost';
flush privileges;
show grants for 'bkupuser'@'localhost';
准备工作:
备份目录创建:
### 全量目录
mkdir -p /data/backup/full  
### 第一次增量目录
mkdir -p /data/backup/inc1 
### 第二次增量目录
mkdir -p /data/backup/inc2
以此类推:也可以使用脚本创建以日期时间为目录等都可以,无规范。

接下来开始备份

一、先进行完整备份 (完整目录什么也没有,每次增量备份需要添加一些数据,以呈现效果)
xtrabackup --user=bkupuser --password=123 --backup --target-dir=/data/backup/full  

参数详解:
–user : 数据库用户
–password: 数据库密码
–backup: 创建备份
–target-dir :指定备份文件存放目录

执行结果为:
在这里插入图片描述

只要执行备份,或者恢复命令,日志最终结果都是OK,如有报错,会提示报错信息

添加测试数据
mysql -u root -p123
create database test;

在这里插入图片描述

添加了测试数据之后,在进行增量备份。
二、增量备份1,在全备的基础上
xtrabackup --user=bkupuser --password=123 --backup  \ 
 --incremental-basedir=/data/backup/full \ 
 --target-dir=/data/backup/inc1 

参数详解:
–incremental-basedir:
该选项表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录
说白了就是 指定上次完整备份或者增量备份文件的位置

添加测试数据
建表:
create table test.tb_name (
`id` int(11) NOT NULL,
`name` varchar(12)  COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
);
插入数据:
INSERT INTO test.tb_name (id,name) values (1,'yuhl');
INSERT INTO test.tb_name (id,name) values (2,'wang');
INSERT INTO test.tb_name (id,name) values (3,'er');
INSERT INTO test.tb_name (id,name) values (4,'ma');
INSERT INTO test.tb_name (id,name) values (5,'zi');
INSERT INTO test.tb_name (id,name) values (6,'zhangsan');

在这里插入图片描述

三、增量备份2,在增量备份1的基础上
xtrabackup --user=bkupuser --password=123 --backup \  
--incremental-basedir=/data/backup/inc1 \   
--target-dir=/data/backup/inc2
备份完成之后,测试效果。

场景:
删除数据库表内容,不小心误操作把test数据库删除了,里面数据什么也没了,需要找回。

在这里插入图片描述

开始恢复操作如下:
步骤:将增量备份1、增量备份2…合并到完整备份,加到一起出来一个新的完整备份,将新的完整备份恢复到数据库空目录
预备完整备份
xtrabackup --user=bkupuser -p'2023'  \ 
 --prepare --apply-log-only \  
 --target-dir=/data/backup/full 

参数注释:
–prepare :
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态,在准备增量备份时,必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,并且很可能会在下一次增量备份中提交
–apply-log-only:
在备份还在进行准备工作时,跳过消除(undo)阶段,只执行重做(redo)阶段,从而进行增量备份,通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。

######### 以上参数注释是网上查出来的 作者也不太理解,作者自己理解的是:如果要恢复数据,这两个参数要一起使用,直到最后一条增量无需增加 –apply-log-only,如果有更好的理解,欢迎留言

恢复增量备份1到全量数据
xtrabackup --user=bkupuser -p'2023' \   
--prepare --apply-log-only  \  
--target-dir=/data/backup/full  \ 
--incremental-dir=/data/backup/inc1

参数注释:
–incremental-dir 指向增量备份目录

恢复增量备份2到全量数据,

-######

#####重点:注意我这里没有加–apply-log-only 参数

xtrabackup --user=bkupuser -p'2023' \ 
 --prepare  \  
 --target-dir=/data/backup/full  \ 
 --incremental-dir=/data/backup/inc2

因为我只有一个全量,两个增量备份,上面提了,最后一个增量备份加到全量中时,不要加 --apply-log-only 。原因是:使最后一次备份数据中未完成的事务进行回滚,让数据统一。

如果最后一次合并添加了 --apply-log-only 参数
解决方法如下:
# 直接回滚操作,回滚未提交的事务: 回滚到第一次就可以了 
# 不要加 --apply-log-only 参数
xtrabackup --user=bkupuser -p'2023' --prepare  --target-dir=/data/backup/full 

回滚到第一次事务,不影响恢复数据,接着如下操作即可

准备恢复数据

1.停止数据库
./support-files/mysql.server stop
2.将原目录下的数据迁移干净
mkdir /data/mysqlbak
rm -rf /data/mysqlbak/*
mv /data/mysql/*  /data/mysqlbak
3.恢复备份
xtrabackup --user=bkupuser -p'2023' --copy-back  --target-dir=/data/backup/full/
4.赋权
chown -R mysql.mysql  /data/mysql/
5.启动数据库
./support-files/mysql.server start
6.查看数据是否恢复
mysql -uroot -p

在这里插入图片描述

数据已经恢复,如上及恢复完成。

如果以上备份数据已经做过恢复操作后,下次备份需重新全量备份。
如果不想重新备份,也可以接着备份2 去备份,操作如下
#增量备份3,在增量备份2的基础上
xtrabackup --user=bkupuser --password=2023 \ 
 --backup --incremental-basedir=/data/backup/inc2 \ 
 --target-dir=/data/backup/inc3
 
#增量备份4,在增量备份3的基础上
xtrabackup --user=bkupuser --password=2023  \  
 --backup --incremental-basedir=/data/backup/inc3 \ 
 --target-dir=/data/backup/inc4
恢复 同上一样
步骤:将增量备份3、增量备份4…合并到完整备份,加到一起出来一个新的完整备份,将新的完整备份恢复到数据库空目录
# 先预备完整备份
xtrabackup --user=bkupuser -p'2023' \ 
 --prepare --apply-log-only \ 
 --target-dir=/data/backup/full
# 恢复增量备份3到全量数据(可以略过1、2备份,因为全量中已经存放了)
xtrabackup --user=bkupuser -p'2023' \  
--prepare --apply-log-only \ 
--target-dir=/data/backup/full  \ 
--incremental-dir=/data/backup/inc3
# 恢复增量备份4到全量数据
xtrabackup --user=bkupuser -p'2023' \ 
 --prepare  \ 
 --target-dir=/data/backup/full  \  
 --incremental-dir=/data/backup/inc4
接着准备恢复数据 同上1 - 6 步一样即可
1.停止数据库
./support-files/mysql.server stop
2.将原目录下的数据迁移干净
mkdir /data/mysqlbak
rm -rf /data/mysqlbak/*
mv /data/mysql/*  /data/mysqlbak
3.恢复备份
xtrabackup --user=bkupuser -p'2023' --copy-back  --target-dir=/data/backup/full/
4.赋权
chown -R mysql.mysql  /data/mysql/
5.启动数据库
./support-files/mysql.server start
6.查看数据是否恢复
mysql -uroot -p

脚本内容在下一章,感谢关注。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我们可以使用以下shell脚本来实现mysql增量备份:#!/bin/bash# 设置备份文件存储路径 BACKUP_DIR="/data/mysqlbackup"# 获取当前日期 DATE=`date +%Y%m%d`# 设置备份文件名称 BACKUP_NAME="$DATE.sql"# 设置要备份的数据库名称 DB_NAME="test_db"# 设置要备份的表名称 TABLE_NAME="test_table"# 存放备份文件的路径 BACKUP_FILE="$BACKUP_DIR/$BACKUP_NAME"# 创建存放备份文件的目录 if [ ! -d "$BACKUP_DIR" ]; then mkdir -p "$BACKUP_DIR" fi# 获取上次备份时的最后更新时间 LAST_UPDATED_TIME=`ls -l --time-style="+%Y-%m-%d %H:%M:%S" $BACKUP_FILE | awk '{print $6,$7}'`# 备份数据库 mysqldump -uusername -ppassword --databases $DB_NAME --no-create-info --tables $TABLE_NAME --where="updated > '$LAST_UPDATED_TIME'" | gzip > $BACKUP_FILE ### 回答2: 下面是一个简单的MySQL增量备份Shell脚本示例: ```bash #!/bin/bash # 设定备份目录和文件名 backup_dir="/path/to/backup" backup_file="db_backup_$(date +%Y%m%d%H%M%S).sql" # MySQL连接参数 mysql_user="your_username" mysql_password="your_password" mysql_host="your_mysql_host" mysql_database="your_database" # 创建备份目录(如果不存在) mkdir -p $backup_dir # 使用mysqldump命令备份MySQL数据库 mysqldump --single-transaction --skip-lock-tables -u $mysql_user -p$mysql_password -h $mysql_host $mysql_database > $backup_dir/$backup_file # 检查备份是否成功 if [ $? -eq 0 ]; then echo "MySQL增量备份成功: $backup_dir/$backup_file" else echo "MySQL增量备份失败" fi ``` 使用这个脚本,你需要替换以下内容: - 将`/path/to/backup`替换为你希望保存备份文件的目录路径。 - 将`your_username`替换为用于连接到MySQL的用户名。 - 将`your_password`替换为用于连接到MySQL的密码。 - 将`your_mysql_host`替换为MySQL主机的名称或IP地址。 - 将`your_database`替换为需要备份的数据库名称。 该脚本会创建一个以当前日期和时间命名的备份文件,并将其保存在指定的备份目录中。使用`mysqldump`命令备份数据库,并通过检查命令退出状态确定备份是否成功。 请记住,只是示例,并且可能需要根据实际需求进行修改和调整。 ### 回答3: MySQL增量备份是指在全量备份的基础上,只备份发生了改变的数据,以减少备份时间和空间。下面是一个简单的MySQL增量备份的Shell脚本示例: ```shell #!/bin/bash # 设置备份目录和文件名 backup_dir="/path/to/backup" backup_file="${backup_dir}/$(date +%Y%m%d%H%M%S).sql" # 获取最近一次全量备份的文件名 latest_full_backup=$(ls -t ${backup_dir}/*.full | head -n 1) # 检查是否存在全量备份文件 if [[ ! -f ${latest_full_backup} ]] then echo "最近的全量备份文件不存在!" exit 1 fi # 获取最近一次增量备份的文件名 latest_incremental_backup=$(ls -t ${backup_dir}/*.incr | head -n 1) # 使用mysqldump备份增量数据 mysqldump -u username -p --single-transaction --flush-logs \ --master-data=2 --databases database1 database2 > ${backup_file} # 检查上一次增量备份文件是否存在 if [[ ! -f ${latest_incremental_backup} ]] then # 不存在增量备份文件,则将当前备份文件重命名为增量备份文件 mv ${backup_file} ${backup_file}.incr else # 存在增量备份文件,则使用mysqlbinlog解析二进制日志并生成增量备份文件 mysqlbinlog --start-position=$(grep "CHANGE MASTER TO MASTER_LOG_POS" ${latest_full_backup} \ | awk -F '=[ \t]*' '{print $2}') $(ls -t ${backup_dir}/*.log | head -n 1) \ | sed -n '/### INSERT INTO/p;/### UPDATE/p;/### DELETE FROM/p' \ > ${backup_file}.incr fi echo "MySQL增量备份完成!" ``` 上述脚本的过程如下: 1. 设置备份目录和备份文件名。 2. 获取最近一次全量备份的文件名。 3. 检查最近的全量备份文件是否存在,如果不存在则报错并退出。 4. 获取最近一次增量备份的文件名。 5. 使用`mysqldump`命令进行增量备份,备份目标数据库和表名需要根据实际情况修改。 6. 检查上一次增量备份文件是否存在,如果不存在则将当前备份文件重命名为增量备份文件。 7. 如果存在增量备份文件,则使用`mysqlbinlog`命令解析二进制日志,提取INSERT/UPDATE/DELETE语句,并生成增量备份文件。 8. 备份完成,输出完成信息。 通过使用该脚本,可以实现MySQL增量备份,并且根据需要可以自定义备份频率和文件保存策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值