程序员社区

MySQL日志管理、备份与恢复

Hello,欢迎来到程序员社区。 今天聊一聊 MySQL日志管理、备份与恢复,希望对大家有所帮助。

Java面试手册PDF下载:点击下载最全Java面试手册

                

目录

  • 前言
  • 一、MySQL 日志管理
    • 1.1 MySQL的日志分类
    • 1.2 MySQL的日志开启与配置
    • 1.3 进入数据库里查看相对应的日志是否开启
  • 二、MySQL 备份与恢复
    • 2.1 为什么要数据备份?
    • 2.2 数据库备份的分类
      • 2.2.1 从物理与逻辑的角度分类
      • 2.2.2 从数据库的备份策略角度分类
    • 2.3 常见的备份方法
    • 2.4 MySQL 完全备份
    • 2.5 物理备份之:冷备份、与恢复
    • 2.6 mysqldump 工具 备份与恢复
      • 2.6.1 完全备份一个、多个、所有完整的库
      • 2.6.2 完全备份指定库中的部分表
      • 2.6.3 查看SQL文件中的内容
      • 2.6.4 可添加定时任务备份
    • 2.7 MySQL 完全恢复(使用 mysqldump 备份的 sql 文件)
      • 2.7.1 恢复数据库
      • 2.7.2 恢复数据表
  • 三、MySQL 增量备份与恢复
    • 3.1 MySQL 增量备份
      • 3.1.1 开启二进制日志功能(修改配置文件)
      • 3.1.2 执行 flush-logs 生成新的、空的 二进制日志文件
      • 3.1.3 查看二进制日志文件的内容
      • 3.1.4 验证二进制日志内容
    • 3.2 MySQL 增量恢复
      • 3.2.1 一般增量恢复
      • 3.2.2 断点增量恢复

前言

一、MySQL 日志管理

  • MySQL 的日志默认保存位置为 /usr/local/mysql/data 下:

MySQL日志管理、备份与恢复插图
表、库的信息也在 data 目录下。

1.1 MySQL的日志分类

  • 错误日志:error-log;
  • 通用查询日志:general_log;
  • 二进制日志:log-bin;
  • 慢查询日志:slow_query_log。

1.2 MySQL的日志开启与配置

可以修改 MySQL 的配置文件 /etc/my.cnf 进行永久性修改,重启服务生效。

vim /etc/my.cnf

[mysqld]
#【错误日志】,用来记录当MySQL启动、停止或运行时发生的错误信息,
#【错误日志】默认是开启的

#指定【错误日志】的 保存位置和文件名
log-error=/usr/local/mysql/data/mysql_error.log

#【通用查询日志】,用来记录MySQL的所有连接和语句
#【通用查询日志】默认是关闭的

general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

#【二进制日志】(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复。
#【二进制日志】默认已开启
log-bin=mysql-bin        #也可以 log_bin=mysql-bin

#【慢查询日志】,用来记录所有执行时间超过 long_query_time 秒的语句,可以找到哪些查询语句执行时间长,以便于优化;
#【慢查询日志】默认是关闭的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5  

#设置超过5秒执行的语句被记录,缺省时为10

#重启mysql 服务使其生效
systemctl restart mysqld.service 

修改前:
MySQL日志管理、备份与恢复插图1
修改配置文件中,日志的开启状态和日志的文件位置:
MySQL日志管理、备份与恢复插图2
重启服务
MySQL日志管理、备份与恢复插图3
验证:

1.3 进入数据库里查看相对应的日志是否开启

#查看通用查询日志是否开启
show variables like 'general%';

MySQL日志管理、备份与恢复插图4

查看二进制日志是否开启
show variables like 'log_bin%';

MySQL日志管理、备份与恢复插图5

#查看慢查询日志功能是否开启
show variables like '%slow%';

#查看慢查询时间设置
show variables like 'long_query_time';

MySQL日志管理、备份与恢复插图6

#在数据库中设置开启慢查询的方法
set global slow_query_log=ON;

ls /usr/local/mysql/data/
MySQL日志管理、备份与恢复插图7

二、MySQL 备份与恢复

2.1 为什么要数据备份?

  • 备份的主要目的是灾难恢复,在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。
  • 造成数据丢失的原因:程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃等。

2.2 数据库备份的分类

2.2.1 从物理与逻辑的角度分类

(1)物理备份

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

物理备份的方法

  • 冷备份(脱机备份):是在关闭数据库的时候进行的
  • 热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
  • 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作

(2)逻辑备份

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

2.2.2 从数据库的备份策略角度分类

(1)完全备份

  • 每次对数据库进行完整的备份;

(2)差异备份

  • 备份自从上次完全备份之后,被修改过的文件;

(3)增量备份

  • 只有在上次完全备份或者增量备份后被修改的文件才会被备份。

工作中通常使用 一次完全备份(如每月一次) 和 多次增量备份 结合使用。

2.3 常见的备份方法

物理冷备

  • 备份时数据库处于关闭状态,直接打包数据库文件;
  • 备份速度快,恢复时也是最简单的;

**专用备份工具 m编程电子书汇总ydump 或 mysqlhotcopy **

  • mysqldump常用的逻辑备份工具;
  • mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表;

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

  • 进行增量备份,需要刷新二进制日志;

第三方工具备份

  • 如:免费的 MySQL 热备份软件 Percona XtraBackup;

常用备份方式有:物理打包备份,还有 mysqldump 工具备份。

2.4 MySQL 完全备份

  • 完全备份是对整个数据库、数据库结构和文件结构的备份;保存的是备份完成时刻的数据库;是差异备份与增量备份的基础;

  • 优点:备份与恢复操作简单方便(就是压缩、解压缩、替换的过程)

  • 缺点:数据存在大量的重复、占用大量的备份空间、备份与恢复时间长;

完全备份分类:

(1)物理冷备份与恢复

  • 关闭MySQL数据库;
  • 使用tar命令直接打包数据库文件夹;
  • 直接替换现有MySQL目录即可;

(2)mysqldump备份与恢复

  • MySQL自带的备份工具,可方便实现对MySQL的Java面试手册备份;
  • 可以将指定的库、表导出为 .SQL脚本文件;
  • 使用mysql命令 导入备份的数据;

2.5 物理备份之:冷备份、与恢复

冷备份就是 停止 mysql 服务后,再进行备份;
热备份就是 mysql 在服务中就进行备份;

物理冷备份与恢复

systemctl stop mysqld

#xz 也是一个压缩工具,J:压缩,压缩文件结尾用 xz
yum -y install xz       
#压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/
#解压恢复
tar Jxvf /opt/mysql_all_2021-02-05.tar.xz -C /usr/local/mysql/data

systemctl start mysqld

/usr/lcoal/mysql/data 目录中
.ibd 是数据文件
.frm 是表结构文件

MySQL日志管理、备份与恢复插图8
MySQL日志管理、备份与恢复插图9
MySQL日志管理、备份与恢复插图10
恢复后,发现备份前的库、数据、日志 文件都还在。

2.6 mysqldump 工具 备份与恢复

备份通过保存 SQL 语句,恢复时再执行 保存的 SQL 语句覆盖恢复;

mysqldump 是数据库的备份工具

2.6.1 完全备份一个、多个、所有完整的库

#导出的备份文件就是数据库脚本 SQL 文件
语法:
mysqldump -u root -p[密码] --databases 库名1 [库名2]  > /备份路径/备份文件名.sql
例:
#完全备份一个库
mysqldump -u root -p --databases STARBUCKS > /opt/STARBUCKS.sql

#完全备份多个库,空格隔开
mysqldump -u root -p --databases STARBUCKS LUCKY > /opt/STARBUCKS-LUCKY.sql

#完全备份 MySQL 服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/ALL_DATABASES.sql

MySQL日志管理、备份与恢复插图11

2.6.2 完全备份指定库中的部分表

格式编程电子书汇总
mysqldump -u root -p[密码] [-d] 库名 [表名1] [表名2]  > /备份路径/备份文件名.sql

#使用“ -d ”选项,只保存数据库的表结构
#不使用“ -d ”选项,表结构和表数据都进行备份
例:
mysqldump -u root -p STARBUCKS member > /opt/STARBUCKS_member.sql

MySQL日志管理、备份与恢复插图12

2.6.3 查看SQL文件中的内容

#去除注释行、空行

cat /opt/文件名.sql |grep -v "^--" | grep -v "^/" | grep -v "^$"

MySQL日志管理、备份与恢复插图13

2.6.4 可添加定时任务备份

#使用crontab 计划性任务来执行;每周6凌晨1点进行完整备份
crontab -e
0 1 * * 6 mysqldump -u root -p --all-databases > /opt/STARBUCKS_$(date +%F).sql

2.7 MySQL 完全恢复(使用 mysqldump 备份的 sql 文件)

2.7.1 恢复数据库

#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出,就不用登录Mysql界面敲命令了

#我们用删掉库 STARBUCKS , 用上面保存的 STARBUCKS_bak.sql 进行恢复(及时执行sql语句)
mysql -u root -p -e 'DROP DATABASE STARBUCKS;'
mysql -u root -p -e 'show databases;'

#恢复(重新执行这个库的sql脚本)
mysql -u root -p  /opt/STARBUCKS_bak.sql
mysql -u root -p -e 'show databasJava面试手册es;

MySQL日志管理、备份与恢复插图14
MySQL日志管理、备份与恢复插图15

2.7.2 恢复数据表

数据库存在,其中的表被删除了,可以通过表的备份 sql 文件进行恢复(就是执行表的sql语句)。

mysql -u root -p -e 'drop table STARBUCKS.member;'
mysql -u root -p -e 'USE STARBUCKS;SHOW TABLES;'

mysql -u root -p STARBUCKS  /opt/STARBUCKS_member.sql
mysql -u root -p -e 'show tables from STARBUCKS;'

MySQL日志管理、备份与恢复插图16
MySQL日志管理、备份与恢复插图17

三、MySQL 增量备份与恢复

3.1 MySQL 增量备份

3.1.1 开启二进制日志功能(修改配置文件)

修改mysql 配置文件后要重启服务。

vim /etc/my.cnf

[mysqld]
server-id = 1

log-bin=mysql-bin
binlog_format = MIXED                #指定二进制日志(binlog)的记录格式为 MIXED

#二进制日志(binlog)3种不同的记录格式:
STATEMENT(基于SQL语句)  #默认格式是STATEMENT
ROW(基于行)
MIXED(混合模式)

systemctl restart mysqld.service

#查看生成的二进制日志文件
ls -l /usr/local/mysql/data/mysql-bin.*

MySQL日志管理、备份与恢复插图18

3.1.2 执行 flush-logs 生成新的、空的 二进制日志文件

mysqladmin -u root -p flush-logs

生成的文件是空的,执行语句后才会记录在这个新日志文件中

MySQL日志管理、备份与恢复插图19

3.1.3 查看二进制日志文件的内容

由于 mysql-bin 文件中都是通过 base64 编码过的内容,不能直接阅读,所以需要进行转码。

cp /usr/local/mysql/data/mysql-bin.000006 /opt/

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

#--base64-output=decode-rows:使用base64编码机制去解码并按行读取
#-v:显示详细内容

MySQL日志管理、备份与恢复插图20

3.1.4 验证二进制日志内容

INSERT INTO </span><span class="token variable">STARBUCKS</span><span class="token punctuation">.</span><span class="token variable">USER_MESG</span><span class="token punctuation"> VALUES (1010, '饼干', '食品', '2021-06-28', '50', '在用');
INSERT INTO </span><span class="token variable">STARBUCKS</span><span class="token punctuation">.</span><span class="token variable">USER_MESG</span><span class="token punctuation"> VALUES (1011, '橙汁', '饮料', '2021-06-29', '10', '已过期');

MySQL日志管理、备份与恢复插图21
插入完成后,执行 mysqladmin -u root -p flush-logs,新生成 mysql-bin.000007,解码 00007 ,发现执行的 两条 INSERT 语句不在 0007 日志文件中,而在 00006 日志文件中。
MySQL日志管理、备份与恢复插图22
所以说 flush-logs 执行后,会生成一个新的空的 二进制日志文件,之后再执行 INSERT 等语句才会记录在其中。

3.2 MySQL 增量恢复

3.2.1 一般增量恢复

根据上面 3.1 中生成的二进制文件中的内容,进行恢复。

  • 模拟的是进行 增量备份恢复,二进制日志文件中记录的是 增量的SQL语句,恢复的时候也是执行的增量SQL。
mysql -u root -p

delete from STARBUCKS.USER_MESG where id in (1010,1011);
select * from class;
quit

#将二进制日志中的数据导入到数据库中
mysqlbinlog --no-defaults /opt/mysql-bin.000006 | mysql -u root -p

mysql -u root -pabc123 -e 'SELECT * FROM STARBUCKS.USER_MESG;'

MySQL日志管理、备份与恢复插图23
MySQL日志管理、备份与恢复插图24

  • 也可以删除整个库后,先执行完全备份的SQL 脚本文件,再执行需要执行的增量二进制日志文件。

3.2.2 断点增量恢复

看图,二进制日志文件中,有 at 后面跟着日志记录的位置,也有时间。
MySQL日志管理、备份与恢复插图25
(1)基于位置恢复

如:仅恢复到位置点为“ at 299”之前的数据

恢复到哪一行为止:--stop-position='at 值'

#模拟数据丢失
mysql -uroot -pabc123 -e "DELETE FROM STARBUCKS.USER_MESG WHERE ID IN (1010,1011);"
mysql -uroot -pabc123 -e "SELECT * FROM STARBUCKS.USER_MESG;"

#到位置点649停止恢复数据
mysqlbinlog --no-defaults --stop-position='649' /opt/mysql-bin.000006 | mysql -u root -pabc123

mysql -uroot -pabc123 -e "SELECT * FROM STARBUCKS.USER_MESG;"

MySQL日志管理、备份与恢复插图26
MySQL日志管理、备份与恢复插图27
从哪一行开始恢复:--start-position='at 值'

#模拟数据丢失
mysql -uroot -pabc123 -e "DELETE FROM STARBUCKS.USER_MESG WHERE ID IN (1010,1011);"

#从位置点649开始恢复
mysqlbinlog --no-def编程电子书汇总aults --start-position='649' /opt/mysql-bin.000006 | mysql -u root -pabc123

mysql -uroot -pabc123 -e "SELECT * FROM STARBUCKS.USER_MESG;"

MySQL日志管理、备份与恢复插图28

#当然 --start-position  --stop-position 可以一起使用

mysql -uroot -pabc123 -e "DELETE FROM STARBUCKS.USER_MESG WHERE ID IN (1010,1011);"

mysqlbinlog --no-defaults --start-position='299' --stop-position='857' /opt/mysql-bin.000006 | mysql -u root -pabc123

两条就都新增了,注意 日志文件是通过事务执行的,不仅要包含 BEGIN 也要包含 COMMIT 的行才能新增成功。

(1)基于时间点恢复

  • 仅恢复到 210628 14:53:05 之前的数据,即不恢复 id=1011 的数据。
#模拟数据丢失
mysql -uroot -pabc123 -e "DELETE FROM STARBUCKS.USER_MESG WHERE ID IN (1010,1011);"

#到2021-06-28 14:53:05截止恢复数据
mysqlbinlog --no-defaults --stop-datetime='2021-06-28 14:53:05' /opt/mysql-bin.000006 | mysql -uroot -pabc123

#查看表中数据
mysql -uroot -pabc123 -e "SELECT * FROM STARBUCKS.USER_MESG;"

MySQL日志管理、备份与恢复插图29

和根据位置恢复数据一样,也可以 从某个时间点进行恢复,也可恢复到某个时间点为止。

mysqlbinlog --no-defaults --start-datetime='2021-06-28 14:53:05' /opt/mysql-bin.000006 | mysql -uroot -pabc123

> 时间不一定能证明很多东西,但是一定能看透很多东西。坚信自己的选择,不动摇,使劲跑,明天会更好。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » MySQL日志管理、备份与恢复

一个分享Java & Python知识的社区