我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。

个人博客:传送阵

笔者微信:zhanghe15069028807

0、备份与恢复概述


系统版本 mysql版本 安装方式
centos7 5.7.28 二进制安装

数据库要备份的内容:

  • dababase数据文件
  • binlog日志文件
  • my.cnf配置文件

注:

1、所有的数据库备份文件都应当放在非数据库本地,而且建议备份多份。

2、仅备份没啥用,我们备份的目的是为了恢复,能够正常恢复才是最终目标,所以要经常进行恢复的演练,通常,恢复演练也是运维工作者的日常工作之一。

数据备份要考虑的因素:

  • 数据的一致性
  • 服务的可用性

数据库的备份模式:

  • 完全备份
  • 增量备份:在上一次备份的基础上,仅备份有变化的部分。
  • 差异备份:在完全备份的基础上,仅备份有变化的部分。

逻辑备份与物理备份的区别:

  • 逻辑备份:备份的是SQL语句,效率较低,用于中小型企业。
  • 物理备份:备份的具体的数据,效率较高,用于大型企业。

1、逻辑备份-完整备份与恢复


mysql自带逻辑备份工具mysqldump,可以保证数据的一致性和服务的可用性。

>mysqldump -h 服务器 -u 用户名  -p 密码 数据库名 > 备份文件.sql
//常用参数
-A,--all-databases #备份所有库
-B,--databases #备份多个库
--single-transaction #保证数据的一致性和服务的可用性
--master-data=1|2 #通常等于1,记录binlog日志位置与文件名,追加至备份文件中
-F,--flush-logs #备份之前刷新日志
-E,--events #备份事件调度器代码
--triggers #备份触发器
-R,--routines #备份存储过程和存储函数

第一步:进入mysqld创建一个数据库test1

mysql -u root -p"cba-123"
mysql>create database test1;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+

创建好test1数据库之后,我们就要开始全量备份了,备份之前要先开启二进制日志。

第二步:在/etc/my.cnf文件里面开启二进制日志

vim /etc/my.cnf
[mysqld]
basedir=/soft/mysql
datadir=/soft/mysql/data
default_password_lifetime=0
server-id = 241 #id是做标识,随便填写
log-bin=/log/mysql/bin-log #设置二进制日志存放的位置

第三步:保证二进制日志文件的存在和权限

mkdir -p /log/mysql/ ; touch /log/mysql/bin-log ;
chown -R mysql:mysql /log/mysql/bin-log;

第四步:准备好全量备份好的文件存放的目录和权限

mkdir /backup/mysql -p
chown -R mysql:mysql /backup/mysql/

第五步:重启数据库进行全量备份

/etc/init.d/mysqld restart
mysqldump -uroot -pcba-123
--all-databases
--single-transaction
--master-data=1
--flush-logs > /backup/mysql/$(date +%F%H)-mysql-all.sql

第六步:破坏数据库,删除数据表

/etc/init.d/mysqld stop
rm -rf /soft/mysql/data/*

第七步:向全量备份文件里面追加不记录二进制日志的命令

sed -i '23a SET sql_log_bin=0;' /backup/mysql/2019-11-2810-mysql-all.sql

向全量备份文件里面追加不记录二进制日志的命令的原因是因为我们在恢复的时候要重新执行一次SQL语句,这个语句没有记录的必要,如果记录的话还可能会导致恢复失败。

第八步:重启初始化数据库、启动数据库、并修改密码

/soft/mysql/bin/mysqld --initialize --user=mysql --basedir=/soft/mysql --datadir=/soft/mysql/data
/etc/init.d/mysqld start
mysql -u root -p'U0ln8LE!ue=#'
mysql> ALTER USER USER() IDENTIFIED BY '123';
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+

由于这是一个新的数据库,里面只有默认的库,并没有test1数据库。

第九步:导入全备的数据

mysql -u root -p'123' < /backup/mysql/2019-11-2810-mysql-all.sql
mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+

其实在数据库内部也可以进行恢复,如下所示

mysql> set	sql_log_bin=0;
mysql> source /backup/mysql/2019-11-2810-mysql-all.sql

导入之后当前的密码会不变,当进入数据库flush privileges之后,密码又恢复到备份时的cba-123了。

2、逻辑备份-增量备份与恢复


实战案例1: 数据库完整备份+数据库增量备份

新建数据表, 进行全量备份, 随着时间推移, 数据库突然奔溃

(1)环境准备

//备份之前
mysql> create database bgx;
mysql> create table bgx.t1 (id int,name varchar(20));
mysql> insert into bgx.t1 values (1,"bgx1");
mysql> insert into bgx.t1 values (2,"bgx2");
mysql> select * from bgx.t1;
+------+------+
| id | name |
+------+------+
| 1 | bgx1 |
| 2 | bgx2 |
+------+------+ //基于当前状态做一次全备
mysqldump -uroot -pcba-123 --all-databases --single-transaction --master-data=1 --flush-logs > /backup/mysql/$(date +%F%H)-mysql-all.sql //进入数据库,再插入一些数据
mysql> insert into bgx.t1 values (3,"bgx3");
mysql> insert into bgx.t1 values (5,"tt");
mysql> select * from bgx.t1;
+------+------+
| id | name |
+------+------+
| 1 | bgx1 |
| 2 | bgx2 |
| 3 | bgx3 |
| 5 | tt |
+------+------+
//模拟数据库崩溃,重启初始化,启动数据库,更改默认密码
/etc/init.d/mysqld stop
rm -rf /soft/mysql/data/*
/soft/mysql/bin/mysqld --initialize --user=mysql --basedir=/soft/mysql --datadir=/soft/mysql/data
/etc/init.d/mysqld start
mysql -p'1=FuY==qhkjd'
mysql> ALTER USER USER() IDENTIFIED BY '123';

(2)恢复全量数据

[root@mysql02 ~]# sed -i "23aSET sql_log_bin=0;" /backup/mysql/2019-11-2810-mysql-all.sql
[root@mysql02 ~]# mysql -uroot -p'123' < /backup/mysql/2019-11-2810-mysql-all.sql
[root@mysql02 ~]# mysql -u root -p'123' -e "select * from bgx.t1"
+------+------+
| id | name |
+------+------+
| 1 | bgx1 |
| 2 | bgx2 |
+------+------+

(3)恢复增量备份

第一步:查看一下全量备份,备份到哪个点了,如下所示是154这个点,000001这个日志文件

[root@mysql02 ~]# sed -n '22p' /backup/mysql/2019-11-2810-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000001', MASTER_LOG_POS=154;

全量仅备份到了154这个点,154后面的点全备文件里面就没有了,需要去000002以后的二进制文件里面找

第二步:根据 MASTER_LOG_POS恢复增量的数据

[root@mysql02 mysql]# pwd
/log/mysql
[root@mysql02 mysql]#mysqlbinlog --start-position=154 bin-log.000001 bin-log.000002 bin-log.000003 bin-log.000003 | mysql -uroot -p'123';
[root@mysql02 ~]# mysql -u root -p'123' -e "select * from bgx.t1"
+------+------+
| id | name |
+------+------+
| 1 | bgx1 |
| 2 | bgx2 |
| 3 | bgx3 |
| 5 | tt |
+------+------+

3、新来的开发妹子删了库!

上周,新来的开发妹子删了库,这件事不想再回忆了,以后打死也不会把数据库的root权限轻易给别人了。今天把当时的场景用虚拟机还原一下,然后复现一下数据恢复的过程,就当是个总结吧!说多了都是泪啊~

(1)模拟环境准备

[root@mysql02 ~]# mysql -p'cba-123'
mysql> create database bgxdb;
mysql> use bgxdb;
mysql> create table t1 (id int,name varchar(20));
mysql> insert into t1 values (1,"ccr");
mysql> insert into t1 values (2,"tfr");
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
+------+------+

(2)全备

[root@mysql02 ~]# mysqldump -uroot -pcba-123 --all-databases --single-transaction --master-data=1 --flush-logs > /backup/mysql/$(date +%F%H)-mysql-all.sql

(3)再次插入数据

[root@mysql02 ~]# mysql -p'cba-123';
mysql> insert into bgxdb.t1 values
-> (3,'tr1'),
-> (4,'zx'),
-> (5,'wq'),
-> (6,'tj'),
-> (7,'gwt');
mysql> select * from bgxdb.t1;
+------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
| 3 | tr1 |
| 4 | zx |
| 5 | wq |
| 6 | tj |
| 7 | gwt |
+------+------+

(4)开发妹子的误操作

mysql> delete from bgxdb.t1 where id = '2';
mysql> drop database bgxdb;

(5)恢复全备

[root@mysql02 ~]# sed -i '23aSET sql_log_bin=0;' /backup/mysql/2019-11-2812-mysql-all.sql
[root@mysql02 ~]# mysql -u root -p'cba-123' < /backup/mysql/2019-11-2812-mysql-all.sql
[root@mysql02 ~]# mysql -u root -p'cba-123' -e "select * from bgxdb.t1"
+------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
+------+------+

(6)进一步小心地恢复,跳过DELETEDROP语句

下面的操作就要小心翼翼了,不能一下子把二进制日志里面全备以后的操作全部恢复,一旦全部恢复了,那开发妹子的删除操作也会恢复,我们只能跳过误操作的地方。

[root@mysql02 ~]# sed -n '22p' /backup/mysql/2019-11-2812-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='bin_log.000002', MASTER_LOG_POS=154;
[root@mysql02 ~]# ls /log/mysql/ #全备之后只有一个` bin_log.000002`二进程日志文件
[root@mysql02 ~]# mysqlbinlog --start-position=154 --stop-position=577
[root@mysql02 ~]# mysqlbinlog --start-position=670 --stop-position=701
[root@mysql02 ~]# mysql -uroot -p'cba-123' -e "select * from bgxdb.t1" +------+------+
| id | name |
+------+------+
| 1 | ccr |
| 2 | tfr |
| 3 | tr1 |
| 4 | zx |
| 5 | wq |
| 6 | tj |
| 7 | gwt |
#被开发妹子删除的数据终于恢复回来了

注:上述案例在全备之后仅产生了一个二进制日志,如果有多个呢?该如何操作?如下所示

mysqlbinlog --base64-output="decode-rows" -v bin_log.000001 bin_log.000002 > test3.sql

MYSQL的备份与恢复--逻辑备份mysqldump的更多相关文章

  1. 逻辑备份,mysqldump,SELECT…INTO OUTFILE,恢复

    逻辑备份 mysqldump mysqldump备份工具最初由Igor Romanenko编写完成,通常用来完成转存(dump)数据库的备份以及不同数据库之间的移植,例如从低版本的MySQL数据库升级 ...

  2. MySQL 逻辑备份mysqldump&mysqlpump&mydumper原理解析

    目录 准备 mysqldump备份 mysqlpump备份 mydumper备份 想弄清除逻辑备份的原理,最好的办法是开启general_log,一探究竟 准备 创建用户 CREATE USER IF ...

  3. (十二)MySQL逻辑备份mysqldump

    (1)简介 语法 mysqldump -h服务器 -u用户名 -p密码 [-P端口号] [参数] 数据库名 >备份文件.sql 关于数据库: -A,--all-databases 所有库,会生成 ...

  4. mysql的2种备份mysqldump 和 Xtrabackup

    mysqldump备份方式 备份 mysqldump -uroot -p 数据库名 > 备份的文件名 恢复(先关闭数据库) mysql -uroot -p 数据库名 < 备份的文件名 Xt ...

  5. MySQL逻辑备份mysqldump

    MySQL 备份之 mysqldump mysqldump mysqldump工具备份: 本质:导出的是SQL语句文件 优点:不论是什么存储引擎,都可以用mysqldump备成SQL语句 缺点:速度较 ...

  6. MYSQL的备份与恢复--物理备份xrabackup

    目录 1.数据库完整备份与恢复 (1)环境准备 (2)完全备份恢复流程 2.数据库增量备份与恢复 (1)增量和差异概述 (2)增量备份和恢复 3.数据库差异备份与恢复 4.简单命令进行物理备份 5.实 ...

  7. 逻辑备份(mysqldump/select into outfile)

    #mysqldump备份 shell> mysqldump -uroot -p -P4306 sakila actor>E:\sakila-actor.sql shell> mysq ...

  8. Mysql备份与恢复(2)---逻辑备份

    数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小.上一篇针对使用xtrabackup工具进行物理备份和数据恢复做了一个详细讲解,本篇 ...

  9. MySQL的备份与恢复理解与备份策略

    MySQL的备份主要分为逻辑备份和物理备份 逻辑备份 在MySQL中逻辑备份的最大优点是对各种存储引擎都可以用同样的方法来备份.而物理备份则不同,不同的存储引擎有着不同的备份方法.Mysql中的逻辑备 ...

随机推荐

  1. netcore 2.2 使用 AutoMapper 实现实体之间映射

    一.什么是AutoMapper? AutoMapper是一个简单的对象映射框架(OOM),将一个对象映射到另一个对象. 二.AutoMapper的好处 以前的时候我们将DTO对象转换为Model对象时 ...

  2. NLTK实现文本切分

    之前已经了解了使用nltk库,将文本作为参数传入相应函数进行切分的方法,下面看看使用正则表达式如何来进行文本切分. 1. 使用正则表达式切分 1.1 通过RegexpTokenizer 进行切分.先导 ...

  3. Python中Pyyaml模块的使用

    一.YAML是什么 YAML是专门用来写配置文件的语言,远比JSON格式方便. YAML语言的设计目标,就是方便人类读写. YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩 ...

  4. Python 基础语法-str

    字符串常见操作 find:检测str是否包含在 mystr 中,如果是返回开始的索引值,否则返回 -1 mystr.index(str, start=0, end=len(mystr)) count: ...

  5. oracle 根据时间戳查询date类型sql

    话不多说上sql: select to_char(1574837126879/(1000*60*60*24)+to_date('1970-01-01 08:00:00','YYYY-MM-DD HH2 ...

  6. mongodb使用_遍历列表中的元素,作为变量,循环修改mongodb中的字段

    一.问题描述: 需要将工作界面上的一些已经离职的用户状态改为失效,并备注为离职 二.需要准备/拿到手的工具/条件/数据: 1.已离职人员名单(excel格式) 2.任意mongodb工具(笔者使用的是 ...

  7. python总结【来自Runoob】

    test.py #!/usr/bin/python print "Hello, Python!"; $ chmod +x test.py # 脚本文件添加可执行权限 $ ./tes ...

  8. 强大的django-debug-toolbar,django项目性能分析工具

    强大的django-debug-toolbar,django项目性能分析工具 给大家介绍一个用于django中debug模式下查看网站性能等其他信息的插件django-debug-toolbar 首先 ...

  9. gmail 批量删除邮件

    前几天我在 github上 star 了一下 angular 项目,然后8,9 天的时间收到了很多邮件,起初我没注意看具体数量,直接全选-删除.结果删了 3,4 页了还有很多.再仔细一看,一万多封邮件 ...

  10. 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2019-12-12)

    说明: 争取做更多的实战性应用,分享更多的嵌入式技术,希望能在实际项目中帮到大家. (1)V7将大力加强对初学者的支持力度,已经更新至63章,下载链接,后37章和一批视频教程将加紧制作. (2)事隔五 ...