MySQL 로그 관리, 백업 및 복구

하나, MySQL 로그 관리 기본 명령

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秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
s1ow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5        #设置超过5秒执行的语句被记录,缺省时为10秒

---------------------------------------------------------------
log-error=/usr/local/mysql/data/mysql_error.log
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
log-bin=mysql-bin
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
----------------------------------------------------------------

systemctl restart mysqld
mysql -u root -P
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;         #在数据库中设置开启慢查询的方法

둘째, 데이터 백업의 중요성

1. 백업의 주된 목적은 재해 복구입니다
2. 프로덕션 환경에서 데이터의 안전은 매우 중요합니다
3. 데이터 손실은 심각한 결과를 초래할 수 있습니다
4. 데이터 손실 원인
(1) 프로그램 오류
(2 ) 휴먼 작동 오류
(3) 작동 오류
(4) 디스크 고장
(5) 재해 (화재, 지진 등) 및 도난

세, 데이터베이스 백업의 분류

1. 물리적 및 논리적 관점에서 분류

(1) 물리적 백업 : 데이터베이스 운영 체제의 물리적 파일 (데이터 파일, 로그 파일 등) 백업

콜드 백업 (오프라인 백업) : 데이터베이스가 닫힐 때 수행됩니다.
핫 백업 (온라인 백업) : 데이터베이스가 실행 중이며 데이터베이스의 로그 파일에 따라 다릅니다.
웜 백업 : 데이터베이스 잠금 테이블의 상태 (쓰기 가능하지 않지만 읽기 가능) 백업 작업

(2) 논리적 백업 : 데이터베이스 논리적 구성 요소 (예 : 테이블 및 기타 데이터베이스 개체)의 백업

2. 데이터베이스 백업 전략의 관점에서 분류

(1) 전체 백업 : 매번 데이터베이스 전체 백업을 수행합니다.
(2) 차등 백업 : 마지막 전체 백업 이후 수정 된 파일을 백업합니다.
(3) 증분 백업 : 마지막 전체 또는 증분 백업 이후에만 수정 된 파일이 백업됩니다.

3. 일반적인 백업 방법

(1) 물리적 콜드 대기

백업하는 동안 데이터베이스가 닫히고 데이터베이스 파일이 직접 패키징됩니다.
백업 속도가 빠르며 복구도 가장 쉽습니다.

(2) 특수 백업 도구 mydump 또는 mysqlhotcopy

일반적으로 사용되는 논리적 백업 도구 인 mysqldump 인
mysqlhotcopy에는 백업 MyISAM 및 ARCHIVE 테이블 만 있습니다.

(3) 증분 백업을위한 바이너리 로그 활성화

증분 백업의 경우 바이너리 로그를 새로 고쳐야합니다.

(4) 타사 도구 백업

무료 MySQL 핫 백업 소프트웨어 Percona XtraBackup

네, MySQL 전체 백업

1. 특징

(1) 전체 데이터베이스, 데이터베이스 구조 및 파일 구조의 백업입니다.
(2) 백업이 완료된 시점에 데이터베이스를 저장합니다.
(3) 차등 백업 및 증분 백업의 기반입니다.

2. 장점 : 간단하고 편리한 백업 및 복구 작업

3. 단점 :

(1) 데이터 중복이 많음
(2) 백업 공간을 많이 차지함
(3) 백업 및 복구 시간이 깁니다.

4. 데이터베이스 전체 백업 분류

(1) 물리적 콜드 백업 및 복구

MySQL 데이터베이스 닫기
tar 명령을 사용하여 데이터베이스 폴더를 직접 패키징
하고 기존 MySQL 디렉토리를 직접 바꿉니다.

(2) mysqldump 백업 및 복구

MySQL에는 MySQL의 백업을 용이하게 할 수있는 백업 도구가 함께 제공됩니다.
지정된 라이브러리와 테이블을 SQL 스크립트로 내보낼 수 있습니다.
mysq | 명령을 사용하여 백업 데이터를 가져옵니다.

다섯, MySQL 백업 및 복원 관련 명령

环境准备:
use edg;
create table if not exists info1 (
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 info1 values(1,'user1','male','running');
insert into info1 values(2,'user2','female','singing');

----------------------------MySQL完全备份与恢复-----------------------------------

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

1.物理冷备份与恢复
systemctl stop mysqld
yum -y install XZ
#压缩备份
tar Jcvf /opt/mysql_all_$(date +%F).tar.XZ /usr/local/mysql/data/
#解压恢复
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz -C /usr/local/mysql/data/

2. mysqldump 备份与恢复
(1)、完全备份一个或多个完整的库 (包括其中所有的表)
mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql    #导出的就是数据库脚本文件
例:
mysqldump -u root -p --databases edg > /opt/edg.sql       #备份一个edg库
mysqldump -u root -p --databases mysql edg > /opt/mysql-edg.sql    #备份mysql与 edg两个库

(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] edg info1 info2 > /opt/edg_info1.sql
#使用“-d”选项,说明只保存数据库的表结构
#不使用“-d"选项,说明表数据也进行备份

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


-----------------MySQL完全恢复---------------------
systemctl start mysqld

(1)恢复数据库
mysql -u root -P -e 'drop database edg;'
#“-e"选项,用于指定连接MySQL后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'SHOW DATABASES;'

mysql -u root -p < /opt/gcc.sql         #将之前备份的edg数据库进行恢复
mysql -u root -p -e 'SHOW DATABASES;'

(2)、恢复数据表
当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
mysqldump -u root -p edg info1 > /opt/edg_info1.sql    #将表info1进行备份

mysql -u root -p -e 'drop table edg.info1;'      #模拟删除edg库中的info1表
mysql -u root -p -e 'show tables from edg;'

mysql -u root -p edg < /opt/edg_info1.sql        #将edg库中的info1表进行恢复
mysql -u root -p -e 'show tables from edg;'



---------------------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 edg info1 > /opt/edg_info1_$(date +%F).sql
mysqldump -u root -P --all-databases edg > /opt/edg_$(date +%F).sql

3.可每天进行增量备份操作,生成新的二进制日志文件(例如:mysql-bin.000002)
mysqladmin -u root -p flush-logs

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

5.再次生成新的二进制日志文件(例如:mysql-bin.000003)
mysqladmin -u root -p flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000003文件中

6.查看二进制日志文件的内密
cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#--base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v: 显示详细内容


--------MySQL增量恢复--------
1.一般恢复
(1)、模拟丢失更改的数据的恢复步骤
use edg;
delete from info1 where id=3;
delete from info1 where id=4;

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

(2)、模拟丢失所有数据的恢复步骤
use edg; .
drop table info1;

mysql -u root -p edg < /opt/edg_info1_2020-11-22.sql
mysqlbinlog --no-defaults / opt/mysql-bin.000002 | mysql -u root -p

2.断点恢复
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
例:
# at 302
#201122 16:41:16
插入了"user3"的用户数据

# at 623
#201122 16:41:24 
插入了"user4"的用户数据

(1)、基于位置恢复
#仅恢复到操作 ID 为“623"之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p

#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -p

mysqlbinlog --no-defaults --start-position='400' --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p      #恢复从位置为400开始到位置为623为止


(2)、基于时间点恢复
mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码

#仅恢复到16:41:24 之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-datetime='2020-11-22 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p 

#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-datetime='2020-11-2216:41:24' /opt/mysql-bin.000002 | mysql -uroot -p



如果恢复某条SQL语之前的所有数据,就stop在这个语句的位置节点或者时间点
如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start

추천

출처blog.csdn.net/tefuiryy/article/details/113662889