데이터 베이스 MySQL 튜토리얼 Linux_MySQL에서 binlog 파일을 통해 mysql 데이터베이스를 복원하는 세부 단계

Linux_MySQL에서 binlog 파일을 통해 mysql 데이터베이스를 복원하는 세부 단계

Sep 09, 2016 am 08:13 AM
linux

1. binlog 소개

서버의 바이너리 로그는 데이터베이스의 모든 추가, 삭제 및 수정을 기록하며(자체 서버에서 binlog가 활성화된 경우) 이러한 작업의 실행 시간도 포함합니다. 이러한 바이너리 내용을 표시하려면 mysqlbinlog 명령을 사용하여 볼 수 있습니다.

목적 1: 마스터-슬레이브 동기화

목적 2: 데이터베이스 복원(데이터베이스 파일이 온라인에서 손실된 후에야 이 사실을 알게 되었습니다.)

Mysqlbinlog 명령 사용법: shell> mysqlbinlog [옵션] log_file ...

1) mysqlbinlog 옵션 예

일반적인 옵션은 다음과 같습니다.

--시작-날짜/시간

바이너리 로그에서 로컬 시스템 시간과 같거나 그 이후의 지정된 타임스탬프를 읽습니다. 다음과 같은 값:="1470733768" 또는="2016-08-09 5:09:28"

예:

[root@hcloud ~]# mysqlbinlog --start-datetime="2016-08-09 5:05:27" /var/lib/mysql/mysql-bin.000001 
--stop-datetime
로그인 후 복사

타임스탬프보다 작거나 로컬 컴퓨터와 동일한 바이너리 로그에서 지정된 시간을 읽어옵니다.

--시작 위치

바이너리 로그에서 지정된 위치 이벤트 위치를 시작으로 읽어옵니다. 값:="2698"

예:

[root@hcloud ~]# mysqlbinlog --start-position="2698" /var/lib/mysql/mysql-bin.000001 
--stop-position
로그인 후 복사

이벤트 종료로 바이너리 로그에서 지정된 위치 이벤트 위치를 읽어옵니다. 값:="2698"

2. 환경 준비 및 백업 및 복구

 1) mysql 설치 후 binlog 활성화 체크

mysql> 바이너리 로그 표시;

오류 1381(HY000): 바이너리 로깅을 사용하고 있지 않습니다. 위 프롬프트는 binlog를 활성화할 서버가 없음을 나타냅니다.

/etc/my.cnf 수정

mysqld 옵션에 다음과 같이 한 줄을 추가합니다.

로그-bin=mysql-bin

기본적으로 값이 지정되지 않으면 log-bin은 mysqld-bin을 인덱스로 사용하고 mysqld-bin.00001 등을 생성합니다.

mysqld를 다시 시작하세요.

 2) 빈로그 확인

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 106 |
+------------------+-----------+
1 row in set (0.00 sec)
로그인 후 복사

 3) 먼저 원시 데이터를 생성합니다.

mysql> create database Test_DB;
Query OK, 1 row affected (0.00 sec)
mysql> use Test_DB;
Database changed
mysql> CREATE TABLE OneTb(id INT(10) NOT NULL,name varchar(20),age INT(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into OneTb values (1,'user1',18);
mysql> insert into OneTb values (2,'user2',19);
insert into OneTb values (3,'user3',20);
로그인 후 복사

데이터 확인:

mysql> select * from OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
+----+-------+------+
3 rows in set (0.00 sec)
로그인 후 복사

 4) 백업 및 복원(전체 백업 및 복원)

여기에서는 일일 전체 데이터베이스 백업 작업을 시뮬레이션합니다.

[root@hcloud ~]# mysqldump -uroot -p Test_DB > /data/mysqlbackup/Test_DB_0809-16:50.sql
Enter password:
로그인 후 복사

시뮬레이션 중 연산 오류가 발생하여 데이터가 잘못 수정되었습니다.

mysql> update OneTb set age = 15;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> select * from OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 15 |
| 2 | user2 | 15 |
| 3 | user3 | 15 |
+----+-------+------+
3 rows in set (0.00 sec)
로그인 후 복사

이제 우리는 전통적인 방법을 사용하여 복원합니다.

[root@hcloud ~]# mysql -uroot -p Test_DB < /data/mysqlbackup/Test_DB_0809-16\:50.sql 
로그인 후 복사

다시 확인:

mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
+----+-------+------+
3 rows in set (0.00 sec)
로그인 후 복사

데이터가 복원된 것을 확인할 수 있습니다.

5) binlog를 사용하여 복원 시뮬레이션

원본 테이블을 기반으로 여러 데이터 조각을 만듭니다.

mysql> insert into Test_DB.OneTb values(4,'user4',21),(5,'user5',22),(6,'user6',23);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
| 4 | user4 | 21 |
| 5 | user5 | 22 |
| 6 | user6 | 23 |
+----+-------+------+
6 rows in set (0.00 sec)
로그인 후 복사

이때 실수로 데이터를 수정하거나 라이브러리를 삭제하여 모든 데이터가 손실된 경우, 이때 최신 백업 파일인 Test_DB_0809-16:50.sql을 사용하여 데이터를 복원하면 이후에 Data가 새로 삽입됩니다. 백업이 손실됩니다.

참고: 정말 최신 백업 파일을 사용한다면 최후의 수단이 되어야 합니다(예를 들어 binlog가 삭제되거나 하드 디스크 전체가 정지되는 등... 생각만 해도 끔찍합니다...)

오작동을 시뮬레이션하고 사용자 이름을 일괄 변경합니다.

mysql> update Test_DB.OneTb set name='user10';
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6 Changed: 6 Warnings: 0
로그인 후 복사

아니요, 이전 단계는 충분히 무자비하지 않았습니다. 여기서는 더 무자비하게 모든 테이블을 삭제해 보겠습니다.

mysql> drop table Test_DB.OneTb;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: *** NONE ***
Query OK, 0 rows affected (0.00 sec)
로그인 후 복사

처음에 binlog 옵션을 켜두었기 때문에 binlog를 사용하여 데이터베이스를 복원했습니다. binlog부터 시작해 보겠습니다. 먼저 binlog 파일을 확인합니다. 현재 mysql 서비스는 binlog가 켜진 이후 두 번 다시 시작되었으므로 binlog 파일이 2개 있습니다(다시 시작할 때마다 binlog 파일이 재생성됩니다.) FLUSH LOGS 명령을 실행하면 다시 빌드됩니다.

mysql-bin.index 파일에 기록되는 내용은 log-bin 옵션이 활성화된 이후 기록된 모든 바이너리 로그 목록입니다.

참고: 실제 프로덕션 환경에서 데이터베이스를 복원해야 하는 상황이 발생하면 새로운 데이터가 삽입되는 것을 피하기 위해 사용자가 데이터베이스에 접근하는 것을 허용하지 말고, 마스터-슬레이브 환경에서는 데이터베이스를 종료하세요. 주인-노예.

mysqlbinlog 명령어를 이용하여 binlog 파일을 살펴보겠습니다. mysql-bin.00002

마지막에 삭제 작업이 있는 것을 볼 수 있습니다. 하지만 아직 마지막에 삭제 작업이 남아 있기 때문에 완전히 복원할 수는 없습니다.

  现在我的思路就是,先将第一个binlog 和第二个binlog 文件导出来à利用指定的position位置的方式(过滤掉删除表操作和update Test_DB.OneTb set name='user10';这条语句 ),导出2个sql 语句,最后我们将2个sql 合成一个sql,导入到数据库中即可。

  我们先用mysqlbinlog命令找到update 那条语句的位置,然后指定position 将mysql-bin.00001 导出来。

[root@hcloud ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001
….
#160809 5:09:28 server id 1 end_log_pos 2698 Query thread_id=17 exec_time=0 error_code=0
SET TIMESTAMP=1470733768/*!*/;
SET @@session.foreign_key_checks=1, @@session.unique_checks=1/*!*/;
SET @@session.sql_mode=0/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
insert into Test_DB.OneTb values(4,'user4',21),(5,'user5',22),(6,'user6',23)
/*!*/;
# at 2698
#160809 5:19:49 server id 1 end_log_pos 2795 Query thread_id=17 exec_time=0 error_code=0
SET TIMESTAMP=1470734389/*!*/;
update Test_DB.OneTb set name='user10'
/*!*/;
# at 2795
#160809 5:30:38 server id 1 end_log_pos 2814 Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
로그인 후 복사

  从上面可以看到我们在做插入正常数据后的position 是2698,那么使用下面的命令导出sql

[root@hcloud ~]# mysqlbinlog --stop-position="2698" /var/lib/mysql/mysql-bin.000001 > Backup_1.sql 
로그인 후 복사

  然后导出mysql-bin.00002的sql 语句(注:由于演示操作,该文件只有一个drop 表操作,所以不做处理,但是在实际环境中,由于中途可能会有重启数据库操作,那时就需要检测最新的binlog有没有业务需要的语句。)

  sql 语句已经导出来了。我们可以利用该语句直接恢复所有正常的数据。

  注:本次恢复没有利用到之前的完整备份,因为我是开启binlog后,然后才做的所有建库建表操作,第一个binlog文件里已经记录了所有的数据库操作,所以不需要使用之前的完整备份(另外:实际的生产环境,还是需要利用到完整备份的,因为线上环境可能会有N多个binlog文件,所以需要利用到完整备份和最新的binlog文件来结合恢复)

  开始恢复前,我们将原有的Test_DB数据库也给干掉吧。毕竟我们的binlog中有创建操作

mysql> DROP DATABASE Test_DB;
Query OK, 0 rows affected (0.03 sec)
로그인 후 복사

  恢复数据库时还可以利用在登陆mysql 后,用source 命令导入sql语句,这里暂不介绍

[root@hcloud ~]# mysql -uroot -p < Backup_1.sql 
로그인 후 복사

Enter password:

  恢复完成后,我们检查下表的数据是否完整

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Test_DB |
| mysql |
+--------------------+
3 rows in set (0.00 sec)
mysql> select * from Test_DB.OneTb;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 18 |
| 2 | user2 | 19 |
| 3 | user3 | 20 |
| 4 | user4 | 21 |
| 5 | user5 | 22 |
| 6 | user6 | 23 |
+----+-------+------+
6 rows in set (0.00 sec)
로그인 후 복사

  Ok完整的都恢复过来了。

三、总结

  1) 恢复方式

    a) 利用最新一次的完整备份加binlog 指定事件起始时间和终止时间或者position恢复数据库

    b) 利用所有binlog指定事件起始位置和终止时间来合并sql文件恢复数据库(此方法要确保binlog文件的完整)

    c) 利用mysqldump 使用完整恢复。(在确保最新一次的完整备份后的数据不重要,允许丢掉的情况下,直接恢复。该方法最简单、效率最高)

  2) 附:官方建议的备份原则(为了能睡个好觉….嗯,是的)

    a) 在mysql安装好并运行时,就始终开启 log-bin选项,该日志文件位于datadir目录下,也要确保该目录所在存储介质是安全的。

    b) 定期做完整的mysql 备份。

    c) 定期使用 FlUSH LOGS 或者 mysqladmin flush-logs ,该操作会关闭当前的二进制日志文件,并新建一个binlog日志文件。(和重启mysql后新建的binlog操作一样)。以备份binlog日志,利用binlog日志也可以做增量备份。

以上所述是小编给大家介绍的Linux上通过binlog文件恢复mysql数据库详细步骤,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

VSCODE에 필요한 컴퓨터 구성 VSCODE에 필요한 컴퓨터 구성 Apr 15, 2025 pm 09:48 PM

대 코드 시스템 요구 사항 : 운영 체제 : Windows 10 이상, MacOS 10.12 이상, Linux 배포 프로세서 : 최소 1.6GHz, 권장 2.0GHz 이상의 메모리 : 최소 512MB, 권장 4GB 이상의 저장 공간 : 최소 250MB, 권장 1GB 및 기타 요구 사항 : 안정 네트워크 연결, Xorg/Wayland (LINUX)

VSCODE는 확장자를 설치할 수 없습니다 VSCODE는 확장자를 설치할 수 없습니다 Apr 15, 2025 pm 07:18 PM

VS 코드 확장을 설치하는 이유는 다음과 같습니다. 네트워크 불안정성, 불충분 한 권한, 시스템 호환성 문제, C 코드 버전은 너무 오래된, 바이러스 백신 소프트웨어 또는 방화벽 간섭입니다. 네트워크 연결, 권한, 로그 파일, 업데이트 대 코드 업데이트, 보안 소프트웨어 비활성화 및 대 코드 또는 컴퓨터를 다시 시작하면 점차 문제를 해결하고 해결할 수 있습니다.

Apr 16, 2025 pm 07:39 PM

메모장은 Java 코드를 직접 실행할 수는 없지만 다른 도구를 사용하여 명령 줄 컴파일러 (Javac)를 사용하여 Bytecode 파일 (filename.class)을 생성하면 달성 할 수 있습니다. Java Interpreter (Java)를 사용하여 바이트 코드를 해석하고 코드를 실행하고 결과를 출력하십시오.

VScode 란 무엇입니까? VScode 란 무엇입니까? Apr 15, 2025 pm 06:45 PM

VS Code는 Full Name Visual Studio Code로, Microsoft가 개발 한 무료 및 오픈 소스 크로스 플랫폼 코드 편집기 및 개발 환경입니다. 광범위한 프로그래밍 언어를 지원하고 구문 강조 표시, 코드 자동 완료, 코드 스 니펫 및 스마트 프롬프트를 제공하여 개발 효율성을 향상시킵니다. 풍부한 확장 생태계를 통해 사용자는 디버거, 코드 서식 도구 및 GIT 통합과 같은 특정 요구 및 언어에 확장을 추가 할 수 있습니다. VS 코드에는 코드에서 버그를 신속하게 찾아서 해결하는 데 도움이되는 직관적 인 디버거도 포함되어 있습니다.

vScode를 Mac에 사용할 수 있습니다 vScode를 Mac에 사용할 수 있습니다 Apr 15, 2025 pm 07:36 PM

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.

vscode를 사용하는 방법 vscode를 사용하는 방법 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCODE)는 Microsoft가 개발 한 크로스 플랫폼, 오픈 소스 및 무료 코드 편집기입니다. 광범위한 프로그래밍 언어에 대한 가볍고 확장 성 및 지원으로 유명합니다. VSCODE를 설치하려면 공식 웹 사이트를 방문하여 설치 프로그램을 다운로드하고 실행하십시오. VScode를 사용하는 경우 새 프로젝트를 만들고 코드 편집, 디버그 코드, 프로젝트 탐색, VSCODE 확장 및 설정을 관리 할 수 ​​있습니다. VSCODE는 Windows, MacOS 및 Linux에서 사용할 수 있으며 여러 프로그래밍 언어를 지원하며 Marketplace를 통해 다양한 확장을 제공합니다. 이점은 경량, 확장 성, 광범위한 언어 지원, 풍부한 기능 및 버전이 포함됩니다.

Linux의 주요 목적은 무엇입니까? Linux의 주요 목적은 무엇입니까? Apr 16, 2025 am 12:19 AM

Linux의 주요 용도에는 다음이 포함됩니다. 1. 서버 운영 체제, 2. 임베디드 시스템, 3. 데스크탑 운영 체제, 4. 개발 및 테스트 환경. Linux는이 분야에서 뛰어나 안정성, 보안 및 효율적인 개발 도구를 제공합니다.

git의 창고 주소를 확인하는 방법 git의 창고 주소를 확인하는 방법 Apr 17, 2025 pm 01:54 PM

git 저장소 주소를 보려면 다음 단계를 수행하십시오. 1. 명령 줄을 열고 리포지토리 디렉토리로 이동하십시오. 2. "git remote -v"명령을 실행하십시오. 3. 출력 및 해당 주소에서 저장소 이름을 봅니다.

See all articles