Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > Mysql数据备份与恢复

Mysql数据库之数据备份与恢复方式

作者:一坨小橙子ovo

本文详细介绍了数据库备份的重要性、分类、方法以及Mysql数据库的备份与恢复操作,包括完全备份、差异备份、增量备份等,同时,还涉及了日志数据库、备份策略和执行备份的定时任务(Crontab)等内容

一、数据备份的重要性

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

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

造成数据丢失的原因

拓展:容灾是一个旨在确保业务连续性的系统工程,它涉及IT系统的设计和实施,以防止用户业务系统受到各种灾难的影响和破坏。容灾的核心目的是在自然或人为原因导致生产系统发生灾难时,尽可能保证业务的连续性。这通常包括建立两套或多套功能相同的IT系统,这些系统分布在相隔较远的不同地点,并能够进行健康状态监视和功能切换。当一处系统因意外(如火灾、地震等)停止工作时,整个应用系统可以切换到另一处,使得系统功能可以继续正常工作

二、数据库备份的分类

1.从物理与逻辑的角度分类

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

物理备份方法

逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份

2.从数据库的备份策略角度,备份可分为

2.1完全备份

完全备份过程中每次备份都会进行完全备份,会导致备份文件占用大量的磁盘空间,并且有大量的重复数据,只适合第一次备份,不常用

2.2差异备份

差异备份要先进行一次完全备份,每次差异备份都会备份上一次完全备份后的数据,可能会出现备份的重复数据,导致占用大量的磁盘空间;备份恢复时,先恢复完全备份呢,再导入差异备份的数据

2.3增量备份

2.4总结

完全备份差异备份增量备份
执行顺序每次完全备份会备份之前完全备份的数据,会出现重复数据每次执行差异备份会备份之前每次的差异备份每一次增量备份的数据都是备份上一次增量备份后新增的数据
占用磁盘空间占用大量的磁盘空间占用少量额外的磁盘空间占用极少量的磁盘空间
数据恢复

把完全备份的文件导入即可

恢复速度很快

先恢复完全备份数据,再导入差异备份数据先恢复完全备份数据,再恢复增量备份数据(需要按照次序进恢复)

备份频率建议:一周一次的全备,全备的时间要选择在不提供业务或者业务处理较少的时间段执行(建议为01点到05点之间);每天的增量备份;特定场景的差异备份

三、常见的备份方法

物理冷备

专用备份工具mydump或mysqlhotcopy

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

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

第三方备份工具

四、Mysql数据库完全备份

1.完全备份定义

2.优缺点

3.数据库完全备份分类

物理冷备份与恢复

Mysqldump备份与恢复

导出使用的是Mysqldump;导入使用的是Mysql命令

4.Mysql数据库完全备份实际操作

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

4.1环境准备

目前Mysql数据库中存在class数据库,及class数据表以及数据表中的数据

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.05 sec)

mysql> create database class;
Query OK, 1 row affected (0.00 sec)

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

mysql> create table class(id int(6),name varchar(8),remark varchar(40));
Query OK, 0 rows affected (0.01 sec)

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

mysql> insert into class values(1,'cxk','ctrl');
Query OK, 1 row affected (0.01 sec)

mysql> insert into class values(2,'wyb','skateboarding');
Query OK, 1 row affected (0.00 sec)

mysql> select * from class;
+------+------+---------------+
| id   | name | remark        |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+
2 rows in set (0.00 sec)

4.2物理冷备份与恢复——使用tar命令备份

4.2.1备份方法一
[root@localhost mysql]#systemctl stop mysqld
#物理冷备份需要先关闭mysqld服务
[root@localhost ~]#cd /usr/local/mysql/
[root@localhost mysql]#ls
bin      docs     man         mysql.sock.lock  share
COPYING  include  mysqld.pid  mysql-test       support-files
data     lib      mysql.sock  README           usr
[root@localhost mysql]#tar zcvf data.tar.gz data/ -C /opt/
#使用tar命令进行压缩备份
[root@localhost mysql]#ls /opt
boost_1_59_0.tar.gz  mysql-5.7.17  mysql-5.7.17.tar.gz  rh  data.tar.gz
4.2.2备份方法二
[root@localhost mysql]#systemctl stop mysqld
#物理冷备份需要先关闭mysqld服务
[root@localhost mysql]#tar Jcvf /opt/mysql_allbackup$(date +%F).tar.xz /usr/local/mysql/data
#压缩打包/usr/local/mysql/data下的数据  保存在/opt目录下取名为mysql_allbackup$(date +%F).tar.xz     date +%F代表当天的日期
[root@localhost mysql]#ls /opt
boost_1_59_0.tar.gz  mysql-5.7.17.tar.gz               rh
mysql-5.7.17         mysql_allbackup2024-03-25.tar.xz
4.2.3模式移走data数据文件目录
[root@localhost mysql]#mv data/ /home/
[root@localhost mysql]#ls
bin          docs     man         mysql.sock.lock  share
COPYING      include  mysqld.pid  mysql-test       support-files
data.tar.gz  lib      mysql.sock  README           usr
[root@localhost mysql]#systemctl restart mysqld.service
#此时重启mysqld数据库 可能会报错 或者重新建立一个新的data数据文件目录(如果是新建的data数据文件目录)那么新建的data数据文件目录中无任何数据文件
[root@localhost mysql]#systemctl restart mysqld.service 
[root@localhost mysql]#ls
bin      data.tar.gz  lib         mysql.sock       README         usr
COPYING  docs         man         mysql.sock.lock  share
data     include      mysqld.pid  mysql-test       support-files
#这里看到有一个新的data数据文件目录已经建立
[root@localhost mysql]#cd data/
[root@localhost data]#ls
auto.cnf         client-key.pem  ib_logfile1         private_key.pem  sys
ca-key.pem       ib_buffer_pool  ibtmp1              public_key.pem
ca.pem           ibdata1         mysql               server-cert.pem
client-cert.pem  ib_logfile0     performance_schema  server-key.pem
#这里看不到之前数据库中的文件
4.2.4执行数据恢复操作一
[root@localhost mysql]#tar zxvf data.tar.gz -C /usr/local/mysql/
#使用tar命令解压刚刚完全备份的数据文件  指定解压目录为/usr/local/mysql目录下
[root@localhost mysql]#cd data/
[root@localhost data]#ls
auto.cnf    client-cert.pem  ib_logfile0  performance_schema  server-key.pem
ca-key.pem  client-key.pem   ib_logfile1  private_key.pem     sys
ca.pem      ib_buffer_pool   ibtmp1       public_key.pem
class       ibdata1          mysql        server-cert.pem
#此时我们看到刚刚完全备份的数据文件又恢复了
4.2.5执行数据恢复操作二
[root@localhost mysql]#tar Jxvf /opt/mysql_allbackup2024-03-25.tar.xz -C /usr/local/mysql/data
#使用tar命令解压刚刚的完全备份文件 指定解压目录到/usr/local/mysql目录下
[root@localhost mysql]#ls
bin      data.tar.gz  lib         mysql.sock       README         usr
COPYING  docs         man         mysql.sock.lock  share
data     include      mysqld.pid  mysql-test       support-files
[root@localhost mysql]#cd data/
[root@localhost data]#ls
auto.cnf    client-cert.pem  ib_logfile0  performance_schema  server-key.pem
ca-key.pem  client-key.pem   ib_logfile1  private_key.pem     sys
ca.pem      ib_buffer_pool   ibtmp1       public_key.pem
class       ibdata1          mysql        server-cert.pem
#此时可以看到刚刚完全备份的数据文件内容
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use class;
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> select * from class;
+------+------+---------------+
| id   | name | remark        |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+
2 rows in set (0.00 sec)

数据库做迁移的时候 做整迁的时候使用该备份方式

4.3物理温备份与恢复——使用mysqldump命令

4.3.1备份单个数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> create database class2;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| class2             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
[root@localhost mysql]#mysqldump -uroot -p123456 --databases class > class.sql
#使用mysqldump命令 指定用户root 指定密码为123456 指定备份的数据库class 备份存储为class.sql数据文件
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls
bin        data         include  mysqld.pid       mysql-test  support-files
class.sql  data.tar.gz  lib      mysql.sock       README      usr
COPYING    docs         man      mysql.sock.lock  share
[root@localhost mysql]#cat class.sql 
#class.sql数据文件存放了一些sql语句  也就是在sql环境中的操作  注意一定要以sql结尾 方便后期的恢复
-- MySQL dump 10.13  Distrib 5.7.17, for Linux (x86_64)
--
-- Host: localhost    Database: class
-- ------------------------------------------------------
-- 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: `class`
--

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

USE `class`;

--
-- Table structure for table `class`
--

DROP TABLE IF EXISTS `class`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class` (
  `id` int(6) DEFAULT NULL,
  `name` varchar(8) DEFAULT NULL,
  `remark` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `class`
--

LOCK TABLES `class` WRITE;
/*!40000 ALTER TABLE `class` DISABLE KEYS */;
INSERT INTO `class` VALUES (1,'cxk','ctrl'),(2,'wyb','skateboarding');
/*!40000 ALTER TABLE `class` 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 16:04:00
4.3.2备份多个数据库
[root@localhost mysql]#mysqldump -uroot -p123456 --databases class class2 > class-class2.sql
#使用mysqldump命令 指定用户root 指定密码为123456 指定备份的数据库class和class2 备份存储为class-class.sql数据文件
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls
bin               data         lib         mysql.sock.lock  support-files
class-class2.sql  data.tar.gz  man         mysql-test       usr
class.sql         docs         mysqld.pid  README
COPYING           include      mysql.sock  share
[root@localhost mysql]#cat class-class2.sql 
#class-class2.sql数据文件存放了一些sql语句  也就是在sql环境中的操作  注意一定要以sql结尾 方便后期的恢复
-- MySQL dump 10.13  Distrib 5.7.17, for Linux (x86_64)
--
-- Host: localhost    Database: class
-- ------------------------------------------------------
-- 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: `class`
--

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

USE `class`;

--
-- Table structure for table `class`
--

DROP TABLE IF EXISTS `class`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class` (
  `id` int(6) DEFAULT NULL,
  `name` varchar(8) DEFAULT NULL,
  `remark` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `class`
--

LOCK TABLES `class` WRITE;
/*!40000 ALTER TABLE `class` DISABLE KEYS */;
INSERT INTO `class` VALUES (1,'cxk','ctrl'),(2,'wyb','skateboarding');
/*!40000 ALTER TABLE `class` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Current Database: `class2`
--

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

USE `class2`;
/*!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 16:07:25
[root@localhost mysql]#ll
总用量 1428
drwxr-xr-x  2 mysql mysql    4096 3月  19 13:12 bin
-rw-r--r--  1 root  root     2174 3月  25 16:07 class-class2.sql
-rw-r--r--  1 root  root     2031 3月  25 16:04 class.sql
-rw-r--r--  1 mysql mysql   17987 11月 28 2016 COPYING
drwxr-x---  7 mysql mysql     188 3月  25 16:02 data
-rw-r--r--  1 root  root  1401469 3月  25 15:27 data.tar.gz
drwxr-xr-x  2 mysql mysql      55 3月  19 13:10 docs
drwxr-xr-x  3 mysql mysql    4096 3月  19 13:10 include
drwxr-xr-x  4 mysql mysql     191 3月  19 13:12 lib
drwxr-xr-x  4 mysql mysql      30 3月  19 13:11 man
-rw-r-----  1 mysql mysql       5 3月  25 15:58 mysqld.pid
srwxrwxrwx  1 mysql mysql       0 3月  25 15:58 mysql.sock
-rw-------  1 mysql mysql       5 3月  25 15:58 mysql.sock.lock
drwxr-xr-x 10 mysql mysql    4096 3月  19 13:13 mysql-test
-rw-r--r--  1 mysql mysql    2478 11月 28 2016 README
drwxr-xr-x 28 mysql mysql    4096 3月  19 13:13 share
drwxr-xr-x  2 mysql mysql     112 3月  19 13:13 support-files
drwxr-xr-x  4 mysql mysql      30 3月  25 15:49 usr
[root@localhost mysql]#chown mysql:mysql class.sql class-class2.sql 
[root@localhost mysql]#ll
总用量 1428
drwxr-xr-x  2 mysql mysql    4096 3月  19 13:12 bin
-rw-r--r--  1 mysql mysql    2174 3月  25 16:07 class-class2.sql
-rw-r--r--  1 mysql mysql    2031 3月  25 16:04 class.sql
-rw-r--r--  1 mysql mysql   17987 11月 28 2016 COPYING
drwxr-x---  7 mysql mysql     188 3月  25 16:02 data
-rw-r--r--  1 root  root  1401469 3月  25 15:27 data.tar.gz
drwxr-xr-x  2 mysql mysql      55 3月  19 13:10 docs
drwxr-xr-x  3 mysql mysql    4096 3月  19 13:10 include
drwxr-xr-x  4 mysql mysql     191 3月  19 13:12 lib
drwxr-xr-x  4 mysql mysql      30 3月  19 13:11 man
-rw-r-----  1 mysql mysql       5 3月  25 15:58 mysqld.pid
srwxrwxrwx  1 mysql mysql       0 3月  25 15:58 mysql.sock
-rw-------  1 mysql mysql       5 3月  25 15:58 mysql.sock.lock
drwxr-xr-x 10 mysql mysql    4096 3月  19 13:13 mysql-test
-rw-r--r--  1 mysql mysql    2478 11月 28 2016 README
drwxr-xr-x 28 mysql mysql    4096 3月  19 13:13 share
drwxr-xr-x  2 mysql mysql     112 3月  19 13:13 support-files
drwxr-xr-x  4 mysql mysql      30 3月  25 15:49 usr

注意:这里一定要将sql结尾的备份数据文件修改为mysql属主和属组,否则mysqld服务无法调用

4.3.3备份所有的库
[root@localhost mysql]#mysqldump -uroot -p123456 --all-databases > alldatabases.sql
#使用mysqldump命令 指定用户root 指定密码为123456 指定备份的所有数据库 备份存储为alldatabases.sql数据文件
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls
alldatabases.sql  COPYING      include     mysql.sock       share
bin               data         lib         mysql.sock.lock  support-files
class-class2.sql  data.tar.gz  man         mysql-test       usr
class.sql         docs         mysqld.pid  README
4.3.4备份单个数据表
[root@localhost mysql]#mysqldump -uroot -p123456 class class > class_class.sql
#使用mysqldump命令 指定用户为root 指定密码为123456 指定class数据库下的class数据表 备份到当前目录下 取名为class_class.sql数据文件
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls
alldatabases.sql  class.sql    docs     mysqld.pid       README
bin               COPYING      include  mysql.sock       share
class-class2.sql  data         lib      mysql.sock.lock  support-files
class_class.sql   data.tar.gz  man      mysql-test       usr
4.3.5备份多个数据表
mysql> create table test(id int(6),name char(8),hobby varchar(40));
Query OK, 0 rows affected (0.00 sec)

mysql> create table test2(id int(6),name char(8),hobby varchar(40));
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+-----------------+
| Tables_in_class |
+-----------------+
| class           |
| test            |
| test2           |
+-----------------+
3 rows in set (0.00 sec)
[root@localhost mysql]#mysqldump -uroot -p123456 class class test test2 > class_class_test_test2.sql
#使用mysqldump命令 指定用户为root 指定密码为123456 指定class数据库下的class、test、test2三个数据表 备份到当前目录下 取名为class_class_test_test2.sql数据文件
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls
alldatabases.sql            class.sql    include     mysql.sock.lock  usr
bin                         COPYING      lib         mysql-test
class-class2.sql            data         man         README
class_class.sql             data.tar.gz  mysqld.pid  share
class_class_test_test2.sql  docs         mysql.sock  support-files
4.3.6只备份数据表结构
mysql> desc class;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(6)      | YES  |     | NULL    |       |
| name   | varchar(8)  | YES  |     | NULL    |       |
| remark | varchar(40) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
[root@localhost mysql]#mysqldump -uroot -p123456 -d class class > classdesc.sql
#使用mysqldump命令 指定用户为root 指定密码123456 -d只保存表结构(desc)class数据库下class数据表的结构  保存在当前目录下取名为classdesc.sql数据文件
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls
alldatabases.sql            class.sql    lib              README
bin                         COPYING      man              share
class-class2.sql            data         mysqld.pid       support-files
class_class.sql             data.tar.gz  mysql.sock       usr
class_class_test_test2.sql  docs         mysql.sock.lock
classdesc.sql               include      mysql-test
[root@localhost mysql]#cat classdesc.sql 
-- MySQL dump 10.13  Distrib 5.7.17, for Linux (x86_64)
--
-- Host: localhost    Database: class
-- ------------------------------------------------------
-- 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 `class`
--

DROP TABLE IF EXISTS `class`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class` (
  `id` int(6) DEFAULT NULL,
  `name` varchar(8) DEFAULT NULL,
  `remark` varchar(40) 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 16:20:21
[root@localhost mysql]#grep -v "^--" classdesc.sql |grep -v "^/"|grep -v "^$"
#过滤出SQL语句
#整条命令解释:过滤出classdesc.sql数据文件中不是以"--"开头的、不是以"/"开头的并且不是空行的内容
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `id` int(6) DEFAULT NULL,
  `name` varchar(8) DEFAULT NULL,
  `remark` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

5.Mysql数据库完全恢复实际操作

使用mysqldump命令导出的文件可以使用导入的方法

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

mysql> show tables;
+-----------------+
| Tables_in_class |
+-----------------+
| class           |
| test            |
| test2           |
+-----------------+
3 rows in set (0.00 sec)
[root@localhost mysql]#mysql -uroot -p123456 -e 'drop table class.test2;'
#在bash环境使用mysql命令登入数据库指定用户root 指定密码 指定sql命令删除class数据库下的test2数据表
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> show tables;
+-----------------+
| Tables_in_class |
+-----------------+
| class           |
| test            |
+-----------------+
2 rows in set (0.00 sec)

5.1使用Source命令恢复数据库

mysql> source /usr/local/mysql/class_class_test_test2.sql
mysql> show tables;
+-----------------+
| Tables_in_class |
+-----------------+
| class           |
| test            |
| test2           |
+-----------------+
3 rows in set (0.00 sec)

5.2使用Mysql命令恢复数据库

[root@localhost mysql]#mysql -uroot -p123456 -e 'drop table class.class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 -e 'show tables from  class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------+
| Tables_in_class |
+-----------------+
| test            |
| test2           |
+-----------------+
[root@localhost mysql]#mysql -uroot -p123456 class < class_class_test_test2.sql
#使用mysql命令 指定用户root 指定密码为123456 将该目录下的class_class_test_test2.sql数据文件导入到class数据库中
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 -e 'show tables from  class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------+
| Tables_in_class |
+-----------------+
| class           |
| test            |
| test2           |
+-----------------+
[root@localhost mysql]#mysql -uroot -p123456 -e 'select * from  class.class;' 
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+------+---------------+
| id   | name | remark        |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+

5.3有无--database的区别

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

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

5.3.1有database
[root@localhost mysql]#mysql -uroot -p123456 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| class2             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost mysql]#mysql -uroot -p123456 -e 'show tables from  class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------+
| Tables_in_class |
+-----------------+
| class           |
| test            |
| test2           |
+-----------------+
[root@localhost mysql]#mysqldump -uroot -p123456 --databases class > class_all.sql
#使用mysqldump命令 指定root用户 指定密码 备份class数据库下所有内容到当前目录  取名为class_all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls
alldatabases.sql            classdesc.sql  include          mysql-test
bin                         class.sql      lib              README
class_all.sql               COPYING        man              share
class-class2.sql            data           mysqld.pid       support-files
class_class.sql             data.tar.gz    mysql.sock       usr
class_class_test_test2.sql  docs           mysql.sock.lock
[root@localhost mysql]#cat class_all.sql 
-- MySQL dump 10.13  Distrib 5.7.17, for Linux (x86_64)
--
-- Host: localhost    Database: class
-- ------------------------------------------------------
-- 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: `class`
--

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

USE `class`;

--
-- Table structure for table `class`
--

DROP TABLE IF EXISTS `class`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class` (
  `id` int(6) DEFAULT NULL,
  `name` varchar(8) DEFAULT NULL,
  `remark` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `class`
--

LOCK TABLES `class` WRITE;
/*!40000 ALTER TABLE `class` DISABLE KEYS */;
INSERT INTO `class` VALUES (1,'cxk','ctrl'),(2,'wyb','skateboarding');
/*!40000 ALTER TABLE `class` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `test`
--

DROP TABLE IF EXISTS `test`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
  `id` int(6) DEFAULT NULL,
  `name` char(8) DEFAULT NULL,
  `hobby` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `test`
--

LOCK TABLES `test` WRITE;
/*!40000 ALTER TABLE `test` DISABLE KEYS */;
/*!40000 ALTER TABLE `test` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `test2`
--

DROP TABLE IF EXISTS `test2`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test2` (
  `id` int(6) DEFAULT NULL,
  `name` char(8) DEFAULT NULL,
  `hobby` varchar(40) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `test2`
--

LOCK TABLES `test2` WRITE;
/*!40000 ALTER TABLE `test2` DISABLE KEYS */;
/*!40000 ALTER TABLE `test2` 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 16:51:08
[root@localhost mysql]#mysql -uroot -p123456 -e 'drop database class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class2             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost mysql]#mysql -uroot -p123456 class < class_all.sql 
#恢复数据库
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1049 (42000): Unknown database 'class'
[root@localhost mysql]#mysql -uroot -p123456 -e 'create database class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| class2             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost mysql]#mysql -uroot -p123456 class < class_all.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| class2             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost mysql]#mysql -uroot -p123456 -e 'select * from class.class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+------+---------------+
| id   | name | remark        |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+
5.3.2无database
[root@localhost mysql]#mysqldump -uroot -p123456 class > /opt/class_all.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#ls /opt/|grep "class"
class_all.sql
[root@localhost mysql]#mysql -uroot -p123456 -e 'drop database class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class2             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost mysql]#mysql -uroot -p123456 -e 'create database class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 class < /opt/class_all.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost mysql]#mysql -uroot -p123456 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| class2             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
[root@localhost mysql]#mysql -uroot -p123456 -e 'select * from class.class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+------+---------------+
| id   | name | remark        |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+

6.Crontab -e——执行定时备份

0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123456 class > class_all_$(date +%F).sql;
/usr/local/mysql/bin/mysqladmin -uroot -p flush-logs

或者

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

五、日志

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

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

1.配置文件

[root@localhost mysql]#vim /etc/my.cnf
[root@localhost mysql]#sed -n '26,33p' /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

[root@localhost mysql]#ls
alldatabases.sql            classdesc.sql  include          mysql-test
bin                         class.sql      lib              README
class_all.sql               COPYING        man              share
class-class2.sql            data           mysqld.pid       support-files
class_class.sql             data.tar.gz    mysql.sock       usr
class_class_test_test2.sql  docs           mysql.sock.lock
[root@localhost mysql]#cd data/
[root@localhost data]#ls
auto.cnf        ibdata1      mysql             mysql_error.log       sys
class           ib_logfile0  mysql-bin.000001  mysql_general.log
class2          ib_logfile1  mysql-bin.000002  mysql_slow_query.log
ib_buffer_pool  ibtmp1       mysql-bin.index   performance_schema

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

索引文件刷新方式

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

默认格式是STATEMENT记录格式

1.1STATEMENT(基于SQL语句)记录格式

每一条设计到被修改的SQL都会记录在binlog

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

1.2ROW(基于行)记录格式

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

1.3MIXED(混合输入)记录格式——推荐使用

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

根据并发量进行分配,并发量低选择STATEMENT,并发量高选择ROW

2.查看数据库日志

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)

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

2.1查看二进制日志文件内容

[root@localhost data]#cp /usr/local/mysql/data/mysql-bin.000001 /opt
[root@localhost data]#vim /opt/mysql-bin.000001 
[root@localhost data]#cat /opt/mysql-bin.000001                             _þbinª?fw{5.7.17-logª?f8

**4𓇆ª?f#¹f穵?f±'
[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
#240325 17:11:06 server id 1  end_log_pos 123 CRC32 0x86c752f5 	Start: binlog v 4, server v 5.7.17-log created 240325 17:11:06 at startup
ROLLBACK/*!*/;
BINLOG '
qj8BZg8BAAAAdwAAAHsAAAAAAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACqPwFmEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AfVSx4Y=
'/*!*/;
# at 123
#240325 17:11:06 server id 1  end_log_pos 154 CRC32 0x28e966b9 	Previous-GTIDs
# [empty]
# at 154
#240325 17:12:21 server id 1  end_log_pos 177 CRC32 0xf627839d 	Stop
ERROR: Could not read entry at offset 177: Error in log format or read error.
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 
#使用mysql服务自带的binlog二进制解释器默认字符集查看/opt目录下的/mysql-bin.000001数据文件
#--base64-output=decode-rows:使用64位编码机制去解码(decode)并按行读取(rows)
#-v: 显示详细内容
#--no-defaults : 默认字符集(不加会报UTF-8的错误)



/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240325 17:11:06 server id 1  end_log_pos 123 CRC32 0x86c752f5 	Start: binlog v 4, server v 5.7.17-log created 240325 17:11:06 at startup
ROLLBACK/*!*/;
# at 123
#240325 17:11:06 server id 1  end_log_pos 154 CRC32 0x28e966b9 	Previous-GTIDs
# [empty]
# at 154
#240325 17:12:21 server id 1  end_log_pos 177 CRC32 0xf627839d 	Stop
ERROR: Could not read entry at offset 177: Error in log format or read error.
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 > /opt/mysql-bin.000001
#可以将解码后的文件导出为txt格式  方便查阅

二进制日志内容需要关注的重点部分

六、增量备份

1.环境准备

mysql> create database class;
Query OK, 1 row affected (0.00 sec)

mysql> use class
Database changed
mysql> show table;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> show tables;
Empty set (0.00 sec)

mysql> create table class(id int(6),name char(8),hobby varchar(40));
Query OK, 0 rows affected (0.07 sec)

mysql> insert into class values(1,'cxk','ctrl');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(2,'wyb','skateboarding');
Query OK, 1 row affected (0.00 sec)

mysql> select * from class;
+------+------+---------------+
| id   | name | hobby         |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+
2 rows in set (0.00 sec)
[root@localhost data]#mysqladmin -uroot -p123456 flush-logs
#使用mysqladmin命令 指定root用户 指定密码为123456 刷新日志
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#ls
auto.cnf        ib_logfile0       mysql-bin.000002   mysql_slow_query.log
class           ib_logfile1       mysql-bin.000003   performance_schema
class2          ibtmp1            mysql-bin.index    sys
ib_buffer_pool  mysql             mysql_error.log
ibdata1         mysql-bin.000001  mysql_general.log
#此时刷新后的日志为mysql-bin.000003该二进制日志为空,之前的数据内容存放在刷新前的日志

2.使用二进制日志备份与恢复

2.1数据备份

[root@localhost data]#mysqladmin -uroot -p123456 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#ls
auto.cnf        ib_logfile0  mysql-bin.000001  mysql_error.log       sys
class           ib_logfile1  mysql-bin.000002  mysql_general.log
ib_buffer_pool  ibtmp1       mysql-bin.000003  mysql_slow_query.log
ibdata1         mysql        mysql-bin.index   performance_schema
[root@localhost data]#mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000003

[root@localhost data]#cp mysql-bin.000003 /opt/
[root@localhost data]#ls /opt/
boost_1_59_0.tar.gz  mysql-5.7.17         mysql-bin.000002  rh
class_class.sql      mysql-5.7.17.tar.gz  mysql-bin.000003

删除数据表

[root@localhost data]#mysql -uroot -p123456 -e 'show tables from class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------------+
| Tables_in_class |
+-----------------+
| class           |
+-----------------+
[root@localhost data]#mysql -uroot -p123456 -e 'drop table class.class;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#mysql -uroot -p123456 -e 'show tables from class;'
mysql: [Warning] Using a password on the command line interface can be insecure.

2.2数据恢复

[root@localhost data]#ls /opt/
boost_1_59_0.tar.gz  mysql-5.7.17         mysql-bin.000002
class_class.sql      mysql-5.7.17.tar.gz  rh
[root@localhost data]#mysqlbinlog --no-defaults /opt/mysql-bin.000003| mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost data]#mysql -uroot -p123456 -e 'select * from class.class'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+------+---------------+
| id   | name | hobby         |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+

3.节点恢复

3.1插入数据

mysql> insert into class values(3,'zs','sing song');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(4,'lyx','an mo');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(5,'xzq','sing');
Query OK, 1 row affected (0.00 sec)

mysql> select * from class;
+------+------+---------------+
| id   | name | hobby         |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
|    3 | zs   | sing song     |
|    4 | lyx  | an mo         |
|    5 | xzq  | sing          |
+------+------+---------------+
5 rows in set (0.00 sec)

3.2备份二进制日志文件

[root@localhost data]#cp /usr/local/mysql/data/mysql-bin.000004 /opt
[root@localhost data]#ls /opt/
boost_1_59_0.tar.gz  mysql-5.7.17         mysql-bin.000002  mysql-bin.000004
class_class.sql      mysql-5.7.17.tar.gz  mysql-bin.000003  rh
[root@localhost data]#mysqladmin -uroot -p123456 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.

3.3删除数据库

mysql> drop database class;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

3.4恢复最原始数据

[root@localhost data]#mysqlbinlog --no-defaults mysql-bin.000001| mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| class              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> select * from class.class;
+------+------+---------------+
| id   | name | hobby         |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
+------+------+---------------+
2 rows in set (0.00 sec)

3.5恢复第三条数据,跳过第四条数据,恢复第五条数据

[root@localhost data]#mysqlbinlog --no-defaults mysql-bin.000004
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240325 19:05:35 server id 1  end_log_pos 123 CRC32 0x8cca9a0f 	Start: binlog v 4, server v 5.7.17-log created 240325 19:05:35
BINLOG '
f1oBZg8BAAAAdwAAAHsAAAAAAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AQ+ayow=
'/*!*/;
# at 123
#240325 19:05:35 server id 1  end_log_pos 154 CRC32 0xc343a14d 	Previous-GTIDs
# [empty]
# at 154
#240325 18:57:29 server id 1  end_log_pos 219 CRC32 0x2363efd7 	Anonymous_GTID	last_committed=0	sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#240325 18:57:29 server id 1  end_log_pos 342 CRC32 0x0134024f 	Query	thread_id=23	exec_time=597	error_code=0
SET TIMESTAMP=1711364249/*!*/;
SET @@session.pseudo_thread_id=23/*!*/;
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 "class"."class" /* generated by server */
/*!*/;
# at 342
#240325 19:04:31 server id 1  end_log_pos 407 CRC32 0x6ecfc60a 	Anonymous_GTID	last_committed=1	sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 407
#240325 19:04:31 server id 1  end_log_pos 543 CRC32 0x2b9a9ccc 	Query	thread_id=23	exec_time=175	error_code=0
use `class`/*!*/;
SET TIMESTAMP=1711364671/*!*/;
create table class(id int(6),name char(8),hobby varchar(40))
/*!*/;
# at 543
#240325 19:05:03 server id 1  end_log_pos 608 CRC32 0x93301d7a 	Anonymous_GTID	last_committed=2	sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 608
#240325 19:05:03 server id 1  end_log_pos 689 CRC32 0x9a4dfeb5 	Query	thread_id=23	exec_time=143	error_code=0
SET TIMESTAMP=1711364703/*!*/;
BEGIN
/*!*/;
# at 689
#240325 19:05:03 server id 1  end_log_pos 805 CRC32 0x00cd6a8b 	Query	thread_id=23	exec_time=143	error_code=0
SET TIMESTAMP=1711364703/*!*/;
insert into class values(1,'cxk','ctrl')
/*!*/;
# at 805
#240325 19:05:03 server id 1  end_log_pos 836 CRC32 0xe04e6909 	Xid = 235
COMMIT/*!*/;
# at 836
#240325 19:05:16 server id 1  end_log_pos 901 CRC32 0x75fad878 	Anonymous_GTID	last_committed=3	sequence_number=4
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 901
#240325 19:05:16 server id 1  end_log_pos 982 CRC32 0x93099481 	Query	thread_id=23	exec_time=130	error_code=0
SET TIMESTAMP=1711364716/*!*/;
BEGIN
/*!*/;
# at 982
#240325 19:05:16 server id 1  end_log_pos 1107 CRC32 0xcb3e3715 	Query	thread_id=23	exec_time=130	error_code=0
SET TIMESTAMP=1711364716/*!*/;
insert into class values(2,'wyb','skateboarding')
/*!*/;
# at 1107
#240325 19:05:16 server id 1  end_log_pos 1138 CRC32 0x725b9d8c 	Xid = 241
COMMIT/*!*/;
# at 1138
#240325 19:10:43 server id 1  end_log_pos 1203 CRC32 0xdc7ee633 	Anonymous_GTID	last_committed=4	sequence_number=5
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1203
#240325 19:10:43 server id 1  end_log_pos 1284 CRC32 0xa40309c5 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711365043/*!*/;
BEGIN
/*!*/;
# at 1284
#240325 19:10:43 server id 1  end_log_pos 1404 CRC32 0xd6055200 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711365043/*!*/;
insert into class values(3,'zs','sing song')
/*!*/;
# at 1404
#240325 19:10:43 server id 1  end_log_pos 1435 CRC32 0xc6f4a164 	Xid = 250
COMMIT/*!*/;
# at 1435
#240325 19:11:01 server id 1  end_log_pos 1500 CRC32 0xd23eccd1 	Anonymous_GTID	last_committed=5	sequence_number=6
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1500
#240325 19:11:01 server id 1  end_log_pos 1581 CRC32 0x9a58b66d 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711365061/*!*/;
BEGIN
/*!*/;
# at 1581
#240325 19:11:01 server id 1  end_log_pos 1698 CRC32 0x0583193e 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711365061/*!*/;
insert into class values(4,'lyx','an mo')
/*!*/;
# at 1698
#240325 19:11:01 server id 1  end_log_pos 1729 CRC32 0xbecfd71f 	Xid = 251
COMMIT/*!*/;
# at 1729
#240325 19:11:14 server id 1  end_log_pos 1794 CRC32 0x9d8d8f8f 	Anonymous_GTID	last_committed=6	sequence_number=7
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1794
#240325 19:11:14 server id 1  end_log_pos 1875 CRC32 0x1124da5c 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711365074/*!*/;
BEGIN
/*!*/;
# at 1875
#240325 19:11:14 server id 1  end_log_pos 1991 CRC32 0xee4f0216 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1711365074/*!*/;
insert into class values(5,'xzq','sing')
/*!*/;
# at 1991
#240325 19:11:14 server id 1  end_log_pos 2022 CRC32 0x4d943848 	Xid = 252
COMMIT/*!*/;
# at 2022
#240325 19:12:56 server id 1  end_log_pos 2069 CRC32 0xd63fcb53 	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]#mysqlbinlog --no-defaults --start-position='1284' --stop-position='1435' mysql-bin.000004|mysql -uroot -p123456
#第三条数据插入at值为1284  结束值为1435
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from class.class;
+------+------+---------------+
| id   | name | hobby         |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
|    3 | zs   | sing song     |
+------+------+---------------+
3 rows in set (0.00 sec)

使用时间节点恢复第五条数据

[root@localhost data]#mysqlbinlog --no-defaults --start-datetime='2024-03-25 19:11:14' mysql-bin.000004|mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from class.class;
+------+------+---------------+
| id   | name | hobby         |
+------+------+---------------+
|    1 | cxk  | ctrl          |
|    2 | wyb  | skateboarding |
|    3 | zs   | sing song     |
|    5 | xzq  | sing          |
+------+------+---------------+
4 rows in set (0.00 sec)

七、总结

1.物理冷备份

2.逻辑备份

3.完全恢复

4.增量备份

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

位置恢复——position

时间恢复——datetime

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文