MySQL innodb 변수 'innodb_log_file_size'를 안전하게 변경하는 방법은 무엇입니까?


105

그래서 저는 InnoDB 튜닝에 상당히 익숙하지 않습니다. MyIsam에서 InnoDB로 (필요한 경우) 테이블을 천천히 변경하고 있습니다. innodb에 약 100MB가 있으므로 innodb_buffer_pool_size변수를 128MB로 늘 렸습니다 .

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

innodb_log_file_size값 을 변경하려고 할 때 ( mysql의 innodb 구성 페이지의 my.cnf 예 에서 로그 파일 크기를 버퍼 크기의 25 %로 변경하기 위해 주석을 달았습니다.) 이제 my.cnf는 다음과 같습니다.

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

서버를 다시 시작하면 다음 오류가 발생합니다.

110216 9:48:41 InnoDB : 버퍼 풀 초기화, 크기 = 128.0M
110216 9:48:41 InnoDB : 버퍼 풀 초기화 완료
InnoDB : 오류 : 로그 파일 ./ib_logfile0의 크기가 다른 크기 0 5242880 바이트
InnoDB : .cnf 파일 0 33554432 바이트!
110216 9:48:41 [ERROR] 플러그인 'InnoDB'init 함수가 오류를 반환했습니다.
110216 9:48:41 [오류] STORAGE ENGINE으로 'InnoDB'플러그인을 등록하지 못했습니다.

그래서 내 질문 : 이전 log_files를 삭제하는 것이 안전 innodb_log_file_size합니까? 아니면 변수 를 변경하는 다른 방법이 있습니까?


1
my.ini에서 innodb_log_file_size를 주석 처리하십시오 .....

5
흠, 왜 기본값을 변경하려고 할 때 기본값을 사용하도록 주석을 달고 싶습니까?
데릭 다우니

그렇습니다. innodb_log_file_size 줄을 주석 처리하면됩니다 .. 감사합니다.
muhammad 우마르 farooq 프랭크

2
@muhammadumarfarooqfrank 물론 작동합니다. 더 이상 변수의 값을 변경하지 않기 때문에 요점을 무의미하게 만듭니다. 의견을 내리는 방법이 있었으면 좋겠다.
dr01

답변:


83

예, 일단 mysqld가 종료되면 로그 파일을 삭제하는 것이 안전합니다

이를 고려하여 다음 단계를 수행하십시오.

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

mysqld를 시작하면 다시 생성 ib_logfile0되고ib_logfile1

시도 해봐 !!!

업데이트 2011-10-20 16:40 EDT

로그 파일을 다시 실행하기 전에 InnoDB 버퍼 풀의 모든 데이터를 깨끗하게 페이징 아웃합니다. 종료하기 약 1 시간 전에이 옵션을 설정해야합니다.

SET GLOBAL innodb_max_dirty_pages_pct = 0;

기본적으로 innodb_max_dirty_pages_pct 는 75 (MySQL 5.5+) 또는 90 (MySQL 5.5 이전)입니다. 이 값을 0으로 설정하면 더티 페이지 수가 InnoDB 버퍼 풀의 1 % 미만으로 유지됩니다. service mysql stop어쨌든이 작업을 수행 합니다. 또한 종료하면 재실행 로그에 남아있는 모든 항목이 완료됩니다. 이 옵션을 유지하려면 /etc/my.cnf에 추가하십시오.

[mysqld]
innodb_max_dirty_pages_pct = 0

업데이트 2013-04-19 16:16 EDT

mysql을 다시 시작하고 mysql을 중지하여이를 수행했기 때문에 innodb_fast_shutdown으로 답변을 조금 더 업데이트 했습니다. 커밋되지 않은 모든 트랜잭션에 InnoDB 트랜잭션 로그 내부 및 외부의 다른 이동 부분이있을 수 있으므로이 한 단계는 매우 중요합니다 ( InnoDB 인프라 참조 ).

innodb_fast_shutdown 을 2로 설정 하면 로그도 정리되지만 더 많은 움직이는 부분이 여전히 존재하며 mysqld가 시작되는 동안 Crash Recovery에서 선택됩니다. 0으로 설정하는 것이 가장 좋습니다.


1
좋은 답변과 업데이트도 훌륭합니다. 내 유일한 제안은 무언가 잘못되었을 때 ib_logfiles를 다른 위치로 복사하는 것입니다. 이렇게하면 파일 크기를 조정하는 방법에 대한 아이디어를 얻을 수 있습니다. mysqlperformanceblog.com/2011/07/09/…
Justin Noel

5
나를 위해 일했지만 BUT : Linux 콘솔 UI가 오도 될 수 있습니다-큰 로그 파일 크기 (수백 MB 이상)를 설정하면 mysqld 시작에 많은 시간이 걸립니다. 콘솔 UI에 점이 표시되고 "실패했습니다!"가 표시되지만 실제로 MySQL이 여전히 시작 중입니다. "mysqld : 연결 준비"가 표시 될 때까지 기다렸다가 로그 파일을 읽거나 "tail -f [log-file]"로 로그 파일을 모니터하십시오. 디스크에 할당 된 두 로그 파일.
f055

2
경고!! 3 단계가 작동하지 않았고 InnoDB없이 mysql 이로 드되는 것을 보았을 때 내 마음이 거의 멈췄습니다 .mysql을 중지하고 수동으로 제거하고 MySQL을 다시 시작해야했습니다. 두 가지 조언 : 1. 기존 로그 파일 백업, 2. 파일 수동 삭제
Peeyush Kushwaha

2
Peeyush가 맞습니다. mysql 문서 조차도 문제가 생길 경우를 대비하여 로그 파일을 백업 할 것을 권장합니다.
Greg

1
@Greg 이것이 내가 사용하는 이유 SET GLOBAL innodb_fast_shutdown = 0;입니다. MySQL이 종료되면 재실행 로그 (ib_logfile0 및 ib_logfile1)를 포함하여 모든 트랜잭션 부분에서 트랜잭션이 모두 플러시됩니다. 그것들을 유지할 수 있습니다. 완전히 플러시 된 로그와 관련된 문제는 아직 발생하지 않았습니다.
RolandoMySQLDBA

31

대신 편의를 위해 여기에 재현 하는 공식 방법을 권장 합니다.

MySQL 5.6.7 또는 이전 버전 에서 InnoDB 로그 파일의 수 또는 크기를 변경하려면 다음 지침을 사용하십시오. 사용할 프로시 저는 종료 조작 전에 시스템 테이블 스페이스를 완전히 최신 상태로 유지할지 여부를 결정하는 innodb_fast_shutdown 값에 따라 다릅니다.

  • innodb_fast_shutdown이 2로 설정되지 않은 경우 : MySQL 서버를 중지하고 오류없이 종료되도록하여 리두 로그에 미해결 트랜잭션에 대한 정보가 없는지 확인하십시오. 종료 중에 문제가 발생하여 테이블 스페이스를 복구해야하는 경우를 대비하여 이전 리두 로그 파일을 안전한 곳에 복사하십시오. 로그 파일 디렉토리에서 이전 로그 파일을 삭제하고 my.cnf를 편집하여 로그 파일 구성을 변경 한 다음 MySQL 서버를 다시 시작하십시오. mysqld는 시작할 때 InnoDB 로그 파일이 존재하지 않는 것을 확인하고 새로운 파일을 생성합니다.

  • innodb_fast_shutdown이 2로 설정된 경우 : innodb_fast_shutdown을 1로 설정하십시오.

mysql> SET GLOBAL innodb_fast_shutdown = 1;

그런 다음 이전 항목의 지침을 따르십시오.

MySQL 5.6.8 부터 InnoDB_fast_shutdown 설정은 InnoDB 로그 파일의 수 또는 크기를 변경할 때 더 이상 관련이 없습니다. 또한 이전 로그 파일을 백업으로 안전한 장소에 여전히 복사 할 수 있지만 더 이상 이전 로그 파일을 제거하지 않아도됩니다. InnoDB 로그 파일의 수 또는 크기를 변경하려면 다음 단계를 수행하십시오.

  1. MySQL 서버를 중지하고 오류없이 종료되는지 확인하십시오.

  2. my.cnf를 편집하여 로그 파일 구성을 변경하십시오. 로그 파일 크기를 변경하려면 innodb_log_file_size를 구성하십시오. 로그 파일 수를 늘리려면 innodb_log_files_in_group을 구성하십시오.

  3. MySQL 서버를 다시 시작하십시오.

InnoDB가 innodb_log_file_size가 리두 로그 파일 크기와 다르다는 것을 감지하면 로그 체크 포인트를 작성하고 기존 로그 파일을 닫고 제거하며 요청 된 크기로 새 로그 파일을 생성 한 다음 새 로그 파일을 엽니 다.


이것은이 질문에 대한 업데이트로 좋은 대답입니다. +1 !!!
RolandoMySQLDBA 2016 년

2
이것은 "업데이트"가 아닙니다. 이 매뉴얼 페이지는 오랫동안 존재했습니다. 나는 항상 바퀴를 재발 명하고 정보를 복제하는 대신 (우리가 DBA가 가장 싫어하는 것) 매뉴얼 (직접 최고의 매뉴얼 중 하나)의 직접 정보를 추천합니다.
RandomSeed 2016 년

이것은 MySQL 5.6에서 선호되는 방법입니다. 5.6 이전 버전에서 계속 실행중인 경우 작동하지 않습니다.
데릭 다우니

20

innodb_buffer_pool_size-단순히 my.cnf( my.ini) 를 변경 하고 mysqld를 다시 시작하십시오.

innodb_log_file_size덜 중요합니다. 이유가없는 한 변경하지 마십시오. 롤랜드 가 단계를 제공 했지만 한 가지 측면이 저를 걱정합니다 ... 처음 두 단계가 중요한지 모르겠습니다. 그들이 될 수있는 것 같습니다 :

  1. set innodb_fast_shutdown = OFF
  2. MySQL을 다시 시작
  3. MySQL을 중지
  4. 로그 파일을 제거하십시오
  5. MySQL을 시작

로그 파일은 완료되지 않은 비즈니스를 추적합니다. " innodb_fast_shutdown"는 다시 시작한 후에 해당 내용을 처리한다고 말합니다 . 파일을 제거하면 정보가 손실 될 수 있습니까?

새로운 버전의 일을 개선 : (댓글에 더 많은 토론)

  • 5.6 innodb_log_file_size4GB 이상 허용
  • innodb_log_file_sizeiblog *를 먼저 제거하지 않고도 5.6 을 변경할 수 있습니다 *
  • 5.7 동적 크기 조정 가능 innodb_buffer_pool_size

log_file_size를 변경해야합니까?

사용 GLOBAL STATUS로그주기 전에 시간 (분)을 계산.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

60 (분)보다 훨씬 으면 log_file_size를 늘리는 데 도움이 될 수 있습니다. 더 많은 경우 로그 파일은 디스크 공간을 낭비하고 있습니다. "1 시간"은 다소 임의적이므로 가까운 경우 log_file_size를 변경하지 마십시오.

innodb_log_files_in_group기본값은 2로 두십시오 .


+1 귀하의 우려가 문서에서
Jack Douglas

나는이 답변을 보았고 첫 번째 줄을 좋아합니다. 나는 일반적으로 클라이언트가 --skip-networking마지막 순간의 변화를 막기 위해 예방 조치로 mysql을 가져 오게했습니다 . 첫 번째 줄 (innodb_fast_shutdown = OFF로 설정)은이를 제거합니다. +1 !!!
RolandoMySQLDBA

1
공감에 감사드립니다. 새로운 독자에게는 이것이 필요하지 않을 수 있습니다. 에서 5.6.8 , innodb_log_file_sizeiblog 파일을 제거하지 않고 변화 할 수 있도록 향상되었다.
Rick James

"더 중요하지 않다"가 아니라 "더 중요하다"를 의미합니까?
Igor

@Igor-아니요. log_file_size가 너무 작 으면 추가 I / O 스 래싱이 발생합니다. 나는 거의 보지 못합니다. 너무 큰 경우 디스크 공간을 낭비하고 있습니다. 그것을 설정하는 목표는 한 시간 안에 순환하는 것입니다. 그러나 10 분 대 10 시간은 중요하지 않습니다. 자세히 ...
Rick James

1

mysql에 로그온하면 다음 명령을 입력하십시오.

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

두 개의 숫자를 얻게됩니다. 먼저 하나를 얻은 다음 잠시 기다립니다. 당신은 다른 것을 얻을 것입니다.

첫 번째는 3.456.718.123이고 두 번째는 4.098.873.134라고 가정하십시오.

지금 (4.098.873.134-3.856.718.123) * 60 / 1024 / 1024

결과는 13.856MB입니다.

두 개의 로그 파일이 있습니다. 따라서 2로 나누면 7.000MB에 가까운 숫자가 표시됩니다. 확실하게, 로그 파일 크기를 8GB로 설정하십시오.


1
이것이 실제로 질문에 대답한다는 것은 분명하지 않습니다. 이것은 로그 파일 의 크기 를 안전하게 변경 하는 방법이 아니라 로그 파일의 대체 크기에 대한 제안으로 보입니다 .
RDFozz

1
@RDFozz 당신이 맞아요. 로그 파일 크기를 변경하는 방법에 대한 대답은 아닙니다. 이 질문은 innodb_log_file_size를 설정하기 위해 숫자를 알아내는 방법에 대한 답변입니다. 난 이미 (부제목 참조 5 년 전 같은 질문에 대답 Log File Sizedba.stackexchange.com/questions/23189/...을 )
RolandoMySQLDBA

나는 단지 돕고 싶었다 : / 나는 정확한 답이 아니라는 것을 안다.
리눅스 초보자

-4

chown mysql : mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || 서비스 mysql restart

제대로 작동하는지 확인 [데비안 6에서 테스트]


2
이것은 완전한 종료를 보장하지 않습니다. 일반적으로 부하가 적은 서버에서는 일반적으로 작동하지만 데이터베이스 무결성에 신경 쓰면 권장되지 않습니다.
Emil Vikström
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.