MySQL日志管理、备份与恢复

目录

日志管理

数据库备份和恢复

备份方法

备份策略

MySQL完全备份与恢复

MySQL完全备份

物理冷备份与恢复

[mysqldump 备份与恢复](#mysqldump 备份与恢复)

1.完全备份一个或多个完整的库

2.完全备份MySQL服务器中所有的库

​编辑3.完全备份指定库中的部分表

4.查看备份文件

MySQL完全恢复

1.恢复数据库

2.恢复数据表

完全备份脚本

MySQL增量备份与恢复

MySQL增量备份

1.开启二进制日志功能

2.可每周对数据库或表进行完全备份

3.可每天进行增量备份操作,生成新的二进制日志文件

4.插入新数据,以模拟数据的增加或变更

5.再次生成新的二进制日志文件

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

MySQL增量恢复

1.一般恢复

2.断点复恢


日志管理

  • MySQL 的日志默认保存位置为 /usr/local/mysql/data
bash 复制代码
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秒

systemctl restart mysqld

bash 复制代码
show variables like 'general%';			  #查看通用查询日志是否开启
show variables like 'log_bin%';			  #查看二进制日志是否开启
show variables like '%slow%';			  #查看慢查询日功能是否开启
show variables like 'long_query_time';	  #查看慢查询时间设置
set global slow_query_log=ON;             #在数据库中设置开启慢查询的方法

数据库备份和恢复

备份方法

  • 物理备份:直接对数据库的物理文件(数据文件、日志文件等)进行备份
  • 逻辑备份:对数据库的库和表对象以SQL语言的形式导出进行备份

备份策略

  1. 完全备份:每次备份都备份完整的库或者表数据
  2. 差异备份:只备份上一次完全备份后的更新数据
  3. 增量备份:每次备份只备份上一次完全备份或增量备份后的更新数据

数据库上云迁移 冷迁移 物理冷备 先关闭数据库,再打包备份+恢复
热迁移 阿里云 DTS

MySQL完全备份与恢复

例:

bash 复制代码
use ybc;
create table if not exists ccc (id int(4) not null auto_increment,name varchar(10) not null,sex char(10) not null,hobby varchar(50),primary key (id));
##创建一个表格

insert into ccc values(1,'user1','male','running');
insert into ccc values(2,'user2','female','singing');

MySQL完全备份

  • InnoDB存储引擎的数据库在磁盘上存储成三个文件:db.opt(表属性文件)、表名.frm(表结构文件)、表名.ibd(表数据文件)。

物理冷备份与恢复

bash 复制代码
systemctl stop mysqld
tar cf /opt/mysql_all_$(date +%F).tar.gz /usr/local/mysql/data/

解压恢复

bash 复制代码
mv /usr/local/mysql/data/ ~
tar xf /opt/mysql_all_2023-12-26.tar.gz
mv /opt/usr/local/mysql/data/ /usr/local/mysql/

mysqldump 备份与恢复

1.完全备份一个或多个完整的库
bash 复制代码
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql	
#导出的就是数据库脚本文件

例:
mysqldump -u root -p --databases ybc > /opt/ybc.sql
mysqldump -u root -p --databases mysql ybc > /opt/mysql-ybc.sql
2.完全备份MySQL服务器中所有的库
bash 复制代码
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql
3.完全备份指定库中的部分表
bash 复制代码
mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql

例:
mysqldump -u root -p [-d] ybc ccc cc > /opt/ybc_backup.sql
#使用"-d"选项,说明只保存数据库的表结构
#不使用"-d"选项,说明表数据也进行备份

4.查看备份文件
bash 复制代码
grep -v "^--" /opt/ybc_backup.sql | grep -v "^/" | grep -v "^$"

MySQL完全恢复

1.恢复数据库

bash 复制代码
mysql -u root -p -e 'drop database ybc;'
#"-e"选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'SHOW DATABASES;'

mysql -u root -p < /opt/ybc.sql
mysql -u root -p -e 'SHOW DATABASES;'

2.恢复数据表

  • 当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
bash 复制代码
mysqldump -u root -p ybc ccc > /opt/ybc_ccc.sql

mysql -u root -p -e 'drop table ybc.ccc;'
mysql -u root -p -e 'show tables from ybc;'

mysql -u root -p ybc < /opt/ybc_ccc.sql
mysql -u root -p -e 'show tables from ybc;'

完全备份脚本

bash 复制代码
#!/bin/bash
#完全备份mysql数据库

USENAME=root
PASSWORD=
TODAY=$(date +%F)
 
/usr/local/mysql/bin/mysqldump -u"$USENAME" -p"$PASSWORD" --all-databases > /opt/backup/all-${TODAY}.sql
/usr/local/mysql/bin/mysqldump -u"$USENAME" -p"$PASSWORD" --databases ybc  > /opt/backup/ybc-${TODAY}.sql

MySQL增量备份与恢复

MySQL增量备份

1.开启二进制日志功能
bash 复制代码
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED			#可选,指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1

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

systemctl start mysqld
ls -l /usr/local/mysql/data/mysql-bin.*

2.可每周对数据库或表进行完全备份
bash 复制代码
mysqldump -u root -p ybc ccc > /opt/ybc_ccc_$(date +%F).sql
mysqldump -u root -p --databases ybc > /opt/ybc_$(date +%F).sql
3.可每天进行增量备份操作,生成新的二进制日志文件
bash 复制代码
mysqladmin -u root -p flush-logs
4.插入新数据,以模拟数据的增加或变更
bash 复制代码
use ybc;
insert into ccc values(3,'user3','male','game');
insert into ccc values(4,'user4','female','reading');
5.再次生成新的二进制日志文件
bash 复制代码
mysqladmin -u root -p flush-logs

#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000004文件中
6.查看二进制日志文件的内容
bash 复制代码
cp /usr/local/mysql/data/mysql-bin.000004 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000004

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

MySQL增量恢复

1.一般恢复

(1)模拟丢失更改的数据的恢复步骤

bash 复制代码
use ybc;
delete from ccc where id=5;

mysqlbinlog --no-defaults /opt/mysql-bin.000007 | mysql -u root -p

(2)模拟丢失所有数据的恢复步骤

bash 复制代码
use ybc;
drop database ybc;

mysql -u root -p  < /opt/ybc_2023-12-26.sql
mysqlbinlog --no-defaults mysql-bin.000007 | mysql -u root -p

2.断点复恢

查看二级制文件

bash 复制代码
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002

(1)基于位置恢复

bash 复制代码
#仅恢复到操作 ID 为"8365"之前的数据,即不恢复之后的数据
mysqlbinlog --no-defaults --stop-position='8365' /opt/mysql-bin.000002 | mysql -uroot -p

(2)基于时间点恢复

bash 复制代码
#仅恢复到 16∶41∶24 之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-datetime='2023-12-26 18:45:04' mysql-bin.000002 |mysql -uroot -p

  • 如果恢复某条SQL语句之前的所有数据,就stop在这个语句的位置节点或者时间点
  • 如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start
相关推荐
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6751 小时前
数据库基础1
数据库
我爱松子鱼1 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白3 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码3 小时前
【SQL实验】触发器
数据库·笔记·sql