一、备份方式

①逻辑备份(文件表示:SQL语句)

②物理备份(数据文件的二进制副本)

③基于快照的备份

④基于复制的备份

二、备份工具

①mysqldump:原生自带的逻辑备份工具

②mysqlbinlog:实现binlog备份的原生态命令

③xtrabackup:precona公司开发的性能很高的物理备份工具

三、Mysqldump

1、常用参数

-A, --all-databases      #备份所有库
-B 增加建库(create)及"use库"的语句,可以接多个库名,同时备份多个库
-B 库1 库2
-d #仅备份表结构
-t #仅备份数据
--compact #减少无用数据输出(调试)
-R, --routines #备份存储过程和函数数据
--triggers #备份触发器数据
-F,--flush-logs #刷新binlog日志
--master-data=1|2 #告诉备份时刻的binlog位置
-x, --lock-all-tables #锁所有备份表
-l, --lock-tables #锁单表

2、参数使用详解

①全库备份

mysqldump -uroot -p123456 -A >/backup/full.sql

②备份多个库

mysqldump -uroot -p123456 -B oldboy oldgirl>/backup/oldboy_oldgirl.sql

③分库备份

for name in `mysql -uroot -p123456 -e "show databases;"|sed 1d`
do
mysqldump -uroot -p'' -B $name
done

④单表备份

mysqldump -uroot -p123456 oldboy test>/backup/oldboy_test.sql

⑤多表备份

mysqldump -uroot -p123456 oldboy 表1 表2 表3 …… /backup/oldboy_test.sql

⑥分库分表备份

#!/bin/sh
Myuser=root
Mypass=
Mycmd="mysql -u$Myuser -p$Mypass"
Mydump="mysqldump -u$Myuser -p$Mypass -x -F -R"
Dblist=`$Mycmd -e "show databases;"|sed '1,2d'|egrep -v "_schema|mysql"`
for database in $Dblist
do
Tablist=`$Mycmd -e "show tables from $database;"|sed 1d`
for table in $Tablist
do
mkdir -p /tmp/${database}
$Mydump $database $table|gzip >/tmp/${database}/${table}_$(date +%F).sql.gz
done
done

⑦压缩备份

mysqldump -uroot -p123456  -B --master-data= oldboy|gzip >/backup/oldboy.sql.gz

⑧innodb引擎备份命令

mysqldump -uroot -p123456 -A -B -R --triggers --master-data= --single-transaction|gzip >/backup/all.sql.gz

⑨适合多引擎混合备份

mysqldump -uroot -p123456 -A -B -R --triggers --master-data=|gzip >/backup/alL_$(date +%F).sql.gz

3、mysqldump备份恢复实战案例

===================================================

环境:正在运行的网站,mysql数据库,数据量25G,日业务增量10-15M

[root@db ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@db ~]# uname -r
2.6.-.el6.x86_64
[root@db ~]# getenforce
Disabled
[root@db ~]# hostname -I
172.19.5.56 172.16.1.56
[root@db ~]# mysql -V
mysql Ver 14.14 Distrib 5.6., for linux-glibc2. (x86_64) using EditLine wrapper

备份方式:每天晚上00:00,计划任务调用mysqldump执行全备脚本

mysqldump -uroot -p123456 -A -B -R --triggers --master-data= |gzip >/backup/all_$(date +%F_%T).sql.gz

故障时间点:第二天上午10点,某开发人员误删除了一个表

如何恢复?

=====================================================

解题思路:

1、使用测试库,恢复全备 source
2、恢复从00:00到10点之间的binlog
    a.截取00:00到10点这段 binlog在测试库恢复
    b.导出删除表
3、将删除的表进行恢复到生产库

①模拟数据

create database oldboy;#创建oldboy库
use oldboy;
create table test( id int() not null,name char() not null);#在oldboy库中创建test表
insert into test values(,"oldboy");#test表中插入数据
insert into test values(,"oldgirl");
insert into test values(,"inca");
insert into test values(,"zuma");
insert into test values(,"kaka");
insert into test values(,"老男孩");
mysql> select * from oldboy.test;
+----+-----------+
| id | name |
+----+-----------+
| | oldboy |
| | oldgirl |
| | inca |
| | zuma |
| | kaka |
| | 老男孩 |
+----+-----------+

②模拟全备之后增量数据

mysql -e "use oldboy;insert into test values(7,'bingbing');"
mysql -e "use oldboy;insert into test values(8,'xiaoting');"
mysql -e "select * from oldboy.test;"
+----+-----------+
| id | name |
+----+-----------+
| | oldboy |
| | oldgirl |
| | inca |
| | zuma |
| | kaka |
| | 老男孩 |
| | bingbing |
| | xiaoting |
+----+-----------+

③误删除数据

[root@db ~]# date -s "2018/01/23 10:00"
mysql> use oldboy;
Database changed
mysql> drop table test;
mysql> show tables;
Empty set (0.00 sec)

④开始恢复准备

iptables -I INPUT -p tcp --dport  ! -s 172.19.5.56 -j DROP #非172.19.5.56禁止访问数据库3306端口

收集恢复所需数据

cp -a /data/mysql/mysql-bin.* /backup/   #copy所有的binlog日志到/backup下面,binlog指定在哪里看配置文件即可
gzip -d all_2018--22_00\:\:.sql.gz #解压晚上00:00点的全备
[root@db backup]# sed -n '22p' all_2018--22_00\:\:.sql #提取出binlog位置点
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=;
mysqlbinlog -d oldboy --start-position=658960 mysql-bin.000002 -r bin.sql #截取binlog位置点
[root@db backup]# ll /backup/ #收集到最终全备及增量恢复所需的数据
total
-rw-r--r-- root root -- : all_2018--22_00::.sql
-rw-rw---- root root -- : bin.sql
-rw-rw---- mysql mysql -- : mysql-bin.
-rw-rw---- mysql mysql -- : mysql-bin.

⑤恢复全备

mysql <all_2018--22_00\:\:.sql
[root@db backup]# mysql -e "select * from oldboy.test;"
+----+-----------+
| id | name |
+----+-----------+
| | oldboy |
| | oldgirl |
| | inca |
| | zuma |
| | kaka |
| | 老男孩 |
+----+-----------+

⑥恢复增量数据

[root@db backup]# mysql<bin.sql
[root@db backup]# mysql -e "select * from oldboy.test;"
+----+-----------+
| id | name |
+----+-----------+
| | oldboy |
| | oldgirl |
| | inca |
| | zuma |
| | kaka |
| | 老男孩 |
| | bingbing |
| | xiaoting |
+----+-----------+

恢复数据完毕,调整iptables允许用户访问,截取多个binlog问题

mysqlbinlog -d oldboy --start-position= mysql-bin. mysql-bin. -r bin.sql

四、XtraBackup

xtrabackup:是一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,占用磁盘空间小,能够非常快速地备份与恢复mysql数据库,(备份时不影响数据读写)

1、工作原理

2、安装部署

①添加yum源安装依赖

wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

 ②下载安装xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
yum -y install percona-xtrabackup--2.4.-.el6.x86_64.rpm

3、XtraBackup备份恢复实战

①全备

innobackupex --no-timestamp /backup/full

由于备份命令依赖于/etc/my.cnf文件中basedir  datadir  socket,如配置文件中未配置,需在命令行指定

[client]
user = root
password = [mysqld]
log-bin=/data/mysql/mysql-bin
character-set-server = utf8
basedir = /application/mysql/
datadir = /application/mysql/data/
port =
socket = /tmp/mysql.sock

②应用日志到全备中(预处理数据)

innobackupex --apply-log /backup/full/

③模拟数据损坏

rm -fr /application/mysql/data/*
pkill mysql

④恢复全备数据

innobackupex --copy-back /backup/full/
chown -R mysql.mysql /application/mysql-5.6./ #这里重新授权注意一下,有时候发现授权软链接不管用

⑤查看恢复结果

[root@db ~]# mysql -e "select * from oldboy.test;"
+----+-----------+
| id | name |
+----+-----------+
| | oldboy |
| | oldgirl |
| | inca |
| | zuma |
| | kaka |
| | 老男孩 |
| | bingbing |
| | xiaoting |
+----+-----------+

innobackupex命令常用参数说明

--defaults-file
#指明服务器的配置文件,此参数必须作为innobackupex的第一个参数,否则报错
--user #备份的用户名
--password #指明备份用户名的密码
/backup #备份的目录
--apply-log #指明为重做日志
--copy-back #指明为恢复
--slave-info
#备份从库的show slave status信息,仅用于在备份从库时使用
--no-lock
#不锁表,仅适用于存储引擎为innodb,并且不在乎备份位置点时使用

--no-timestamp#不按时间生成备份目录

4、XtraBackup增量备份恢复实战

=================================================

场景:xtrabackup全备+增量

备份策略:定时任务周日晚上00点全备,周一到周六都是基于上一天的增量备份

故障场景:周三的时候,下午两点,某开发小菜鸟误删除了一张test表,大于2G

解决思路:

①准备上周日全备,并--apply-log --redo-only
②合并增量,周一 、周二 --apply-log --redo-only 周三 --apply-log
③在测试库恢复以上数据,数据的目前状态应该周三凌晨1:00
④需要恢复的数据状态是,下午2点钟左右,删除test表之前的数据状态,从1点开始的binlog恢复到删除之前的那个events的position
⑤导出删除的表test,恢复到生产库,验证数据可用性、完整性。
⑥启动应用连接数据库

==================================================

①模拟案例

mkdir /backup/inc{,} -p #创建增量备份的目录
innobackupex --no-timestamp /backup/full/ #周日全备 #模拟插入数据#
insert into test values(,'outman');
insert into test values(,'man');

②周一增量备份

innobackupex --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1

③再次模拟插入数据

insert into test values(,'');
insert into test values(,'');

④周二增量备份

innobackupex --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2

⑤再次模拟数据变化

insert into test values(,'newdata1');
insert into test values(,'newdata2');

此时表中内容为

mysql> select * from test;
+-----+-----------+
| id | name |
+-----+-----------+
| | oldboy |
| | oldgirl |
| | inca |
| | zuma |
| | kaka |
| | 老男孩 |
| | bingbing |
| | xiaoting |
| | outman |
| | man |
| | |
| | |
| | newdata1 |
| | newdata2 |
+-----+-----------+
rows in set (0.00 sec)

⑥故障场景模拟:下午2点误删除test表

mysql> use oldboy;
Database changed
mysql> drop table test;
Query OK, rows affected (0.01 sec) mysql> select * from test;
ERROR (42S02): Table 'oldboy.test' doesn't exist

故障恢复:

①全备进行apply-log,暂时不需要undo回滚,只做redo

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

②将周一的inc1合并到全备当中去,暂时不需要undo回滚,只做redo

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

③将周二的inc2合并到全备当中去,undo和redo都apply

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

④最终把所有合并后的备份集合做apply

innobackupex --apply-log /backup/full

⑤截取周二增量备份inc2之后产生的binlog,截取到delete之前,即可恢复故障

确认binlog起点

[root@db ~]# cat /backup/inc2/xtrabackup_binlog_info
mysql-bin.

截取drop操作之前的binlog

mysqlbinlog --start-position= --stop-position= /data/mysql/mysql-bin. >/backup/incbinlog.sql

使用命令查看binlog的event

mysql> show binlog events in 'mysql-bin.000017';
+------------------+------+-------------+-----------+-------------+-----------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+-------------+-----------+-------------+-----------------------------------------------------------+
| mysql-bin. | | Format_desc | | | Server ver: 5.6.-log, Binlog ver: |
| mysql-bin. | | Query | | | BEGIN |
| mysql-bin. | | Query | | | use `oldboy`; insert into test values(,'outman') |
| mysql-bin. | | Xid | | | COMMIT /* xid=37 */ |
| mysql-bin. | | Query | | | BEGIN |
| mysql-bin. | | Query | | | use `oldboy`; insert into test values(,'man') |
| mysql-bin. | | Xid | | | COMMIT /* xid=38 */ |
| mysql-bin. | | Query | | | BEGIN |
| mysql-bin. | | Query | | | use `oldboy`; insert into test values(,'') |
| mysql-bin. | | Xid | | | COMMIT /* xid=57 */ |
| mysql-bin. | | Query | | | BEGIN |
| mysql-bin. | | Query | | | use `oldboy`; insert into test values(,'') |
| mysql-bin. | | Xid | | | COMMIT /* xid=58 */ |
| mysql-bin. | | Query | | | BEGIN |
| mysql-bin. | | Query | | | use `oldboy`; insert into test values(,'newdata1') |
| mysql-bin. | | Xid | | | COMMIT /* xid=77 */ |
| mysql-bin. | | Query | | | BEGIN |
| mysql-bin. | | Query | | | use `oldboy`; insert into test values(,'newdata2') |
| mysql-bin. | | Xid | | 1484 | COMMIT /* xid=78 */ |
| mysql-bin. | | Query | | | use `oldboy`; DROP TABLE `test` /* generated by server */ |
+------------------+------+-------------+-----------+-------------+-----------------------------------------------------------+
rows in set (0.00 sec)

停库,备份binlog日志,本实例中binlog日志单独存放在/data/mysql目录下,无需备份

[root@db ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
[root@db ~]# rm -fr /application/mysql/data/*

恢复xtrabackup数据

innobackupex --copy-back /backup/full/
chown -R mysql.mysql /application/mysql-5.6./
/etc/init.d/mysqld start

恢复binlog

mysql> set sql_log_bin=; #临时不记录binlog
Query OK, rows affected (0.00 sec) mysql> source /backup/incbinlog.sql
Query OK, rows affected (0.00 sec)

⑥故障恢复完毕

mysql> select * from oldboy.test;
+-----+-----------+
| id | name |
+-----+-----------+
| | oldboy |
| | oldgirl |
| | inca |
| | zuma |
| | kaka |
| | 老男孩 |
| | bingbing |
| | xiaoting |
| | outman |
| | man |
| | |
| | |
| | newdata1 |
| | newdata2 |
+-----+-----------+
rows in set (0.00 sec)

linux运维、架构之路-MySQL备份与恢复(四)的更多相关文章

  1. linux运维架构师职业规划

    1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...

  2. Linux运维必会的MySQL企业面试题大全

    (1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld start service mysqld start systemctl start mysqld 2.检测端口是 ...

  3. 写给自己看的Linux运维基础(二) - Apache/MySQL. 安全设置. 定时任务

    本文使用环境为CentOS 6 Apache, PHP, MySQL等常用软件均可通过yum安装包获取 yum install httpd php mysql-server # mysql: 客户端; ...

  4. linux运维中的命令梳理(四)

    ----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不 ...

  5. Linux运维企业架构实战系列

    Linux运维企业架构项目实战系列 项目实战1-LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2-LVS.nginx实现负载均衡系列 2.1 项目实战2.1-实现基于LVS负载均衡集 ...

  6. 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

    做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...

  7. Linux运维企业架构项目实战系列

    Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...

  8. Linux 运维入门到跑路书单推荐

    一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...

  9. (转)linux运维必会MySQL企业面试题

    linux运维必会MySQL企业面试题  老男孩教育运维班全体学员MySQL必会企业面试题最实战.最细致.最落地的运维实训基地,老男孩教育连续多年国内平均就业工资最高! 数据库的重要性是所有技术里最核 ...

随机推荐

  1. Zabbix4.0.1使用自带模板监控Linux主机 CPU、内存、硬盘、网卡

    环境: 前提已经安装好zabbix服务端.zabbix客户端, zabbix_server端ip和主机名信息:    ip:192.168.1.204 hostname:  www.test.com ...

  2. Ubuntu vimrc 和 bashrc 配置

    先上效果图,把vimrc 和bashrc 备份一下.. vimrc: map <F9> :call SaveInputData()<CR> func! SaveInputDat ...

  3. centos7配置NTP时间服务器

    Network Time Protocol--NTP时间服务器,用来同步网络中各个计算机时间的协议. 通常将一台服务器配置为时间服务器,然后集群内其他服务器都来同步这台服务器的时间. 目的:集群内所有 ...

  4. 使用screen管理后台程序

    我们常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了.这时,我们可以用sc ...

  5. 【监控实践】【4.1】利用trace实现阻塞跟踪和慢查询跟踪

    原文:https://blog.csdn.net/kk185800961/article/details/49252037 分享个SQLServer profiler 的一个技巧吧.很早用过,忘记总结 ...

  6. Java——LinkedList底层源码分析

    1.简介 LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢.另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈 ...

  7. python爬取b站排行榜

    爬取b站排行榜并存到mysql中 目的 b站是我平时看得最多的一个网站,最近接到了一个爬虫的课设.首先要选择一个网站,并对其进行爬取,最后将该网站的数据存储并使其可视化. 网站的结构 目标网站:bil ...

  8. 洛谷 P2347 砝码称重 & [NOIP1996提高组](dp,枚举)

    传送门 解题思路 一看数据范围<1000就坚定了我暴力的决心(不愧是1996年代的题还是t4QAQ) 所以很显然,暴力之中有一点dp的思想,就是把它们像多重背包一样拆分,拆成a1+a2+a3+a ...

  9. 码云与Git的使用

    码云注册和使用 网址:https://gitee.com 注册之后新建一个仓库 接下来安装Git 协同开发Git安装与使用 下载地址:https://gitforwindows.org 安装完成之后选 ...

  10. 什么场景下用redis而不用mysql?

    redis我们用作缓存,对查询速度要求比较高的应用场景比较适合.对有复杂逻辑关系的存储不适合. mysql是硬盘存储的,在高性能io要求的项目里不能满足需求,而redis所有数据存在内存里,因此要快得 ...