文章目录
一、MySQL日志管理
MySQL的日志默认保存位置为:/usr/local/mysql/data下
配置文件位于:/etc/my.cnf文件中的[mysqld]内
错误日志
log-error=/usr/local/mysql/data/mysql_error.log
用来记录当MySQL启动、停止或运行时发生的错误信息,默认开启
通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
用来记录MySQL的所有连接和语句,默认是关闭的
二进制日志
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 单位时间为s,缺省时为10s(一般设置为1或0.5)

systemctl restart mysqld
sql_mode=""
[mysql]
auto-rehash
# sql_mode="" 关闭 ONLY_FULL_GROUP_BY 模式
# auto-rehash 自动补全

二、数据备份
1. 备份类型
从物理与逻辑的角度分类(逻辑备份、物理备份)
1.逻辑备份是对数据库逻辑组件(如表等数据库对象)的备份,表及数据库结构(CREATEDATABASE,CREATETABLEia)和内容(INSERT语句或分隔文本文件)的信息。
2.逻辑备份适用于可以编辑数据值或表结构较小的数据量,或者在不同的机器体系结构上重新创建数据
3.物理备份是对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。
4.物理备份适用于在出现问题时需要快速恢复的大型重要数据库。
5.物理备份又可以分为冷备份(脱机备份)、热备份(联机备份)和温备份。
冷备份:在数据库关闭状态下进行备份操作。(tar)
热备份:在数据库处于运行状态时进行备份操作,该备份方法依赖数据库的日志文件。(mysqldump)
温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。
2.从数据库的备份策略角度分类(完全备份、差异备份、增量备份)
从数据库的备份策略角度,数据库的备份可分为完全备份、差异备份和增量备份(面试点)。
完全备份:每次对数据进行完整的备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础。完全备份的备份与恢复操作都非常简单方便,但是数据存在大量的重复,并且会占用大量的磁盘空间,备份的时间也很长。
差异备份:备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份数据量会越来越大。恢复数据时,只需恢复上次的完全备份与最近的一次差异备份。
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次完整备份或上次增量备份的时间为时间点,仅备份这之间的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份开始到最后一次增量备份之的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失。
3.备份方法
数据库的备份可以采用很多种方式,如直接打包数据库文件(物理冷备份)、专用备份工具(mysqldump)、二进制日志增量备份、第三方工具备份等。
物理冷备份
物理冷备份时需要在数据库处于关闭状态下,能够较好地保证数据库的完整性。
物理冷备份一般用于非核心业务,这类业务一般都允许中断。
物理冷备份的特点就是速度快,恢复时也是最为简单的。
通常通过直接打包数据库文件夹(/usr/local/mysql/data)来实现备份。
专用备份工具 mysqldump 或 mysqlhotcopy
mysqldump程序和mysqlhotcopy都可以做备份。
mysqldump是客户端常用逻辑备份程序,能够产生一组被执行以后再现原始数据库对象定义和表数据的SQL语句。它可以转储一个到多个MySQL数据库,对其进行备份或传输到远程SQL服务器。mysqldump更为通用,因为它可以备份各种表。
mysqlhotcopy仅适用于某些存储引擎(MyISAM和ARCHIVE)。
通过启用二进制日志进行增量备份
支持增量备份,进行增量备份时必须启用二进制日志。
二进制日志文件为用户提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复。
如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改) ,需要刷新二进制日志。
通过第三方工具备份
第三方工具Percona xtraBackup是一个免费的MysQL热备份软件,支持在线热备份Innodb和xtraDB,也可以支持MySQL表备份,不过MyISAM表的备份要在表锁的情况下进行。
三、MySQL完全备份与恢复
1.物理冷备份与恢复
systemctl stop mysqld
yum -y install xz
#压缩备份
#/usr/local/mysql/data/,如果是编译安装,路径有可能为这个
tar jcvf /opt/mysql_all_$(date +%F).tar.xz /var/lib/mysql/
#移除原先数据文件
cd /var/lib/
mv mysql /opt/
#解压恢复
tar jxvf /opt/mysql_all_2024-09-02.tar.xz -C /var/lib/
cd /var/lib/var/lib
mv mysql/ /var/lib/
systemctl start mysqld
2.mysqldump 完全备份与恢复(温备份)
mysqldump -u root -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql
#导出的就是数据库脚本文件
mysqldump -u root -p --databases yy y1 > /opt/yy-yy1.sql #备份yy与y1两个库
当备份时不加 --databases,表示针对yy库下的所有表
mysqldump -uroot -p1234 yy > /opt/yy.sql
完全备份 MySQL 服务器中所有的库
mysqldump -u root -p --all-databases > /opt/all.sql
完全备份指定库中的部分表
#备份yy库中的yy1和yy2表
mysqldump -u root -p yy yy1 yy2 > /opt/yyinfo.sql
查看备份文件
grep -v "^--" /opt/yyinfo.sql | grep -v "^/" | grep -v "^$"

3.恢复数据库
方法一:source恢复
使用mysqldump导出的文件,可使用导入的方法
source命令 进入数据库
mysql> source /opt/yyinfo.sql ------>备份文件路径
登录到MySQL数据库,执行source备份sql脚本的路径


mysql -uroot -p1234 < /opt/yy-yy1.sql

4.在生产环境中,可以使用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 增量备份与恢复
生成的二进制日志是空的,只记录新的操作
一般恢复
将所有备份的二进制日志内容全部恢复
基于位置恢复
数据库在某一时间点可能既有错误的操作也有正确的操作
可以基于精准的位置跳过错误的操作
发生错误节点之前的一个节点,上一次正确操作的位置点停止
基于时间点恢复
跳过某个发生错误的时间点实现数据恢复
在错误时间点停止,在下一个正确时间点开始
开启二进制日志功能
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED
#可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
server-id = 1
#可加可不加该命令
systemctl restart mysqld

1.二进制日志(binlog)的3种不同的记录格式
STATEMENT (基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
① STATEMENT(基于SQL语句)
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
② ROW(基于行)
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update…set…where true 那么binlog的数据量会越来越大
③ MIXED 推荐使用
一般的语句使用statement,函数使用ROW方式存储。
cp /var/lib/mysql/mysql-bin.000003 /opt/
mysqlbinlog --no-defaults /opt/mysql-bin.000003 或
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000003
#--base64-output=decode-rows:使用64位编码机制去解码(decode)并按行读取(rows)
#-v: 显示详细内容
#--no-defaults : 默认字符集(不加会报UTF-8的错误)
PS: 可以将解码后的文件导出为txt格式,方便查阅
二进制日志中需要关注的部分
1、at :开始的位置点
2、end_log_pos:结束的位置
3、时间戳: 210712 11:50:30
4、SQL语句
2.增量备份过程(全备+增备)
使用mysqldump
可每天进行增量备份操作,生成新的二进制日志文件(例如:mysql-bin.000006)
#生成新的二进制日志文件
mysqladmin -u root -p flush-logs
进行完全备份(增量备份时基于完全备份的,所以我们直接完全备份数据库)
mysqldump -uroot -p1234 yy yy1 > /opt/school_info1_$(date +%F).sql
mysqldump -uroot -p1234 yy > /opt/school_all_$(date +%F).sql
可每天进行增量备份操作,生成新的二进制日志文件(例如:mysql-bin.000006)
mysqladmin -uroot -p1234 flush-logs

3.一般恢复(完全备份恢复):
1.创建数据库表

2.备份数据库yy

3.删除yy库中的yy表

4.恢复数据


4.一般恢复(基于二进制日志恢复):
1.先刷新二进制日志

2.创建表aaa(会写进新创建的二进制日志里)

3.再次刷新二进制日志(防止删除操作进入上一个日志里)

4.使用二进制日志恢复数据

5.查看aaa表数据恢复

5.断点恢复(位置恢复)
1.模拟数据误删除

2.基于位置恢复数据
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#也可单独指定start或者stop位置
mysqlbinlog --no-defaults --start-position='724' --stop-position='1149' mysql-bin.000002 | mysql -uroot -p1234

3.查看数据已经恢复

5.断点恢复(时间恢复)
#也可单独指定start或者stop位置
mysqlbinlog --no-defaults --start-datetime='2024-09-15 03:11:10' --stop-datetime='2024-09-15 03:11:24' mysql-bin.000002 | mysql -uroot -p1234

数据已恢复

697

被折叠的 条评论
为什么被折叠?



