一 MySQL完全备份
数据丢失的原因
- 程序错误
- 人为操作
- 运算错误
- 磁盘故障(备份 redis 云)
- 灾难(火灾、、)和盗窃
1 数据库备份的分类
物理备用:
对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
冷备份 (脱机备份) :是在关闭数据库的时候进行的
热备份(联机备份): 数据库处于运行状态,依赖于数据库的日志文件温备份:数据库锁定表格(不可 写入但可读)的状态下进行备份操作
逻辑备用:
是对数据库逻辑组件的备份.表示为逻辑数据库结构;这种类型的备份适用于可以编辑数据值或表结构
①完全备份:
每次对数据库进行完整的备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完
成时刻的数据库,是差异备份与增量备份的基础完全备份的备份与恢复操作都非常简单方便,但是
数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长
优点
备份与恢复操作简单方便
缺点
数据存在大量的重复占用大量的备份空间备份与恢复时间长
②差异备份:
备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份
数据量会越来越大。恢复数据时只需要恢复上次的完全备份与最佳的一次差异备份
每次差异备份,都会备份上一次完全备份之后的数据,可能会出现重复数据。恢复时,先恢复完全
备份的数据,再恢复差异备份的数据
③增量备份:
每次增量备份都是备份在上一次完全备份或者增量备份之后的数据,不会出现重复数据的情况,也不会占用额外的磁盘空间;恢复数据,需要按照次序恢复完全备份和增量备份的数据
备份频率
一周一次的全备,全备的时间需要在不提供业务的时间区间进行 PM 10点 AM 5:00之间进行全备
增量:3天/2天/1天一次增量备份
差异:选择特定的场景进行备份
2 常见的备份方法
①物理冷备
备份时数据库处于关闭状态,直接打包数据库文件备份速度快,恢复时也是最简单的
②专用备份工具
- mysqldump常用的逻辑备份工具
- mysglhotcopy仅拥有备份MyISAM和ARCHIVE表
③启用二进制日志进行增量备份
进行增量备份,需要刷新二进制日志
④第三方工具备份
免费的 MySQL 热备份软件 Navicat、DBeaver、Percona XtraBackup、mysqlbackup
⑤授权远程登录
3 数据库完全备份分类
物理冷备份与恢复
- 关闭MySQL数据库
- 使用tar命令直接打包数据库文件夹
- 直接替换现有MySQL目录即可
mysqldump备份与恢复
- MySQL自带的备份工具,可方便实现对MySQL的备份
- 可以将指定的库、表导出为SQL脚本
- 使用命令mysql导入备份的数据
注意:导出使用的是Mysqldump;导入使用的是Mysql命令
4 InnoDB 存储引擎的数据库在磁盘上存储成三个文件:
- db.opt(表属性文件)
- 表名.frm(表结构文件)
- 表名.ibd(表数据文件)
5 方法1:物理冷备份与恢复
①环境准备:
登录数据库--查看那些库--切换库--查看表
②关闭mysqld 服务
[root@localhost mysql]# systemctl stop mysqld.service
③使用tar指令压缩备份
tar zcvf data.targz data$(date +%F)/ 会显示时间
另一种方法进行备份 ![](https://img-blog.csdnimg.cn/direct/c5a37e38686c4aa4aa918864a13603fd.png)
④转移opt目录下
⑤模拟丢失
⑥解压还原
另一种解压恢复
切记要原路径解压
再来一遍:
这种方法用于数据库整体迁移数据
6 方法2:mysqldump 备份与恢复(温备份)
create table info2 (id int,name char(10),age int,sex char(4));
insert into info2 values(1,'user',11,'性别');
insert into info2 values(2,'user',11,'性别');
①环境准备:
登录数据库--查看数据库---切换数据库---建立多个数据表
①完全备份一个或多个完整的库 (包括其中所有的表)
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@mcb-11-8 opt]#mysqldump -uroot -p123 --databases mcb120 > mcb120.sql
指定用户root 指定密码123 指定备份数据mcb120 备份储蓄为mcb120.sql数据文件
②备份多个数据库
③完全备份 MySQL 服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
④ 完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql
使用“-d”选项:只备份数据库的表结构
不使用“-d"选项:表数据与表结构同时备份
举例:做为一个表结构模板
⑤备份多个数据库
⑥对加不加d做实验:
⑦ 查看备份文件
grep -v "^--" mcb120_NBA_jiegou.sql | grep -v "^/" | grep -v "^$"
二 Mysql 完全恢复
1.使用mysqldump导出的文件,可使用导入的方法
source命令
mysql命令
2.使用source恢复数据库
①先备份:
[root@localhost opt]#mysqldump -uroot -p123 beijing mcb120 > /opt/beijing_beida.sql
[root@server1 backup]# mysql -uroot -pabc123 登录数据库
mysql> show databases; 查看数据库信息
mysql> drop database school; 删除数据库school
mysql> show databases;
②模拟数据库出现问题
创建备份(对表进行备份)
[root@mcb-11-8 ~]# mysqldump -uroot -pabc123 mcb120.ABC > /opt/mcb120.ABC.sql
[root@mcb-11-8 ~]# mysql -uroot -p123 登录数据库查看
[root@mcb-11-8 ~]# mysql -uroot -p123 -e 'drop table mcb120.ABC;' #删除数据库的表
③恢复数据表
mysql> select * from ABC; 查询所有字段
mysql> show tables; 查看表信息 或免交互> source /opt/mcb.sql
mysql -uroot -p123 -e 'show tables from mcb120;
3 使用 mysql命令恢复数据库
①先备份
②模拟删除
③恢复
mysql -e是指在bash环境执行SQL语句,-e指调用命令(此命令行方便在Shell脚本中运行)
4 加与不加 --database的区别
在全量备份与恢复中,kgc数据库,kgc数据库中有kgc数据表
当备份增加--database时,表示针对kgc整个数据库;
当备份不增加--databases时,表示只针对kgc数据库下所有的数据表
① 当备份时加 --databases
1)模拟环境
2)先备份
[root@localhost mysql]#mysqldump -uroot -p123456 --databases kgc_ky35 > kgc_ky35.sql
#使用mysqldump命令 指定root用户 指定密码 备份kgc数据库下所有内容到当前目录 取名为kgc_ky35.sql
3)恢复数据库
将备份表ky35数据库文件导入系统;导入时mysql 导出mysqldump
② 备份时不加 databases
1)先备份
把备份数据导入ky35
③crontab -e 执行定时备份
0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123 mcb120 > mcb120_all_$(date +%F).sql;
/usr/local/mysql/bin/mysqladmin -uroot -p flush-logs
或者
0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123 mcb120 > mcb120_all_$(date +%Y%m%d).sql;
/usr/local/mysql/bin/mysqladmin -uroot -p flush-logs
三 MySQL增量备份与恢复
1、at :开始的位置点
2、end_log_pos:结束的位置
3、时间戳: 210712 11:50:30
4、SQL语句
1 二进制日志三种不同的记录格式:
STATEMENT (基于SQL语句)
ROW(基于行)
MIXED(混合模式),默认格式是STATEMENT
① STATEMENT(基于SQL语句):
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率底
② ROW(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update......set....where true 那么binlog的数据量会越来越大
总结:update、delete以多行数据起作用,来用行记录下来,
只记录变动的记录,不记录sql的上下文环境,
比如sql语句记录一行,但是ROW就可能记录10行,但是准确性高,高并发的时候由于操作量,性能变低 比较大所以记录都记下来,
③ MIXED(混合输入)记录格式——推荐使用
一般的语句使用statement,函数使用ROW方式存储。
2 开启二进制日志
做增量备份要先开启二进制日志,再插入数据,否则日志是空的
①编辑文本开启二进制功能
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(混合输入)
[root@mcb-11 ~]# vim /etc/my.cnf
[root@mcb-11 data]# systemctl restart mysqld
[root@mcb-11 ~]# cd /usr/local/mysql/data
[root@mcb-11 data]# ls
auto.cnf ib_logfile0 mysql mysql_error.log performance_schema
ib_buffer_pool ib_logfile1 mysql-bin.000001 mysql_general.log sys
ibdata1 ibtmp1 mysql-bin.index mysql_slow_query.log
[root@mcb-11 data]# ll
总用量 122940
-rw-r-----. 1 mysql mysql 56 3月 19 21:39 auto.cnf
-rw-r-----. 1 mysql mysql 360 4月 6 12:10 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 4月 6 12:10 ibdata1
-rw-r-----. 1 mysql mysql 50331648 4月 6 12:10 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 3月 19 21:39 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 4月 6 12:10 ibtmp1
drwxr-x---. 2 mysql mysql 4096 3月 19 21:39 mysql
-rw-r-----. 1 mysql mysql 154 4月 6 12:10 mysql-bin.000001
-rw-r-----. 1 mysql mysql 19 4月 6 12:10 mysql-bin.index
-rw-r-----. 1 mysql mysql 4184 4月 6 12:10 mysql_error.log
-rw-r-----. 1 mysql mysql 333 4月 6 12:10 mysql_general.log
-rw-r-----. 1 mysql mysql 187 4月 6 12:10 mysql_slow_query.log
drwxr-x---. 2 mysql mysql 8192 3月 19 21:39 performance_schema
drwxr-x---. 2 mysql mysql 8192 3月 19 21:40 sys
二进制日志开启后,重启mysql会在data目录中看到二进制日志(mysql-bin.000001,mysql-bin.000002...文件)
开启二进制日志,会产生一个索引文件及索引列表(mysql-bin.index)
其中,索引文件记录更新的sql语句
索引文件刷新方式
重启Mysql服务的时候会更新索引文件,用于记录新的更新的sql语句
刷新二进制日志
mysql-bin.index #二进制日志文件的索引
查看数据库日志;日志默认存放位置:
/usr/local/mysql/data 文件夹下
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.01 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)
mysql> set global slow_query_log=ON; #在数据库中设置开启慢查询的方法
Query OK, 0 rows affected (0.00 sec)
②查看二进制日志文件的内容
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的错误)
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001 > /opt/mysql-bin.000001
解码方式:将文件导出为txt格式,方便查阅
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 > /opt/mysql-bin.000001
因为没有建立数据库,日志为空
做个文本也行
③创建数据库
在生产环境中,可以使用Shell脚本自动实现定时备份(时间频率需要确认)
0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -pabc123 kgc info1 > ./kgc_infol_$(date
+%Y%m%d).sql ;/usr/local/mysql/bin/mysqladmin -u root -p flush-logs
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database njdn;
Query OK, 1 row affected (0.01 sec)
mysql> use njdn;
Database changed
mysql> create table mcb(id int(6),name varchar(20));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into mcb values (1,'cd');
Query OK, 1 row affected (0.01 sec)
mysql> insert into mcb values (2,'mdq');
Query OK, 1 row affected (0.00 sec)
mysql> select * from mcb;
+------+------+
| id | name |
+------+------+
| 1 | cd |
| 2 | mdq |
+------+------+
2 rows in set (0.00 sec)
③在另一个窗口刷新一下日志
[root@mcb-11 opt]# mysqladmin -uroot -p123 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@mcb-11 opt]# ll /usr/local/mysql/data/
auto.cnf ib_logfile0 mysql mysql-bin.index mysql_slow_query.log sys
ib_buffer_pool ib_logfile1 mysql-bin.000001 mysql_error.log njdn
ibdata1 ibtmp1 mysql-bin.000002 mysql_general.log performance_schema
④也可以使用MySQL自带的binlog二进制解释器默认字符集utf-8查看/opt目录下的mysql-
bin.000001数据文件
注意:若有000001与000002日志,则000002是空的,创建日志在000001
[root@mcb-11 opt]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001
⑤把新产生的日志拷贝到/opt 下
[root@mcb-11 opt]# cp /usr/local/mysql/data/mysql-bin.000001 /opt/
[root@mcb-11 opt]# ls /opt/
⑥进行备份
[root@mcb-11 opt]# mysqldump -uroot -p123 njdn > /opt/njdn_mcb_$(date +%F).sql
⑦删除表格:
1 完全恢复:
①使用重定向恢复
[root@mcb-11 opt]# mysql -uroot -p123 njdn < /opt/njdn_mcb_2024-04-06.sql
②去另一个端口取查看
③使用二进制文件进行恢复
首先删除表
mysql> drop table mcb;
Query OK, 0 rows affected (0.01 sec)
恢复表
[root@mcb-11 opt]#mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -p
Enter password:
ERROR 1007 (HY000) at line 29: Can't create database 'njzh'; database exists
##此时报错,是因为我们库名没有删除,在二进制文件中还会创建库名,导致重复,所以需要我们手动删除
mysql> drop database njdn;
Query OK, 0 rows affected (0.00 sec)
##此时将数据库删除,再去使用二进制日志恢复
[root@mcb-11 opt]#mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -p
Enter password:
[root@mcb-11 opt]#
查看是否恢复
mysql> use njdn;
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_njdn |
+----------------+
| mcb |
+----------------+
1 row in set (0.00 sec)
mysql> select * from mcb;
+------+------+
| id | name |
+------+------+
| 1 | cd |
| 2 | mdq |
+------+------+
2 rows in set (0.00 sec)
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> insert into mcb values(3,'hz');
Query OK, 1 row affected (0.01 sec)
mysql> insert into mcb values(4,'wf');
Query OK, 1 row affected (0.00 sec)
mysql> insert into mcb values(5,'qd');
Query OK, 1 row affected (0.00 sec)
mysql> insert into mcb values(6,'dq');
Query OK, 1 row affected (0.01 sec)
mysql> select * from mcb;
+------+------+
| id | name |
+------+------+
| 1 | cd |
| 2 | mdq |
| 3 | hz |
| 4 | wf |
| 5 | qd |
| 6 | dq |
+------+------+
6 rows in set (0.00 sec)
②查看日志
[root@mcb-11 opt]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
[root@mcb-11 opt]# cp /usr/local/mysql/data/mysql-bin.000002 /opt/
[root@mcb-11 opt]# mysqladmin -uroot -p123 flush-logs
[root@mcb-11 opt]# ll /usr/local/mysql/data/
[root@mcb-11 opt]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240406 12:47:03 server id 1 end_log_pos 123 CRC32 0xa5c7d295 Start: binlog v 4, server v 5.7.17-log created 240406 12:47:03
# Warning: this binlog is either in use or was not closed properly.
# at 123
#240406 12:47:03 server id 1 end_log_pos 154 CRC32 0x60072e1f Previous-GTIDs
# [empty]
# at 154
#240406 13:05:00 server id 1 end_log_pos 219 CRC32 0xc7fc569d Anonymous_GTID last_committed=0 sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#240406 13:05:00 server id 1 end_log_pos 335 CRC32 0x76f0ffb6 Query thread_id=3 exec_time=1 error_code=0
use `njdn`/*!*/;
SET TIMESTAMP=1712379900/*!*/;
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/*!*/;
DROP TABLE "mcb" /* generated by server */
/*!*/;
# at 335
#240406 13:05:35 server id 1 end_log_pos 400 CRC32 0x754a74c9 Anonymous_GTID last_committed=1 sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 400
#240406 13:05:35 server id 1 end_log_pos 526 CRC32 0x2805dd82 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1712379935/*!*/;
SET @@session.foreign_key_checks=0, @@session.unique_checks=0/*!*/;
SET @@session.sql_mode=524288/*!*/;
DROP TABLE IF EXISTS `mcb` /* generated by server */
/*!*/;
# at 526
#240406 13:05:35 server id 1 end_log_pos 591 CRC32 0x7532ff26 Anonymous_GTID last_committed=2 sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 591
#240406 13:05:35 server id 1 end_log_pos 784 CRC32 0x27368e1f Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1712379935/*!*/;
CREATE TABLE `mcb` (
`id` int(6) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!*/;
# at 784
#240406 13:05:35 server id 1 end_log_pos 849 CRC32 0x6e40a7e0 Anonymous_GTID last_committed=3 sequence_number=4
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 849
#240406 13:05:35 server id 1 end_log_pos 965 CRC32 0x5b9a3540 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1712379935/*!*/;
/*!40000 ALTER TABLE `mcb` DISABLE KEYS */
/*!*/;
# at 965
#240406 13:05:35 server id 1 end_log_pos 1030 CRC32 0x2b662d6e Anonymous_GTID last_committed=4 sequence_number=5
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1030
#240406 13:05:35 server id 1 end_log_pos 1109 CRC32 0x34dc54e1 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1712379935/*!*/;
BEGIN
/*!*/;
# at 1109
#240406 13:05:35 server id 1 end_log_pos 1226 CRC32 0x8e4a8b99 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1712379935/*!*/;
INSERT INTO `mcb` VALUES (1,'cd'),(2,'mdq')
/*!*/;
# at 1226
#240406 13:05:35 server id 1 end_log_pos 1257 CRC32 0x7a7d6131 Xid = 59
COMMIT/*!*/;
# at 1257
#240406 13:05:35 server id 1 end_log_pos 1322 CRC32 0x7938e12c Anonymous_GTID last_committed=5 sequence_number=6
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1322
#240406 13:05:35 server id 1 end_log_pos 1437 CRC32 0x9c2e7dd4 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1712379935/*!*/;
/*!40000 ALTER TABLE `mcb` ENABLE KEYS */
/*!*/;
# at 1437
#240406 13:08:01 server id 1 end_log_pos 1502 CRC32 0xd7c9ba5a Anonymous_GTID last_committed=6 sequence_number=7
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1502
#240406 13:08:01 server id 1 end_log_pos 1618 CRC32 0x8806a4a0 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380081/*!*/;
SET @@session.foreign_key_checks=1, @@session.unique_checks=1/*!*/;
SET @@session.sql_mode=1437073414/*!*/;
DROP TABLE "mcb" /* generated by server */
/*!*/;
# at 1618
#240406 13:09:30 server id 1 end_log_pos 1683 CRC32 0x1e9d3902 Anonymous_GTID last_committed=7 sequence_number=8
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1683
#240406 13:09:30 server id 1 end_log_pos 1768 CRC32 0x9af36fef Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380170/*!*/;
drop database njdn
/*!*/;
# at 1768
#240406 12:33:46 server id 1 end_log_pos 1833 CRC32 0xc272e3af Anonymous_GTID last_committed=8 sequence_number=9
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1833
#240406 12:33:46 server id 1 end_log_pos 1927 CRC32 0xdfc00616 Query thread_id=3 exec_time=2243 error_code=0
SET TIMESTAMP=1712378026/*!*/;
create database njdn
/*!*/;
# at 1927
#240406 12:38:36 server id 1 end_log_pos 1992 CRC32 0xbcd68aa8 Anonymous_GTID last_committed=9 sequence_number=10
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1992
#240406 12:38:36 server id 1 end_log_pos 2110 CRC32 0x4b25a068 Query thread_id=3 exec_time=1953 error_code=0
use `njdn`/*!*/;
SET TIMESTAMP=1712378316/*!*/;
create table mcb(id int(6),name varchar(20))
/*!*/;
# at 2110
#240406 12:39:48 server id 1 end_log_pos 2175 CRC32 0xf208c37e Anonymous_GTID last_committed=10 sequence_number=11
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2175
#240406 12:39:48 server id 1 end_log_pos 2254 CRC32 0x2c217c14 Query thread_id=3 exec_time=1881 error_code=0
SET TIMESTAMP=1712378388/*!*/;
BEGIN
/*!*/;
# at 2254
#240406 12:39:48 server id 1 end_log_pos 2359 CRC32 0x33092071 Query thread_id=3 exec_time=1881 error_code=0
SET TIMESTAMP=1712378388/*!*/;
insert into mcb values (1,'cd')
/*!*/;
# at 2359
#240406 12:39:48 server id 1 end_log_pos 2390 CRC32 0xd507467b Xid = 120
COMMIT/*!*/;
# at 2390
#240406 12:40:02 server id 1 end_log_pos 2455 CRC32 0xb8c346f3 Anonymous_GTID last_committed=11 sequence_number=12
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2455
#240406 12:40:02 server id 1 end_log_pos 2534 CRC32 0x472f065b Query thread_id=3 exec_time=1867 error_code=0
SET TIMESTAMP=1712378402/*!*/;
BEGIN
/*!*/;
# at 2534
#240406 12:40:02 server id 1 end_log_pos 2640 CRC32 0x38bf8db9 Query thread_id=3 exec_time=1867 error_code=0
SET TIMESTAMP=1712378402/*!*/;
insert into mcb values (2,'mdq')
/*!*/;
# at 2640
#240406 12:40:02 server id 1 end_log_pos 2671 CRC32 0xf5e638fe Xid = 126
COMMIT/*!*/;
# at 2671
#240406 13:15:58 server id 1 end_log_pos 2736 CRC32 0x32a2344e Anonymous_GTID last_committed=12 sequence_number=13
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 2736
#240406 13:15:58 server id 1 end_log_pos 2815 CRC32 0xddce8b49 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380558/*!*/;
BEGIN
/*!*/;
# at 2815
#240406 13:15:58 server id 1 end_log_pos 2920 CRC32 0x685a004e Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380558/*!*/;
insert into mcb values (3,'hz')
/*!*/;
# at 2920
#240406 13:15:58 server id 1 end_log_pos 2951 CRC32 0x7dfc1a03 Xid = 140
COMMIT/*!*/;
# at 2951
#240406 13:16:08 server id 1 end_log_pos 3016 CRC32 0xf18beb40 Anonymous_GTID last_committed=13 sequence_number=14
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 3016
#240406 13:16:08 server id 1 end_log_pos 3095 CRC32 0xe3221a46 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380568/*!*/;
BEGIN
/*!*/;
# at 3095
#240406 13:16:08 server id 1 end_log_pos 3200 CRC32 0x004627ec Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380568/*!*/;
insert into mcb values (4,'wf')
/*!*/;
# at 3200
#240406 13:16:08 server id 1 end_log_pos 3231 CRC32 0x7be3c80d Xid = 141
COMMIT/*!*/;
# at 3231
#240406 13:16:21 server id 1 end_log_pos 3296 CRC32 0x3db1c8d6 Anonymous_GTID last_committed=14 sequence_number=15
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 3296
#240406 13:16:21 server id 1 end_log_pos 3375 CRC32 0x9b0e0a43 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380581/*!*/;
BEGIN
/*!*/;
# at 3375
#240406 13:16:21 server id 1 end_log_pos 3480 CRC32 0xae7e183a Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380581/*!*/;
insert into mcb values (5,'qd')
/*!*/;
# at 3480
#240406 13:16:21 server id 1 end_log_pos 3511 CRC32 0xf9152bf4 Xid = 142
COMMIT/*!*/;
# at 3511
#240406 13:16:34 server id 1 end_log_pos 3576 CRC32 0x1f3aff4e Anonymous_GTID last_committed=15 sequence_number=16
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 3576
#240406 13:16:34 server id 1 end_log_pos 3655 CRC32 0xdb6b06ec Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380594/*!*/;
BEGIN
/*!*/;
# at 3655
#240406 13:16:34 server id 1 end_log_pos 3760 CRC32 0x7b6c9a6b Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1712380594/*!*/;
insert into mcb values (6,'dq')
/*!*/;
# at 3760
#240406 13:16:34 server id 1 end_log_pos 3791 CRC32 0xdde20704 Xid = 143
COMMIT/*!*/;
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*/;
③删除库
mysql> drop database njdn;
Query OK, 1 row affected (0.01 sec)
需求1:恢复前两条
一共六条数据从0恢复到任意位置,中间不能停止
--stop-position=‘xxxxid’ 到id停止
查看日志
基于位置点恢复
#仅恢复到操作 ID 为'1102'之前的数据,即恢复1 2的数据
mysqlbinlog --no-defaults --stop-position='2671' mysql-bin.000001|mysql -uroot -p123
需求2:恢复中间两条
#恢复3数据 起始操作ID 为'2947',截止id为 '3237'
mysqlbinlog --no-defaults --start-position='2815' --stop-position='3095' mysql-bin.000002|mysql -uroot -p123
查看日志:
--start-position=‘xxxx’
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
##查看数据2的日志
需求3:恢复后两条一条
查看日志
3 基于时间点恢复
跳过某个发生错误的时间点实现数据恢复,在错误时间点停止,在下一个正确时间点开始
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
仅恢复到16:41:24 之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-datetime='2024 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
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-
日小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
#前一个年月日:起始时间;后一个年月日:终止时间
需求:今回复第四条数据
[root@mysql-server opt]#mysqlbinlog --no-defaults --start-datetime='2024-04-06 13:16:08' mysql-bin.000002 | mysql -uroot -p
Enter password: ##输入密码