目录

一、数据备份的重要性

二、数据库备份的分类

2.1从物理与逻辑的角度,备份可分为物理备份与逻辑备份

2.2从数据库的备份策略角度:备份可分为完全备份、差异备份、 增量备份

2.2.1完全备份

2.2.2差异备份

2.2.3增量备份

2.2.4备份方式比较

三、常见的备份方法

四、MySQL完全备份

4.1MySQL完全备份介绍

4.2MySQL完全备份优缺点

4.3数据库完全备份分类

4.3.1物理冷备份与恢复

4.3.2mysqldump备份与恢复

五、MySQL完全备份与恢复

5.1物理冷备份与恢复

5.2 mysqldump 备份与恢复(温备份)

5.2.1完全备份一个完整的数据库 (包括其中所有的表)

5.2.2完全备份多个完整的数据库 (包括其中所有的表)

5.2.3完全备份 MySQL 服务器中所有的库

5.2.4完全备份指定库中的部分表

5.2.5完全备份指定库中的多张表

5.2.6查看备份文件

六、Mysql 完全备份恢复

6.1使用source命令恢复数据

①先备份

②模拟删除

③恢复

6.2使用mysql命令恢复数据

6.3有无--database的区别

6.3.1有database 

6.3.2无database

6.4Crontab -e——执行定时备份

七、Mysql日志

7.1开启二进制日志功能

7.1.1二进制日志(binlog)有3种不同的记录格式:

7.1.1.1 STATEMENT(基于SQL语句)

7.1.1.2 ROW(基于行)

7.1.1.3MIXED 推荐使用

7.2查看数据库日志

7.3查看二进制日志文件的内容

7.4二进制日志中需要关注的部分

八、MySQL 增量备份

8.1使用二进制日志备份与恢复( 一般恢复)

8.2基于位置点恢复

8.2.1断点恢复

8.3基于时间点恢复


一、数据备份的重要性

备份的主要目的是灾难恢复

在生产环境中,数据的安全性至关重要

任何数据的丢失都可能产生严重的后果

造成数据丢失的原因

  • 程序错误
  • 人为操作错误
  • 运算错误
  • 磁盘故障
  • 灾难(如火灾、地震)和盗窃

二、数据库备份的分类

2.1从物理与逻辑的角度,备份可分为物理备份与逻辑备份

①物理备份:对数据库操作系统的物理文件(如数据文件、 日志文件等)的备份

物理备份的方法:

  • 冷备份(脱机备份):是在关闭数据库的时候进行的
  • 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
  • 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作

②逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份,表示为逻辑数据库结构
这种类型的备份适用于可以编辑数据值或表结构

2.2从数据库的备份策略角度:备份可分为完全备份、差异备份、 增量备份

  • 完全备份:每次对数据库进行完整的备份
  • 差异备份:备份自从上次完全备份之后被修改过的文件
  • 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份
2.2.1完全备份

2.2.2差异备份

2.2.3增量备份

2.2.4备份方式比较
备份方式完全备份差异备份增量备份
完全备份时的状态表1、 表2表1、 表2表1、 表2
第一次添加内容创建表3创建表3创建表3
备份内容表1、 表2、表3表3表3
第二次添加内容创建表4创建表4创建表4
备份内容表1、 表2、表3、表4表3、表4表4

逻辑备份的策略(增量备份、全、差异备份)
如何选择逻辑备份策略(频率)
合理值区间⭐⭐⭐ 
一周一次的全备,全备的时间需要在不提供业务的时间区间进行 PM 10点 AM 5:00之间进行全备 (一般凌晨 1:00~5:00 )
增量:3天/2天/1天一次增量备份
差异:选择特定的场景进行备份
一个处理(NFS)提供额外空间给与mysql 服务器用

三、常见的备份方法

物理冷备

  • 备份时数据库处于关闭状态,直接打包 (tar)数据库文件
  • 备份速度快,恢复时也是最简单的

专用备份工具mydump或mysqlhotcopy

  • mysqldump常用的逻辑备份工具
  • mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

启用二进制日志进行增量备份

  • 进行增量备份,需要刷新二进制日志

MySQL支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文件为用户提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复。如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志。

第三方工具备份

  • 免费的MySQL热备份软件Percona XtraBackup

四、MySQL完全备份

4.1MySQL完全备份介绍

  • 是对整个数据库、数据库结构和文件结构的备份
  • 保存的是备份完成时刻的数据库
  • 是差异备份与增量备份的基础

4.2MySQL完全备份优缺点

优点

  • 备份与恢复操作简单方便

缺点

  • 数据存在大量的重复
  • 占用大量的备份空间
  • 备份与恢复时间长

4.3数据库完全备份分类

4.3.1物理冷备份与恢复
  • 关闭MySQL数据库
  • 使用tar命令直接打包数据库文件夹
  • 直接替换现有MySQL目录即可
4.3.2mysqldump备份与恢复
  • MySQL自带的备份工具,可方便实现对MySQL的备份
  • 可以将指定的库、表导出为SQL脚本
  • 使用命令mysql导入备份的数据

mysql导入备份数据          mysqldump导出备份数据        将指定的库、表导出为SQL脚本

五、MySQL完全备份与恢复

InnoDB 存储引擎的数据库在磁盘上存储成三个文件:

db.opt(表属性文件)

表名.frm(表结构文件)

表名.ibd(表数据文件)

环境准备:

​
[root@localhost ~]#mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;    #查看有哪些库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| beijing            |
| class              |
| hunan              |
| mysql              |
| nanjing            |
| performance_schema |
| sys                |
+--------------------+
9 rows in set (0.01 sec)

mysql> use anhui;   #切换anhui库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;      #查看表
​

5.1物理冷备份与恢复

systemctl stop mysqld
yum -y install xz
#压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
mv /usr/local/mysql/data/ /opt/
#解压恢复
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C /usr/local/mysql/data/
cd /usr/local/mysql/data
mv /usr/local/mysql/data/* ./

tar   备份数据库所有备份文件     一般使用tar打包

数据恢复:

xz 备份数据库所有备份文件  

[root@localhost mysql]#tar Jcvf /opt/mysql_all$(date +%F).tar.xz /usr/local/mysql/data/

root@localhost mysql]#cd /opt/
[root@localhost opt]#ls
boost_1_59_0.tar.gz  data.tar.gz  mysql-5.7.17  mysql-5.7.17.tar.gz  mysql_all2024-03-25.tar.xz  rh
[root@localhost opt]#tar Jxvf mysql_all2024-03-25.tar.xz -C /home/mysql/data/

恢复数据   指定解压目录是 /home/mysql/data   注意目录   看你要去那个目录

恢复数据     指定解压目录是 /usr/local/mysql/data   注意目录  看你要去那个目录

[root@localhost mysql]#cd /opt
[root@localhost opt]#ls
boost_1_59_0.tar.gz  data  data.tar.gz  mysql-5.7.17  mysql-5.7.17.tar.gz  mysql_all2024-03-25.tar.xz  rh
[root@localhost opt]#tar Jxvf mysql_all2024-03-25.tar.xz -C /usr/local/mysql/data/

这种数据用于数据库整体迁数据

5.2 mysqldump 备份与恢复(温备份)

(1)完全备份一个或多个完整的库 (包括其中所有的表)
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql  

 #导出的就是数据库脚本文件
示例:
mysqldump -u root -p --databases kgc > /opt/kgc.sql       #备份一个kgc库
mysqldump -u root -p --databases mysql kgc > /opt/mysql-kgc.sql    #备份mysql与 kgc两个库 

环境准备:

[root@localhost ~]#mysql -uroot -p123123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| beijing            |
| mysql              |
| performance_schema |
| sys                |
| usr                |
+--------------------+
7 rows in set (0.00 sec)

mysql>
mysql> use anhui;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------+
| Tables_in_anhui |
+-----------------+
| hefei           |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from hefei;
+----+------+--------+
| id | name | cardid |
+----+------+--------+
|  1 | xh   | 12222  |
|  2 | xw   | 13332  |
|  3 | sx   | 13332  |
+----+------+--------+
3 rows in set (0.00 sec)
mysql> use beijing;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_beijing |
+-------------------+
| qhua              |
+-------------------+
1 row in set (0.00 sec)

mysql> select * from qhua;
+----+------+-------+
| id | name | phone |
+----+------+-------+
|  1 | lss  | 13333 |
|  2 | ngmt | 13366 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql>
mysql> create table beida(id int(3) not null,name varchar(6),hobby varchar(11));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into beida values(1,'khui','xue xi');
Query OK, 1 row affected (0.00 sec)

mysql> insert into beida values(2,'gquan','hui hua');
Query OK, 1 row affected (0.00 sec)

mysql> select * from beida;
+----+-------+---------+
| id | name  | hobby   |
+----+-------+---------+
|  1 | khui  | xue xi  |
|  2 | gquan | hui hua |
+----+-------+---------+
2 rows in set (0.00 sec)

mysql> use beijing;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_beijing |
+-------------------+
| beida             |
| qhua              |
+-------------------+
2 rows in set (0.00 sec)

mysql> 

5.2.1完全备份一个完整的数据库 (包括其中所有的表)

mysqldump -uroot -p123123 --databases anhui > anhui.sql

5.2.2完全备份多个完整的数据库 (包括其中所有的表)

mysqldump -uroot -p123123 --databases anhui beijing > /opt/anhui_beijing.sql

[root@localhost opt]#mysqldump -uroot -p123123 --databases anhui beijing > /opt/anhui_beijing.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#ll
总用量 134048
-rw-r--r--.  1 root root      2805 3月  25 18:09 anhui_beijing.sql
-rw-r--r--.  1 root root      2033 3月  25 18:00 anhui.sql
-rw-r--r--.  1 root root  83709983 3月  19 13:31 boost_1_59_0.tar.gz
drwxr-xr-x.  2 root root         6 3月  25 17:04 data
-rw-r--r--.  1 root root   1385218 3月  25 16:40 data.tar.gz
drwxr-xr-x. 37 7161 31415     4096 3月  19 21:01 mysql-5.7.17
-rw-r--r--.  1 root root  51433090 3月  19 13:31 mysql-5.7.17.tar.gz
-rw-r--r--.  1 root root    714336 3月  25 16:49 mysql_all2024-03-25.tar.xz
drwxr-xr-x.  2 root root         6 3月  26 2015 rh
[root@localhost opt]#cat anhui_beijing.sql 
-- MySQL dump 10.13  Distrib 5.7.17, for Linux (x86_64)
--
-- Host: localhost    Database: anhui
-- ------------------------------------------------------
-- Server version	5.7.17

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `anhui`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `anhui` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `anhui`;

--
-- Table structure for table `hefei`
--

DROP TABLE IF EXISTS `hefei`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `hefei` (
  `id` int(11) NOT NULL,
  `name` varchar(10) NOT NULL,
  `cardid` varchar(18) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `hefei`
--

LOCK TABLES `hefei` WRITE;
/*!40000 ALTER TABLE `hefei` DISABLE KEYS */;
INSERT INTO `hefei` VALUES (1,'xh','12222'),(2,'xw','13332'),(3,'sx','13332');
/*!40000 ALTER TABLE `hefei` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Current Database: `beijing`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `beijing` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `beijing`;

--
-- Table structure for table `qhua`
--

DROP TABLE IF EXISTS `qhua`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `qhua` (
  `id` int(3) NOT NULL,
  `name` varchar(6) DEFAULT NULL,
  `phone` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `qhua`
--

LOCK TABLES `qhua` WRITE;
/*!40000 ALTER TABLE `qhua` DISABLE KEYS */;
INSERT INTO `qhua` VALUES (1,'lss','13333'),(2,'ngmt','13366');
/*!40000 ALTER TABLE `qhua` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2024-03-25 18:09:52

5.2.3完全备份 MySQL 服务器中所有的库

(2) 完全备份 MySQL 服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql

[root@localhost opt]#mysqldump -uroot -p123123 --all-databases  > /opt/all-databases.sql

5.2.4完全备份指定库中的部分表

(3) 完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
例:
mysqldump -u root -p [-d] kgc info1 info2 > /opt/kgc_info1.sql
#使用“-d”选项,说明只保存数据库的表结构 
#不使用“-d"选项,说明表数据也进行备份

#做为一个表结构模板

[root@localhost opt]#mysqldump -uroot -p123123 beijing beida  > /opt/beijing_beida.sql

5.2.5完全备份指定库中的多张表

[root@localhost opt]#mysqldump -uroot -p123123 beijing beida qhua > /opt/beijing_beida_qhua_$(date +%F).sql

  完全备份指定库中的指定表,只保存数据库的表结构 -d 

[root@localhost opt]#mysqldump -uroot -p123123 -d beijing beida  > /opt/beijing_beida_jiegou.sql
[root@localhost opt]#cat beijing_beida_jiegou.sql  #查看

[root@localhost opt]#mysqldump -uroot -p123123 -d beijing beida  > /opt/beijing_beida_jiegou.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#ll
总用量 134820
-rw-r--r--.  1 root root    776975 3月  25 18:28 all-databases.sql
-rw-r--r--.  1 root root      2805 3月  25 18:09 anhui_beijing.sql
-rw-r--r--.  1 root root      2033 3月  25 18:00 anhui.sql
-rw-r--r--.  1 root root      1642 3月  25 18:48 beijing_beida_jiegou.sql
-rw-r--r--.  1 root root      2513 3月  25 18:43 beijing_beida_qhua_2024-03-25.sql
-rw-r--r--.  1 root root      1887 3月  25 18:38 beijing_beida.sql
-rw-r--r--.  1 root root  83709983 3月  19 13:31 boost_1_59_0.tar.gz
drwxr-xr-x.  2 root root         6 3月  25 17:04 data
-rw-r--r--.  1 root root   1385218 3月  25 16:40 data.tar.gz
drwxr-xr-x. 37 7161 31415     4096 3月  19 21:01 mysql-5.7.17
-rw-r--r--.  1 root root  51433090 3月  19 13:31 mysql-5.7.17.tar.gz
-rw-r--r--.  1 root root    714336 3月  25 16:49 mysql_all2024-03-25.tar.xz
drwxr-xr-x.  2 root root         6 3月  26 2015 rh
[root@localhost opt]#cat beijing_beida_jiegou.sql 
-- MySQL dump 10.13  Distrib 5.7.17, for Linux (x86_64)
--
-- Host: localhost    Database: beijing
-- ------------------------------------------------------
-- Server version	5.7.17

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `beida`
--

DROP TABLE IF EXISTS `beida`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `beida` (
  `id` int(3) NOT NULL,
  `name` varchar(6) DEFAULT NULL,
  `hobby` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2024-03-25 18:48:08
[root@localhost opt]#

5.2.6查看备份文件

(4)查看备份文件
grep -v "^--" /opt/kgc_info1.sql | grep -v "^/" | grep -v "^$"

[root@localhost opt]#grep -v "^--" /opt/beijing_beida_jiegou.sql | grep -v "^/" | grep -v "^$"

六、Mysql 完全备份恢复

#恢复数据库
1.使用mysqldump导出的文件,可使用导入的方法
source命令
mysql命令

2.使用source恢复数据库的步骤

登录到MySQL数据库
执行source备份sql脚本的路径

3.source恢复的示例

MySQL [(none)]> source /backup/all-data.sql

6.1使用source命令恢复数据

[root@localhost opt]#mysqldump -uroot -p123123 beijing beida  > /opt/beijing_beida.sql
①先备份

登录数据库查看

[root@localhost opt]#mysql -uroot -p123123 -e 'drop table beijing.beida;'
②模拟删除

再次去数据库查看表

③恢复

6.2使用mysql命令恢复数据

①先备份

②删除表

③恢复beida表

mysql -e是指在bash环境执行SQL语句,-e指调用命令(此命令行方便在Shell脚本中运行) 

使用mysql导入恢复,如果你恢复的是库下面的表,就要加库,如果直接恢复库,就不用加库

[root@localhost opt]#pwd
/opt
[root@localhost opt]#mysql -uroot -p123123 -e 'show tables from beijing;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------+
| Tables_in_beijing |
+-------------------+
| beida             |
| qhua              |
+-------------------+
[root@localhost opt]#mysql -uroot -p123123 -e 'drop table beijing.beida;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#mysql -uroot -p123123 -e 'show tables from beijing;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------+
| Tables_in_beijing |
+-------------------+
| qhua              |
+-------------------+
[root@localhost opt]#mysql -uroot -p123123 beijing < beijing_beida.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#mysql -uroot -p123123 -e 'show tables from beijing;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------+
| Tables_in_beijing |
+-------------------+
| beida             |
| qhua              |
+-------------------+
[root@localhost opt]#

6.3有无--database的区别

Mysqldump严格来说是属于温备份,需要对表进行写入的锁定。

在全量备份与恢复中,beijing数据库,beijing数据库中有beida数据表

  • 当备份增加--database时,表示针对beijing整个数据库;
  • 当备份不增加--databases时,表示只针对beijing数据库下所有的数据表

mysql -e是指在bash环境执行SQL语句,-e指调用命令(此命令行方便在Shell脚本中运行) 

6.3.1有database 

当备份增加--database时,表示针对beijing整个数据库;

[root@localhost opt]#mysql -uroot -p123123 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| beijing            |
| mysql              |
| performance_schema |
| sys                |
| usr                |
+--------------------+
[root@localhost opt]#mysql -uroot -p123123 -e 'show tables from beijing;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------+
| Tables_in_beijing |
+-------------------+
| beida             |
| qhua              |
+-------------------+
[root@localhost opt]#mysqldump -uroot -p123123 --dababases beijing  > /opt/beijing_all.sql
#使用mysqldump命令 指定root用户 指定密码 备份beijing数据库下所有内容到opt下取名为beijing_all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: [ERROR] unknown option '--dababases'
[root@localhost opt]#mysqldump -uroot -p123123 --databases beijing  > /opt/beijing_all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#ls 
all-databases.sql  beijing_beida_jiegou.sql           data                 mysql_all2024-03-25.tar.xz
anhui_beijing.sql  beijing_beida_qhua_2024-03-25.sql  data.tar.gz          rh
anhui.sql          beijing_beida.sql                  mysql-5.7.17
beijing_all.sql    boost_1_59_0.tar.gz                mysql-5.7.17.tar.gz
[root@localhost opt]#mysql -uroot -p123123 -e 'drop database beijing;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#mysql -uroot -p123123 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| mysql              |
| performance_schema |
| sys                |
| usr                |
+--------------------+
[root@localhost opt]#

①先备份

②模拟删除数据库

③恢复数据库

[root@localhost opt]#mysql -uroot -p123123 < /opt/beijing_all.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#mysql -uroot -p123123 -e 'show databases;'  #不进入数据库查看库 -e 
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| beijing            |
| mysql              |
| performance_schema |
| sys                |
| usr                |
+--------------------+
[root@localhost opt]#mysql -uroot -p123123 -e 'select * from beijing.beida;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+-------+---------+
| id | name  | hobby   |
+----+-------+---------+
|  1 | khui  | xue xi  |
|  2 | gquan | hui hua |
+----+-------+---------+
[root@localhost opt]#

6.3.2无database

 当备份不增加--databases时,表示只针对beijing数据库下所有的数据表

①先备份

[root@localhost opt]#mysql -uroot -p123123 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| beijing            |
| mysql              |
| performance_schema |
| sys                |
| usr                |
+--------------------+
[root@localhost opt]#mysqldump -uroot -p123123 beijing > /opt/beijing_all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#ls /opt/
all-databases.sql  beijing_beida_jiegou.sql           data                 mysql_all2024-03-25.tar.xz
anhui_beijing.sql  beijing_beida_qhua_2024-03-25.sql  data.tar.gz          rh
anhui.sql          beijing_beida.sql                  mysql-5.7.17
beijing_all.sql    boost_1_59_0.tar.gz                mysql-5.7.17.tar.gz

②数据恢复

[root@localhost opt]#mysql -uroot -p123123 -e 'create database beijing;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#mysql -uroot -p123123 beijing < /opt/beijing_all.sql  #把备份导入
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#mysql -uroot -p123123 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| beijing            |
| mysql              |
| performance_schema |
| sys                |
| usr                |
+--------------------+
[root@localhost opt]#mysql -uroot -p123123 -e 'select * from beijing.beida;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+-------+---------+
| id | name  | hobby   |
+----+-------+---------+
|  1 | khui  | xue xi  |
|  2 | gquan | hui hua |
+----+-------+---------+
[root@localhost opt]#

记得创建beijing数据库,要不会报错,

-e 可以不进入数据库,看相关信息

mysqldump 导出数据库

mysql   导入数据库

6.4Crontab -e——执行定时备份

0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123456 beijing > beijing_all_$(date +%F).sql;
/usr/local/mysql/bin/mysqladmin -uroot -p flush-logs
 
或者
 
0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123456 beijing > beijing_all_$(date +%Y%m%d).sql;
/usr/local/mysql/bin/mysqladmin -uroot -p flush-logs

七、Mysql日志

MySQL数据库增量恢复
1.一般恢复

将所有备份的二进制日志内容全部恢复

2.基于位置恢复

数据库在某一时间点可能既有错误的操作也有正确的操作
可以基于精准的位置跳过错误的操作
发生错误节点之前的一个节点,上一次正确操作的位置点停止

3.基于时间点恢复

跳过某个发生错误的时间点实现数据恢复
在错误时间点停止,在下一个正确时间点开始

换一台机器操作,方便看数据,环境准备:

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]#mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database henan;
Query OK, 1 row affected (0.01 sec)

mysql> use henan;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table laojunshan(id int(5),name varchar(8),phone varchar(11));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into laojunshan values(1,'zh',11111);
Query OK, 1 row affected (0.08 sec)

mysql> insert into laojunshan values(2,'dzl',66666);
Query OK, 1 row affected (0.00 sec)

mysql> select * from laojunshan;
+------+------+-------+
| id   | name | phone |
+------+------+-------+
|    1 | zh   | 11111 |
|    2 | dzl  | 66666 |
+------+------+-------+
2 rows in set (0.00 sec)

mysql> show tables;
+-----------------+
| Tables_in_henan |
+-----------------+
| laojunshan      |
+-----------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| henan              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql>

数据库日志对于数据库的备份和恢复中起着至关重要的作用

日志默认存放位置/usr/local/mysql/data文件夹下

7.1开启二进制日志功能

vim /etc/my.cnf
 
[mysqld]
 
log-bin=mysql-bin
 
binlog_format = MIXED      
#可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
 
server-id = 1              
#可加可不加该命令
 
systemctl restart mysqld

log-error=/usr/local/mysql/data/mysql_error.log
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
log-bin=mysql-bin
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
binlog_format = MIXED

解释如下:

[root@localhost ~]#vim /etc/my.cnf

log-error=/usr/local/mysql/data/mysql_error.log
#错误日志  存放位置/usr/local/mysql/data/目录下  错误日志文件名为mysql_error.log
 
general_log=ON
#通用查询日志开启
 
general_log_file=/usr/local/mysql/data/mysql_general.log
#通用查询日志 保存位置在/usr/local/mysql/data目录下  通用查询日志文件名为mysql_general.log
 
log-bin=mysql-bin
#二进制日志(binlog):用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认开启
 
slow_query_log=ON
#慢查询开启  慢查询:用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便提醒优化,默认关闭
 
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
#慢查询日志默认存放位置  /usr/local/mysql/data/  慢查询日志文件名为mysql_slow_query.log
 
long_query_time=5
#设置超过5秒执行的语句被记录  缺省时为10秒
 
binlog_format = MIXED
#指定二进制日志(binlog)的记录格式为MIXED(混合输入)

二进制日志开启后,重启mysql会在data目录中看到二进制日志(mysql-bin.000001,mysql-bin.000002...文件

开启二进制日志,会产生一个索引文件及索引列表(mysql-bin.index

其中,索引文件记录更新的sql语句

索引文件刷新方式

  • 重启Mysql服务的时候会更新索引文件,用于记录新的更新的sql语句
  • 刷新二进制日志

mysql-bin.index     #二进制日志文件的索引

7.1.1二进制日志(binlog)有3种不同的记录格式:

STATEMENT (基于SQL语句)

ROW(基于行)

MIXED(混合模式)     

默认格式是STATEMENT

7.1.1.1 STATEMENT(基于SQL语句)

每一条涉及到被修改的sql 都会记录在binlog中

  • 缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
  • 总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来,准确率低

如果使用STATEMENT记录格式,假如删除数据库数据表中的第二行的数据,再次恢复数据表的数据,不一定是第二行,有可能将第二行恢复到最后 

7.1.1.2 ROW(基于行)

只记录变动的记录,不记录sql的上下文环境

  • 缺点:如果遇到update......set....where true 那么binlog的数据量会越来越大
  • 总结:update、delete以多行数据起作用,来用行记录下来,只记录变动的记录,不记录sql的上下文环境,比如sql语句记录一行,但是ROW就可能记录10行,但是准确性高,高并发的时候由于操作量,性能变低, 比较大所以记录都记下来
7.1.1.3MIXED 推荐使用

一般的语句使用statement,函数使用ROW方式存储。

7.2查看数据库日志

systemctl restart mysqld
mysql -u root -P
show variables like 'general%';       #查看通用查询日志是否开启
show variables like 'log_bin%';       #查看二进制日志是否开启
show variables like '%slow%';         #查看慢查询日功能是否开启
show variables like 'long_query_time';    #查看慢查询时间设置
set global slow_query_log=ON;         #在数据库中设置开启慢查询的方法

PS:variables 表示变量 like 表示模糊查询

#xxx(字段)
xxx% 以xxx为开头的字段
%xxx 以xxx为结尾的字段
%xxx% 只要出现xxx字段的都会显示出来
xxx   精准查询

mysql> show variables like 'log_bin%';
#查看二进制日志是否开启
+---------------------------------+---------------------------------------+
| Variable_name                   | Value                                 |
+---------------------------------+---------------------------------------+
| log_bin                         | ON                                    |
| log_bin_basename                | /usr/local/mysql/data/mysql-bin       |
| log_bin_index                   | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF                                   |
| log_bin_use_v1_row_events       | OFF                                   |
+---------------------------------+---------------------------------------+
5 rows in set (0.00 sec)
 
mysql> show variables like 'general%';
#查看通用查询日志状态
+------------------+-----------------------------------------+
| Variable_name    | Value                                   |
+------------------+-----------------------------------------+
| general_log      | ON                                      |
| general_log_file | /usr/local/mysql/data/mysql_general.log |
+------------------+-----------------------------------------+
2 rows in set (0.00 sec)
 
mysql> show variables like '%slow%';
#查看慢查询日志是否开启
+---------------------------+--------------------------------------------+
| Variable_name             | Value                                      |
+---------------------------+--------------------------------------------+
| log_slow_admin_statements | OFF                                        |
| log_slow_slave_statements | OFF                                        |
| slow_launch_time          | 2                                          |
| slow_query_log            | ON                                         |
| slow_query_log_file       | /usr/local/mysql/data/mysql_slow_query.log |
+---------------------------+--------------------------------------------+
5 rows in set (0.00 sec)
 
mysql> show variables like 'long_query_time';
#查看慢查询时间设置
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

7.3查看二进制日志文件的内容

cp /usr/local/mysql/data/mysql-bin.000001 /opt/
 
mysqlbinlog --no-defaults /opt/mysql-bin.000001
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001
 
#--base64-output=decode-rows:使用64位编码机制去解码(decode)并按行读取(rows)
#-v: 显示详细内容
#--no-defaults : 默认字符集(不加会报UTF-8的错误)
PS: 可以将解码后的文件导出为txt格式,方便查阅
 
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001 > /opt/mysql-bin.000001

[root@localhost ~]#cd /usr/local/mysql/data/
[root@localhost data]#ls
auto.cnf  ib_buffer_pool  ib_logfile0  ibtmp1  mysql-bin.000001  mysql_error.log    mysql_slow_query.log  sys
henan     ibdata1         ib_logfile1  mysql   mysql-bin.index   mysql_general.log  performance_schema
[root@localhost data]#pwd
/usr/local/mysql/data
[root@localhost data]#cp /usr/local/mysql/data/mysql-bin.000001 /opt
[root@localhost data]#cat /opt/mysql-bin.000001                                                                        _?bin?fw{5.7.17-log?f8

**4Yo??f#j?[root@localhost data]#
[root@localhost data]#mysqlbinlog --no-defaults /opt/mysql-bin.000001
#使用mysql服务自带的binlog二进制解释器默认字符集查看/opt目录下的/mysql-bin.000001数据文件
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240326 22:25:37 server id 1  end_log_pos 123 CRC32 0x84a06f59 	Start: binlog v 4, server v 5.7.17-log created 240326 22:25:37 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
4doCZg8BAAAAdwAAAHsAAAABAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADh2gJmEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AVlvoIQ=
'/*!*/;
# at 123
#240326 22:25:37 server id 1  end_log_pos 154 CRC32 0x1af2af6a 	Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@localhost data]#mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240326 22:25:37 server id 1  end_log_pos 123 CRC32 0x84a06f59 	Start: binlog v 4, server v 5.7.17-log created 240326 22:25:37 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
# at 123
#240326 22:25:37 server id 1  end_log_pos 154 CRC32 0x1af2af6a 	Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

7.4二进制日志中需要关注的部分

1、at :开始的位置点 
2、end_log_pos:结束的位置
3、时间戳: 210712 11:50:30 
4、SQL语句

八、MySQL 增量备份

做增量备份要先开启二进制日志,然后再插入数据,不然日志是空的

8.1使用二进制日志备份与恢复( 一般恢复)

[root@localhost data]#mysqladmin -uroot -p123123 flush-logs

环境搭建:

[root@localhost ~]#mysql -uroot -p123123
mysql> create database anhui;
Query OK, 1 row affected (0.01 sec)
mysql> use anhui;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table feixi(id int(5),name varchar(8),hobby varchar(11));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into feixi values(2,'zsx','du shu');
Query OK, 1 row affected (0.01 sec)

mysql> insert into feixi values(1,'axs','lan qiu');
Query OK, 1 row affected (0.00 sec)
mysql> select * from feixi;
+------+------+---------+
| id   | name | hobby   |
+------+------+---------+
|    2 | zsx  | du shu  |
|    1 | axs  | lan qiu |
+------+------+---------+
2 rows in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| henan              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

​

在重新创建数据,就有日志了

[root@localhost opt]#mysqladmin -uroot -p123123 flush-logs  #刷新日志
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost opt]#cd -
/usr/local/mysql/data
[root@localhost data]#ls
anhui     ib_buffer_pool  ib_logfile1  mysql-bin.000001  mysql-bin.index    mysql_slow_query.log
auto.cnf  ibdata1         ibtmp1       mysql-bin.000002  mysql_error.log    performance_schema
henan     ib_logfile0     mysql        mysql-bin.000003  mysql_general.log  sys
[root@localhost data]#cp mysql-bin.000002 /opt/    #此时日志在000002中
cp:是否覆盖"/opt/mysql-bin.000002"? yes
[root@localhost data]#mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240326 23:25:22 server id 1  end_log_pos 123 CRC32 0xbe3a670f 	Start: binlog v 4, server v 5.7.17-log created 240326 23:25:22
# at 123
#240326 23:25:22 server id 1  end_log_pos 154 CRC32 0x99ab220f 	Previous-GTIDs
# [empty]
# at 154
#240326 23:37:29 server id 1  end_log_pos 219 CRC32 0x9fa96e75 	Anonymous_GTID	last_committed=0	sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#240326 23:37:29 server id 1  end_log_pos 316 CRC32 0x6782688e 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467449/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1437073414/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database anhui
/*!*/;
# at 316
#240326 23:38:04 server id 1  end_log_pos 381 CRC32 0x1867d084 	Anonymous_GTID	last_committed=1	sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 381
#240326 23:38:04 server id 1  end_log_pos 520 CRC32 0xb0c7b2a9 	Query	thread_id=3	exec_time=0	error_code=0
use `henan`/*!*/;
SET TIMESTAMP=1711467484/*!*/;
create table feixi(id int(5),name varchar(8),hobby varchar(11))
/*!*/;
# at 520
#240326 23:38:24 server id 1  end_log_pos 585 CRC32 0xcbd04d9f 	Anonymous_GTID	last_committed=2	sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 585
#240326 23:38:24 server id 1  end_log_pos 666 CRC32 0x673daeb4 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467504/*!*/;
BEGIN
/*!*/;
# at 666
#240326 23:38:24 server id 1  end_log_pos 790 CRC32 0x5bfcf1c4 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467504/*!*/;
insert into laojunshan values(1,'dzl','lan qiu')
/*!*/;
# at 790
#240326 23:38:24 server id 1  end_log_pos 821 CRC32 0x45abb21b 	Xid = 13
COMMIT/*!*/;
# at 821
#240326 23:38:44 server id 1  end_log_pos 886 CRC32 0x2a46d6fb 	Anonymous_GTID	last_committed=3	sequence_number=4
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 886
#240326 23:38:44 server id 1  end_log_pos 967 CRC32 0xc60b4330 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467524/*!*/;
BEGIN
/*!*/;
# at 967
#240326 23:38:44 server id 1  end_log_pos 1090 CRC32 0xbd861b65 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467524/*!*/;
insert into laojunshan values(2,'zsx','du shu')
/*!*/;
# at 1090
#240326 23:38:44 server id 1  end_log_pos 1121 CRC32 0xef7ae1c4 	Xid = 14
COMMIT/*!*/;
# at 1121
#240326 23:39:47 server id 1  end_log_pos 1186 CRC32 0xf375ab6c 	Anonymous_GTID	last_committed=4	sequence_number=5
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1186
#240326 23:39:47 server id 1  end_log_pos 1267 CRC32 0x60d34f7e 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467587/*!*/;
BEGIN
/*!*/;
# at 1267
#240326 23:39:47 server id 1  end_log_pos 1385 CRC32 0x545613c8 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467587/*!*/;
insert into feixi values(2,'zsx','du shu')
/*!*/;
# at 1385
#240326 23:39:47 server id 1  end_log_pos 1416 CRC32 0x46f969de 	Xid = 17
COMMIT/*!*/;
# at 1416
#240326 23:40:07 server id 1  end_log_pos 1481 CRC32 0xe0e81a3a 	Anonymous_GTID	last_committed=5	sequence_number=6
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1481
#240326 23:40:07 server id 1  end_log_pos 1562 CRC32 0x2e65f65e 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467607/*!*/;
BEGIN
/*!*/;
# at 1562
#240326 23:40:07 server id 1  end_log_pos 1681 CRC32 0x224e7eee 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711467607/*!*/;
insert into feixi values(1,'axs','lan qiu')
/*!*/;
# at 1681
#240326 23:40:07 server id 1  end_log_pos 1712 CRC32 0xd2069861 	Xid = 18
COMMIT/*!*/;
# at 1712
#240326 23:42:10 server id 1  end_log_pos 1759 CRC32 0xe7b67c5b 	Rotate to mysql-bin.000003  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@localhost data]#

000001里创建了anhui库,000002由于数据插入错误,000003日志中插入前两条数据

由于刚才表添加错误,没有use anhui,再重新刷新下日志备份下:

①数据备份

②删除数据:

[root@localhost data]#mysql -uroot -p123123 -e 'select * from anhui.feixi;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+------+---------+
| id   | name | hobby   |
+------+------+---------+
|    2 | zsx  | du shu  |
|    1 | axs  | lan qiu |
+------+------+---------+
[root@localhost data]#mysql -uroot -p123123 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| anhui              |
| henan              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost data]#mysql -uroot -p123123 -e 'show tables from anhui;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------+
| Tables_in_anhui |
+-----------------+
| feixi           |
+-----------------+
[root@localhost data]#mysql -uroot -p123123 -e 'drop table anhui.feixi;'  #删除feixi表
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#mysql -uroot -p123123 -e 'show tables from anhui;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#

③数据恢复

[root@localhost data]#mysqlbinlog --no-defaults /opt/mysql-bin.000003| mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#mysql -uroot -p123123 -e 'show tables from anhui;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------+
| Tables_in_anhui |
+-----------------+
| feixi           |
+-----------------+
[root@localhost data]#mysql -uroot -p123123 -e 'select * from anhui.feixi;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+------+---------+
| id   | name | hobby   |
+------+------+---------+
|    2 | zsx  | du shu  |
|    1 | axs  | lan qiu |
+------+------+---------+
[root@localhost data]#

8.2基于位置点恢复

8.2.1断点恢复

数据库在某一时间点可能既有错误的操作也有正确的操作 可以基于精准的位置跳过错误的操作

#仅恢复到操作 ID 为“623"之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p


#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -p

mysqlbinlog --no-defaults --start-position='400' --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p      #恢复从位置为400开始到位置为623为止

①插入一些数据

mysql> select * from feixi;
+------+------+---------+
| id   | name | hobby   |
+------+------+---------+
|    2 | zsx  | du shu  |
|    1 | axs  | lan qiu |
+------+------+---------+
2 rows in set (0.00 sec)
mysql> insert into feixi values(3,'jian','cahng ge');
Query OK, 1 row affected (0.01 sec)

mysql> insert into feixi values(4,'lili','shu fa');
Query OK, 1 row affected (0.01 sec)

mysql> insert into feixi values(5,'xjin','hui hua');
Query OK, 1 row affected (0.01 sec)

mysql> select * from feixi;
+------+------+----------+
| id   | name | hobby    |
+------+------+----------+
|    2 | zsx  | du shu   |
|    1 | axs  | lan qiu  |
|    3 | jian | cahng ge |
|    4 | lili | shu fa   |
|    5 | xjin | hui hua  |
+------+------+----------+
5 rows in set (0.00 sec)

mysql>
②备份二进制日志文件

查看内容:数据信息

[root@localhost data]#mysqladmin -uroot -p123123 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#ls
anhui     ib_buffer_pool  ib_logfile1  mysql-bin.000001  mysql-bin.000004  mysql_error.log       performance_schema
auto.cnf  ibdata1         ibtmp1       mysql-bin.000002  mysql-bin.000005  mysql_general.log     sys
henan     ib_logfile0     mysql        mysql-bin.000003  mysql-bin.index   mysql_slow_query.log
[root@localhost data]#pwd
/usr/local/mysql/data
[root@localhost data]#cp /usr/local/mysql/data/mysql-bin.000004 /opt
[root@localhost data]#mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240327  0:02:54 server id 1  end_log_pos 123 CRC32 0xb6d3b975 	Start: binlog v 4, server v 5.7.17-log created 240327  0:02:54
# at 123
#240327  0:02:54 server id 1  end_log_pos 154 CRC32 0x80ade486 	Previous-GTIDs
# [empty]
# at 154
#240327  0:10:38 server id 1  end_log_pos 219 CRC32 0xefb155fb 	Anonymous_GTID	last_committed=0	sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#240327  0:10:38 server id 1  end_log_pos 342 CRC32 0x8985723e 	Query	thread_id=19	exec_time=0	error_code=0
SET TIMESTAMP=1711469438/*!*/;
SET @@session.pseudo_thread_id=19/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1437073414/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
DROP TABLE "anhui"."feixi" /* generated by server */
/*!*/;
# at 342
#240327  0:00:17 server id 1  end_log_pos 407 CRC32 0x6868494a 	Anonymous_GTID	last_committed=1	sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 407
#240327  0:00:17 server id 1  end_log_pos 546 CRC32 0xfbb8ad12 	Query	thread_id=3	exec_time=985	error_code=0
use `anhui`/*!*/;
SET TIMESTAMP=1711468817/*!*/;
create table feixi(id int(5),name varchar(8),hobby varchar(11))
/*!*/;
# at 546
#240327  0:00:24 server id 1  end_log_pos 611 CRC32 0xe6803da1 	Anonymous_GTID	last_committed=2	sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 611
#240327  0:00:24 server id 1  end_log_pos 692 CRC32 0x1c26c75c 	Query	thread_id=3	exec_time=978	error_code=0
SET TIMESTAMP=1711468824/*!*/;
BEGIN
/*!*/;
# at 692
#240327  0:00:24 server id 1  end_log_pos 810 CRC32 0xffd5c239 	Query	thread_id=3	exec_time=978	error_code=0
SET TIMESTAMP=1711468824/*!*/;
insert into feixi values(2,'zsx','du shu')
/*!*/;
# at 810
#240327  0:00:24 server id 1  end_log_pos 841 CRC32 0xe5c0468d 	Xid = 128
COMMIT/*!*/;
# at 841
#240327  0:00:31 server id 1  end_log_pos 906 CRC32 0xe4774092 	Anonymous_GTID	last_committed=3	sequence_number=4
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 906
#240327  0:00:31 server id 1  end_log_pos 987 CRC32 0x383cc4e8 	Query	thread_id=3	exec_time=971	error_code=0
SET TIMESTAMP=1711468831/*!*/;
BEGIN
/*!*/;
# at 987
#240327  0:00:31 server id 1  end_log_pos 1106 CRC32 0x71440208 	Query	thread_id=3	exec_time=971	error_code=0
SET TIMESTAMP=1711468831/*!*/;
insert into feixi values(1,'axs','lan qiu')
/*!*/;
# at 1106
#240327  0:00:31 server id 1  end_log_pos 1137 CRC32 0x14865556 	Xid = 134
COMMIT/*!*/;
# at 1137
#240327  0:17:32 server id 1  end_log_pos 1202 CRC32 0x450b34c6 	Anonymous_GTID	last_committed=4	sequence_number=5
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1202
#240327  0:17:32 server id 1  end_log_pos 1325 CRC32 0xb63888c7 	Query	thread_id=24	exec_time=0	error_code=0
SET TIMESTAMP=1711469852/*!*/;
DROP TABLE "anhui"."feixi" /* generated by server */
/*!*/;
# at 1325
#240327  0:00:17 server id 1  end_log_pos 1390 CRC32 0x4e4aea82 	Anonymous_GTID	last_committed=5	sequence_number=6
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1390
#240327  0:00:17 server id 1  end_log_pos 1529 CRC32 0x8971b4f1 	Query	thread_id=3	exec_time=1052	error_code=0
use `anhui`/*!*/;
SET TIMESTAMP=1711468817/*!*/;
create table feixi(id int(5),name varchar(8),hobby varchar(11))
/*!*/;
# at 1529
#240327  0:00:24 server id 1  end_log_pos 1594 CRC32 0xc25f1a7f 	Anonymous_GTID	last_committed=6	sequence_number=7
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1594
#240327  0:00:24 server id 1  end_log_pos 1675 CRC32 0x59013848 	Query	thread_id=3	exec_time=1045	error_code=0
SET TIMESTAMP=1711468824/*!*/;
BEGIN
/*!*/;
# at 1675
#240327  0:00:24 server id 1  end_log_pos 1793 CRC32 0x18ea0602 	Query	thread_id=3	exec_time=1045	error_code=0
SET TIMESTAMP=1711468824/*!*/;
insert into feixi values(2,'zsx','du shu')
/*!*/;
# at 1793
#240327  0:00:24 server id 1  end_log_pos 1824 CRC32 0xa3ee2272 	Xid = 171
COMMIT/*!*/;
# at 1824
#240327  0:00:31 server id 1  end_log_pos 1889 CRC32 0x072fe015 	Anonymous_GTID	last_committed=7	sequence_number=8
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1889
#240327  0:00:31 server id 1  end_log_pos 1970 CRC32 0x604fa7c6 	Query	thread_id=3	exec_time=1038	error_code=0
SET TIMESTAMP=1711468831/*!*/;
BEGIN
/*!*/;
# at 1970
#240327  0:00:31 server id 1  end_log_pos 2089 CRC32 0x40665d54 	Query	thread_id=3	exec_time=1038	error_code=0
SET TIMESTAMP=1711468831/*!*/;
insert into feixi values(1,'axs','lan qiu')
/*!*/;
# at 2089
#240327  0:00:31 server id 1  end_log_pos 2120 CRC32 0x04b40d3d 	Xid = 177
COMMIT/*!*/;
# at 2120
#240327  0:29:55 server id 1  end_log_pos 2185 CRC32 0x04cd0143 	Anonymous_GTID	last_committed=8	sequence_number=9
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2185
#240327  0:29:55 server id 1  end_log_pos 2266 CRC32 0x1ecfa84f 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711470595/*!*/;
BEGIN
/*!*/;
# at 2266
#240327  0:29:55 server id 1  end_log_pos 2387 CRC32 0x03b9763c 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711470595/*!*/;
insert into feixi values(3,'jian','cahng ge')
/*!*/;
# at 2387
#240327  0:29:55 server id 1  end_log_pos 2418 CRC32 0x3660c58a 	Xid = 190
COMMIT/*!*/;
# at 2418
#240327  0:30:19 server id 1  end_log_pos 2483 CRC32 0x5f53c905 	Anonymous_GTID	last_committed=9	sequence_number=10
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2483
#240327  0:30:19 server id 1  end_log_pos 2564 CRC32 0x3a41501f 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711470619/*!*/;
BEGIN
/*!*/;
# at 2564
#240327  0:30:19 server id 1  end_log_pos 2683 CRC32 0xec06c70b 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711470619/*!*/;
insert into feixi values(4,'lili','shu fa')
/*!*/;
# at 2683
#240327  0:30:19 server id 1  end_log_pos 2714 CRC32 0xe701aaf8 	Xid = 191
COMMIT/*!*/;
# at 2714
#240327  0:30:44 server id 1  end_log_pos 2779 CRC32 0xcbf49285 	Anonymous_GTID	last_committed=10	sequence_number=11
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2779
#240327  0:30:44 server id 1  end_log_pos 2860 CRC32 0x34af4911 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711470644/*!*/;
BEGIN
/*!*/;
# at 2860
#240327  0:30:44 server id 1  end_log_pos 2980 CRC32 0x2c1cf0e7 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711470644/*!*/;
insert into feixi values(5,'xjin','hui hua')
/*!*/;
# at 2980
#240327  0:30:44 server id 1  end_log_pos 3011 CRC32 0x6a04023a 	Xid = 192
COMMIT/*!*/;
# at 3011
#240327  0:34:40 server id 1  end_log_pos 3058 CRC32 0xe5401f6e 	Rotate to mysql-bin.000005  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@localhost data]#

③删除数据库

④恢复最原始数据

000001里创建了anhui库,000002由于数据插入错误,000003日志中插入前两条数据,000004中插入了5条数据,我们恢复到000003即恢复到2条数据

如何恢复数据3 

[root@localhost data]#pwd
/usr/local/mysql/data
[root@localhost data]#mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004

[root@localhost data]#mysqlbinlog --no-defaults --stop-position='2564' /usr/local/mysql/data/mysql-bin.000004|mysql -u root -p123123

恢复数据5

恢复:

[root@localhost opt]#mysqlbinlog --no-defaults --start-position='2860' /usr/local/mysql/data/mysql-bin.000004|mysql -u root -p123123


8.3基于时间点恢复

mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码

#仅恢复到16:41:24 之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p 

#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p

如果恢复某条SQL语之前的所有数据,就stop在这个语句的位置节点或者时间点
如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start

数据恢复:

[root@localhost data]#date
2024年 03月 27日 星期三 01:05:53 CST
[root@localhost data]#mysqlbinlog --no-defaults --start-datetime='2024-03-27 0:30:19' /usr/local/mysql/data/mysql-bin.000004|mysql -u root -p123123

date记得看下时间对不对哦,本机时间忘记矫正了,就用这个时间了

因为时间节点'2024-03-27 0:30:19'在数据3和数据4之间

#所以只要恢复这个节点之后的数据就可以

start:恢复之后的数据

温故而知新

1.物理冷备份

  • 关闭Mysqld服务
  • 使用tar命令进行打包data目录
  • 恢复直接解压即可

2.逻辑备份

  • mysqldump -u -p --database 备份库1,库2 > xxx.sql   #备份多个数据库
  • mysqldump -u -p --all-database > xxx.sql   #备份所有数据库
  • mysql -u -p 库1,库2 表1,表2 > xxx.sql   #备份多库多表

3.完全恢复

  • mysql -u -p < xxx.sql #恢复整个库
  • mysql -u -p 库名 < xxx.sql  #恢复表

4.增量备份

  • 要先开启二进制日志,设置二进制格式为MIXED
  • 进行一次完全备份,可每周备份一次,通过crontable -e 进行编辑
  • mysqladmin -uroot -p flush-logs 刷新二进制日志文件 分割出二进制日志文件,由于刷新之前的数据都会记录在老的二进制文件里
  • 可以通过mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制文件名称 可以查看日志内容
  • 可以通过mysqlbinlog --no-defaults 二进制日志文件名 mysql -uroot -p 恢复丢失的数据库

位置恢复——position

  • start:--start-position
  • stop:--stop-position
  • start、stop:--start-position --stop-position

时间恢复——datetime

  • start:--start-datetime
  • stop:--stop-datetime
  • start、stop:--start-datetime --stop-datetime

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐