mysql 备份恢复-mysqldump

备份恢复

mysql数据损坏类型

1.物理损坏 

磁盘损坏:硬件,磁道坏,dd,格式化

文件损坏:数据文件损坏,redo损坏

2.逻辑损坏

drop,delete,truncate,update 

运维人员在备份,恢复的指责

1.设计备份,容灾策略

备份策略:

备份工具的选择;

备份周期设计;

备份监控方法

容灾策略:

备份:什么备份;

架构:高可用,演示从库,灾备库

2.定期备份,容灾检查

备份软件 ----> 带库 

两地三中心:

每周   北京 ==》天津    数据库相互切换 

3.定期的故障恢复演练

使用从库和测试库进行演练 

4.数据损坏时的快速准确恢复

5.数据迁移工作


Mysql 常用的备份工具

逻辑备份方式

mysqldump (MDP) *******

mydumper(自行扩展)

load data in file(自行扩展)

物理备份方式

企业版  Mysql Enterprise Backup(企业版)

Percona  Xtrabackup (PBK,XBK) *****


mysqldump (MDP) 应用

介绍

逻辑备份工具。备份的是SQL语句。

InnoDB表:

利用多版本特性,采取快照备份的方式。开启一个独立的事务。

获取当前最新的一致性快照,将快照数据,放在临时表中转换为sql语句,保存到SQL文件中。

非InnoDB表:

需要锁表备份。触发FTWRL,全局锁表。转换为sql语句,保存到SQL文件中。

mysqldump的核心参数

连接参数:

-u 用户名

-p 密码

-h ip地址

-P 端口

-S socket 

备份参数 :

-A  全备

mkdir -p /data/backup

chown mysql.mysql /data/* 

mysqldump -uroot -pluobiao123 -S /tmp/mysql.sock -A > /data/backup/full.sql 

-B 单库或者多库 

 mysqldump -uroot -pluobiao123 -S /tmp/mysql.sock -B world  > /data/backup/world.sql 

备份单表或者多表

mysqldump -uroot -pluobiao123 -S /tmp/mysql.sock world  t9  t1   > /data/backup/world.sql

备份所有的表:

mysqldump -uroot -pluobiao123 -S /tmp/mysql.sock world   > /data/backup/world.sql

恢复的时候,需要先建库,在use 库,在恢复.

备份高级参数:

每周23:00全备,周1-6binlog备份,所有备份是完整的。

周三时,又一个核心运维人员进行删库操作。

恢复全备 + 所有需要的binlog恢复。

问题?binlog的截取

起点查找比较困难:

方法一:备份开始时,切割日志。-F 

方法二:备份开始时,自动记录日志文件信息

终点 :drop 之前的位置 

--master-data=2 

--master-data=[=#]

功能:

备份时自动记录当前的最新binlog信息,得到准确的position号,

用来恢复数据值,方便进行全备之后的binlog日志恢复。

自动锁表和解表

配合single transaction 可以减少锁表时间 


--single-transaction

作用:对于innodb表备份时,开启一个事务,获取一致性快照进行备份,减少锁表。

测试:mysqldump -uroot -pluobiao123  --single-transaction --master-data=1   -S /tmp/mysql.sock -A > /data/backup/full2.sql

-R 备份存储过程,函数  -E  事件    --triggers    触发器 

测试:mysqldump -uroot -pluobiao123   -R -E --triggers  --single-transaction --master-data=1   -S /tmp/mysql.sock -A > /data/backup/full3.sql

--max_allowed_packet=64M  客户端  《=====》服务端 双向发送数据的大小设置

作用:


测试:测试:mysqldump -uroot -pluobiao123 --max-allowed-packet=64M   -R -E --triggers  --single-transaction --master-data=1   -S /tmp/mysql.sock -A > /data/backup/full4.sql 

上面的语句就是mysql的最终的逻辑备份的语句的完整版,参数缺一不可。

5.基于mysqldump + binlog 故障恢复案例

案例环境:centos7.6 + mysql5.7.28  LNMT网站业务,数据量100G,

每天5-10M增长

备份策略:mysqldump每天全备,binlog定时备份。

故障模拟:周三上午10点数据故障,例如:核心业务库被删除。

恢复思路:

1.挂维护页。

2.找测试库。

3.恢复周二全备。

4.截取周二全备至周三上午10点之前误删的binlog,并恢复

5.测试业务功能是否正常

6.恢复业务:

方案1:故障库导回到原生产

方案2:直接用测试库充当生产业务

模拟数据损坏及恢复:

1.模拟原始数据

create database mdp charset=utf8mb4;

use mdp;

create table t1(id int);

begin;

insert into t1 values(1),(2),(3);

commit;

2.模拟周二晚上全备

mysqldump -uroot -p -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M  >/data/backup/full_`date +%F`.sql

3.模拟周三数据变化 

mysql> create table t2 (id int );

Query OK, 0 rows affected (0.12 sec)

mysql> insert into t2 values(1),(2),(3);

4.发生误操作 

mysql> drop database mdp;

5.开始恢复

5.1恢复全备

检查全备:

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=787;

5.2 恢复全备

source /data/backup/full_2020-03-28.sql

5.3 截取binlog 

起点:

[root@later03 backup]# grep "\-- CHANGE MASTER*" /data/backup/full_2020-03-28.sql 

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=787;

终点:

mysql> show master status;

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

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |

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

| mysql-bin.000017 |    1364 |              |                  | 7acb1b1a-6660-11ea-b89b-00163e0477d5:1-17 |

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

mysql>   show binlog events in 'mysql-bin.000017';

| mysql-bin.000017 | 1275 | Query          |        6 |        1364 | drop database mdp                                                  |

所以起点position号:787  终点:1275  

开始截取 :

mysqlbinlog  --start-position=787  --stop-position=1275   --skip-gtids     /data/binlog/mysql-bin.000017   > /tmp/bbq.sql

5.4开始恢复:

不再计入binlog

set sql_log_bin = 0;

source /tmp/bbq.sql 

开启binlog 

set sql_log_bin = 0;


6.使用gtid恢复

6.1.使用全备恢复 

6.2 寻找起点

[root@later03 backup]# grep "\-- CHANGE MASTER*" /data/backup/full_2020-03-28.sql 

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=787;

找到该position号对应的事务ID;

show binlog events in 'mysql-bin.000017';

| mysql-bin.000017 |  787 | Gtid          |        6 |        852 | SET @@SESSION.GTID_NEXT= '7acb1b1a-6660-11ea-b89b-00163e0477d5:15' |


6.3寻找终点:

| mysql-bin.000017 |  949 | Gtid          |        6 |        1014 | SET @@SESSION.GTID_NEXT= '7acb1b1a-6660-11ea-b89b-00163e0477d5:16' |

| mysql-bin.000017 | 1014 | Query          |        6 |        1085 | BEGIN                                                              |

| mysql-bin.000017 | 1085 | Table_map      |        6 |        1129 | table_id: 406 (mdp.t2)                                            |

| mysql-bin.000017 | 1129 | Write_rows    |        6 |        1179 | table_id: 406 flags: STMT_END_F                                    |

| mysql-bin.000017 | 1179 | Xid            |        6 |        1210 | COMMIT /* xid=5122 */                                              |

| mysql-bin.000017 | 1210 | Gtid          |        6 |        1275 | SET @@SESSION.GTID_NEXT= '7acb1b1a-6660-11ea-b89b-00163e0477d5:17' |

| mysql-bin.000017 | 1275 | Query          |        6 |        1364 | drop database mdp   

6.3 截取日志  

mysqlbinlog --include-gtids='7acb1b1a-6660-11ea-b89b-00163e0477d5:15-16'  --skip-gtids   /data/binlog/mysql-bin.000017   >/tmp/bbq3.sql


6.4进行恢复

set sql_log_bin=0;

source /tmp/bbq3.sql

set sql_log_bin=1;

总结:

选择场景:

数据量较少,建议mysqldump。大约在100G -200G左右。大概1个小时-2个小时。

恢复是备份时间的2~3倍左右。

优点:可读性比较强,压缩比高,不需要下载安装,自带工具。

缺点:备份时间相对较长,恢复时间比备份时间长。

分布式架构,数据量较大的时候,可以才用分布式备份,也可以 选择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

你可能感兴趣的:(mysql 备份恢复-mysqldump)