序
号
日志名称
解释说明
01
general_log
表示查询日志(通用日志),默认日志状态处于关闭,可以进行在线调整配置
作用:记录了客户端从会话连接开始,执行过的所有SQL语句信息;
02
表示错误日志(运行日志),默认日志状态处于激活
作用:记录了数据库服务启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息;
03
表示二进制日志(binlog日志),默认日志状态处于激活(8.0之后)
作用:记录了所有的DDL语句和DML语句,但是不包括数据库查询语句;语句以事件的形式保存,描述了数据的更改过程,此日志对于灾难时的数据恢复起着极其
重要的作用。
04
slow_quer y_log
表示慢查询日志,记录了所有执行时间超过参数long_quer y_time设置值并且扫描记录数小于min_examined_row_limit的所有SQL语句的日志。
基础章节-01-MySQL数据库服务中级课程#
1.00 课程知识章节说明#
目前在互联网的实际应用中,各个企业都会比较关注自身网站的数据信息,既要保证数据信息的安全性,同时也要保证数据存储读取效率
并且在特殊的场景下,还要对存储的数据信息进行检索和分析;因此数据库服务业务已经在各行各业应用非常的广泛
对于互联网领域的技术人员,对于数据库服务知识的掌握,也将是在求职时必备的技能,有些时候还会绝对入职的定级和薪资水平。
1.11 数据库服务日志管理#
1.11.1 数据库服务日志概述介绍#
任何一种数据库中,都会有各种各样的日志,记录这数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件;
主要是针对数据库ser ver层产生的数据信息,主要用于记录和数据库服务运行本身有关的日志、以及SQL语句操作执行相关的日志;
1.11.2 数据库服务日志常用分类#
在MySQL数据库服务中,有4种不同的日志是最常用的日志类型,这些日志记录这数据库在不同方面的踪迹;
日志信息查看方法:
常用日志信息介绍:
1.11.3 数据库服务日志信息配置#
分类日志信息配置:通用日志(general_log)
01 日志信息基本配置:#
1
2
3
4
5
6
7
8
9
10
11
12
13
| mysql> show variables like '%log%';
+------------------------------------------------+---------------------------------------------+
| Variable_name | Value |
+------------------------------------------------+---------------------------------------------+
| general_log | OFF |
| general_log_file | /data/3306/data/xiaoQ-01.log |
| log_error | ./xiaoQ-01.edu.err |
| log_bin | ON |
| log_bin_basename | /data/3306/data/binlog |
| log_bin_index | /data/3306/data/binlog.index |
| slow_quer y_log | OFF |
| slow_quer y_log_file | /data/3306/data/xiaoQ-01-slow.log |
+------------------------------------------------+---------------------------------------------+
|
说明:企业真实环境,由于日志记录量比较大,所以不建议打开此日志记录功能,可以在有需要时打开,支持在线配置调整;
分类日志信息配置:错误日志(log_error)
01 日志信息基本配置
说明:企业真实环境,日志处于默认激活记录状态,可以使用错误日志信息做故障诊断,记录错误信息级别为note warning error;
分类日志信息配置:二进制日志(log_bin)
在进行增量恢复数据时,需要先了解什么是binlog日志,此日志文件其实就是用于记录对数据库进行操作更改的语句信息的;
并且记录更改的语句信息以事件形式进行记录,但是需要注意的是查询相关的语句是不会被记录的,比如:select、show;
然而作为所有对数据库的改操作事件信息都会被记录,比如:insert、update、create、drop。。。
查看数据库binlog日志配置参数:
进入到数据库服务系统环境中,可以使用命令进行查看binlog日志功能是否开启;
01 日志信息基本配置
general_log=OFF
1
| -- 默认日志功能处于关闭,建议在需要做调试工作时(功能测试、语句审计)可以打开;
|
general_log_file=/data/3306/data/xiaoQ-01.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| -- 定义日志文件存储的路径信息,建议日志文件路径与数据存放路径进行分离;
# 修改日志默认状态(激活日志):
mysql > set global general_log=1;
log_error=./xiaoQ-01.edu.err
-- 定义日志文件存储的路径信息,建议日志文件路径与数据存放路径进行分离;
# 修改日志存储路径(永久配置):
[root@xiaoq ~]# vim /etc/my.cnf
log_error=/tmp/mysql3306.err
-- 配置文件编写完毕后,需要重启数据库服务生效
# 模拟故障日志应用
[root@oldboyxiaoq ~]# ll /data/3306/data/ ibdata1
-rw-r----- 1 mysql mysql 12582912 Nov 16 17:46 /data/3306/data/ ibdata1
[root@oldboyxiaoq ~]# chmod 000 /data/3306/data/ ibdata1
[root@oldboyxiaoq ~]# /etc/ init.d/mysqld restart
Shutting down MySQL............................... SUCCESS!
Starting MySQL......................................... ERROR! The ser ver quit without updating PID file (/data/3306/data/oldboyxiaoq.com.pid).
[root@oldboyxiaoq ~]# tail -20 /data/3306/data/oldboyxiaoq.com.err
2022-11-21T01:20:47.735040Z 1 [ERROR] [MY-012271] [InnoDB] The innodb_system data file 'ibdata1' must be writable
2022-11-21T01:20:47.744091Z 1 [ERROR] [MY-012278] [InnoDB] The innodb_system data file 'ibdata1' must be writable
2022-11-21T01:20:47.744808Z 1 [ERROR] [MY-010334] [Ser ver] Failed to initialize DD Storage Engine
2022-11-21T01:20:47.745739Z 0 [ERROR] [MY-010020] [Ser ver] Data Dictionar y initialization failed.
2022-11-21T01:20:47.746526Z 0 [ERROR] [MY-010119] [Ser ver] Aborting
-- 根据错误日志的错误提示信息,进行错误信息进行分析,从而排查故障可能出现的原因;
# 未开启binlog日志功能时,查看系统binlog功能配置参数状态
mysql> show variables like '%log_bin%';
+-----------------------------------------+-------+
| Variable_name | Value |
+-----------------------------------------+-------+
| log_bin | OFF |
| sql_log_bin | ON |
+-----------------------------------------+-------+
3 rows in set (0.00 sec)
|
— 通过以上输出信息可以看到log_bin为off状态,表示binlog日志功能尚未开启
1
2
3
4
5
6
7
8
9
| # 已开启binlog日志功能后,查看系统binlog功能配置参数状态
mysql> show variables like '%log_bin%';
+-----------------------------------------+-------+
| Variable_name | Value |
+-----------------------------------------+-------+
| log_bin | ON |
| sql_log_bin | ON |
+-----------------------------------------+-------+
3 rows in set (0.00 sec)
|
— 通过以上输出信息可以看到log_bin为on状态,表示binlog日志功能已经开启
1
2
| ser ver_id=6
-- 进行主从操作时,需要进行此信息配置;
|
记录方式
优点说明
缺点说明
SBR
可读性强,日志量相对较少;
数据信息可能不准确,数据一致性不足
RBR
数据信息记录更准确,数据一致性更强
可读性弱,日志量相对较多,数据记录准确
举例说明
1
2
| update t1 set a=10 where id<10000; 记录一条语句即可
insert into 随机数函数;
|
举例说明
1
2
| update t1 set a=10 where id<10000; 记录多条语句修改信息,生成日志
insert into 随机数函数;
|
说明:企业真实环境,日志处于默认激活记录状态,可以使用日志信息进行灾难数据恢复,以及可以用于实现主从复制;
02 日志配置信息扩展
SBR(statement-based replication)与RBR(Row-Based Replication)记录的优缺点分析:(面试常见问题)#
03 日志信息查看方法:#
可以通过查看方式,获取binlog日志里的数据信息,一般在数据库启动时,日志记录功能就开启了;
可以利用日志中记录信息,将数据库服务的数据信息恢复到指定的时间点,同时也可以支持主从数据复制(在其它机器上回放日志);
1
2
3
4
5
6
7
8
9
10
11
| log_bin=ON
-- 默认日志功能处于关闭状态
log_bin_basename=/data/3306/data/binlog
-- 定义日志文件存储的路径信息,建议日志文件路径与数据存放路径进行分离;
# 配置信息简写方式:开启数据库binlog日志记录功能
[root@xiaoq ~]# vim /etc/my.cnf
-- 激活binlog日志记录功能,需要对数据库服务配置文件进行编辑修改
[mysqld]
ser ver_id=6
log_bin=/data/3306/binlog /mysql-bin
-- 进行binlog日志目录路径信息修改时,需要创建指定的目录并设置权限信息,最后需要重新启动数据库服务生效;
|
或者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| log_bin=binlog
-- 只是设置日志名称信息,日志会自动保存到数据库服务指定的数据目录中;
# 配置文件修改后需要重启数据库服务,加载配置文件改动的信息:
[root@xiaoQ ~]# /etc/ init.d/mysqld restart
[root@xiaoQ xiaoQ]# ll -h /data/3306/data/binlog*
-rw-rw----. 1 mysql mysql 245 6月 24 02:19 /data/3306/data/binlog.00000N
-rw-rw----. 1 mysql mysql 16 6月 24 02:19 /data/3306/data/binlog.index
-- 数据库服务重启后,已经可以在数据库的数据存储目录中,看到binlog日志文件的踪影
# 参数一:sync_binlog 表示刷新日志到磁盘策略
mysql> select @@sync_binlog;
+---------------------+
| @@sync_binlog |
+---------------------+
| 1 |
+---------------------+
1 row in set (0.00 sec)
-- 在进行主从同步过程的双一标准的其中一个1的信息配置,主要是控制缓冲区里的binlog日志信息如何刷写到磁盘中;
-- 此参数信息是有三种方式进行配置的:
-- 参数信息配置0:表示由操作系统缓存自己决定,什么时候刷新日志到磁盘中;
-- 参数信息配置1:表示每次事务提交,立即刷新日志到磁盘中;(此方式配置更安全)
-- 参数信息配置N:表示每组事务提交,按照组的事务次数定义,确定刷新日志到磁盘中的频次;(可以有效减少IO性能损耗)
-- 参数官方资料链接:https://dev.mysql.com/doc/refman/8.0/en/replication-options-binar y-log.html
# 参数二:binlog_format 定义binlog日志的格式信息
mysql> select @@binlog_format;
+------------------------+
| @@binlog_format |
+------------------------+
| ROW |
+------------------------+
1 row in set (0.00 sec)
-- 在进行主从同步数据恢复时,此参数配置可能会影响数据恢复的一致性问题;
-- 此参数信息是有三种方式进行配置的,确定了主从复制的级别,只针对DML语句的日志才有效;
-- 参数信息配置 statement(SBR):语句格式记录binlog;
create database xiaoQ; -- DDL DCL语句只能使用statement 表示的就是原原本本的语句信息,即做什么就记录什么;
-- 参数信息配置 row(RBR):行格式记录binlog(默认模式)
update t1 set a=10 where id<10; -- 会记录行的变化信息,属于底层的记录信息,可能会有多个变化日志信息记录
-- 参数信息配置 mixed(MBR):混合格式记录binlog
-- 由数据库服务自行决定,是记录语句信息,还是记录行的变化信息;
|
对于binlog日志信息的查看,主要目的是为了日后日志事件信息的截取操作;
查看方式一:确认数据库binlog日志数量
查看方式二:确认数据库binlog日志状态
查看方式三:查看数据库binlog日志信息
具体binlog事件信息:
具体binlog事件记录信息分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| mysql> show binar y logs;
+------------------+-------------+--------------+
| Log_name | File_size | Encr ypted |
+------------------+-------------+--------------+
| binlog.000001 | 156 | No |
+------------------+-------------+--------------+
-- 获取数据库服务运行过程中,使用的binlog日志的情况
mysql> flush logs;
Quer y OK, 0 rows affected (0.12 sec)
-- 可以执行flush刷新命令,从而生成新的binlog日志文件,类似于实现了日志切割功能;
mysql> show binar y logs;
+------------------+-------------+--------------+
| Log_name | File_size | Encr ypted |
+------------------+-------------+--------------+
| binlog.000001 | 200 | No |
| binlog.000002 | 156 | No |
+------------------+-------------+--------------+
2 rows in set (0.00 sec)
mysql> create database test_binlog;
Quer y OK, 1 row affected (0.03 sec)
-- 模拟数据服务有修改操作
mysql> select * from world.city limit 1;
Quer y OK, 1 row affected (0.03 sec)
-- 模拟数据服务有修改操作
mysql> show binar y logs;
+------------------+-------------+--------------+
| Log_name | File_size | Encr ypted |
+------------------+-------------+--------------+
| binlog.000001 | 200 | No |
| binlog.000002 | 362 | No |
+------------------+-------------+--------------+
2 rows in set (0.00 sec)
-- 可以看到binlog日志的存储量发生了变化,但是在做查询操作时,binlog日志的存储量并未发生变化
mysql> show master status;
+------------------+------------+------------------+-----------------------+-------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+------------+------------------+-----------------------+-------------------------+
| binlog.000002 | 362 | | | |
+------------------+------------+------------------+-----------------------+-------------------------+
1 row in set (0.00 sec)
-- 查看获取当前使用的binlog日志情况,以及产生的日志量字节大小;
mysql> show binlog events in 'binlog.000002';
-- binlog日志信息是以事件方式进行记录的,所以日志查看过程是查看事件信息
-- 一般binlog日志的前两行,表示日志格式头信息(日志简单的描述信息)
-- 一般binlog日志中的quer y信息,就是对数据库的操作语句,其中包含了创建数据库的语句;
|
列号
列信息
解释说明
01
表示指定查看的binlog日志文件名称信息
02
Pos
表示binlog日志事件开始的位置点,用于截取二进制日志信息标识
05
End_log_pos
表示binlog日志事件结束的位置点,用于截取二进制日志信息标识
06
Info
表示binlog中具体的事件内容信息
查看方式四:筛选数据库binlog日志事件
说明:在实际生产环境中,若binlog日志量比较大时,需要快速过滤关键日志事件行,可以使用以上查看日志方法;
获取数据库binlog日志记录信息异常:
进行数据库服务数据信息更改操作,随后查看binlog日志信息的变化:
04 日志信息应用实战:#
数据库数据异常恢复(简单情况)
在实际生成环境中,可以利用binlog日志记录的信息截取,实现数据库异常情况下的数据信息恢复功能;
数据库异常恢复情况环境准备:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 模拟生成binlog日志事件信息
mysql> source ~/world.sql;
mysql> drop database world;
mysql> source ~/world.sql;
# 获取删除数据库的事件信息:
# 筛选数据库日志方式一:
[root@xiaoq data]# mysql -e "show binlog events in 'binlog.000002'"|grep "drop database"
binlog.000002 722789 Quer y 1 722896 drop database world /* xid=5363 */
-- 获取指定事件信息产生的起点位置和终点位置信息;
# 筛选数据库日志方式二:
mysql> pager less
-- 在数据库中定义pager功能,数据库连接会话退出即失效;
mysql> show binlog events in 'binlog.000002';
-- 此时查看日志事件信息具有了翻页功能
|
/drop database
| binlog.000002 | 722789 | Quer y | 1 | 722896 | drop database world /* xid=5363 */
1
| mysql> pager grep "drop database"
|
PAGER set to ‘grep “drop database”’
1
2
| -- 表示开启数据库pager的过滤功能
mysql> show binlog events in 'binlog.000002';
|
| binlog.000002 | 722789 | Quer y | 1 | 722896 | drop database world /* xid=5363 */
1
2
3
4
5
6
| -- 再次查看binlog事件信息时,只过滤显示删除数据库的操作事件日志
# 进行数据库创建操作
mysql> create database xiaoQ;
mysql> show databases;
# 查看获取binlog日志记录信息
[root@xiaoQ ~]# mysqlbinlog /var/lib/mysql/binlog.000001
|
mysqlbinlog: unknown variable ‘default-character-set=utf8mb4’
1
2
3
| -- 由于在数据库在客户端配置文件中添加了default-character-set=utf8mb4字符编码信息,因此造成无法查看binlog
[root@xiaoQ ~]# cat /etc/my.cnf.d/client.cnf
[client]
|
#default-character-set=utf8mb4
[client-mariadb]
#default-character-set=utf8mb4
1
2
| -- 可以临时调整先将客户端的字符编码配置信息注释,
[root@xiaoQ ~]# mysqlbinlog /var/lib/mysql/binlog.000001
|
… 省略部分信息 …
#220624 2:35:02 ser ver id 1 end_log_pos 579 Quer y thread_id=2 exec_time=0 error_code=0
1
2
| SET TIMESTAMP=1656009302/*!*/;
create database xiaoQ
|
/!/;
… 省略部分信息 …
1
2
3
| -- 在binlog日志文件中,已经记录了之前的创建xiaoQ的更改操作记录信息
# 切换新的binlog日志文件做模拟数据恢复
mysql> flush logs;
|
数据库二进制日志信息查看方法:
通过日志信息查看DDL操作语句信息(记录方式 SBR)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| Quer y OK, 0 rows affected (0.03 sec)
mysql> show master status;
+------------------+------------+------------------+-----------------------+-------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+------------+------------------+-----------------------+-------------------------+
| binlog.000003 | 156 | | | |
+------------------+------------+------------------+-----------------------+-------------------------+
1 row in set (0.01 sec)
-- 确认已经刷新生成了新的binlog日志文件;
# 进行基本的数据库SQL语句操作:
mysql> create database bindb;
mysql> use bindb;
mysql> create table t1 (id int);
mysql> begin;
mysql> insert into t1 values(1);
-- 在没有进行事务提交前,操作的事务事件信息,是不会出现在binlog事件日志中的
mysql> commit;
-- 对于数据库的binlog日志,只会记录事务已经提交的DML语句信息,没有提交的DML语句是不会进行记录的;
-- 在日志中变化的DML语句信息是无法识别的,因为记录DML操作的语句默认是以ROW模式记录的;
[root@xiaoq ~]# mysqlbinlog /data/3306/data/binlog.000003
-- 对于数据库binlog日志信息,是无法直接查看内容信息,需要利用相关命令工具进行查看
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on ser ver versions 8.0.24 and older.
|
/!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1/;
/!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0/;
DELIMITER /!/;
#221121 13:12:59 ser ver id 1 end_log_pos 125 CRC32 0xbb7d1fd1 Start: binlog v 4, ser ver v 8.0.26 created 221121 13:12:59
1
2
| # Warning: this binlog is either in use or was not closed properly.
BINLOG '
|
2wh7Yw8BAAAAeQAAAH0AAAABAAQAOC4wLjI2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA
CigB0R99uw==
‘/!/;
#221121 13:12:59 ser ver id 1 end_log_pos 156 CRC32 0x04874c92 Previous-GTIDs
1
2
3
| # [empty]
-- binlog日志文件156之前的内容是可以忽略的,表示是日志文件的头格式内容信息
# at 156
|
#221121 13:16:19 ser ver id 1 end_log_pos 233 CRC32 0xd73c14e1 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=no
original_committed_timestamp=1669007779100380 immediate_commit_timestamp=1669007779100380 transaction_length=188
1
2
| # original_commit_timestamp=1669007779100380 (2022-11-21 13:16:19.100380 HKT)
# immediate_commit_timestamp=1669007779100380 (2022-11-21 13:16:19.100380 HKT)
|
/!80001 SET @@session.original_commit_timestamp=1669007779100380//!/;
/!80014 SET @@session.original_ser ver_version=80026//!/;
/!80014 SET @@session.immediate_ser ver_version=80026//!/;
1
2
3
4
| SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
-- binlog日志文件已事件形式进行记录,主要关注两个at内容之间的信息,即表示的是一个事件信息;
# at 233
-- binlog日志中一个事件的开始,就表示上一个事件的结束,在binlog中记录的事件日志信息是连续的;
|
#221121 13:16:19 ser ver id 1 end_log_pos 344 CRC32 0x624986f5 Quer y thread_id=11 exec_time=0 error_code=0 Xid = 10728
1
2
3
4
5
| SET TIMESTAMP=1669007779/*!*/;
SET @@session.pseudo_thread_id=11/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
|
/!\C utf8mb4 //!/;
1
2
3
| SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_ser ver=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
|
/!80011 SET @@session.default_collation_for_utf8mb4=255//!/;
/!80016 SET @@session.default_table_encr yption=0//!/;
/!/;
通过日志信息查看DML操作语句信息(记录方式 RBR)
以上ROW模式记录的信息是加密显示,无法直接查看的,可以使用下面命令参数进行获取详细信息:
数据库模拟异常情况破坏操作:
数据库异常情况数据恢复操作:
#####################################################################################################
数据库数据异常恢复(痛点情况)
1
2
3
| [root@xiaoq ~]# mysqlbinlog --base64-output=decode-rows -vvv /data/3306/data/binlog.000003
-- 以上添加的参数信息,表示将DML的ROW格式语句信息,进行格式化处理输出;
# at 739
|
#221121 13:17:45 ser ver id 1 end_log_pos 779 CRC32 0xb468b459 Write_rows: table id 101 flags: STMT_END_F
INSERT INTO bindb.t1#
1
| -- 利用DML语句做的插入语句信息就显示出来了
|
SET#
1
2
| -- 以上日志记录的信息,可以用命令实现,如下:
mysql > insert into t1 set id=1;
|
等价于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| mysql > insert into t1 values(1);
mysql> drop database bindb;
-- 模拟破坏性操作,删除数据库
# 需要恢复建库开始,删除之前的所有操作(即所有binlog日志信息),实现日志信息的截取
mysql> show binlog events in 'binlog.000002';
-- 查看截取日志信息事件区域范围
[root@oldboyxiaoq ~]# mysqlbinlog --start-position=233 --stop-position=1162 /data/3306/data/binlog.000003 >/tmp/bin.sql
-- 依据binlog日志的position号码,即可获取到想要恢复数据信息;
# 根据截取的日志信息,进行数据库服务数据恢复
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;
mysql> source /tmp/bin.sql
# 查看确认数据信息是否恢复
mysql> use bindb;
mysql> show tables;
mysql> select * from t1;
|
情况一:日志文件被清理过,可能建库语句所在日志已经丢失;(在后面课程章节处理)
项目背景:一个数据库三年前就创建了,但是日志信息只记录一个月,这个库被误删除了;
解决方案:
A计划:最近一次全备+全备之后,误删除之前所有binlog,进行一同恢复;(全备数据+增量数据)
B计划:利用延时从库,进行数据恢复;
情况二:所需日志跨越多个文件,如何进行日志信息的截取;
解决方案:
A计划:只有position号的方式,可以进行分段截取,进行分段恢复数据;
B计划:根据Datatime时间信息方式,可能会出现准确性不高的情况(因为每一秒可能有多个事件产生);
C计划:启用GTID(全局事务ID)方式,无论跨越多少个日志文件,每个事务操作的事件ID信息都是唯一且递增的(5.6+引入);
实践操作:
C计划:基于GTID方式对binlog进行管理(利用GTID实现日志截取)
数据库异常恢复情况环境准备:
数据库模拟异常情况破坏操作:
数据库异常情况数据恢复操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| # 刷新新的binlog日志进行操作
mysql> flush logs;
-- 生成新的binlog日志信息
# 确认新的日志编号是否是连续的
mysql> create database test5;
mysql> show binlog events in "binlog.000004"
-- 可以看出新的binlog日志文件中,记录的gtid编号信息是延续了上一个binlog日志gtid集合信息,继续连续进行记录;
# 进行基本的数据库SQL语句操作:
mysql> create database gtdb;
mysql> use gtdb;
mysql> create table t1(id int);
mysql> insert into t1 values(1);
mysql> commit;
mysql> insert into t1 values(2);
mysql> commit;
mysql> insert into t1 values(3);
mysql> commit;
# 进行binlog事件信息查看
mysql> show binlog events in 'binlog.000004';
-- 可以获取以上的数据操作事件信息,
mysql> drop database gtdb;
-- 模拟破坏性操作,删除数据库
# 根据日志信息查看相关的事件情况(获取GTID编号范围)
mysql> show binlog events in 'binlog.000004';
# 需要恢复建库开始,删除之前的所有操作(即所有binlog日志信息),实现日志信息的截取
[root@oldboyxiaoq ~]# mysqlbinlog --include-gtids='7afe4f8c-5e36-11ed-b083-000c29d44f34:3-7' /data/3306/data/binlog.000004 >/tmp/gtid.sql
-- 依据binlog日志的GTID信息,即可获取到想要恢复数据信息;
# 根据截取的日志信息,进行数据库服务数据恢复
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;恢复后别忘在改为1;
mysql> source /tmp/gtid.sql
-- 默认此时报错恢复失败,因为GTID截取的日志恢复数据时,具有幂等性,由于binlog中已经记录了3-7的GTID事件信息
mysql> show master status;
+---------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+------------------------------------------+
| binlog.000004 | 1905 | | | 7afe4f8c-5e36-11ed-b083-000c29d44f34:1-8 |
+---------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
-- 通过查看确认,核实清楚binlog中已经记录了3-7的GTID事件信息
# 利用GTID日志信息恢复报错处理方式一:将系统中日志中的GTID信息清除掉(不建议)
# 利用GTID日志信息恢复报错处理方式二:删除与幂等性冲突的记录信息
[root@oldboyxiaoq ~]# mysqlbinlog --skip-gtids --include-gtids='7afe4f8c-5e36-11ed-b083-000c29d44f34:3-7' /data/3306/data/binlog.000004 >/tmp/gtid.sql
|
表现形式
关键列
解释说明
ser ver_uuid:N
ser ver_uuid
表示数据库初始化启动之后,自动生成的随机数信息(唯一的)
N
表示第几个相关的事务或事件信息,会不断进行自增
============================================================================================
GTID概念介绍:
GTID(global transation id)称为全局事务(事件)ID,标识binlog日志记录的唯一性;
GTID信息的表示方式:
ser ver_uuid信息查看:
GTID功能作用:
利用GTID方式管理binlog,实质上就是对于数据库的每个事务产生事件信息打上唯一标识信息(id号);
利用GTID方式管理binlog,主要目的是处理数据库主从问题,解决主从数据库的数据一致性问题;
简单描述:标识事务的唯一性,保证日志恢复时的一致性,并且具备”幂等性”;
GTID功能配置:
GTID功能相关参数介绍:
1
2
3
4
5
6
7
8
9
| -- 表示跳过gtid的检查过程,即截取的日志中不再含有GTID的配置语句信息,自然解决了幂等性冲突问题;
-- 开启了GTID之后,依然可以使用pos方式进行日志信息截取与恢复;
# 查看确认数据信息是否恢复
mysql> use gtdb;
mysql> show tables;
mysql> select * from t1;
-- 查看test1数据库中的t1表的数据信息是否恢复
# 操作扩展:可以实现排除指定gtid信息不做日志记录截取
[root@oldboyxiaoq ~]# mysqlbinlog --exclude-gtids='7afe4f8c-5e36-11ed-b083-000c29d44f34:4' --include-gtids='7afe4f8c-5e36-11ed-b083-000c29d44f34:3-7'
|
/data/3306/data/binlog.000004
1
2
| # 操作扩展:跨多日志文件信息截取
[root@oldboyxiaoq ~]# mysqlbinlog --skip-gtids --include-gtids='7afe4f8c-5e36-11ed-b083-000c29d44f34:1-10' /data/3306/data/binlog.000001
|
/data/3306/data/binlog.000002 /data/3306/data/binlog.000003 >/tmp/gtid.sql
1
2
3
4
5
6
7
8
9
| mysql> select @@ser ver_uuid;
+---------------------------------------------------+
| @@ser ver_uuid |
+---------------------------------------------------+
| 7afe4f8c-5e36-11ed-b083-000c29d44f34 |
+---------------------------------------------------+
1 row in set (0.00 sec)
-- 表示数据库每次初始化之后自动生成,不建议手工进行修改;
[root@oldboyxiaoq ~]# cat /data/3306/data/auto.cnf
|
[auto]
ser ver-uuid=7afe4f8c-5e36-11ed-b083-000c29d44f34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| -- 在数据库的数据目录文件中也可以查询到
# GTID功能参数信息介绍(3个重要的配置参数)
mysql> select @@gtid_mode;
+-------------------+
| @@gtid_mode |
+-------------------+
| OFF |
+-------------------+
1 row in set (0.00 sec)
-- 设置是否开启显示gtid信息功能(在5.7之后是有个匿名的gtid,是数据库系统自己维护的)
mysql> select @@enforce_gtid_consistency;
+-------------------------------------+
| @@enforce_gtid_consistency |
+-------------------------------------+
| OFF |
+-------------------------------------+
1 row in set (0.00 sec)
-- 设置是否开启GTID强制一致性功能
-- 对某些 SQL 会有限制,例如 CREATE TABLE … SELECT 必须得分成两条语句执行。
-- OFF: 表示事务允许违反 GTID 一致性。
|
GTID功能相关参数激活:
GTID信息查看:
============================================================================================
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| -- ON: 表示事务不允许违反 GTID 一致性,有相关 SQL 会直接返回异常。
-- WARN:表示事务允许违反 GTID 一致性,但会将警告信息记录到 ERROR LOG。
mysql> select @@log_slave_updates;
+----------------------------+
| @@log_slave_updates |
+----------------------------+
| 1 |
+----------------------------+
1 row in set, 1 warning (0.01 sec)
-- 和配置主从有关(在8.0.26开始 推荐配置log_replica_updates替代log_slave_updates参数)
-- 此参数表示从服务器从主服务器接收的更新信息,是否也会记录在从服务器本地的二进制文件中
[root@xiaoq ~]# vim /etc/my.cnf
[mysqld]
gtid_mode=on
enforce_gtid_consistency=1
log_slave_updates=on
-- 配置文件信息修改完毕后,重启数据库服务使配置生效
mysql> show master status;
+------------------+-----------+-------------------+-----------------------+-------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+-------------------+-----------------------+-------------------------+
| binlog.000004 | 156 | | | |
+------------------+-----------+-------------------+-----------------------+-------------------------+
1 row in set (0.03 sec)
-- 在GTID功能被激活后,就会在Executed_Gtid_Set列中显示GTID集合信息;
mysql> create database test3;
Quer y OK, 1 row affected (0.08 sec)
-- 模拟创建数据库,产生新的事件信息
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| binlog.000004 | 344 | | | 7afe4f8c-5e36-11ed-b083-000c29d44f34:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.01 sec)
-- GTID信息随着新的事件产生,随之发生变化
mysql> create database test4;
Quer y OK, 1 row affected (0.03 sec)
-- 模拟创建数据库,产生新的事件信息
mysql> show master status;
+---------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+------------------------------------------+
| binlog.000004 | 532 | | | 7afe4f8c-5e36-11ed-b083-000c29d44f34:1-2 |
+---------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
-- GTID信息随着新的事件产生,随之发生变化
mysql> show binlog events in 'binlog.000004';
+---------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Ser ver_i | End_log_pos | Info |
+---------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| binlog.000004 | 4 | Format_desc | 1 | 125 | Ser ver ver : 8.0.26, Binlog ver : 4 |
| binlog.000004 | 125 | Previous_gtids | 1 | 156 | |
| binlog.000004 | 156 | Gtid | 1 | 233 | SET @@SESSION.GTID_NEXT= '7afe4f8c-5e36-11ed-b083-000c29d44f34:1' |
| binlog.000004 | 233 | Quer y | 1 | 344 | create database test3 /* xid=6 */ |
| binlog.000004 | 344 | Gtid | 1 | 421 | SET @@SESSION.GTID_NEXT= '7afe4f8c-5e36-11ed-b083-000c29d44f34:2' |
| binlog.000004 | 421 | Quer y | 1 | 532 | create database test4 /* xid=8 */ |
+---------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
6 rows in set (0.00 sec)
-- 在每个数据库操作事件之前,会显示GTID的唯一标识信息
|
情况三:如何从日志文件中恢复单库、单表、或者部分行数据信息;
解决方案:
A计划:可以利用命令单独截取某个数据库的日志信息;mysqlbinlog -d world xxx > xxxx
B计划:可以借助第三方工具实现单表或部分数据恢复;binlog2sql(python) 过滤指定表数据或过滤指定表的部分数据;
实战操作:
A计划:单库日志信息截取,企业实战过程:
数据库异常恢复情况环境准备:
数据库模拟异常情况破坏操作:
数据库异常情况数据恢复操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| # 查看获取当前binlog日志状态信息
mysql > show master status;
+------------------+-----------+-------------------+-----------------------+-------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+-------------------+-----------------------+-------------------------+
| binlog.000003 | 1269 | | | |
+------------------+-----------+-------------------+-----------------------+-------------------------+
# 进行基本的数据库SQL语句操作:
mysql> create database test1;
mysql> create table t1 (id int);
mysql> insert into t1 values(1);
mysql> insert into t1 values(2);
mysql> commit;
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
-- 创建了一个test1数据库,并在数据库中创建了一个表,在表中插入了一些数据信息
mysql> create database test2;
mysql> use test2;
mysql> create table t2 (id int);
mysql> insert into t2 values(1);
mysql> insert into t2 values(2);
mysql> commit;
-- 创建了一个test2数据库,并在数据库中创建了一个表,在表中插入了一些数据信息
mysql> use test1;
mysql> insert into t1 values(3);
mysql> insert into t1 values(4);
mysql> use test2;
mysql> insert into t2 values(3);
mysql> insert into t2 values(4);
mysql> commit;
mysql> select * from test1.t1;
mysql> select * from test2.t2;
-- 通过操作不同的数据库,以及不同的数据表,实现binlog日志事件信息的交叉
mysql> drop database test1;
-- 模拟破坏性操作,删除数据库
# 根据日志信息查看相关的事件情况
mysql> show binlog events in 'binlog.000003';
# 需要恢复建库开始,删除之前的所有操作(即所有binlog日志信息),实现日志信息的截取
[root@oldboyxiaoq ~]# mysqlbinlog --start-position=1346 --stop-position=4116 -d test1 /data/3306/data/binlog.000003 >/tmp/bin.sql
-- 依据binlog日志的position号码,即可获取到想要恢复数据信息,并利用-d参数导出指定数据库相关数据;
# 根据截取的日志信息,进行数据库服务数据恢复
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;恢复后别忘在改为1;
mysql> source /tmp/bin.sql
# 查看确认数据信息是否恢复
mysql> use test1;
mysql> show tables;
mysql> select * from t1;
|
B计划:可以借助第三方工具实现单表或部分数据恢复;
利用binlog2sql工具可以处理上面的企业需求,此软件是利用python语言开发的,主要用来处理binlog日志信息;
从软件应用方面来说主要包含两个核心功能:
可以友好的展示或者管理二进制日志信息(binlog),进而可以过滤出单独表的信息,甚至表中指定行的信息;
可以快速的实现DML操作语句的闪回功能,即实现通过日志信息翻转方式,进行数据信息的恢复;
说明:binlog2sql工具是模拟了一个从库,进行日志信息分析,需要保证数据库服务启动状态,且不支持离线方式分析日志内容;
数据库异常恢复情况环境准备:
数据库日志信息工具分析查看:(解析日志事件SQL)
数据库模拟异常情况破坏操作:
数据库日志信息工具分析查看:(解析日志事件SQL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| -- 查看test1数据库中的t1表的数据信息是否恢复
mysql> use test2;
mysql> show tables;
mysql> select * from t2;
-- 查看test2数据库中的t2表的数据信息是否破坏
# 下载第三方日志分析工具
[root@xiaoq ~]# cd /opt/
[root@xiaoq ~]# git clone https://github.com/danfengcao/binlog2sql.git
[root@xiaoq ~]# cd /opt/binlog2sql
-- 此工具在mariadb中可以通过打补丁方式,进行部署安装;但是在mysql 8.0中暂时还没有集成,需要单独安装
# 部署第三方工具运行环境
[root@xiaoq ~]# yum install -y python3
[root@xiaoq ~]# pip3 install -r requirments.txt
[root@xiaoq ~]# pip3 show pymysql
[root@xiaoq ~]# pip3 install --upgrade pymysql (此步骤可以忽略)
-- 以上pip3下载软件缓慢,可以优化pip3下载源
-- 下载源优化方法:https://developer.aliyun.com/mirror/pypi?spm=a2c6h.13651102.0.0.3e221b11H9Q7La
# 在指定数据库中创建多个数据表
mysql> use test1;
mysql> create table t11 (id int);
mysql> insert into t11 values (1),(2);
mysql> commit;
[root@xiaoq binlog2sql]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --start-file='binlog.000003'
INSERT INTO `test1`.`t1`(`id`) VALUES (1); #start 1460 end 1704 time 2022-11-21 22:16:32 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (2); #start 1735 end 1979 time 2022-11-21 22:16:35 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (3); #start 2939 end 3183 time 2022-11-21 22:20:53 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (4); #start 3214 end 3458 time 2022-11-21 22:22:19 gtid
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t11 --start-file='binlog.000003'
INSERT INTO `test1`.`t11`(`id`) VALUES (1); #start 4704 end 4954 time 2022-11-21 23:47:51 gtid
INSERT INTO `test1`.`t11`(`id`) VALUES (2); #start 4704 end 4954 time 2022-11-21 23:47:51 gtid
-- 表的数据信息导出后,可以直接复制命令信息恢复,或者导出sql文件进行导入恢复;
# 在指定数据库的相应数据表中做修改操作
mysql> use test1;
mysql> update t1 set id=10 where id=1;
mysql> commit;
# 在指定数据库的相应数据表中做删除操作
mysql> use test1;
mysql> delete from t1 where id=3;
mysql> commit;
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --start-file='binlog.000003'
INSERT INTO `test1`.`t1`(`id`) VALUES (1); #start 1460 end 1704 time 2022-11-21 22:16:32 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (2); #start 1735 end 1979 time 2022-11-21 22:16:35 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (3); #start 2939 end 3183 time 2022-11-21 22:20:53 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (4); #start 3214 end 3458 time 2022-11-21 22:22:19 gtid
UPDATE `test1`.`t1` SET `id`=10 WHERE `id`=1 LIMIT 1; #start 4985 end 5244 time 2022-11-21 23:52:33 gtid
DELETE FROM `test1`.`t1` WHERE `id`=3 LIMIT 1; #start 5275 end 5519 time 2022-11-21 23:54:17 gtid
|
数据库日志信息工具回滚操作:(生成指定事件回滚语句-闪回操作)
假设在某个企业的应用场景中,有3000万行数据,占用200G的存储空间,其中误删除了10行数据信息,请问如何进行恢复数据?
#####################################################################################################
05 日志信息滚动切割:#
在应用binlog日志过程中,经常需要对日志文件进行日志切割(滚动更新),可以有效避免日志文件数据量过大问题;
在某些场景中,如果需要对binlog日志文件进行备份操作时,也可以对原有使用的binlog日志文件进行滚动更新;
常用的日志滚动更新方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| # 只想查看删除操作信息
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=delete --start-file='binlog.000003'
DELETE FROM `test1`.`t1` WHERE `id`=3 LIMIT 1; #start 5275 end 5519 time 2022-11-21 23:54:17 gtid
-- sql-type参数只能过滤DML类型语句信息,一般常见过滤的是 insert update delete
# 只想查看修改操作信息
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=update --start-file='binlog.000003'
UPDATE `test1`.`t1` SET `id`=10 WHERE `id`=1 LIMIT 1; #start 4985 end 5244 time 2022-11-21 23:52:33 gtid
# 只想查看插入操作信息
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=insert --start-file='binlog.000003'
INSERT INTO `test1`.`t1`(`id`) VALUES (1); #start 1460 end 1704 time 2022-11-21 22:16:32 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (2); #start 1735 end 1979 time 2022-11-21 22:16:35 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (3); #start 2939 end 3183 time 2022-11-21 22:20:53 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (4); #start 3214 end 3458 time 2022-11-21 22:22:19 gtid
# 误删除操作语句反转操作
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=delete --start-file='binlog.000003'
DELETE FROM `test1`.`t1` WHERE `id`=3 LIMIT 1; #start 5275 end 5519 time 2022-11-21 23:54:17 gtid
-- 获取删除操作语句信息
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=delete --start-file='binlog.000003' -B
INSERT INTO `test1`.`t1`(`id`) VALUES (3); #start 5275 end 5519 time 2022-11-21 23:54:17 gtid
-- 在获取删除操作语句命令后加 -B 参数,正好获得了反转语句的操作信息
# 误修改操作语句反转操作
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=update --start-file='binlog.000003'
UPDATE `test1`.`t1` SET `id`=10 WHERE `id`=1 LIMIT 1; #start 4985 end 5244 time 2022-11-21 23:52:33 gtid
-- 获取修改操作语句信息
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=update --start-file='binlog.000003' -B
UPDATE `test1`.`t1` SET `id`=1 WHERE `id`=10 LIMIT 1; #start 4985 end 5244 time 2022-11-21 23:52:33 gtid
-- 在获取修改操作语句命令后加 -B 参数,正好获得了反转语句的操作信息
# 误插入操作语句反转操作
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=insert --start-file='binlog.000003'
INSERT INTO `test1`.`t1`(`id`) VALUES (1); #start 1460 end 1704 time 2022-11-21 22:16:32 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (2); #start 1735 end 1979 time 2022-11-21 22:16:35 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (3); #start 2939 end 3183 time 2022-11-21 22:20:53 gtid
INSERT INTO `test1`.`t1`(`id`) VALUES (4); #start 3214 end 3458 time 2022-11-21 22:22:19 gtid
-- 获取插入操作语句信息
[root@oldboyxiaoq binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d test1 -t t1 --sql-type=insert --start-file='binlog.000003' -B
DELETE FROM `test1`.`t1` WHERE `id`=4 LIMIT 1; #start 3214 end 3458 time 2022-11-21 22:22:19 gtid
DELETE FROM `test1`.`t1` WHERE `id`=3 LIMIT 1; #start 2939 end 3183 time 2022-11-21 22:20:53 gtid
DELETE FROM `test1`.`t1` WHERE `id`=2 LIMIT 1; #start 1735 end 1979 time 2022-11-21 22:16:35 gtid
DELETE FROM `test1`.`t1` WHERE `id`=1 LIMIT 1; #start 1460 end 1704 time 2022-11-21 22:16:32 gtid
-- 在获取插入操作语句命令后加 -B 参数,正好获得了反转语句的操作信息
# 方法一:
mysql> flush logs;
-- 滚动更新前的日志文件就会处于静止状态,不会在进行数据信息的更新
# 方式二:
[root@xiaoq ~ ]# mysql -uroot -p123456 flush-logs
# 方式三:
mysql> restart;
-- mysql 8.0之后支持的数据库中重启服务;之前的版本只支持shutdown关闭数据库;
[root@xiaoq ~ ]# /etc/ init.d/mysqld restart
# 方式四:
mysql> select @@max_binlog_size;
|
参数信息
官方说明
解释说明
-R
–read-from-remote-ser ver
Read binar y logs from a MySQL ser ver.
读取binlog日志文件从数据库服务端
-h
–host
Get the binlog from ser ver
指定binlog日志文件存储服务器地址
-u
–user=name
Connect to the remote ser ver as username
指定binlog日志服务器连接用户信息
-p
–password[=name]
Password to connect to remote ser ver.
指定binlog日志服务器连接密码信息
–raw
Requires -R. Output raw binlog data instead of SQL statements, output is to log files
指定binlog日志信息记录二进制信息
–stop-never
Wait for more data from the ser ver instead of stopping at the end of the last log
指定binlog日志信息将会一直备份记录
代表从哪个binlog日志开始进行备份
06 日志信息清理方法:#
在系统中日志信息,随着时间的推移将会越来越多,将严重占用磁盘空间,因此需要对日志做相应清理工作;
对于日志信息常用的清理方式有两种:
方式一:进行日志信息自动清理
方式二:进行日志信息手工清理
说明:在对数据库服务日志信息进行清理时,最好使用数据库服务自带的清理工具进行清理,不建议使用rm做日志清理;
07 日志信息远程备份:#
可以实现将数据库中(特别是主库)生成的binlog日志文件,及时备份保存到专门的日志备份服务器中,并且整个备份操作都是在线的;
远程备份命令参数说明:
分类日志信息配置:慢日志(slow_log)
慢日志主要是用于以文本形式记录数据库服务运行过程中,执行过程较慢的语句;
利用慢日志信息生成的信息,可以在日常巡检过程中,通过日志定位SQL语句性能问题;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| +--------------------------+
| @@max_binlog_size |
+--------------------------+
| 1073741824 |
+--------------------------+
-- 配置binlog日志最大数据存储量,默认大小为1G,到达最大日志存储量也会进行自动切割;
mysql> show variables like '%expire%';
+-------------------------------------+-----------+
| Variable_name | Value |
+-------------------------------------+-----------+
| binlog_expire_logs_seconds | 2592000 |
| expire_logs_days | 0 |
+-------------------------------------+-----------+
3 rows in set (0.00 sec)
-- 在最新数据库8.0中,可以以秒为单位进行日志信息清理,默认是30天进行日志清理,或者也可以以天为单位进行清理;
-- 在最先数据库8.0前,主要是以天为单位进行清理,但默认清理功能并未激活;
-- 在企业实战环境中,建议过期时间最少保留一轮全备周期以上,有条件最好是保留两轮+1;
mysql> help purge binar y logs;
-- 获取清理日志命令帮助信息
mysql> purge binar y logs to 'mysql-bin.010'
-- 删除到指定日志文件前结束
mysql> PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';
-- 可以基于日志时间点信息进行日志清理
[root@xiaoQ-01 ~]# mkdir -p /binlog_backup
[root@xiaoQ-01 ~]# cd /binlog_backup/
[root@xiaoQ-01 binlog_backup]# mysqlbinlog -R --host=192.168.30.101 --user=root --password=123456 --raw --stop-never binlog.000008 &
-- 备份过程可以放后台一直运行,但是需要注意当连接的数据库服务器停止或重启了,也会导致备份中断;
# 数据库服务多实例情况binlog日志备份
mysqlbinlog -R --host=10.0.0.51 -P 3306 --user=root --password=123456 --raw --stop-never binlog.000002 &
mysqlbinlog -R --host=10.0.0.51 -P 3307 --user=root --password=123456 --raw --stop-never binlog.000002 &
-- 需要考虑备份后日志文件名称一样的覆盖问题
|
01 日志信息基本配置
02 日志应用配置核实
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| mysql> select @@slow_quer y_log;
+-------------------------+
| @@slow_quer y_log |
+-------------------------+
| 0 |
+-------------------------+
1 row in set (0.00 sec)
-- 此参数配置信息,表示是否激活启动慢日志记录功能,默认处于关闭状态
mysql> select @@slow_quer y_log_file;
+--------------------------------------------+
| @@slow_quer y_log_file |
+--------------------------------------------+
| /data/3306/data/xiaoQ-01-slow.log |
+--------------------------------------------+
1 row in set (0.00 sec)
-- 此参数配置信息,表示慢日志文件保存的路径信息;建议日志文件路径与数据存放路径进行分离;
mysql> select @@long_quer y_time;
+---------------------------+
| @@long_quer y_time |
+---------------------------+
| 10.000000 |
+---------------------------+
1 row in set (0.00 sec)
-- 此参数信息配置,表示记录慢日志的条件,默认是大于10s执行的语句,就会记录为慢查询语句;(建议时间为0.01~0.1)
mysql> select @@log_queries_not_using_indexes;
+---------------------------------------------+
| @@log_queries_not_using_indexes |
+---------------------------------------------+
| 0 |
+---------------------------------------------+
1 row in set (0.00 sec)
-- 此参数信息配置,表示慢日志中会记录没有使用索引的语句信息;
# 修改日志默认状态(激活日志):
mysql> set global slow_quer y_log=1;
mysql> set global long_quer y_time=0.01;
mysql> set global log_queries_not_using_indexes=1;
-- 可以对以上参数信息进行在线调整,也可以将以上参数编写到数据库my.cnf配置文件中,作为永久配置;
mysql> use oldboy;
mysql> show index from t100w;
mysql> alter table t100w drop index idx;
-- 删除数据表中索引信息
mysql> select * from t100w limit 100;
mysql> select * from t100w where id=10;
mysql> select * from t100w where id=20;
mysql> select count(*) from t100w group by num limit 10;
|
…
1
2
3
4
5
| -- 模拟执行慢查询的操作语句
# 查看核实慢日志文件是否生成
[root@xiaoQ-01 ~]# ll /data/3306/data/xiaoQ-01-slow.log
-rw-r----- 1 mysql mysql 6842 11月 22 23:54 /data/3306/data/xiaoQ-01-slow.log
[root@xiaoQ-01 ~]# cat /data/3306/data/xiaoQ-01-slow.log
|
/usr/local/mysql/bin/mysqld, Version: 8.0.26 (MySQL Community Ser ver - GPL). started with:
1
| Tcp port: 3306 Unix socket: /tmp/mysql.sock
|
Time Id Command Argument
1
2
3
4
5
6
7
8
9
10
11
| # Time: 2022-11-22T15:41:03.849261Z
# User@Host: root[root] @ localhost [] Id: 490
# Quer y_time: 0.000446 Lock_time: 0.000143 Rows_sent: 100 Rows_examined: 100
use oldboy;
SET timestamp=1669131663;
select * from t100w limit 100;
# Time: 2022-11-22T15:41:05.677310Z
# User@Host: root[root] @ localhost [] Id: 490
# Quer y_time: 0.000282 Lock_time: 0.000083 Rows_sent: 100 Rows_examined: 100
SET timestamp=1669131665;
select * from t100w limit 100;
|
03 日志信息分析方法
1.12 数据库服务备份恢复#
1.12.1 数据库服务备份恢复目的#
在企业环境中,无论是安全人员、运维人员、开发人员、数据库管理人员等所有技术人员都有一个共同的职责:
保障数据安全,防止数据库损坏
数据库物理损坏:磁盘、文件系统、数据文件(可以利用主从、高可用、备份+日志恢复数据)
数据库逻辑损坏:drop、truncate、delete、update(可以利用备份+日志、延时从库)
其中对于数据库服务来说,保障数据库服务的数据安全需要考量两个重要的指标:
一定要保障数据不能丢失和泄露;
一定要保障数据存储服务的稳定;(业务7*24)
说明:为了保障数据信息不丢失,最好的处理方案就是做备份,甚至是做多副本备份,多区域备份;就算丢失损坏也能快速复原。
1.12.2 数据库服务备份恢复方式#
01 数据库服务备份数据方式:#
在企业中实现数据库服务数据备份的方式主要有两种方式:
① 物理方式
采用拷贝物理文件数据进行备份的方式,数据库服务物理数据文件存放路径是:/var/lib/mysql
实现方式:
可以在某个特定时间点停机或停止业务访问,然后利用cp和tar命令将物理数据文件备份或打包;
可以在任意时间节点在不停机不停止业务时,然后利用专业的xtrabackup( P ercona X tra b ac k up)热备工具进行数据库数据备份;
应用场景:
当企业数据库服务产生的需要备份的数据量在50G以上,可以选择物理备份(xtrabackup);
② 逻辑方式
可以采用以SQL语句形式把数据库的数据导出保存备份为数据库文件(xxx.sql),文件中会含有大量SQL语句信息;
实现方式:
可以在任意时间节点在不停机不停止业务时,然后利用专业的mysqldump(MDP)逻辑备份工具进行数据备份;
可以在任意时间节点在不停机不停止业务时,然后利用二进制日志binlog文件实现逻辑备份数据操作;
可以在任意时间节点在不停机不停止业务时,然后利用主从数据库架构实现备份数据信息;
应用场景:
当企业数据库服务产生的需要备份的数据量在50G以内,可以选择逻辑备份(mysqldump);
02 数据库服务备份恢复职责:#
设计数据库备份策略:备份数据周期、选择的备份工具、应用的备份方式(全备 增量..);
定期数据库备份检查:核实是否存在、确认备份文件大小;
安排数据库恢复演练:真实确认备份的数据,是否能够准确的做数据恢复;
真实数据库恢复能力:在数据库服务出现异常情况时,可以将数据库服务修复,并恢复丢失的数据信息;
关于数据库迁移升级:可以采用Mergeing方式(主从架构)、可以单独备份数据信息到新的数据库节点做恢复(逻辑导出);
1
2
3
4
5
6
7
8
9
10
| # Time: 2022-11-22T15:41:06.630012Z
# User@Host: root[root] @ localhost [] Id: 490
# Quer y_time: 0.000242 Lock_time: 0.000075 Rows_sent: 100 Rows_examined: 100
SET timestamp=1669131666;
select * from t100w limit 100;
-- 会按照执行语句的操作时间顺序,进行慢查询日志信息的记录;
[root@xiaoQ-01 data]# mysqldumpslow -s c -t 3 /data/3306/data/xiaoQ-01-slow.log
-- 按照慢查询语句的重复执行次数(c)进行排序(-s),取出其中靠前(t)的前三名慢查询语句
-- 还可以扩展使用pt-quer y-digest更好的分析慢查询日志,支持图形化展示
-- what to sort by (al, at, ar, c, l, r, t), 'at' is default
|
al: average lock time
ar : average rows sent
at: average quer y time
c: count
l: lock time
r : rows sent
t: quer y time
1
| | 序号 | 参数信息 | 官方说明 | 解释说明 |
|
|—|—|—|—|
1
2
3
| | 01 | -A | Dump all the databases | 表示备份所有库中数据信息 |
| 02 | -B | Dump several databases. | 表示备份指定库中数据信息 |
| 03 | -F | | |
|
1.12.3 数据库服务逻辑备份实践#
在进行数据库数据逻辑备份操作过程中,主要会运用mysqldump逻辑备份工具,可以实现本地或远程的数据备份;
利用mysqldump进行逻辑备份数据时,主要的备份逻辑是将建库、建表、数据插入语句信息导出,实现数据的备份操作;
基于mysqldump备份数据的逻辑原理,对于数据量比较小的场景(单表数据行百万以内),mysqldump备份工具做备份会更适合些;
在跨平台或跨版本进行数据库数据信息迁移时,mysqldump备份工具做备份也会比较适合,可以避免物理备份的兼容性问题;
说明:在一般情况下,对数据库进行数据恢复的时间耗费,大约是数据库进行数据备份的时间耗费的3~5倍。
工具命令使用语法:
工具命令常用参数:
工具命令实践操作:
数据库备份恢复练习环境准备:
01 数据库全库备份操作练习实践命令:#
将数据库中所有数据库全部备份(-A)
说明:利用-A创建数据库备份数据时,在备份数据中会含有 create建库语句和use切换库语句,可以直接进行恢复操作即可;
02 数据库部分备份操作练习实践命令:#
将数据库中单个数据库进行备份(-B)
以上指定数据库备份完毕后,可以模拟删除相应数据,利用备份的数据库文件进行数据库恢复操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [root@xiaoQ ~]# mysqldump -u数据库用户 -p数据库密码 [备份参数] > /路径信息/数据库备份文件.sql
-- 在执行mysqldump命令时,也会用到数据库连接登录的基础参数:-u -p -S -h -P
[root@xiaoQ ~]# mkdir -p /database_backup
[root@xiaoQ ~]# mysqldump -uroot -p123456 -A >/database_backup/all_database.sql
[root@xiaoQ ~]# ll -h /database_backup/all_database.sql
-rw-r--r--. 1 root root 744K 6月 23 23:13 /database_backup/all_database.sql
-- 利用mysqldump命令备份的数据文件是纯文本文件,是可以进行查看或过滤的;***
# 进行数据库单库备份操作
[root@xiaoQ ~]# mysqldump -uroot -p123456 -B oldboy >/database_backup/oldboy.sql
[root@xiaoQ ~]# ll -h /databases_backup/oldboy.sql
-rw-r--r--. 1 root root 2.0K 6月 23 23:21 /database_backup/oldboy.sql
# 过滤部分内容后查看备份数据库文件信息:
[root@xiaoQ ~]# egrep -vi ' ^-|^ /\*| ^$|lock' /databases_backup/oldboy.sql
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `oldboy` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `oldboy`;
DROP TABLE IF EXISTS `stu2`;
CREATE TABLE `stu2` (
|
id int(10) NOT NULL,
name varchar(20) NOT NULL,
age tinyint(2) NOT NULL DEFAULT ‘0’,
dept varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1
2
3
4
5
6
7
8
9
10
| INSERT INTO `stu2` VALUES (1,'oldboy',35,'net sec'),(2,'oldgirl',25,'linux');
mysql> use oldboy
mysql> show tables;
+------------------------+
| Tables_in_oldboy |
+------------------------+
| stu2 |
+------------------------+
1 row in set (0.00 sec)
mysql> drop table stu2;
|
将数据库中多个数据库进行备份(-B)
说明:利用-B创建数据库备份数据时,在备份数据中会含有 create建库语句和use切换库语句,可以直接进行恢复操作即可;
03 数据表部分备份操作练习实践命令:#
将数据库中单个数据表进行备份
将数据库中多个数据表进行备份
说明:数据库单表或多表进行数据备份时,在备份数据中不含有create建库语句和use切换库语句,需要建库并指定库再恢复数据;
1.12.4 数据库逻辑备份进阶参数#
上文中已经提到mysqldump命令工具基本的数据库和数据表的备份方式,除了以上说明的参数用法,还有其他备份参数信息;
同样可以实现进阶方式的数据库信息备份保存:
数据库数据备份进阶方式一:利用命令参数 –single-transaction
这个参数的用法作用可以利用一个形象的例子去理解:比如在某个时刻班主任希望统计班级同学的数量情况,那么该如何统计准确呢?
方法一:
形象说明:锁门封闭统计,禁止人员在教室内外随意走动,取班级人数变化的静止状态的学生数量;
真实应用:锁表封闭备份,禁止数据库程序进行数据更新操作,实现静止锁表状态进行数据备份;(一般选择半夜操作)
方法二:
形象说明:瞬时拍照统计,允许人员在教室内外随意走动,但是会根据拍照时刻人员数量进行统计;
真实应用:瞬时节点备份,允许数据库程序进行数据更新操作,只把备份操作瞬间已有数据备份;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| mysql> show tables;
Empty set (0.00 sec)
-- 模拟删除数据库中数据表信息,造成数据库中数据损坏
# 进行数据库数据复原恢复操作:
# 方式一:在数据库系统中加载数据库备份文件
mysql> source /database_backup/oldboy.sql;
# 方式二:在操作系统命令行执行数据恢复命令
[root@xiaoQ ~]# mysql -uroot -p123456 oldboy </database_backup/oldboy.sql
# 数据信息恢复完毕后检查数据库情况
mysql> show tables;
+------------------------+
| Tables_in_oldboy |
+------------------------+
| stu2 |
+------------------------+
1 row in set (0.00 sec)
mysql> select * from stu2;
+----+---------+-----+-----------+
| id | name | age | dept |
+----+---------+-----+-----------+
| 1 | oldboy | 35 | net sec |
| 2 | oldgirl | 25 | linux |
+----+---------+-----+-----------+
2 rows in set (0.00 sec)
[root@xiaoQ ~]# mysqldump -uroot -p123456 -B oldboy world >/database_backup/oldboy_world.sql
# 过滤部分内容后查看备份数据库文件信息:
[root@xiaoQ ~]# egrep -vi ' ^-|^ /\*| ^$|lock' /database_backup/oldboy_world.sql
# 备份指定数据库中的单个数据表:
[root@xiaoQ ~]# mysqldump -uroot -poldboy123 oldboy stu1 >/databases_backup/oldboy_tables_stu1.sql
# 恢复指定数据库中的单个数据表:
[root@xiaoQ ~]# mysql -uroot -poldboy123 oldboy </databases_backup/oldboy_tables_stu1.sql
# 备份指定数据库中的多个数据表:
[root@xiaoQ ~]# mysqldump -uroot -p123456 world city countr y >/database_backup/world_tables_city_countr y.sql
# 恢复指定数据库中的多个数据表:
[root@xiaoQ ~]# mysql -uroot -poldboy123 world </database_backup/world_tables_city_countr y.sql
|
因此,利用–single-transaction参数进行数据备份,就等价于在备份的时候给数据库的数据拍了照,备份时候数据库可以继续更新;
命令参数官方信息详细解读:
对于InnoDB存储引擎的表,将会利用MVCC中的一致性快照进行备份;
在备份数据期间不要出现DDL操作语句信息,如果出现DDL操作语句,将会导致备份数据不一致;
数据库数据备份进阶方式二:利用命令参数 –master-data=2
数据备份痛点:在进行数据库全备+binlog恢复数据时,如何进行binlog的临界点(起点)截取操作?
在备份数据的时候会记录binlog日志位置点到备份文件中,这个位置点是上一次全备之后新增数据的临界点;
在未来数据库服务出现异常时,会先恢复全备的数据信息,然后恢复binlog日志临界点之后的数据信息;
在指定日志位置点进行备份的时候,生成的操作日志语句如下:
命令参数官方信息详细解读:
利用此参数功能,可以实现自动记录位置点信息;
利用此参数功能,可以实现自动添加全局读锁(GRL)功能(在配合–single-transaction参数使用时,可以减少锁时间);
备份数据进阶方式实践:
–single-transaction
Creates a consistent snapshot by dumping all tables in a single transaction.
通过在单个事务中备份所有表时,会创建一致性快照
Works ONLY for tables stored in storage engines which support multiversioning (currently only InnoDB does);
仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB)
对于InnoDB,会利用MVCC中一致性快照进行备份;
the dump is NOT guaranteed to be consistent for other storage engines.
这种方式的备份不能保证与其他存储引擎一致
While a –single-transaction dump is in process, to ensure a valid dump file
当–single-transaction参数应用在备份进程中时,确保备份文件的有效性
(correct table contents and binar y log position),
含有正确的表内容和binlog日志位置点
no other connection should use the following statements: ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE, as consistent snapshot is not isolated from
them.
在进行备份数据期间,不要出现相关DDL的操作信息,导致备份数据不一致;
Option automatically turns off –lock-tables.
1
2
3
| CHANGE MASTER TO MASTER_LOG_FILE='binlog.000011', MASTER_LOG_POS=2335;
-- binlog.000011 表示临界点之后的文件信息
-- 2335表示全备进行时的位置点信息 binlog.000001 binlog.000002 binlog00003
|
–master-data[=#]
This option is deprecated and will be removed in a future version. Use source-data instead.
此选项已弃用,将在以后数据库服务的版本中删除,请使用source-data代替此参数使用;
–source-data[=#]
This causes the binar y log position and filename to be appended to the output.
这个参数会导致binlog日志位置点信息和文件名信息会附加到输出中,即附件到备份文件中。
If equal to 1, will print it as a CHANGE MASTER command;
如果数值等于1,将输出显示change master的命令信息;
if equal to 2, that command will be prefixed with a comment symbol.
如果数值等于2,该命令将以注释符号作为前缀
This option will turn –lock-all-tables on, unless –single-transaction is specified too
这个参数在使用时,将会自动开启–lock-all-tables参数功能,除非也指定了–single-transaction参数信息;
(in which case a global read lock is only taken a short time at the beginning of the dump;
在这种情况下,全局读锁只在备份开始时占用很短的时间
don’t forget to read about –single-transaction below).
不要忘记阅读一下–single-transaction参数功能说明
In all cases, any action on logs will happen at the exact moment of the dump.
在所有情况下,日志上的任何操作都将在备份的确切时刻发生
Option automatically turns –lock-tables off.
参数将自动关闭 –lock-tables参数功能
1
| | 序号 | 参数信息 | 官方说明 | 解释说明 |
|
|—|—|—|—|
1
2
3
| | 01 | -R | Dump stored routines (functions and procedures) | 表示进行数据库存储过程备份 |
| 02 | -E | Dump events | 表示进行数据库事件信息备份 |
| 03 | --triggers | Dump triggers for each dumped table. | 表示进行触发器信息备份 |
|
数据库数据备份进阶方式三:利用命令参数 -R -E –triggers
模拟时间-某周周二晚零点,企业数据库管理员进行一次数据库服务数据全备操作**
以上mysqldump备份中的特殊参数说明:
数据库数据备份进阶方式四:利用命令参数 –max_allowed_packet=64M
此参数表示允许进行传输的数据包大小,在某些时候如果备份的数据为大表数据,需要调整此参数信息;
如果没有正确的设置此参数信息,可能会导致备份大表数据时,会出现数据备份失败的情况;
结合以上参数信息,进行标准化数据备份操作:
1.12.5 数据库逻辑备份应用案例#
项目实战介绍:
模拟企业生产场景,数据库管理人员误删除了数据库数据信息,通过mysqldump全备的部分数据信息,进行部分数据信息恢复;
再结合binlog日志文件增量数据信息,实现数据库增量数据恢复,最终实现数据库全部数据的完整复原。
项目实战背景:
在某某小型企业工作环境时,企业数据库服务数据存储量小于50G,每天会在23点进行前一天数据的全备操作,并已开启binlog功能;
项目故障说明:
在某周周三下午14点左右,由于开发人员连接数据库实例错误,导致企业数据库服务生产数据被误删除了,亟待相关人员解决;
故障发现流程:
用户发现故障问题出现:这种企业的网站业务管理的技术人员实力是极差的;
运营人员故障问题发现:这种企业的运营人员或产品经理必然是企业的核心;
开发人员故障问题发现:这种企业的开发人员必然是整个企业业务的主导者;
运维人员故障问题发现:这种企业的运维人员必然已经通晓玩转企业的架构;
安全人员故障问题发现:这种企业的安全维护团队必然是整个企业精英团队;
故障处理思路:
需要在网站首页或者应用程序首页显示业务端维护页;
检查利用mysqldump命令全备的数据文件、以及查看binlog日志功能是否已经开启;
利用部分全备数据和增量数据完成数据库所有数据复原恢复工作;
数据库数据完整复原恢复进行数据信息核验工作,一般此类工作可以交由相关业务部门进行核验测试;
1
2
3
4
5
6
7
8
9
10
| # 进阶方式数据备份(不压缩备份)
[root@xiaoQ ~]# mysqldump -uroot -poldboy123 --master-data=2 --single-transaction -A -B >/tmp/bak.sql
-- -B 表示在备份时添加use语句信息
# 进阶方式数据备份(压缩备份)
[root@xiaoQ ~]# mysqldump -uroot -poldboy123 --master-data=2 --single-transaction -A -B|gzip >/tmp/bak.sql.gz
[root@xiaoQ ~]# gzip -d /tmp/bak.sql.gz
-- 压缩数据解压命令
[root@xiaoQ ~]# mysqldump -uroot -poldboy123 -B mdb --master-data=2 --single-transaction -R -E --triggers >/databases_backup/oldboy_`date +%F`.sql
# 数据库数据信息备份过程(全备)
[root@xiaoQ-01 ~]# mysqldump -uroot -p123456 -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M >/database_backup/full_`date
|
+%F`
1
2
3
4
5
6
7
8
9
10
11
| [root@xiaoQ-01 ~]# ll /database_backup/
-rw-r--r-- 1 root root 51254551 11月 26 00:47 full_2022-11-26
# 数据库数据备份信息查看
[root@xiaoQ-01 ~]# vim /database_backup/full_2022-11-26.sql
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '9d14be39-6423-11ed-bb21-000c2996c4f5:1-6';
-- 表示在进行数据恢复操作时,会将gtid1-6的事件信息删除掉,因为在之前备份数据中已经有了1-6的事件数据信息;
-- 因此,从GTID的编号来看,可以从编号7事件开始进行数据增量恢复;
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000013', MASTER_LOG_POS=1312;
-- 输出信息表示增量数据的临界点在binlog.000013日志文件的1312位置,同时是备份结束时的位置点;
| 序号 | 参数信息 | 官方说明 | 解释说明 |
|
|—|—|—|—|
1
2
3
| | 01 | -R | Dump stored routines (functions and procedures) | 表示进行数据库存储过程备份 |
| 02 | -E | Dump events | 表示进行数据库事件信息备份 |
| 03 | --triggers | Dump triggers for each dumped table. | 表示进行触发器信息备份 |
|
数据信息核验工作完毕后,可以在此时业务中断状态下,进行一次停机冷备操作,彻底完成一次数据物理备份;
所有相关线上业务进行恢复运行,并进行业务恢复后的功能性测试,一般交由测试人员进行完成;
撤销维护页面通知消息,实现用户可以正常访问。
项目实战模拟:
01 模拟时间-某周周一~周二,正常网站用户访问网站进行数据库信息录入#
02 模拟时间-某周周二晚零点,企业数据库管理员进行一次数据库服务数据全备操作#
以上mysqldump备份中的特殊参数说明:
03 模拟时间-某周周二晚零点之后,模拟用户继续访问网站业务产生了增量的数据信息#
04 模拟时间-某周周三下午14点,模拟系统相关技术人员误删除了数据库,并且已紧急跑路#
项目实战复原:
01 修复操作-查看找寻数据库服务全备数据,并进行全备数据恢复#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| mysql> flush logs;
-- 将binlog日志文件进行刷新,创建一个新的日志文件
mysql> create database mdb;
mysql> use mdb;
-- 模拟创建用户存储数据的数据库信息
mysql> create table t1 (id int);
mysql> create table t2 (id int);
-- 模拟创建用户存储数据的数据表信息
mysql> insert into t1 values(1),(2),(3);
mysql> insert into t2 values(1),(2),(3);
mysql> commit;
-- 模拟用户向数据表中添加新的数据
mysql> select * from t1;
mysql> select * from t2;
-- 检查用户创建的数据信息是否生成
[root@xiaoQ ~]# mysqldump -uroot -p -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M >/database_backup/full_`date +%F`.sql
mysql> use mdb;
mysql> create table t3 (id int);
mysql> insert into t3 values(1),(2),(3);
mysql> insert into t2 values(4),(5),(6);
mysql> commit;
mysql> drop database mdb;
[root@xiaoQ-01 database_backup]# ll
-rw-r--r-- 1 root root 51256606 11月 26 01:53 full_2022-11-26.sql
[root@xiaoQ ~]# mysql -uroot -p123456
mysql> source /database_backup/full_2022-11-26.sql
-- 强调说明 强调说明 强调说明,此步骤操作了解作用后,请在后面进行操作,不要在此步骤就进行数据恢复
mysql> use mdb;
mysql> show tables;
+--------------------+
| Tables_in_mdb |
+--------------------+
| t1 |
| t2 |
+--------------------+
2 rows in set (0.00 sec)
-- 查看全备的数据是否恢复成功
|
02 修复操作-查看找寻数据库服务增量备份,并进行增量数据恢复#
03 修复操作-进行测试核验数据信息是否完全恢复,并进行最终全量备份#
说明:数据库数据修复复原完毕后,别忘让开发人员或测试人员进行业务功能测试,最终让运维人员恢复业务上线。
1.12.6 数据库逻辑备份痛点分析#
假设某个企业进行数据库服务的数据备份,将会采用数据库全备方案,每次全备会生成大约50G的数据信息;
并且每次数据库服务进行全备耗时大约1530分钟,因此如果有需要进行数据恢复时,耗费时间大约35小时左右(备份时间的3-5倍);
但是,在实际生产环境中,只是误删除(误修改)了一个10M大小的数据表,如何进行部分数据信息的快速恢复;
说明:此时需要实现部分单表数据信息恢复时,在实际企业生产环境中,并没有做指定的单表数据信息备份操作;
痛点解决思路:
只能通过已有的全备数据信息,配合已有binlog日志信息,进行指定表数据信息的恢复操作;
基于全备数据信息,可以将指定数据表的建表语句和插入语句提取出来,进行单表数据信息恢复(恢复全备前的数据);
基于增量日志信息,可以将指定数据表的所有相关事件信息进行截取,进行单表数据信息增量恢复;
处理方法参考:
基于全备数据信息,获取指定数据表的建表语句和插入语句信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # 检索恢复binlog临界位置
[root@xiaoQ ~]# vim /database_backup/full_2022-11-26.sql
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '9d14be39-6423-11ed-bb21-000c2996c4f5:1-6';
-- 表示在进行数据恢复操作时,会将gtid1-6的事件信息删除掉,因为在之前备份数据中已经有了1-6的事件数据信息;
-- 因此,从GTID的编号来看,可以从编号7事件开始进行数据增量恢复;
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000013', MASTER_LOG_POS=1312;
-- 输出信息表示增量数据的临界点在binlog.000013日志文件的1312位置,同时是备份结束时的位置点;
# 检索查看binlog日志文件获取误删除操作前的GTID
[root@xiaoQ-01 ~]# ll /data/3306/data/binlog.*
-rw-r----- 1 mysql mysql 1833 11月 26 01:55 /data/3306/data/binlog.000013
-rw-r----- 1 mysql mysql 64 11月 26 01:50 /data/3306/data/binlog.index
-- 具体binlog日志是哪个,以企业具体情况而定,不一定是binlog.000013
mysql> show binlog events in 'binlog.000013';
+------------------+-------+------------------+-------------+-----------------+--------------------------------------------------+
| Log_name | Pos | Event_type | Ser ver_id | End_log_pos | Info |
+------------------+-------+------------------+-------------+-----------------+--------------------------------------------------+
| binlog.000013 | 2060 | Gtid | 1 | 2137 | SET @@SESSION.GTID_NEXT= '9d14be39-6423-11ed-bb2 |
| binlog.000013 | 2137 | Quer y | 1 | 2238 | drop database mdb /* xid=840 */ |
+------------------+-------+------------------+-------------+-----------------+--------------------------------------------------+
-- 需要将GTID编号10的误删除数据库事件信息忽略,然后再进行数据信息的恢复
# 移动迁移binlog文件位置
[root@xiaoQ ~]# cp /var/lib/mysql/binlog.* /databases_backup/
# 操作截取binlog文件信息
[root@xiaoQ ~]# mysqlbinlog --skip-gtids --include-gtids='9d14be39-6423-11ed-bb21-000c2996c4f5:7-9' /data/3306/data/binlog.000013
|
/database_backup/add_bin.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| -- include-gtids是指定前面临界位置点,截取之后的日志文件信息
# 增量恢复binlog数据信息
mysql> set sql_log_bin=0;
-- 建议在进行数据日志恢复数据时,将数据恢复时执行的SQL语句信息,不做binlog日志记录;恢复后别忘在改为1;
mysql> source /database_backup/add_bin.sql
-- 完成数据信息的增量恢复
# 核验检查恢复后的数据信息
mysql> use mdb;
mysql> show tables;
mysql> select * from t1;
mysql> select * from t2;
mysql> select * from t3;
# 完成核验之后数据完整备份
[root@xiaoQ ~]# mysqldump -uroot -p -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M >/database_backup/full_`date +%F`.sql
|
基于增量日志信息,获取指定数据表的增量变化的日志数据信息:
1.12.7 数据库服务物理备份实践#
在数据库服务运行使用过程中,除了上面介绍的逻辑备份数据方法,还可以采用物理方式备份数据信息;
物理备份数据方式又可以细分为冷备份和热备份两种,和逻辑备份相比,它的最大优点是备份和恢复的速度更快;
因为物理备份的原理都是基于文件的cp。
01 物理冷备份
冷备份其实就是停掉数据库服务,cp数据文件的方法;这种方法对MyISAM和InnoDB存储引擎都合适,但是一般很少使用,
因为很多应用是不允许长时间停机的。
进行备份的操作过程:
停掉MySQL服务,在操作系统级别备份MySQL的数据文件和日志文件到备份目录;
进行恢复的操作过程:
停掉MySQL服务,在操作系统级别恢复MySQL的数据文件,然后重启MySQL服务,使用mysqlbinlog工具恢复增量数据日志;
02 物理热备份
在MySQL中,对于不同的存储引擎热备份方法也有所不同,下面主要介绍MyISAM和InnoDB两种最常用的存储引擎的热备份方法;
数据库存储引擎应用:MyISAM
MyISAM存储引擎的热备份有很多方法,本质其实就是将要备份的表加读锁,然后再cp数据文件到备份目录:
方法一:使用mysqlhotcopy工具
mysqlhotcopy是MySQL自带的一个热备份工具,使用方法很简单:
参考官方链接说明:https://dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html
方法二:手工锁表copy
在mysqlhotcopy使用不熟悉的情况下,可以手工来做热备份,操作步骤如下:
数据库存储引擎应用:InnoDB
ibbackup是Innobase公司的一个热备份工具,专门对InnoDB存储引擎进行物理热备份,此工具是收费的,但可以免费使用1个月;
Innobase公司已经于2005年被Oracle公司所收购。
使用ibbackup备份工具的备份步骤简要说明:
01 编辑用于启动的配置文件my.cnf和用于备份的配置backup-my.cnf#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| [root@xiaoQ ~]# sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `xiaoQ`/!d;q' /database_backup/full.sql > /database_backup/createtable.sql
-- 获取指定表的建表语句信息;
[root@xiaoQ ~]# grep -i 'INSERT INTO `xiaoQ`' /database_backup/full.sql > /database_backup/data_insert.sql
-- 获取指定表的插入语句信息;
[root@xiaoQ ~]# grep -i 'UPDATE `xiaoQ`' /database_backup/full.sql > /database_backup/data_delete.sql
-- 获取指定表的修改语句信息;
[root@xiaoQ ~]# grep -i 'DELETE FROM `xiaoQ`' /database_backup/full.sql > /database_backup/data_delete.sql
-- 获取指定表的删除语句信息;
[root@xiaoQ ~]# python3 binlog2sql.py -h 10.0.0.101 -P3306 -uroot -p123456 -d 数据库 -t 数据表 --start-file='binlog.00000N'
-- binlog2sql 截取指定单表的binlog数据,进行恢复/分析操作
[root@xiaoQ ~]# mysqlhotcopy db_name [/path/to/new_director y]
-- mysqlhotcopy有很多选项,具体可以使用--help查看帮助信息;
# 对数据库中所有表加读锁:
mysql> flush tables for read;
-- 然后cp数据文件到备份目录即可;
# 配置文件配置参考:my.cnf
[mysqld]
datadir=/data/3306/data
innodb_data_home_dir=/data/3306/data
innodb_data_file_path=ibdata1:100M;ibdata2:200M;ibdata3:500M:autoextend
innodb_log_group_home_dir=/data/3306/data
|
set-variable=innodb_log_files_in_group=2
set-variable=innodb_log_file_size=20M
02 实现数据文件信息热备过程:#
1
| Xtrabackup(PXB)是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,属于物理备份数据工具;
|
具有开源、免费、支持在线热备、备份恢复速度快、占用磁盘空间小等特点,并且支持不同情况下的多种备份形式。
官方软件下载链接:https://www.percona.com/downloads/
对于数据库8.0.20版本,需要使用PXB 8.0.12+以上版本,对于数据库8.0.11~8.0.19,可以使用PXB 8.0正式版本;
PXB 8.0只能备份MySQL 8.0版本数据,不能备份低版本数据信息;如果想备份数据库服务低版本程序数据,需要下载使用PXB 2.4版本;
1
2
3
| xtrabackup包含两个主要的工具:xtrabackup和innobackupex
xtrabackup 只能备份InnoDB和XtraDB两种类型的数据表,而不能备份MyISAM类型数据表;
innobackupex 是一个封装了xtrabackup的perl脚本,支持同时备份InnoDB和MyISAM,但对MyISAM备份时需要加全局读锁;
|
由于PXB属于第三方软件工具程序,因此需要进行单独下载安装:
1
| Xtrabackup(PXB)属于物理备份工具(针对数据文件进行备份),具体备份逻辑如下:(支持增量备份数据)
|
在数据库服务运行期间,通过拷贝数据文件(实质拷贝的是数据页),进而实现数据备份目的;
在进行数据文件拷贝的同时,会将备份期间的变化redo日志信息同时进行备份(拷贝);
1
| Xtrabackup(PXB)属于物理备份工具(针对数据文件进行备份),具体恢复逻辑如下:
|
在进行数据恢复时,模拟了InnoDB Crash recover y(CR)的运行过程,需要将备份进行处理,才能进行数据恢复;
在进行数据恢复时,对于备份进行处理操作,特指的就是前滚操作(redo)和回滚操作(undo),从而解决数据恢复一致性问题;
1
2
3
4
5
6
7
8
| Xtrabackup数据备份方式01:实现全量备份
# 配置文件配置参考:backup-my.cnf
[mysqld]
datadir=/data/3306/backup
innodb_data_home_dir=/data/3306/backup
innodb_data_file_path=ibdata1:100M;ibdata2:200M;ibdata3:500M:autoextend
innodb_log_group_home_dir=/data/3306/backup
|
set-variable=innodb_log_files_in_group=2
set-variable=innodb_log_file_size=20M
1
| [root@xiaoQ ~]# ibbackup /data/3306/my.cnf /data/3306/backup-my.cnf
|
… 省略部分信息…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| -- ibbackup工具不会覆盖任何重名的文件,因此在新的备份开始之前,需要确保备份目录中没有重名文件,否则备份可能会失败
[root@xiaoQ ~]# ll /data/3306/backup
-- 备份成功后,备份目录下包含有数据文件和日志文件等相关数据信息;
# 进行软件程序上传
[root@xiaoQ ~]# cd /usr/local/
[root@xiaoQ-01 local]# rz -y
[root@xiaoQ-01 local]# ll percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm
-r-------- 1 root root 13097340 11月 27 02:08 percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm
# 进行软件程序安装
[root@xiaoQ-01 local]# yum install -y percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm
-- 利用yum方式安装本地的rpm包程序,可以有效解决软件依赖的问题;
# 全量备份操作:
[root@xiaoQ-01 ~]# mkdir /data/backup/full -p
-- 进行物理备份的目标目录不能存在数据信息,需要指定一个空目录进行备份
[root@xiaoQ-01 ~]# xtrabackup --defaults-file=/etc/my.cnf --host=192.168.30.101 --user=root --password=123456 --port=3306 --backup --target-
|
dir=/data/backup/full
或者使用参数–datadir替换掉参数–defaults-file
1
2
3
| [root@xiaoQ-01 ~]# xtrabackup --datadir=/data/3306/data --user=root --password=123456 --port=3306 --backup --target-dir=/data/backup/full
-- backup参数信息表示进行全备操作
# 物理备份命令执行输出信息说明:
|
221127 02:46:11 » log scanned up to (277574297)
1
| -- 记录日志位置点信息,表示进行拷贝数据的checkpoint的SN号码,相当于磁盘当前数据页的SN号码;
|
Using undo tablespace ‘./undo_001’.
Using undo tablespace ‘./undo_002’.
Opened 2 existing undo tablespaces.
221127 02:46:11 [01] Copying ./ ibdata1 to /data/backup/full/ ibdata1
221127 02:46:11 [01] …done
221127 02:46:11 [01] Copying ./sys/sys_config.ibd to /data/backup/full/sys/sys_config.ibd
221127 02:46:11 [01] …done
|—|—|—|
1
2
3
4
5
6
7
8
9
| | 01 | xtrabackup_binlog_info | 表示用于存储备份时的binlog位置点信息 |
| 02 | xtrabackup_checkpoints | 表示用于记录备份时的数据页LSN信息,主要用于接下一次备份,需要保证连续性; |
| 03 | xtrabackup_info | 表示整体物理备份信息的总览 |
| 04 | xtrabackup_logfile | 表示存储在备份数据期间产生的新的的redo日志的信息; |
| 05 | xtrabackup_tablespaces | 表示用于存储表空间的其余信息 |
Xtrabackup数据备份工具在热备操作后产生的特殊数据文件说明:
Xtrabackup数据恢复方式01:全量备份恢复
|
模拟进行数据库数据破坏性操作:
进行数据库数据恢复的操作过程:
1
2
| Xtrabackup数据备份方式02:实现增量备份
xtrabackup物理备份数据时,实现增量备份原理分析:
|
增量备份的实质是,基于上一次备份LSN变化过的数据页,进行相应的备份操作,从而可以不断实现增量备份操作;
在备份同时产生的新的变更,会将redo日志信息备份;
第一次增量备份时依赖于全量备份的,将来的恢复操作也要合并到全备中,再进行统一恢复;
说明:利用XPK增量备份数据,主要目的是减少频繁全备数据的时间开销,可以将每天增量的数据进行更快速的备份
221127 02:46:11 [01] Copying ./mysql.ibd to /data/backup/full/mysql.ibd
… 省略部分信息…
1
2
3
4
5
6
7
8
9
10
11
| -- 进行相关数据文件、日志文件、共享表空间文件、数据表空间文件等文件的拷贝,并且拷贝过程是不会进行锁表操作的;
-- 数据表空间信息备份完毕后,会有提示字段信息,并且此时会锁定binlog日志文件,并将binlog日志文件复制到备份目录;
-- 在进行binlog日志文件备份时,会生成xtrabackup_binlog_info文件信息,用于记录物理备份后的二进制日志位置点;
-- 二进制日志文件备份完毕后,会释放binlog日志文件锁定状态,并再次检查checkpoint的SN号码,确认redo日志是否变化;
[root@xiaoQ-01 backup]# ll /data/backup/full/
-- 可以看到将原有数据库的数据目录信息,已经基本迁移到指定的物理备份目录中;
[root@xiaoQ ~]# pkill mysqld
[root@xiaoQ ~]# rm -rf /data/3306/data/*
[root@xiaoQ ~]# rm -rf /data/3306/logs/*
[root@xiaoQ ~]# rm -rf /data/3306/binlog /*
[root@xiaoQ ~]# xtrabackup --prepare --target-dir=/data/backup/full
|
…忽略部分信息…
Shutdown completed; log sequence number 19214860
221127 16:31:58 completed OK!
1
2
3
4
5
6
7
8
9
10
11
| -- 表示模拟CR过程,将redo日志进行前滚,undo日志进行回滚,让恢复数据信息保持一致性状态
[root@xiaoQ ~]# xtrabackup --copy-back --target-dir=/data/backup/full
-- 将进行物理备份后的数据,再次进行还原恢复到备份前的目录中(拷贝回数据)
[root@xiaoQ ~]# chown -R mysql.mysql /data/*
[root@xiaoQ ~]# /etc/ init.d/mysqld start
-- 重新设置数据目录权限,并重新启动恢复数据库业务
# 增量备份准备:
[root@xiaoQ-01 ~]# mkdir /data/backup/full -p
-- 提前准备好全量备份的目录;
Xtrabackup数据恢复方式02:增量备份恢复
|
模拟进行数据库数据破坏性操作:
进行数据库数据恢复的操作过程:
1
2
3
4
| [root@xiaoQ-01 ~]# mkdir /data/backup/ inc -p
-- 提前准备好增量备份的目录;
# 进行备份操作:
[root@xiaoQ-01 ~]# xtrabackup --defaults-file=/etc/my.cnf --host=192.168.30.101 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-
|
dir=/data/backup/full
1
2
3
4
5
6
7
8
| -- 进行全量备份操作,并且开启并发线程备份功能(--parallel=4),从而提高备份效率(建议4~8个)
mysql> create database pxb;
mysql> use pxb
mysql> create table t1(id int);
mysql> insert into t1 values(1),(2),(3);
mysql> commit;
-- 模拟登陆数据库,进行相关操作,实现增量备份的效果
[root@xiaoQ-01 ~]# xtrabackup --defaults-file=/etc/my.cnf --host=192.168.30.101 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-
|
dir=/data/backup/ inc –incremental-basedir=/data/backup/full
1
2
3
4
5
6
7
8
9
10
11
| -- 进行增量备份操作
# 可以进行继续备份操作(了解)
[root@xiaoQ-01 ~]# mkdir /data/backup/ inc02 -p
-- 提前准备好增量备份的增量备份目录;
mysql> create database pxb02;
mysql> use pxb02
mysql> create table t1(id int);
mysql> insert into t1 values(1),(2),(3);
mysql> commit;
-- 模拟登陆数据库,进行相关操作,实现增量备份的效果
[root@xiaoQ-01 ~]# xtrabackup --defaults-file=/etc/my.cnf --host=192.168.30.101 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-
|
dir=/data/backup/ inc02 –incremental-basedir=/data/backup/ inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| -- 进行增量备份操作的下一次增量备份
[root@xiaoQ ~]# pkill mysqld
[root@xiaoQ ~]# rm -rf /data/3306/data/*
[root@xiaoQ ~]# rm -rf /data/3306/logs/*
[root@xiaoQ ~]# rm -rf /data/3306/binlog /*
# 准备相关备份日志信息
[root@xiaoQ ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full
-- 准备全量备份的日志;
[root@xiaoQ ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full --incremental-dir=/data/backup/ inc
-- 准备增量备份的日志,并且将增量备份合并到全量备份中;
[root@xiaoQ ~]# xtrabackup --prepare --target-dir=/data/backup/full
-- 在全量和增量数据合并后,在整体做日志信息的准备;
# 进行数据备份拷回操作
[root@xiaoQ ~]# xtrabackup --datadir=/data/3306/data --copy-back --target-dir=/data/backup/full
|
或者
1
2
3
4
5
6
| [root@xiaoQ ~]# xtrabackup --copy-back --target-dir=/data/backup/full
-- 将进行物理备份后的数据,再次进行还原恢复到备份前的目录中(拷贝回数据)
# 重新启动恢复业务功能
[root@xiaoQ ~]# chown -R mysql.mysql /data/*
[root@xiaoQ ~]# /etc/ init.d/mysqld start
-- 重新设置数据目录权限,并重新启动恢复数据库业务
|