MySQL备份恢复-2

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL备份恢复-2

屏幕截图 2023-08-28 195743.png

1.

mysqldump 核心参数

-A

-B

库 表

--master-data=2

(1) 以注释的形式记录二进制日志信息

(2) 自动开启锁表的功能

--single-transaction

针对InnoDB进行快照备份

-R

-E

--triggers

--set-gtid-purged=AUTO/ON/OFF

默认是auto

主从复制,忽略此参数

普通备份,可以OFF

Xtrabackup

1. 备份的过程

(1) 非InnoDB表,进行短暂的锁表,然后Copy数据文件

(2) 对于InnoDB表,立即出发checkpoint,会立即记录一个LSN,COPY数据文件.

(3) 将备份过程中产生的redo进行截取和保存,并记录此时最新的LSN

2. 恢复过程

模拟了CSR的全过程,在恢复之前,将数据的LSN号和redo LSN号追平

恢复方法就是直接cp回去即可

3. XBK 全备和恢复体验

innobackupex --user=root --password=123 -S /tmp/mysql.sock --no-timestamp /backup/full

innobackupex --apply-log /backup/full

4. 备份产生的文件介绍

(1) xtrabackup_binlog_info  *****

记录备份时刻的二进制日志信息. 可以作为binlog截取的起点.

(2) xtrabackup_checkpoints  *****

from : 备份中包含的LSN号的起点,全备:0,增量:上次备份的结束位置

to      : ckpt 时的LSN

last-9 : 备份结束时的LSN.下次增量备份的起始位置.

5. 增量备份

5.1 清空备份路径

rm -rf /backup/*

5.2 模拟数据

create database full charset utf8mb4;
use full;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;

5.3 进行周日的全备

innobackupex --user=root --password=123 --socket=/tmp/mysql.sock --no-timestamp /backup/full

5.4 模拟周一的数据变化

create database inc1 charset utf8mb4;
use inc1;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;

5.5 进行周一的增量备份

innobackupex   --user=root --password=123 --no-timestamp --incremental --socket=/tmp/mysql.sock --incremental-basedir=/backup/full /backup/inc1

说明:

--incremental    开启增量备份

--incremental-basedir=/backup/full 基于哪个备份进行增量

/backup/inc1     增量备份的目录

5.6 检查备份的LSN

cat /backup/full/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 2580227
last_lsn = 2580236
compact = 0
recover_binlog_info = 0
cat /backup/inc1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2580227
to_lsn = 2586353
last_lsn = 2586362
compact = 0
recover_binlog_info = 0

5.7 模拟周二数据变化

create database inc2 charset utf8mb4;
use inc2;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;

5.8 周二的增量

innobackupex   --user=root --password=123 --no-timestamp --incremental --socket=/tmp/mysql.sock --incremental-basedir=/backup/inc1 /backup/inc2

5.9 周三的数据变化

create database inc3 charset utf8mb4;
use inc3;
create table t1 (id int);
insert into t1 values(1),(2),(3);
commit;
5.10 模拟上午10点数据库崩溃
pkill mysqld 
rm -rf /usr/local/mysql/data/*

5.10 模拟上午10点数据库崩溃

pkill mysqld

rm -rf /usr/local/mysql/data/*

5.11 恢复思路

1. 停业务,挂维护页

2. 查找可用备份并处理备份:full+inc1+inc2

3. binlog: inc2 到 故障时间点的binlog

4. 恢复全备+增量+binlog

5. 验证数据

6. 起业务,撤维护页

5.12 恢复前的准备

(1) 整理full

innobackupex --apply-log --redo-only  /backup/full

(2) 合并inc1到full,并整理备份

innobackupex --apply-log --redo-only  --incremental-dir=/backup/inc1 /backup/full

(3) 合并inc2到full,并整理备份

innobackupex --apply-log  --incremental-dir=/backup/inc2 /backup/full

(4) 最后一次整理full

innobackupex --apply-log  /backup/full

5.13 截取二进制日志

起点:

cat /backup/inc2/xtrabackup_binlog_info

mysql-bin.000005        1711   5895cebd-eae2-11ec-ad4a-000c29cbdce4:1-9

终点:

mysqlbinlog /data/mysql-bin.000005 |grep 'SET'
SET @@SESSION.GTID_NEXT= '5895cebd-eae2-11ec-ad4a-000c29cbdce4:12'/*!*/;
mysqlbinlog --skip-gtids --include-gtids='5895cebd-eae2-11ec-ad4a-000c29cbdce4:10-12' /data/mysql-bin.000005>/backup/binlog.sql

5.14 恢复备份数据

cp -a  /backup/full/* /usr/local/mysql/data/
chown -R mysql:mysql /usr/local/mysql/
/etc/init.d/mysqld start
set sql_log_bin=0;
source /backup/binlog.sql

5.15 验证数据

select * from full.t1;
select * from inc1.t1;
select * from inc2.t1;
select * from inc3.t1;

作业1

Xtrabackup企业级增量恢复实战

背景:

某大型网站,mysql数据库,数据量500G,每日更新量20M-30M

备份策略:

xtrabackup,每周日0:00进行全备,周一到周六00:00进行增量备份。

故障场景:

周三下午2点出现数据库意外删除表操作。

如何恢复?

作业2

练习:mysqldump备份恢复例子

1、创建一个数据库 hehe

2、在hehe下创建一张表t1

3、插入5行任意数据

4、全备

5、插入两行数据,任意修改3行数据,删除1行数据

6、删除所有数据

7、再t1中又插入5行新数据,修改3行数据

需求,跳过第六步恢复表数据

作业3

分别写备份脚本和策略

作业4:备份集中单独恢复表

思考:在之前的项目案例中,如果误删除的表只有10M,而备份有500G,该如何快速恢复误删除表?

提示:

use world;
create table city_bak like city;
drop table city;
create table city like city_bak;
alter table city discard tablespace;
cp /backup/full/world/city.ibd  /usr/local/mysql/data/world/
chown -R mysql.mysql  /usr/local/mysql/data/world/city.ibd 
alter table city import  tablespace;

作业5: 从mysqldump 全备中获取库和表的备份

1、获得表结构

# sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q'  full.sql>createtable.sql

2、获得INSERT INTO 语句,用于数据的恢复

# grep -i 'INSERT INTO `city`'  full.sqll >data.sql &

3.获取单库的备份

# sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql

6. 迁移(5.6  --->  5.7.20)

6.1 搭建5.6的测试环境

(1)创建必须的目录

mkdir /data/mysql/data  -p

mkdir /application/ -p

mkdir /data/binlog -p

上传软件至 /application 下并解压

tar xf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz

mv mysql-5.6.36-linux-glibc2.5-x86_64 mysql

(2) 建用户,改权限

useradd mysql

chown -R mysql.mysql  /data /application/

(3) 修改环境变量

vim /etc/profile
export PATH=/application/mysql/bin:$PATH
source /etc/profile

(4)数据初始化

yum remove mariadb-libs
yum install -y libaio-devel
rm -rf /data/mysql/data/*
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/mysql/data

(5) 准备配置文件和启动脚本

cat > /etc/my.cnf <
[mysqld]
basedir=/application/mysql 
datadir=/data/mysql/data 
server_id=99
user=mysql
log_bin=/data/binlog/mysql-bin
binlog_format=row
socket=/tmp/mysql.sock 
[mysql]
socket=/tmp/mysql.sock
EOF
cp  /application/mysql/support-files/mysql.server /etc/init.d/mysqld

(5) 启动数据库

/etc/init.d/mysqld start

mysqladmin -uroot -p password 123

6.2 迁移5.6 数据到 5.7  (扩展)

(1) 5.6 数据库备份

mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E --triggers >/tmp/full.sql
scp /tmp/full.sql 192.168.134.222:/tmp

(2)准备5.7数据库

systemctl start mysqld
mysql
source /tmp/full.sql
mysql_upgrade  -uroot -p

(3) binlog的持续追加

(4) 停业务,恢复剩余的binlog

(5) 业务割接


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
SQL 存储 关系型数据库
MySQL备份:mydumper 备份恢复工具生产实战
MySQL备份:mydumper 备份恢复工具生产实战
|
3月前
|
关系型数据库 MySQL 机器人
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
|
3月前
|
运维 关系型数据库 MySQL
"MySQL运维精髓:深入解析数据库及表的高效创建、管理、优化与备份恢复策略"
【8月更文挑战第9天】MySQL是最流行的开源数据库之一,其运维对数据安全与性能至关重要。本文通过最佳实践介绍数据库及表的创建、管理与优化,包括示例代码。涵盖创建/删除数据库、表结构定义/调整、索引优化和查询分析,以及数据备份与恢复等关键操作,助您高效管理MySQL,确保数据完整性和系统稳定运行。
369 0
|
11月前
|
关系型数据库 MySQL 数据库
零基础带你学习MySQL—备份恢复数据库(三)
零基础带你学习MySQL—备份恢复数据库(三)
|
存储 安全 关系型数据库
MySQL备份恢复
MySQL备份恢复
91 0
|
SQL 监控 关系型数据库
MySQL 备份恢复
MySQL 备份恢复
|
关系型数据库 MySQL 数据库
RDS for MySQL8.0物理备份恢复到本地自建数据库
此文章是centos7下的恢复流程。 1、安装MySQL8.0(采用yum方式安装):wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm yum localinstall mysql80-community-release-el7-1.noarch.rpm yum -y install yum-utils 默认安装的就是8.0版本yum install mysql-community-server 安装好了不要启动数据库。
|
SQL 存储 关系型数据库
mysql 中的备份恢复、分区分表、主从复制、读写分离
数据库 mysql 的灾难恢复,高并发必备知识
365 3
mysql 中的备份恢复、分区分表、主从复制、读写分离
|
SQL 安全 关系型数据库
RDS SQL Server 备份恢复到本地报错:Cannot find server certificate with thumbprint
RDS SQL Server 备份恢复到本地报错:Cannot find server certificate with thumbprint
|
存储 SQL 关系型数据库
MySQL备份恢复-3
MySQL备份恢复-3
103 0