MySQL 备份与恢复

时间:2024-03-04 14:14:19

重点:

多种日志:通用日志,慢查询日志

二进制日志

备份:热备份,冷备份

mysqldump 工具( 备份与还原 )

主从复制的工作原理

主从复制的实现

​​​​​​​

5)备份和恢复

5.1)备份恢复概述( 数据备份一定要重视 )

备份 与 还原 二者缺一不可 )

5.1.1)为什么要备份

灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景。

参考链接:https://www.toutiao.com/a6939518201961251359/

5.1.2)备份类型

数据安全笔记:https://www.cnblogs.com/bitrabbit/p/13929478.html

完全备份,部分备份

完全备份:整个数据集( 如果数据量不大的情况下,可以每天都全量备份 )

小技巧:假设我们在每天的凌晨 2 点进行全量备份,但在 10 点遇到了问题,导致 2 点到 10 点之间的数据丢失,我们其实可以通过二进制日志文件来恢复数据。二进制日志文件记录了 2 点到 10 点间的所有操作,可以帮助我们将数据还原到出问题之前的状态。因此,尽管我们无法恢复 2 点到 10 点之间的具体数据,但我们可以通过操作记录将数据还原到接近10点的状态,从而减少数据丢失的影响。因此,我们才说二进制日志很重要,他可以帮助我们还原到出现问题前的时刻,避免数据大量丢失。

部分备份:只备份数据子集,如部分库或表。

完全备份、增量备份、差异备份

增量备份:仅备份最近一次完全备份或增量备份以来变化的数据(如果存在增量),备份较快,还原复杂。

周一:完全备份( 必须先做一个完全备份 )

周二:增量备份( 增量备份的是什么?备份的是周一到周二之间 变化的数据 )

周三:增量备份( 增量备份的是什么?备份的是周二到周三之间 变化的数据 )

周四:增量备份( 增量备份的是什么?备份的是周三到周四之间 变化的数据 )

周五:数据被破坏 如何还原?先还原周一的完全备份,再依次还原周二周三周四的增量备份,再基于二进制日志文件恢复 临近数据被破坏时间段之前的操作到最近一个增量备份之间的操作

差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单。

周一:完全备份( 必须先做一个完全备份 )

周二:差异备份( 差异备份的是什么?备份的是周一到周二之间 变化的数据 )

周三:差异备份( 差异备份的是什么?备份的是周一到周三之间 变化的数据 )

周四:差异备份( 差异备份的是什么?备份的是周一到周四之间 变化的数据 )

周五:数据被破坏( 如何还原?先还原周一的完全备份,再还原最近的一个差异备份即可,再基于二进制日志文件恢复 临近数据被破坏时间段之前到最后一个差异备份之间的操作

注意:二进制日志文件 不应该与 数据文件 放在同一磁盘

冷、温、热备份

冷备:读、写操作均不可进行,数据库停止服务( 影响业务 )

温备:读操作可执行;但写操作不可执行( 只能读不能写 )

热备:读、写操作均可执行,( 数据库不受影响 )

MyISAM:温备,不支持热备

InnoDB:都支持( 能热备就热备 )

物理和逻辑备份

物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快。

逻辑备份:从数据库中 "导出" 数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度。


5.1.3)备份什么?

数据

二进制日志、InnoDB 的事务日志

用户帐号,权限设置,程序代码(存储过程、函数、触发器、事件调度器)

服务器的配置文件

5.1.4)备份注意要点

能容忍最多丢失多少数据

备份产生的负载

备份过程的时长

温备的持锁多久

恢复数据需要在多长时间内完成( 建议脚本化 )

需要备份和恢复哪些数据

5.1.5)还原要点

做还原测试,用于测试备份的可用性

还原演练,写成规范的技术文档( 定期演练 )

5.1.6)备份工具

cp,tar 等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份。 必须:异机器备份 或 异地域备份 )

LVM 的快照:先加读锁,做快照后解锁,几乎热备;借助文件系统工具进行备份。

mysqldump:逻辑备份工具,适用所有存储引擎,对 MyISAM 存储引擎进行温备;支持完全或部分备份;对 InnoDB 存储引擎支持热备,结合 binlog 的增量备份。( 常用 )

xtrabackup:由 Percona 提供支持对 InnoDB 做热备(物理备份)的工具,支持完全备份、增量备份。( 更专业的备份工具 )

MariaDB Backup:从 MariaDB 10.1.26 开始集成,基于 Percona XtraBackup 2.3.8 实现。

mysqlbackup:热备份, MySQL Enterprise Edition 组件。

mysqlhotcopy:PERL 语言实现,几乎冷备,仅适用于 MyISAM 存储引擎,使用 LOCK TABLES、FLUSH TABLES和 cp 或 scp 来快速备份数据库。

5.1.7)实战案例:数据库冷备份和还原

注意:备份与还原主机的数据库版本要保持一致

MySQL 8.0( 数据库冷备份与还原案例 )

冷备份:生产环境少用,因为冷备份需要停止数据库服务

源主机:192.168.80.130

目标主机:192.168.80.150

注意:源主机与目标主机都需要安装 rsync 软件包

---- 备份过程 ----

// 在源主机 ( 192.168.80.130 ) 执行 ( 停止数据库服务 )

[root@centos8 ~] yum install rsync -y

[root@centos8 ~] systemctl stop mysqld



// 备份数据  ( 将相关文件复制到远程主机 )

# 如果配置及二进制文件相关有特殊设置也需要备份

[root@centos8 ~] yum install rsync -y

[root@centos8 ~] rsync -a /var/lib/mysql 192.168.80.150:/data/ # 注意: 192.168.80.150 须事先存在 /data/ 目录



---- 还原过程 ----

// 目标主机安装数据库服务

[root@centos8 ~] ll /data                        # 验证冷备份过来的数据

[root@centos8 ~] yum install mysql-server -y     # 目标主机安装数据库服务 ( 需与源主机的数据库版本一致 )



// 将拷贝过来的备份文件复制到相关目录

[root@centos8 ~] cp -a /data/mysql/* /var/lib/mysql/



// 启用数据库服务

[root@centos8 ~] systemctl start mysqld

[root@centos8 ~] systemctl enable mysqld



// 验证

[root@centos8 ~] mysql

Mariadb 10.3

// 在目标服务器 (10.0.0.18) 安装 mariadb-server, 不启动服务

[root@centos8 ~] yum install mariadb-server



// 在源主机 (10.0.0.8) 执行 ( 停止数据库服务 )

[root@centos8 ~] systemctl stop mariadb



// 复制相关文件 ( 将相关文件复制到远程主机 )

[root@centos8 ~] scp -r /var/lib/mysql/* 10.0.0.18:/var/lib/mysql/

[root@centos8 ~] scp /etc/my.cnf.d/mariadb-server.cnf 10.0.0.18:/etc/my.cnf.d/

[root@centos8 ~] scp -r /data/logbin/ 10.0.0.18:/data/    # 10.0.0.18 须事先存在 /data/ 目录



// 复制相关文件并保留属性: 可以用 rsync

[root@centos8 ~] rsync /etc/my.cnf.d/mariadb-server.cnf 10.0.0.18:/etc/my.cnf.d/

[root@centos8 ~] rsync -av /var/lib/mysql/ 10.0.0.18:/var/lib/mysql/

[root@centos8 ~] rsync -av/data/logbin/ 10.0.0.18:/data/    # 10.0.0.18 须事先存在 /data/ 目录



// 在目标主机 (10.0.0.18) 执行

[root@centos8 ~] chown -R mysql.mysql /var/lib/mysql/

[root@centos8 ~] chown -R mysql.mysql /data/logbin/

[root@centos8 ~] systemctl start mariadb

5.2)mysqldump 备份工具

5.2.1)mysqldump 说明

逻辑备份工具:

mysqldump,mydumper,phpMyAdmin( MySQL 数据库服务必须是启动状态 )

Schema 和数据存储在一起、巨大的 SQL 语句、单个巨大的备份文件。

mysqldump 是 MySQL 的客户端命令,通过 mysql 协议连接至 mysql 服务器进行备份。

mysqldump 是 MySQL 自带的逻辑备份工具。

它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的 insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。

命令格式

mysqldump 参考:MySQL :: MySQL 5.7 Reference Manual :: 4.5.4 mysqldump — A Database Backup Program

// 支持指定数据库和指定多表的备份, 但数据库本身定义不备份

1) 备份指定数据库或指定数据表

mysqldump [OPTIONS] database [tables]



// 支持指定数据库备份, 包含数据库本身定义也会备份

2) -B 备份多个数据库

mysqldump [OPTIONS] -B DB1 [DB2 DB3...]



// 备份所有数据库, 包含数据库本身定义也会备份

3) -A 备份所有数据库

mysqldump [OPTIONS] -A [OPTIONS]


演示:

// 备份单个数据库 hellodb

mysqldump -uroot -p hellodb > /root/hellodb.sql



// 查看备份的 SQL 文件

cat /root/hellodb.sql | grep -i create    ( 发现该 SQL 文件并没有创建数据库的 SQL )

// 还需要我们"手动创建数据库"

// 才能导入成功该 SQL 文件

// ( 但我们并不知道当时创建该数据库时的字符集等等信息 )

// ( 因此不建议使用该备份方式~ )

mysql> create database hellodb;

Query OK, 1 row affected (0.01 sec)



mysql hellodb < hellodb.sql

演示:( 推荐使用 -B 选项备份数据库 )

// 使用 -B 选项备份数据库

mysqldump -B hellodb hellodb_2 > hellodb_all.sql



// 备份的 SQL 文件存在创建数据库的 SQL 语法

cat hellodb_all.sql | grep -i create

// 非交互式: 删除 hellodb 数据库

mysql -e 'drop database hellodb'

mysql -e 'show databases'



// 导入验证

mysql < /root/hellodb_all.sql

mysql -e 'show databases'


​​​​​​​

演示:( -A 选项:导出 mysql 数据库 + 自建的数据库 )

// 备份所有数据库

mysqldump -A > /root/all.sql



// 删库跑路

systemctl stop mysqld

rm -rf /var/lib/mysql/*



// 启用数据库

systemctl start mysqld



# 如果无法启用数据库服务

# 卸载重装数据库服务试试

yum remove mysql-server -y

yum install mysql-server -y



// 还原数据库

mysql < /root/all.sql



// 验证

mysql -e 'show databases'

mysqldump 常见通用选项:

-A, --all-databases         // 备份所有数据库, 含 create database

-B, --databases db_name...  // 指定备份的数据库, 包括 create database 语句

-E, --events:               // 备份相关的所有事件 event scheduler

-R, --routines:             // 备份所有存储过程和自定义函数

--triggers:                 // 备份表相关触发器, 默认启用, 用 --skip-triggers, 不备份触发器

--default-character-set=utf8    // 指定字符集 ( 备份时候建议加该选项 )

--master-data[=N]               // ( "此选项数据库服务需启用二进制日志") "很重要的一个选项"

# 我们使用该选项指定当前备份的时间点

# 后续可以基于二进制日志文件恢复

# 数据被破坏时间段之前 到 最近一个备份数据之间的操作

  1: 所备份的数据之前加一条记录为 CHANGE MASTER TO 语句, 非注释, 不指定 #, 默认为 1, 适合于主从复制多机使用

  2: 记录为被注释的 # CHANGE MASTER TO 语句, 适合于单机使用, ( 适用于备份还原 )

  此选项会自动关闭 --lock-tables 功能, 自动打开-x | --lock-all-tables 功能 (除非开启 --single-transaction)



-F, --flush-logs // 备份前滚动日志, 锁定表完成后, "执行 flush logs 命令, 生成新的二进制日志文件" 配合 -A 或 -B 选项时, 会导致刷新多次数据库. 建议在同一时刻执行转储和日志刷新, 可通过和 --single-transaction 或 -x, "--master-data 一起使用实现, 此时只刷新一次二进制日志" ( 这样就不需要找二进制日志的位置,因为刷新了新的二进制文件,直接将新的二进制文件恢复即可 )

--compact        // 去掉注释, 适合调试, 节约备份占用的空间, ( 生产不建议 )

-d, --no-data    // "只备份表结构,不备份数据" 即只备份 create table

-t, --no-create-info    // "只备份数据,不备份表结构" 即不备份 create table 

-n, --no-create-db       // 不备份 create database, 可被 -A 或 -B 覆盖 ( 默认 )

--flush-privileges      // 备份 MySQL 或相关时需要使用 ( 刷新权限 )

-f, --force            // 忽略 SQL 错误, 继续执行 ( 强制执行 )

--hex-blob             // 使用十六进制符号转储二进制列, 当有包括 BINARY, VARBINARY, BLOB, BIT 的数据类型的列时使用 ( 避免乱码 )

-q, --quick            // 不缓存查询, 直接输出, 加快备份速度

5.2.2)实战案例( 重点 )

利用二进制日志,将数据库还原至最新状态

演示:( MySQL 小技巧:删库跑路如何恢复 )

实战案例:利用二进制日志,将数据库还原至最新状态

参考:记一次mysql从删库到恢复-CSDN博客

参考:【MySQL】删库跑路?了解下bin-log! - 掘金

mysqldump --master-data[=N]

--master-data=2 ( 适用于备份还原 )( 记录二进制日志文件名和位置 )

0) "前置条件" ( 开启二进制日志功能 )

## 并将二进制日志文件与数据库文件分开存放

1. 创建二进制日志文件的存放目录

mkdir /mysql/data/logbin -pv

chown -R mysql:mysql /mysql/data/logbin/



2. 定义二进制日志文件路径 ( 服务器选项: log-bin )

vim /etc/my.cnf

vim /etc/my.cnf.d/mysql-server.cnf      # MySQL 8.0

[mysqld]

log_bin                                 # 开启二进制日志功能 ( 必须 )

log-bin=/mysql/data/logbin/mysql-bin    # 定义二进制日志文件路径



3. 重启 mariadb 服务

setenforce 0         # 关闭 SELinux ( 重要 )

systemctl restart mariadb.service

# 如重启报错 ( 可以尝试查看日志 tail -f /var/log/mysql/mysqld.log )

# 将报错信息发送至 ChatGPT 为你提供解决思路



4. 验证

ll /mysql/data/logbin

cat /mysql/data/logbin/mysql-bin.index ( 该文件记录当前已有的二进制日志文件列表 )



5. 验证

select @@sql_log_bin;

select @@log_bin;

1) 基于 mysqldump 完全备份数据库

mysqldump -A --master-data=2 > /data/all.sql

mysqldump -A --master-data=2 | gzip > /data/all.sql.gz # 建议: 备份并压缩



2) 备份完成后, "继续操作数据库"

mysql hellodb;

insert teachers values(5,'xiaoming',20,'M');

insert teachers values(6,'xiaohong',18,'F');

select * from teachers;



// 瞅瞅二进制日志

ll /mysql/data/logbin



// 查看完全备份文件

vim /data/all.sql        // 该备份文件 ( 记录着当时二进制文件的备份位置 )

如图:该行记录着 mysqldump 命令运行时

二进制日志文件 binlog 的起始位置,这有助于我们恢复近期的二进制日志数据

3) 直接"删库跑路"

systemctl stop mysqld

rm -rf /var/lib/mysql/*

4) 先导出有用处的二进制日志文件

# 查看二进制日志文件中记录的备份位置信息

cat /data/all.sql | grep '^-- CHANGE MASTER TO'



# 然后进入二进制日志文件存放目录

cd /mysql/data/logbin



# 从特定的二进制日志位置开始提取数据,并将结果保存到一个新的SQL文件中

# 将有用处的二进制日志信息都导入一个新的 sql 文件

# 也就是执行完完全备份命令后 ( 记录的二进制日志内容 )

mysqlbinlog --start-position=7667 mysql-bin.000002 > /data/binlog.sql



# 验证文件

vim /data/binlog.sql



5) 恢复数据库

systemctl start mysqld  # 启用数据库服务 ( 现在的数据库相当于是新安装的 )



set sql_log_bin=0;      # 先临时禁用二进制日志记录功能 ( 避免在恢复过程中产生更多的日志数据 )

source /data/all.sql    # 还原 mysqldump 数据库文件 ( 完全备份数据 )

source /data/binlog.sql # 还原 binlog 二进制日志数据

set sql_log_bin=1;      # 继续开启二进制日志功能



6) 验证数据库

use hellodb;

select * from teachers;


mysqldump 的 MyISAM 存储引擎相关的备份选项:

MyISAM 不支持事务,只能支持温备;不支持热备

所以必须先锁定要备份的库,而后启动备份操作。

x,--lock-all-tables   // "加全局读锁,锁定所有库的所有表" 同时加 --single-transaction 或 --lock-tables 选项会关闭此选项功能, 注意: 数据量大时, 可能会导致长时间无法并发访问数据库

-l,--lock-tables      // 对于需要备份的每个数据库, 在启动备份之前分别锁定其所有表, 默认为 on, --skip-lock-tables 选项可禁用, 对备份 MyISAM 的多个库, 可能会造成数据不一致

// 注: 以上选项对 InnoDB 表一样生效, 实现温备, 但不推荐使用

mysqldump 的 InnoDB 存储引擎相关的备份选项:

InnoDB 存储引擎支持事务,可以利用事务的相应的隔离级别,实现热备,也可以实现温备但不建议用。

--single-transaction

// 此选项 Innodb 中推荐使用, 不适用 MyISAM

// "此选项会开始备份前, 先执行 START TRANSACTION 指令开启事务" ( 热备 )

// 此选项通过在单个事务中转储所有表来创建一致的快照. 仅适用于存储在支持多版本控制的存储引擎中的表 ( 目前只有 InnoDB 可以); 转储不保证与其他存储引擎保持一致. 在进行单事务转储时,要确保有效的转储文件 ( 正确的表内容和二进制日志位置 ), 没有其他连接应该使用以下语句: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE, 此选项和 --lock-tables ( 此选项隐含提交挂起的事务 ) 选项是相互排斥, 备份大型表时,建议将 --single-transaction 选项和 --quick 结合一起使用

5.2.3)生产环境实战备份策略

InnoDB 建议备份策略

--single-transaction 确保备份在单个事务中完成。

--master-data=1 这个选项的作用是在备份中包含复制相关的信息。

--flush-privileges 在备份后刷新 MySQL 的权限

--default-character-set=utf8确保了导出的数据使用 UTF-8 编码

mysqldump -uroot -pP@ssw0rd123456 -A -F -E -R --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob

 >${BACKUP}/fullbak_${BACKUP_TIME}.sql

MyISAM 建议备份策略

-X ( 全局读锁 )

mysqldump -uroot -pP@ssw0rd123456 -A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >${BACKUP}/fullbak_${BACKUP_TIME}.sql

5.2.3)mysqldump 备份还原实战案例

5.2.3.1)实战案例:特定数据库的备份脚本

[root@centos8 ~] vim mysql_backup.sh

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

TIME=`date +%F_%H-%M-%S`

DIR=/backup           # 备份数据库的目录

DB=hellodb            # 注意修改需要备份的数据库名称

PASS=P@ssw0rd123456   # 数据库密码

[ -d $DIR ] || mkdir $DIR

mysqldump -uroot -p "$PASS" -F -E -R --triggers --single-transaction --master-data=2 --default-character-set=utf8 -q -B $DB | gzip > ${DIR}/${DB}_${TIME}.sql.gz

// 授权

chmod +x mysql_backup.sh

// 计划任务

crontab -e

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

18 * * * * /root/mysql_backup.sh

// 验证

ll /backup

// 测试备份数据是否可以用于还原 ( "重要" )

cd /backup && gzip -d hellodb_2024-02-02_22-18-01.sql.gz

// 删库跑路

mysql

drop database hellodb;

// 测试还原

set sql_log_bin=0;    # 临时禁用二进制日志功能

source /backup/hellodb_2024-02-02_22-18-01.sql

set sql_log_bin=1;    # 开启二进制日志功能

// 验证数据库

show tables;

5.2.3.2)实战案例:分库备份并压缩

// 方式一

[root@centos8 ~] for db in `mysql -uroot -e 'show databases' | grep -Ev '^(Database|information_schema|performance_schema)$'`;do mysqldump -B $db | gzip > /backup/$db.sql.gz;done

// 方式二

[root@centos8 ~] mysql -uroot -e 'show databases' | grep -Ev '^(Database|information_schema|performance_schema)$' | while read db;do mysqldump -B $db | gzip > /backup/$db.sql.gz;done

// 方式三

[root@centos8 ~] mysql -uroot -e 'show databases' | grep -Ev '^(Database|information_schema|performance_schema)$' | sed -rn 's#(.*)#mysqldump -B \1 | gzip > /backup/\1.sql.gz#p' | bash

// 方式四

[root@centos8 ~] mysql -uroot -e 'show databases' | sed -rn '/^(Database|information_schema|performance_schema)$/!s#(.*)#mysqldump -B \1 | gzip > /backup/\1.sql.gz#p' | bash

5.2.3.3)实战案例:分库备份的实战脚本

// 列出 MySQL 服务器上的所有数据库

// 并从中排除 Database、schema和 sys 这三个数据库

mysql -uroot -e'show databases'

mysql -uroot -e'show databases' | grep -Ev "^Database|.*schema$|sys"

[root@centos8 ~] cat backup_db.sh

#!/bin/bash

TIME=`date +%F_%H-%M-%S`

DIR=/backup           # 备份数据库的目录

PASS=P@ssw0rd123456   # 数据库密码

[ -d "$DIR" ] || mkdir $DIR

for DB in `mysql -uroot -p "$PASS" -e 'show databases' | grep -Ev "^Database|.*schema$|sys"`;do        

    mysqldump -F --single-transaction --master-data=2 --default-character-set=utf8 -q -B $DB | gzip > ${DIR}/${DB}_${TIME}.sql.gz

done

// 运行脚本

bash backup_db.sh

// 验证

ll /backup

5.2.3.4)实战案例:完全备份和还原

// 开启二进制日志

[root@centos8 ~] vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

log-bin

// 备份

[root@centos8 ~] mysqldump -uroot -pmagedu -A -F --single-transaction --master-data=2 | gzip > /backup/all-`date +%F`.sql.gz

// 还原

[root@centos8 backup] yum install mariadb-server

[root@centos8 backup] gzip -d all-2019-11-27.sql.gz

[root@centos8 ~] mysql

MariaDB [(none)]> set sql_log_bin=off;

MariaDB [(none)]> source /backup/all-2019-11-27.sql

MariaDB [(none)]> set sql_log_bin=on;

5.2.3.5)实战案例:利用二进制日志,还原数据库最新状态

// 二进制日志独立存放

[mysqld]

log-bin=/data/mysql/mysql-bin

// 完全备份, 并记录备份的二进制位置

mysqldump -uroot -pmagedu -A -F --default-character-set=utf8 --single-transaction --master-data=2 | gzip > /backup/all_`date +%F`.sql.gz

// 修改数据库

insert students (name,age,gender)value('mage',20,'M');

insert students (name,age,gender)value('wang',22,'M');

// 损坏数据库

rm -rf /var/lib/mysql/*

// 还原

cd /backup

gzip -d all_2019-11-25.sql.gz

// CentOS 8 需要事先生成数据库相关文件, CentOS7 不需要执行此步

mysql_install_db --user=mysql

systemctl restart mariadb

MariaDB [(none)]> show master logs;

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |       998 |

| mysql-bin.000002 |     28090 |

| mysql-bin.000003 |       342 |

+------------------+-----------+

3 rows in set (0.000 sec)

MariaDB [(none)]> set sql_log_bin=0;

MariaDB [(none)]> source /data/all_2019-11-25.sql

[root@centos8 ~] grep '^-- CHANGE MASTER TO' /data/all_2019-11-25.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=328;

// 二进制日志的备份

[root@centos8 mysql] mysqlbinlog mysql-bin.000001 --start-position=328 > /backup/inc.sql

[root@centos8 mysql] mysqlbinlog mysql-bin.000002 >> /backup/inc.sql

MariaDB [(none)]> set sql_log_bin=0;

MariaDB [(none)]> source /backup/inc.sql

MariaDB [(none)]> set sql_log_bin=1;

5.2.3.6)实战案例:mysqldump 和二进制日志结合实现差异(增量)备份

[root@centos8 ~] mysqldump -uroot -p -A -F --single-transaction --master-data=2 | gzip > /backup/all-`date +%F`.sql.gz

// 观察上面备份文件中记录的二进制文件和位置, 定期将其之后生成的所有二进制日志进行复制备份

[root@centos8 ~] cp /var/lib/mysql/mariadb-bin.000003 /backup    // 假设 mariadb-bin.000003 是后续生成的二进制日志

[root@centos8 ~] mysqlbinlog backup/mariadb-bin.000003 > /backup/inc.sql

5.2.3.7)实战案例:恢复误删除的表

案例说明

每天