网站Logo 欢迎来到我的博客

Mysql日志文件

zhang
72
2025-03-20

数据库服务日志管理

数据库服务中有什么日志?(4种)

通用日志(了解)

记录登录数据库的用户信息,登录用户操作行为会被记录

错误日志(关注)

记录数据库启动运行信息/数据库运行过程中错误情况 ,便于排查数据库问题

二进制日志(重点)

(1)二进制日志可以记录用户事务操作信息(DDL DML DCL--commit DQL不会记录-select show),可以用于修复数据

(2)利用二进制日志文件,可以实现主从同步数据

慢查询日志

记录在操作数据库过程中的慢查询语句

(1)给DBA管理员,提供进行数据配置和架构优化的建议;

(2)对于运维人员关注慢查询日志,主要确认慢查询日志的数据量,如果相同慢查询语句出现次数过多,可以告知DBA做优化

数据库日志信息管理

通用日志(默认不存在)

general_log=ON
general_log_file=/data/3306/log/general.log  

错误日志(默认存在)

log_error=0/off    --禁用错误日志
log_error=./db01.err  --指定生成默认日志保存在哪里
#数据库数据目录下
[root@db01 ~]# ll /data/3306/data/db01.err 
-rw-r----- 1 mysql mysql 26646  8月 21 08:43 /data/3306/data/db01.err

select @@log_error;

二进制日志(默认存在)

  • log_bin -- 可以配置二进制日志开启或关闭功能/指定二进制日志存储路径
select @@log_bin;

  • sql_log_bin=1 -- 是否激活事务记录功能 1表示事务信息会记录到二进制日志 0表示事务信息不会记录到二进制日志
  • 做binlog日志进行数据修复时,可以将记录binlog日志功能临时关闭 sql_log_bin=0/off
select @@sql_log_bin;

(1)如何查看二进制日志(在数据库中查看)

  • 查看二进制日志
show binary logs;  --- 显示当前数据库实例中,所有生成binlog日志信息,并且是当前存在的;

  • 查看当前正在使用的binlog日志
show master status;  --- 查看主库binlog日志信息记录情况

File: 表示当前数据库实例正在使用binlog日志;

Position:事务完成之后的位置点用于可以截取日志信息,完成特定数据的修复/还可以便于进行主从同步

Binlog_Do_DB: 表示指定某个或某几个数据库的事务操作,会记录到binlog日志中;(二进制日志记录信息白名单)

Binlog_Ignore_DB:表示指定某个或某几个数据库的事务操作,不会记录到binlog日志中; (二进制日志记录信息黑名单)

  • 直接查看binlog日志内容
show binlog events in '日志文件名称';                                    --- 在数据库中查看binlog日志内容

  • 知识点补充:如歌实现事务自动提交
  • 利用autocommit配置项,可以实现事务信息自动提交
  • 当完成事务过程,出现DDL或DCL语句,也会自动触发提交功能

(2)在命令行中查看二进制文件

cd /data/3306/data/
mysqlbinlog  binlog.000036;
  • 数据恢复
--start-position=#  -- 从binlog日志中,根据位置点过滤指定事务信息(从哪过滤)
--stop-position=#   -- 从binlog日志中,根据位置点过滤指定事务信息(到哪结束)
[root@db01 /data/3306/data]# mysqlbinlog --help | grep start
[root@db01 /data/3306/data]# mysqlbinlog --help | grep stop

#过滤起始点到结束点导入到备份文件
mysqlbinlog --start-position=234 --stop-position=345 binlog.000036 >/backup/xiaoA.sql

ll /backup/xiaoA.sql

#加载恢复文件
[root@db01 /data/3306/data]# mysql -uroot -p1 </backup/xiaoA.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

  • 将DML编码语句进行解码,以明文方式显示DML语句
mysql> insert into student values (1,'xiaoA');
Query OK, 1 row affected (0.00 sec)

mysql> select *  from student;
+------+-------+
| id   | name  |
+------+-------+
|    1 | xiaoA |
+------+-------+
1 row in set (0.00 sec)

#从binlog日志中,将DML编码语句进行解码,以明文方式显示DML语句
mysqlbinlog  --base64-output=decode-rows -vvv '日志文件名称'; 
[root@db01 /data/3306/data]# mysqlbinlog  --base64-output=decode-rows -vvv 'binlog.000038';
--decode-rows 解码

  • 从binlog日志中,将DML编码语句进行解码,以明文方式显示DML语句

INSERT INTO `xiaoA`.`student` SET @1=1 @2='xiaoA';
INSERT INTO `xiaoA`.`student` value (1,'xiaoA');

二进制日志记录格式(面试题)

(1)二进制日志记录信息有三种格式:

SBR(语句格式记录):会将DML操作事务信息,以语句明文方式记录

PBR(行格式记录):会将DML操作事务信息,以具体数据行的信息记录

MBR(混合方式记录):会将DML操作事务信息,进行自动识别,根据识别后内容自动选择记录方式

binlog_format=statement 语句格式记录
应用场景:对表操作过程中,没有函数信息应用,并且需要更直观查看DML事务信息
binlog_format=row       行格式记录
应用场景:对表操作过程中,需要函数信息应用,并且有主从同步架构,为了保证数据一致性
  • 修改配置文件添加语句格式

  • 语句格式记录

  • 行格式记录
#注释掉语句格式记录

  • 查看当前记录格式

  • 删除表中数据,会以行格式记录

  • 再执行相同的插入语句

删除带有函数信息的数据,导致操作前后的数据不一致

二进制日志切割

(1)手动执行命令切割

#数据库中执行
mysql> flush logs;
#命令行
mysqladmin -uroot -p1 flush-logs

(2)根据文件大小进行切割

max_binlog_size 字节量切割(默认1G)
#查看数据库默认切割数据量
select @@max_binlog_size;
#调节数据库默认切割数据量
select 100*1024*1024;

二进制日志清理

(1)进行日志信息手动清理

#修剪
#删除到指定文件前的binlog日志
mysql>purge binary logs to 'binlog.000047'
#可以基于日志时间点信息进行日志清理,超过某个时间的就清理
PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';

(2)进行日志信息自动清理(根据时间)

方法一

binlog_expire_logs_seconds   3600
--根据二进制日志存在了多少秒,就会进行删除清理

  • 编写数据库配置文件,写入binlog_expire_logs_seconds=3600

  • 清理超过一个小时的日志文件

  • 重启数据库查看结果
/etc/init.d/mysql restart

方法二

expire_logs_days      
--根据二进制日志存在了多少天进行清理

二进制日志远程备份(实现日志信息统一管理)

  • 实现高可用架构会应用binlog日志远程备份功能
  • 环境准备--两台数据库服务器db01与db03
mkdir -p /binblog_backup/10.0.0.{51..55}
cd /binblog_backup/10.0.0.51
#拉取相应主机日志信息
mysqlbinlog -R --host=10.0.0.51 --user=root --password=1 --raw --stop-never binlog.00008 &
-R            --远程拉取目标主机日志信息
--host        --指定拉取日志目标主机IP地址
--uesr        --指定登录数据库用户名
--password    --指定登录数据库用户登录密码 
--raw         --实时拉取日志信息(指定binlog日志信息记录二进制信息) 
--stop-never  --以守护进程方式一直拉取日志信息(指定binlog日志信息将会一直备份记录)
binlog.000008 --代表从哪个binlog日志开始进行备份 
  • 远程备份实践过程,db03执行远程备份命令

知识扩展--利用binlog日志实现误操作数据的闪回功能

  • 数据信息物理损坏:硬件出现异常 数据库服务异常 (主从架构 高可用架构)
  • 数据信息逻辑损坏:出现数据信息误操作(DML) (数据闪回功能)
  • binlog2sql介绍
从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等

数据快速回滚(闪回)
主从切换后新master丢数据的修复
从binlog生成标准SQL,带来的衍生功能
步骤一:下载数据闪回工具
www.github.com  -- 搜索 binlog2sql  -- mysql数据实现数据闪回

步骤二:安装软件程序包
ll /opt/binlog2sql-master
yum install -y python3  (可选)
pip3 install -r requirements.txt

步骤三:测试应用数据闪回工具
use xiaoD;
create table t1 (id int,name char(10),age int);
insert into t1 values (1,'xiaoA',18),(2,'xiaoB',19),(3,'xiaoC',20);

模拟误操作:
- 误插入数据
insert into t1 values (4,'xiaoD',18);
- 误修改数据
update t1 set name='oldboy' where id=2;
- 误删除数据
delete from t1 where id=3;

#python工具闪回   -B展示逆向操作,不写显示误操作信息
python3 binlog2sql.py -h10.0.0.51 -P3306 -uroot -p1 -d xiaoD -t t1 --sql-type=insert --start-file='binlog.000003'  -B 

#显示操作信息
--sql-type=insert
insert into t1 values (4,'xiaoD',18); -逆向操作信息-> delete from t1 where id=4 and name=xiaoD and age=18; 

#python工具闪回
python3 binlog2sql.py -h10.0.0.51 -P3306 -uroot -p1 -d xiaoD -t t1 --sql-type=update --start-file='binlog.000003'  -B 

#显示操作信息
--sql-type=update 
update t1 set name='oldboy' where id=2; --> update t1 set name='xiaoB' where id=2;
修改为  xiaoB-oldboy id=2

#python工具闪回
python3 binlog2sql.py -h10.0.0.51 -P3306 -uroot -p1 -d xiaoD -t t1 --sql-type=delete --start-file='binlog.000003'  -B 
#显示操作信息
--sql-type=delete
delete from t1 where id=3; --> insert into t1 values (3,'xiaoC',20);
  • 返回误插入数据

  • 返回误修改数据

  • 返回误删除数据

#复制到数据库执行
DELETE FROM `xiaoA`.`t1` WHERE `id`=4 AND `name`='xiaoD' AND `age`=18;
UPDATE `xiaoA`.`t1` SET `id`=2, `name`='xiaoB', `age`=19 WHERE `id`=2 AND `name`='oldboy' AND `age`=19;
INSERT INTO `xiaoA`.`t1`(`id`, `name`, `age`) VALUES (3, 'xiaoC', 20);

数据库服务备份恢复

逻辑备份与恢复

备份和恢复原理

(1)备份原理:读取数据库中数据对象以及表中数据信息,将数据对象创建过程和表中数据插入过程SQL语句导出

show databases    -- show create database 库名 --创库语句
use 库名          --show tables --show create table 表名 --创表语句
识别表中数据信息   --insert XXX
  • 备份实践过程
mysqldump
-A   全库备份
-B   分库备份
  • 备份方式一:实现数据库信息全备备份
本地备份 socket_file数据库配置文件没有需要加上
mysqldump -u用户 -p密码 -S socket_file  -A   >  /backup/all.sql  
远程备份(异地备份)
mysqldump -u用户 -p密码 -h数据库服务器IP地址 -P数据库服务端口  >  -A  /backup/all.sql  
mysqldump -uroot -pXXXX  -B  库名,库名,....   >  /backup/world.sql
  • 备份方式三:实现数据库分表备份
mysqldump -uroot -pXXX 库名 表名   >  /backup/xiaoD_t1.sql
                       xiaoD t1

(2)恢复原理:重新加载备份文件中SQL语句

应用场景:只适合于少量数据进行备份与恢复(50G)
可以将备份后的数据进行灵活恢复
  • 恢复数据过程:
  • 恢复方式一:实现全备恢复数据
#导入数据到数据库
mysql -uroot -pxxx    <   /backup/all.sql
#实时查看恢复过程
mysql>source  /backup/all.sql;
  • 恢复方式二:实现恢复分库备份数据
mysql -uroot -pxxx    <   /world/world.sql
  • 恢复方式三:实现恢复分表备份数据
mysql -uroot -pxxx 库名 </backup/xiaoD_t1.sql
#切换到对应的数据库
mysql>use xiaoD 
mysql>source /backup/xiaoD_t1.sql

物理备份与恢复

备份与恢复原理

备份原理:将数据库数据目录中的所有信息做备份

恢复原理:将备份后的数据目录重新迁移到原有数据库数据目录中,重新启动数据库服务加载

(1)实现物理方式冷备份

备份实践过程:
/etc/init.d/mysql stop
cp -a /data/3306/data/    /bakup/data_2025_08_21
恢复实践过程
/etc/init.d/mysql stop
rm -rf /data/3306/data/*
cp -a  /bakup/data_2025_08_21/*   /data/3306/data/

(2)实现物理方式热备份(xbk)

  • 步骤一:下载xbk工具

      [https://www.percona.com/downloads/](https://www.percona.com/downloads/)
    
  • 麒麟版本选择

  • Centos7.9版本选择

mv percona-xtrabackup-80-8.0.32-26.1.el7.x86_64.rpm/usr/local/
cd /usr/local
yum localinstall -y  percona-xtrabackup-80-8.0.32-26.1.el7.x86_64.rpm
  • 步骤二:实现物理备份与恢复

    方式一:物理全备与恢复

物理备份
mkdir -p /data/backup/full -p   --创建保存物理数据的空目录
xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.51 --user=root --password=1 --port=3306 --backup  --target-dir=/data/backup/full
全备恢复
/etc/init.d/mysqld stop
rm -rf /data/3306/data/*
xtrabackup --prepare --target-dir=/data/backup/full      -- 恢复备份过程中的内存数据
prepare -- 表示先将内存备份数据,恢复回内存中
xtrabackup --copy-back  --target-dir=/data/backup/full   -- 恢复备份过程前的磁盘数据
恢复目录磁盘数据
chown -R mysql.mysql /data/3306/data
/etc/init.d/mysqld start 
-- 恢复数据库服务运行
  • 方式二:物理增量备份与恢复
#增量备份过程
mkdir /data/backup/week01 -p   -- 作为第一周全备数据存储目录
mkdir /data/backup/week02 -p   -- 作为第二周增量数据存储目录
mkdir /data/backup/week03 -p   -- 作为第三周增量数据存储目录

第一周全备
xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.53 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-dir=/data/backup/week01 

第二周增量备份:
create database week02;
use week02
create table t1(id int);
insert into t1 values(1),(2),(3);
commit;
xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.53 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-dir=/data/backup/week02 --incremental-basedir=/data/backup/week01

第三周增量备份:
create database week03;
use week03
create table t1(id int);
insert into t1 values(1),(2),(3);
commit;
xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.53 --user=root --password=123456 --port=3306 --backup --parallel=4 --target-dir=/data/backup/week03 --incremental-basedir=/data/backup/week02
#增量恢复数据
模拟数据库数据损坏

/etc/init.d/mysqld stop
rm -rf /data/3306/data/*

xtrabackup --prepare  --apply-log-only --target-dir=/data/backup/week01
-- 全量数据目录中数据信息恢复到内存中的(不做恢复)
xtrabackup --prepare  --apply-log-only --target-dir=/data/backup/week01 --incremental-dir=/data/backup/week02 
-- 第一次增量备份过程中需要恢复到内存中的数据也做加载
xtrabackup --prepare  --apply-log-only --target-dir=/data/backup/week01 --incremental-dir=/data/backup/week03 
-- 第二次增量备份过程中需要恢复到内存中的数据也做加载
xtrabackup --prepare  --target-dir=/data/backup/week01
-- 将全量和增量备份过程中,需要恢复到内存的数据统一恢复到内存中
--apply-log-only  -- 取消undo日志文件加载过程
以上信息表示将内存信息做整合恢复

xtrabackup --datadir=/data/3306/data --copy-back  --target-dir=/data/backup/week01
以上信息表示将磁盘信息做整合恢复

chown -R mysql.mysql /data/3306/data
/etc/init.d/mysqld start