目录
一、数据备份的重要性
二、数据库备份的分类
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 -pmysqlbinlog --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