《数据库》MySQL备份回复
1. MyQL日志管理
1.1 为什么需要日志
用于排错
用来做数据分析
了解程序的运行情况,了解MySQL的性能
1.2 日志作用
在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,就必须保证数据的安全性和完整性,则需要使用日志来查看或者恢复数据。
1.3 日志文件查看方法
由于多种安装mysql的方法可能导致文件存储位置和名称不同,需要先通过mysql配置文件确定错误日志文件位置及名称
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
……
datadir=C:/ProgramData/MySQL/MySQL Server 8.0\Data # 注意此处log-error="LEGION.err" # 注意此处
# 位置:C:\ProgramData\MySQL\MySQL Server 8.0\Data\LEGION.err
1.4 常见日志类型之错误日志
错误日志记录以下信息:
服务器启动和关闭过程中的信息
服务器运行过程中的错误信息
事件调度器运行一个时间是产生的信息
在从服务器上启动从服务器进程是产生的信息
查看本机错误日志
# 查看错误日志位置及文件名,一般以主机名.err方式命名
mysql> SHOW VARIABLES LIKE 'log_error';
+---------------+--------------+
| Variable_name | Value |
+---------------+--------------+
| log_error | .\LEGION.err |
+---------------+--------------+
1 row in set, 1 warning (0.01 sec)
错误日志信息需要注意三类:[System]、[Warning]、[Error]
注意:my.ini中可以用log-error=file_name 选项来指定mysqld保存错误日志文件的位置。
1.5 常见日志类型之通用查询日志
由于数据库一般有多条连接,不一定是本地连接,所以需要记录每个连接客户端的所有操作,包括启动和关闭 MySQL 服务、更新语句和查询语句等,从而产生查询日志
查看设置状态
mysql> show global variables like "%general_log%";
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| general_log | OFF | # 默认关闭
| general_log_file | LEGION.log | # 存储位置
+------------------+------------+
2 rows in set, 1 warning (0.00 sec)
- 启动记录查询日志
mysql> set global general_log=on;mysql> show global variables like "%general_log%";
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| general_log | ON |
| general_log_file | LEGION.log |
+------------------+------------+
2 rows in set, 1 warning (0.00 sec)C:\ProgramData\MySQL\MySQL Server 8.0\Data\LEGION.log# 注意这是临时更改,若永久更改则在my.ini中配置general-log=1,并重启服务
# 注意可以在my.ini中设置general_log_file=路径/文件名 的形式设置永久更改存储位置
- 设置日志记录类型
mysql> show variables like "%log_output%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+# 注意可以在my.ini中设置log-output={TABLE|FILE|NONE}类型
- 注意
- 要启用通用查询日志,需要至少配置general-log=1,log-output={TABLE|FILE}
- general_log_file如果没有指定,默认名是:主机名.log
- 默认通用查询日志是不开启的,因为会消耗大量的磁盘空间、CPU以及内存,所以当需要通过查询日志还原操作场景准确定位问题时可以短时间开启
# 可以通过下面的查询测试查询日志的文件变化
mysql> mysql> use mydb9_stusysmysql> select student.sno,student.sname,student.ssex,student.sage,course.cno,teacher.tno,teacher.tname,score from student,sc,course,teacher where student.sno=sc.sno and sc.cno=course.cno and course.tno=teacher.tno;C:\ProgramData\MySQL\MySQL Server 8.0\Data\LEGION.log # 查看
- 关闭查询日志
mysql> set global general_log=0;mysql> show global variables like "%general_log%";
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| general_log | OFF |
| general_log_file | LEGION.log |
+------------------+------------+
1.6 常见日志类型之慢查询日志
慢日志记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询
解释:若某条查询语句的执行时间过长,超过了设定的阈值则就会记录到慢日志中,可以对其进行后期select语句的优化
查看慢查询日志状态
mysql> show global variables like "%slow_query_log%"; +---------------------+-----------------+ | Variable_name | Value | +---------------------+-----------------+ | slow_query_log | ON | | slow_query_log_file | LEGION-slow.log | +---------------------+-----------------+
开启慢查询日志
mysql> set global slow_query_log=1; # 0为关闭C:\ProgramData\MySQL\MySQL Server 8.0\Data\LEGION-slow.log# 注意:为了服务器调优,建议开启
慢日志的时间阈值
mysql> show global variables like "long_query_time"; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | # 默认10秒最小为0,精度可以到微秒 +-----------------+-----------+
1.7 常见日志类型之撤销日志
Undo-log日志:即撤销日志或回滚日志,Undo即撤销的意思,在日常开发过程中,如果代码敲错了,一般会习惯性的按下
Ctrl+Z
撤销,而Undo-log
的作用也是如此,但它是用来给MySQL
撤销SQL
操作的。Undo-log日志记录内容:
若是
insert
插入操作,则生成一个对应的delete
操作。若是
delete
删除操作,InnoDB
中会修改隐藏字段deleted_bit=1
,则生成改为0
的语句。若是
update
修改操作,如:将性别从男改成了女,则就生成一个从女改回男的操作可以理解为:当一条写入类型的
SQL
执行时,都会在Undo-log
日志中生成相应的反SQL
放入到Undo-log
中
从mysql8.0.20版本开始存储位置:C:\ProgramData\MySQL\MySQL Server 8.0\Data\undo_001
1.8 常见日志类型之重做日志
InnoDB
引擎在设计时是基于磁盘存储数据的,当MySQL
启动后就会在内存中创建一个BufferPool
,运行过程中会将大量操作汇集在内存中进行,比如写入数据时,先写到内存中,然后由后台线程再刷写到磁盘。虽然使用
BufferPool
提升了MySQL
整体的读写性能,但它是基于内存的,也就意味着随着机器的宕机、重启,其中保存的数据会消失,当向内存中写入数据后,MySQL
突然宕机了,则这条未刷写到磁盘的数据会丢失,也正由于该原因,Redo-log
应运而生!Redo-log:重做日志,是一种预写式日志,即在向内存写入数据前,会先写日志,当后续数据未被刷写到磁盘、
MySQL
崩溃时,就可以通过日志来恢复数据,确保所有提交的事务都会被持久化。mysql8中Redo-log存储在C:\ProgramData\MySQL\MySQL Server 8.0\Data#innodb_redo目录下,由32个文件组成有两种类型的redo log文件,一种是当前正在使用的
#ib_redoN
;另一种是空闲的文件名为#ib_redoN_tmp
,多加了个 _tmp 后缀。
mysql> select * from performance_schema.innodb_redo_log_files\G
*************************** 1. row ***************************FILE_ID: 118FILE_NAME: .\#innodb_redo\#ib_redo118START_LSN: 386428928END_LSN: 389703680SIZE_IN_BYTES: 3276800IS_FULL: 0
CONSUMER_LEVEL: 0
mysql> show global status like '%innodb%redo%';
+-------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------+------------+
| Innodb_redo_log_read_only | OFF |
| Innodb_redo_log_uuid | 3813940893 |
| Innodb_redo_log_checkpoint_lsn | 386572482 |
| Innodb_redo_log_current_lsn | 386572482 |
| Innodb_redo_log_flushed_to_disk_lsn | 386572482 |
| Innodb_redo_log_logical_size | 512 |
| Innodb_redo_log_physical_size | 3276800 |
| Innodb_redo_log_capacity_resized | 104857600 |
| Innodb_redo_log_resize_status | OK |
| Innodb_redo_log_enabled | ON |
+-------------------------------------+------------+
1.9 常见日志类型之二进制日志-重要
二进制日志作用:
记录所有更改数据的语句(insert、update、delete等),不记录查询语句
用于主从复制,因为从服务器需要到主服务器里拷贝二进制日志,然后根据二进制日志的内容去执行SQL语句,从而达到主从服务器里的数据一模一样;
用于恢复数据
日志审计的场景:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击(mysql注入攻击:黑客可以提交一段数据库查询代码,根据程序返回的结果,获得某些想要得到的数据)
查看二进制日志状态
- 日志查看
# 查看有哪些二进制日志文件:
mysql> show binary logs; # 显示名称、容量单位字节、加密与否# 查看当前正在使用的是哪一个二进制日志文件
mysql> show master status;# 查看二进制日志内容:
mysql> show binlog events in "LEGION-bin.000008";
# 使用命令mysqlbinlog查看二进制日志内容
# 打开命令提示符
C:\Users\Administrator>cd C:\ProgramData\MySQL\MySQL Server 8.0\DataC:\ProgramData\MySQL\MySQL Server 8.0\Data>mysqlbinlog LEGION-bin.000008 > test.sql
- 分割日志:新的操作会记录新的日志文件中
PS C:\Users\Administrator> mysqladmin flush-logs -u root -p
Enter password: ******PS C:\Users\Administrator> mysql -u root -p
Enter password: mysql> create database mydb12_journal; # 新建数据库mysql> show master status;# 打开命令提示符
C:\Users\Administrator>cd C:\ProgramData\MySQL\MySQL Server 8.0\DataC:\ProgramData\MySQL\MySQL Server 8.0\Data>mysqlbinlog LEGION-bin.00000?
- 日志刷新
作用:通过刷新日志进行更新日志,对缓存数据进行磁盘I/O,并强制 mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)
由于日志的记录不是直接写入日志文件中而是使用日志缓存的方式,当频繁执行多条修改的sql语句时,为了避免对磁盘频繁I/O,会将日志记录写入到内存的特殊空间即日志缓存中,之后每隔一个固定时间间隔将缓存的日志写入到磁盘文件中
刷新日志命令格式
mysql> flush logs # 会产生新日志文件
mysql> show master status;
# 在shell中,通过mysqladmin命令执行日志刷新:
mysqladmin flush-logs -u 账户名 -p
mysqladmin refresh -u 账户名 -p
PS C:\Users\Administrator> mysqladmin flush-logs -uroot -p
Enter password: ******PS C:\Users\Administrator> mysql -u root -p
Enter password: ******
mysql> show master status;
不小心删库后应该跑路吗?
如果在线上真的删库了,哪就先别想着跑路,你跑不掉!
bin-log
日志中会记录执行SQL
的连接会话信息,同时一般规模较大的企业,都会搭建完善的监控系统,会监控服务的网络连接因此当你删库后,他们可以顺着
bin-log → session → network-connection
这条线确定执行删库SQL
的IP
!如果你还未断开连接,直接通过MySQL
的命令就能定位到删库的IP
,因此基本上删库了,是可以定位到责任人的!因此当你删库后,可以直接去本地找
Bin-log
的日志文件,然后拷贝出来一份,再打开最后一个文件,把里面删库的记录手动移除,再利用mysqlbinlog
工具导出xx.SQL
文件,最后执行该SQL
文件即可恢复删库前的数据。
1.10 常见日志类型之中继日志
Relay-log:中继日志,在单库中是见不到的,该类型的日志仅存在主从架构中的从机上
主从架构中的从机,其数据基本上都是复制主机
bin-log
日志同步过来并放在relay-log
日志中,中继日志的作用就跟它的名字一样,仅仅只是作为主从同步数据的“中转站”。
2. MySQL备份
2.1 备份类型
根据服务器状态,可以分为热备份、温备份、冷备份
热备份:读、写不受影响
温备份:仅可以执行读操作
冷备份:离线备份;读、写操作均中止
从对象来分,可以分为物理备份与逻辑备份
物理备份:复制数据文件
逻辑备份:将数据导出至文本文件中
从数据收集来分,可以完全备份、增量备份、差异备份
完全备份:备份全部数据;
增量备份:仅备份上次完全备份或增量备份以后变化的数据;
差异备份:仅备份上次完全备份以来变化的数据;
2.2 逻辑备份优缺点
在备份速度上两种备份要取决于不同的存储引擎
物理备份的还原速度非常快。但是物理备份的最小粒度只能做到表
逻辑备份保存的结构通常都是纯ASCII的,所以我们可以使用文本处理工具来处理
逻辑备份有非常强的兼容性,而物理备份则对版本要求非常高
逻辑备份也对保持数据的安全性有保证
逻辑备份的缺点:
逻辑备份要对RDBMS产生额外的压力,而裸备份无压力
逻辑备份的结果可能要比源文件更大。所以很多人都对备份的内容进行压缩
逻辑备份可能会丢失浮点数的精度信息
2.3 备份内容
数据文件
日志文件(比如事务日志,二进制日志)
存储过程,存储函数,触发器
配置文件(十分重要,各个配置文件都要备份)
用于实现数据库备份的脚本,数据库自身清理的Crontab等……
2.4 备份工具
MySQL自带的备份工具--mysqldump,是mysql数据库管理系统,自带的逻辑备份工具,支持完全备份+增加备份,速度相对较慢,适合中小型数据库支持所有引擎,备份策略:第一次完全备份,每天一次增量备份,每周再做一次完全备份,如此一直重复
全备语法
mysqldump -u用户名 --password=密码 -A > 绝对路径\备份文件.sql
备份库和表语法
mysqldump -u用户名 --password=密码 数据库名 表1 表2 > 绝对路径\备份文件.sql
示例1:使用mysqldump工具实现全量备份
# 原理:必须先做全量备份,使得数据库有一个基准还原点,在做增量备份,还原差异数据# 注意:在命令提示符中处理,不要在powershell中
mysql>\q# 切换到命令提示符终端,完成全备
C:\Users\Administrator> mysqldump -u root --password=123456 -A > C:\back1.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure. # 警告表示将密码显示在屏幕上不安全,备份的盘符一定要和MySQL安装目录在同一个盘符中,要不然会提示:拒绝访问# 切换终端到mysql
C:\Users\Administrator> mysql -uroot -p
Enter password: ******mysql> drop database mydb1_test; # 删库跑路mysql> drop database mydb2_stuinfo;
……mysql> show databases; # 查看数据库mysql> source C:\back1.sql # 全库恢复
- 示例2:局部备份恢复
# 注意:在命令提示符中处理,不要在powershell中
mysql>\q# 切换到命令提示符终端,完成全备
C:\Users\Administrator> mysqldump -u root --password=123456 -B mydb1_test > C:\back2.sql# 切换终端到mysql
C:\Users\Administrator> mysql -uroot -p
Enter password: ******mysql> drop database mydb1_test; # 删库跑路# 开始恢复
mysql> create database mydb1_test; # 需要先创建待恢复的数据库mysql> use mydb1_test;mysql> source C:\back2.sqlmysql> show tables; # 查看,已还原mysql> select * from t1 ; # 查看表# 退出后切换回powershell
文件系统备份工具
cp命令, 冷备份,支持所有引擎,复制命令,只能实现冷备,物理备份。使用归档工具,cp命令,对其进行备份的,备份速度快,还原速度几乎最快,但是灵活度很低,可以跨系统,但是跨平台能力很差。
lvm 几乎是热备份,支持所有引擎,基于快照(LVM,ZFS)的物理备份,速度非常快,几乎是热备。只影响数据几秒钟而已。但是创建快照的过程本身就影响到了数据库在线的使用,所以备份速度比较快,恢复速度比较快,没有什么弹性空间,而且LVM的限制:不能对多个逻辑卷同一时间进行备份,所以数据文件和事务日志等各种文件必须放在同一个LVM上。而ZFS则非常好的可以在多逻辑卷之间备份。
其它工具
ibbackup 商业工具 MyISAM是温备份,InnoDB是热备份 ,备份和还原速度都很快,这个软件它的每服务器授权版本是5000美元
xtrabackup 开源工具 MyISAM是温备份,InnoDB是热备份 ,是ibbackup商业工具的替代工具
mysqlbackup ORACLE公司也提供了针对企业的备份软件MySQL Enterprise Backup简称:mysqlbackup。