MySQL 백업 및 복구, 로그 관리

1. MySQL 로그 관리

MySQL 로그의 기본 저장 위치는 /usr/local/mysql/data입니다.
여기에 이미지 설명을 삽입하세요.

1.1 로그 분류

  • 트랜잭션 로그:
    트랜잭션 로그 트랜잭션 로그의 쓰기 유형은 "추가"이므로 해당 작업은 "순차 IO"이며 일반적으로 미리 쓰기 로그 미리 쓰기 로깅 트랜잭션 로그 파일: ib_logfile0, ib_logfile1이라고도 합니다.

  • 오류 로그오류 로그

  • 일반 로그일반 로그

  • 느린 쿼리 로그 느린 쿼리 로그

  • 바이너리 로그바이너리 로그

  • 릴레이 로그 릴레이 로그는 마스터-슬레이브 복제 아키텍처에서 마스터 서버의 바이너리 로그에서 읽은 이벤트를 슬레이브 서버에 저장하는 데 사용됩니다.

1.1.1 오류 로그

用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
vim /etc/my.cnf
log-error=/usr/local/mysql/data/mysql_error.log	

1.1.2, 일반 쿼리 로그

用来记录MySQL的所有连接和语句,默认是关闭的
vim /etc/my.cnf
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

1.1.3 바이너리 로그

用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
vim /etc/my.cnf
#也可以 log_bin=mysql-bin
log-bin=mysql-bin				

1.1.4, 느린 쿼리 로그

用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
vim /etc/my.cnf
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5	

1.1.5, 구성 로그

1. #修改my.cnf配置文件
 
#错误日志
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
 
2. #重新mysql服务
systemctl restart mysqld.service

구성 파일을 수정
여기에 이미지 설명을 삽입하세요.
하고 서비스를 다시 시작하세요.
여기에 이미지 설명을 삽입하세요.

1.2.로그 쿼리

#登入mysql
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;									

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

2. 백업 및 복구

2.1 데이터 백업의 필요성

  • 백업의 주요 목적은 재해 복구입니다.

  • 프로덕션 환경에서는 데이터 보안이 매우 중요합니다.

  • 데이터 손실은 심각한 결과를 초래할 수 있습니다.

2.2. 데이터 손실 이유

  • 프로그램 오류

  • 인간의 조작 오류.

  • 조작 오류

  • 디스크 오류

  • 재해(화재, 지진 등) 및 도난

2.3 데이터베이스 백업의 분류

2.3.1 물리적 백업

对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。

물리적 백업 방법:

  • 콜드 백업(오프라인 백업): 데이터베이스가 닫힐 때 수행됩니다.
  • 핫 백업(온라인 백업): 데이터베이스가 실행 중이며 데이터베이스의 로그 파일에 의존합니다.
  • 웜 백업: 데이터베이스 테이블이 잠겨 있는 동안(쓰기는 불가능하지만 읽기는 가능) 백업 작업이 수행됩니다.

2.3.2 논리적 백업

对数据库的表或者对象进行备份。

2.4 데이터베이스 백업 전략

  • 전체 백업 : 전체 데이터 세트, 전체 데이터베이스가 매번 백업됩니다.

  • 차등 백업 : 최근 전체 백업 이후 변경된 데이터만 백업하는 방식으로 백업 속도가 느리고 복원이 간단하다.

  • 증분 백업 : 마지막 전체 백업 또는 증분 백업(증분 백업이 있는 경우) 이후 변경된 데이터만 백업하며, 백업은 빠르고 복원은 복잡하다.

1) 전체 백업 : 데이터베이스를 매번 전체 백업한다.

- 是对整个数据库、数据库结构和文件结构的备份

- 保存的是备份完成时刻的数据库

- 是差异备份与增量备份的基础

优点:备份与恢复操作简单方便 缺点:数据存在大量的重复、占用大量的备份空间及备份与恢复时间长 

2) 차등 백업 : 마지막 전체 백업 이후 수정된 파일을 백업한다.

3) 증분 백업 : 마지막 전체 백업 또는 증분 백업 이후 수정된 파일만 백업합니다.

2.5, MySQL 전체 백업

InnoDB 스토리지 엔진의 데이터베이스는 디스크의 세 가지 파일에 저장됩니다.

  • db.opt(테이블 속성 파일)

  • 테이블 이름.frm(테이블 구조 파일)

  • 테이블 이름.ibd(테이블 데이터 파일)

2.5.1 물리적 콜드 백업 및 복구

  • 백업 중에는 데이터베이스가 닫히고 데이터베이스 파일이 직접 패키지됩니다.

  • 백업도 빠르고 복구도 가장 쉽습니다

1. #关闭mysql,备份data目录
systemctl stop mysqld
yum -y install xz
cd /usr/local/mysql
 
#压缩备份data目录
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz data/
 
2. #登录mysql,删除NBA库 
systemctl start mysqld.service 
mysql -u root -p123123
 
 
3. #解压之前备份的数据库data目录,不用删除原目录,会自动替换
cd /opt
ls
cd /usr/local/mysql
tar Jxvf /opt/mysql_all_2021-11-28.tar.xz -C ./
 
4. #重启服务查看被删除的库 

라이브러리 생성 및 라이브러리에 테이블 생성
여기에 이미지 설명을 삽입하세요.
mysql을 닫고 데이터 디렉토리 백업
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
mysql에 로그인하여 NBA 라이브러리 삭제
여기에 이미지 설명을 삽입하세요.
이전에 백업한 데이터베이스 데이터 디렉토리의 압축을 푼다 원본 디렉토리를 삭제할 필요는 없다. 자동으로 교체됩니다.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

2.5.2 특별한 백업 도구

  • mysqldump는 일반적으로 사용되는 논리적 백업 도구입니다.

  • mysqlhotcopy에는 백업 MyISAM 및 ARCHIVE 테이블만 있습니다.

하나 이상의 전체 라이브러리에 대한 전체 백업(그 안의 모든 테이블 포함)

#导出的就是数据库脚本文件
mysqldump -u root -p[密码] --databases 库名1 [库名2]> /备份路径/备份文件名.sql	

예: 단일 및 여러 라이브러리 백업

mysqldump -uroot -p --databases NBA > /opt/mysql_bak/nba.sql
mysqldump -uroot -p --databases  NBA info1 > /opt/mysql_bak/nba_info1.sql

여기에 이미지 설명을 삽입하세요.
MySQL 서버의 모든 라이브러리에 대한 전체 백업

mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql

예: 모든 라이브러리 백업

mysqldump -uroot -p --all-databases > /opt/mysql_bak/all.sql

여기에 이미지 설명을 삽입하세요.
지정된 라이브러리의 일부 테이블에 대한 전체 백업

mysqldump -u root -p[密码] 库名 [表名1] [表名2]> /备份路径/备份文件名.sql

예: NBA 데이터베이스의 두 테이블 백업

mysqldump -uroot -p NBA  [-d]  info1 info2 > /opt/mysql_bak/school_info1_info2.sql
  • 데이터베이스의 테이블 구조만 저장하려면 "-d" 옵션을 사용하세요.

  • "-d" 옵션을 사용하지 않으면 테이블 데이터도 함께 백업된다.

여기에 이미지 설명을 삽입하세요.
백업 파일 보기

 cat school_info1_info2.sql |grep -v '^/'|grep -v '^$'|grep -v '^-'

여기에 이미지 설명을 삽입하세요.

2.5.3 MySQL 전체 백업(상호작용 없이 사용)

systemctl start mysqld
mysql -u root -p -e 'drop database NBA;
#“-e”选项,用于指定连接 MySQL 后执行的命令,命令执行完后自动退出
mysql -u root -p -e 'show databases;'
 
#恢复school数据库
mysql -u root -p < /opt/mysql_bak/school.sql		
mysql -u root -p -e 'show databases;'

여기에 이미지 설명을 삽입하세요.데이터 테이블 복원

当备份文件中只包含表的备份,而不包含创建的库的语句时,执行导入操作时必须指定库名,且目标库必须存在。
mysqldump -uroot -p school  info1 info2 > /opt/mysql_bak/school_info1_info2.sql
 
1. #删除school中的info1表 
mysql -u root -p -e 'drop table NBA.lilade;'
mysql -u root -p -e 'show tables from school;'
 
2. #恢复school库中的表 
mysql -u root -p NBA < /opt/mysql_bak/school_info1_info2.sql 
mysql -u root -p -e 'show tables from NBA;'

NBAl에서 정보 테이블을 삭제
여기에 이미지 설명을 삽입하세요.
하고 NBA 라이브러리에서 테이블을 복원합니다.
여기에 이미지 설명을 삽입하세요.

2.5.4, MySQL 증분 백업 및 복구

vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
#指定二进制日志(binlog)的记录格式为 MIXED
binlog_format = MIXED				
server-id = 1

여기에 이미지 설명을 삽입하세요.
바이너리 로그(binlog)에는 3가지 기록 형식이 있습니다.

  • STATEMENT(SQL 문 기반)

  • ROW(행 기반)

  • MIXED(혼합 모드), 기본 형식은 STATEMENT입니다.

#只要重启就会自动生成二进制文件
systemctl start mysqld
ls -l /usr/local/mysql/data/mysql-bin.*

여기에 이미지 설명을 삽입하세요.
증분 백업 작업을 매일 수행하여 새로운 바이너리 로그 파일(예: mysql-bin.000002)을 생성할 수 있습니다.

mysqladmin -u root -p flush-logs

여기에 이미지 설명을 삽입하세요.
새 데이터를 삽입하여 데이터 추가 또는 변경 시뮬레이션

insert into  NBA.info  values (6, 'cj', 33, '男', '打篮球');
insert into  NBA.info  values (7, 'lu', 33, '男', '打篮球');

여기에 이미지 설명을 삽입하세요.
새로운 바이너리 로그 파일을 다시 생성하세요(예: mysql-bin.000007)

mysqladmin -u root -p flush-logs

여기에 이미지 설명을 삽입하세요.
바이너리 로그 파일의 내용 보기

cp /usr/local/mysql/data/mysql-bin.000007 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000007
#--base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v:显示详细内容

여기에 이미지 설명을 삽입하세요.

2.5.5, MySQL 증분 복구

1. 일반 회복

 将所有备份的二进制日志内容全部恢复

손실된 변경 ​​데이터에 대한 복구 단계 시뮬레이션

use nba;
delete from info where id=6;
delete from info where id=7;
 
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000007 | mysql -u root -p

데이터 삭제
여기에 이미지 설명을 삽입하세요.
바이너리 로그를 통한 복구
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
모든 데이터 손실을 위한 복구 단계 시뮬레이션

use NBA;
drop table info;
 
mysql -u root -p NBA < /opt/mysql_bak/NBA_info_info2.sql
mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000007 | mysql -u root -p

학교 도서관에서 info1 테이블 삭제
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

먼저 전체 테이블을 복원한 후
여기에 이미지 설명을 삽입하세요.
위치 복구를 기반으로 바이너리 로그 파일을 복원합니다.

  • 데이터베이스는 특정 시점에 잘못된 작업과 올바른 작업을 모두 수행할 수 있습니다.

  • 정확한 위치에 따라 잘못된 작업을 건너뛸 수 있습니다.

  • 마지막으로 올바른 작업이 중지된 오류 노드 이전의 노드입니다.
    여기에 이미지 설명을 삽입하세요.

# 刷新生成新的二进制日志文件
mysqladmin -u root -p flush-logs 	
# 进入到data目录
cd /usr/local/mysql/data	
#查看二进制日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000012

여기에 이미지 설명을 삽입하세요.
데이터베이스에 데이터를 삽입하고 보기

use school
insert into info values(8,'小斌','男','唱歌');
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.0000008	
# at 1207										#断点
#211130  9:28:59 								#时间
insert into info values(8,'小斌','男','唱歌')     #插入的数据
insert into info values(8,'小斌','男','唱歌')

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
다른 데이터 삽입

use school
insert into info values(9,'晴','女','画画');
 
# at 22236
#211130 10:36:38
insert into info values(9,'晴','女','画画')

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
테스트는 ID가 609가 되기 전의 데이터를 복원하는 것입니다. "다음 것"의 데이터는 복원되지 않습니다.

删除数据之前必须先刷新一下日志文件
mysqladmin -u root -p flush-logs 

여기에 이미지 설명을 삽입하세요.
데이터 복원

mysqlbinlog --no-defaults --stop-position='22236' mysql-bin.000012 | mysql -u root -p

여기에 이미지 설명을 삽입하세요.
"마지막" 데이터만 복구되고 "이전 다중" 데이터는 건너뜁니다.

删除表中所有数据

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
시간 기반 복구

测试恢复到ID为609之前的数据, 不恢复“后面一条”的数据

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
"마지막" 데이터만 복구되고 "이전 다중" 데이터는 건너뜁니다.

여기에 이미지 설명을 삽입하세요.

mysqlbinlog --no-defaults --start-datetime='2021-11-30 10:36:38' /usr/local/mysql/data/mysql-bin.000012 |mysql -uroot -p123123

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.

Supongo que te gusta

Origin blog.csdn.net/fyb012811/article/details/133273008
Recomendado
Clasificación