MySQL日志管理、备份与恢复

发布时间:2023年12月26日

目录

日志管理

数据库备份和恢复

备份方法

备份策略

MySQL完全备份与恢复

MySQL完全备份

物理冷备份与恢复

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
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

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完全备份与恢复

例:

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(表数据文件)。

物理冷备份与恢复

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

解压恢复

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.完全备份一个或多个完整的库
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服务器中所有的库
mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql
例:
mysqldump -u root -p --all-databases > /opt/all.sql
3.完全备份指定库中的部分表
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql

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

4.查看备份文件
grep -v "^--" /opt/ybc_backup.sql | grep -v "^/" | grep -v "^$"

MySQL完全恢复

1.恢复数据库

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.恢复数据表

  • 当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
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;'

完全备份脚本

#!/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.开启二进制日志功能
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.可每周对数据库或表进行完全备份
mysqldump -u root -p ybc ccc > /opt/ybc_ccc_$(date +%F).sql
mysqldump -u root -p --databases ybc > /opt/ybc_$(date +%F).sql

3.可每天进行增量备份操作,生成新的二进制日志文件
mysqladmin -u root -p flush-logs

4.插入新数据,以模拟数据的增加或变更
use ybc;
insert into ccc values(3,'user3','male','game');
insert into ccc values(4,'user4','female','reading');

5.再次生成新的二进制日志文件
mysqladmin -u root -p flush-logs

#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000004文件中

6.查看二进制日志文件的内容
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)模拟丢失更改的数据的恢复步骤

use ybc;
delete from ccc where id=5;

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

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

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.断点复恢

查看二级制文件

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

(1)基于位置恢复

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

(2)基于时间点恢复

#仅恢复到 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
文章来源:https://blog.csdn.net/Ybaocheng/article/details/135224437
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。