innodb_flush_log_at_trx_commit에 대한 동적 변경


11

이것은 이 질문 과 관련 이 있습니다. InnoDB 테이블의 성능을 향상시키는 데 도움이됩니다.

에 따르면 MySQL의 설명서 , innodb_flush_log_at_trx_commit글로벌 동적 변수입니다. 따라서 SET GLOBAL 명령을 사용하여 변경할 수 있으며 작동하는 것 같습니다.

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

그러나 실제 MySQL 설정을 변경하지는 않았습니다. my.cnf를 업데이트 하고 MySQL 서버를 다시 시작 했을 때 작동했습니다. 런타임에 전역 변수를 변경할 수 없습니까?

기본값을 선호 innodb_flush_log_at_trx_commit=1하지만 큰 데이터베이스가 더 빨라지도록 복원 프로세스를 실행하기 전에 2로 변경해야합니다. 그러나 프로세스가 완료되면 값을 다시 1로 변경하고 싶습니다. 런타임시이를 수행 할 수 있습니까?

공유 호스팅 서버 에서 my.cnf 에 액세스 할 수 없습니다 .

답변:


12

Rolando의 변경 권장 사항에 동의하지만 innodb_flush_method귀하가 의미하는 바를 100 % 명확하게 알 수 없었습니다.

실제 MySQL 설정을 변경하지 않았습니다.

GLOBAL 변수를 변경하면 새로운 연결에 영향을 주지만 현재 세션 (강조 광산)은 수정하지 않는다는 경고 를 지적하고 싶습니다 .

전역 변수 변경은 현재 연결된 클라이언트 ( SET GLOBAL 문 을 실행하는 클라이언트의 세션 조차도) 의 세션 변수에 영향을 미치지 않습니다 .

그래서 그것을 확인하려면 :

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

2
이 대답은 의미가 있습니다. 설명서 ( dev.mysql.com/doc/refman/5.5/en/… )에는 세션 수준의 변수를 전역 수준에서만 변경할 수 있다고 말하지 않았습니다. 나는 많은 시간과 MAX_CONNECTIONS을 변경하는 것을 경험 SET GLOBAL max_connections = 1000;하고 난 실행할 때 SHOW VARIABLES LIKE 'max_connections';평균 미치게 것 이전 값을보고 내가 로그 아웃하고 다시. 하나 하를 위해 촬영 허가와 자주 잊어 이러한 관점에 대한 때까지.
— RolandoMySQLDBA

@Rolando 나도! 또한 '연결'할 수 있다는 사실을 알게되어 기뻤습니다. 로그 아웃했다가 다시 로그인하는 대신 시간을 절약 할 수 있습니다!
— 데릭 다우니

이러한 실행 개념 connect은 실제로 MySQL에서 새로운 것입니다. PostgreSQL과 Oracle에서 그 일을 백만 번했습니다. 한 번도 MySQL을 허용 한 적이 없었습니다.
— RolandoMySQLDBA

@DTest, 답변 주셔서 감사합니다. 내 심층 테스트에 따르면 동적으로 작동했습니다. 내 로컬 호스트에서 connect를 실행하지 않고 세션 변수가 변경되었습니다 (문제가 발생하면 오류가 발생했습니다 connect). 값 2를 사용하면 2,241,319 개의 레코드를 가져 오는 데 27 분 43 초가 걸렸지 만 값 1에서는 약 1 일이 걸렸습니다. 설정이 현재 세션에서 작동하는 것 같지만 my.cnf다시 시작한 후 원래 설정 (에서 시작)을 복원했습니다 .
— Sithu

@DerekDowney, 이것은 같은 특정 설정에만 해당 innodb_flush_log_at_trx_commit됩니까? 아니면 모든 설정에 대해 설정해도 global현재 세션에 영향을 미치지 않습니까?
— Pacerier

7

innodb_flush_log_at_trx_commit 을 설정 하면 mysqld / OS 상호 운용성과 혼동 될 위험이 있습니다. OS가 플러시를 수행하도록 신뢰할 수 있기 때문에 이것을 말합니다.

MySQL 문서 의주의 사항을 참고하십시오.

많은 운영 체제와 일부 디스크 하드웨어는 디스크 비우기 작업을 속입니다. 그들은 플러시가 발생하지 않았지만 mysqld에게 플러시가 발생했다고 말할 수 있습니다. 그러면 설정 1을 사용해도 트랜잭션의 내구성이 보장되지 않으며 최악의 경우 정전으로 인해 InnoDB 데이터베이스가 손상 될 수도 있습니다. SCSI 디스크 컨트롤러 나 디스크 자체에서 배터리 백업 디스크 캐시를 사용하면 파일 플러시 속도가 빨라지고 작업이 더 안전 해집니다. 또한 하드웨어 캐시에서 디스크 쓰기 캐싱을 비활성화하기 위해 Unix 명령 hdparm을 사용하거나 하드웨어 공급 업체에 특정한 다른 명령을 사용할 수도 있습니다.

이것이 말하는 것은 다음과 같습니다. OS는 부정 행위하는 남편처럼 보일 수 있습니다. OS는 디스크를 플러시하고 단순히하지 않습니다. 따라서 innodb_flush_log_at_trx_commit을 설정하더라도 mysqld의 플러싱에서 디스크로 OS 플러싱을 이혼해야합니다.

아직 수행하지 않은 경우 innodb_flush_method 를 O_DIRECT로 설정하십시오 . 플러시 방법이 크게 다르기 때문에 차이가있을 수 있습니다 ( MySQL에 대한 내 Mar 04, 2011게시물 설명 innodb_flush_method variable 참조 ).

경고

언급했듯이에 액세스 할 수 없습니다 my.cnf. 공급자의 SysAdmin에 문의하여 innodb_flush_method를 변경하십시오.

업데이트 2012-12-10 12:45 EDT

현재 내 PC에서 MySQL 5.5.12를 실행하고 있습니다. 내가 연결하고 실행할 show variables like 'innodb_flush_method';때 얻을

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

공백이므로 기본 설정이 사용됨을 나타냅니다. MySQL innodb_flush_method 변수에 대한 설명을 위해 2011 년 3 월 4 일 포스트를 읽으십시오


로컬 호스트에서 먼저 테스트했습니다. 찾을 수없는 수 innodb_flush_method의 my.ini(하지 my.cnf). 서버 정보
— -Apache

서버 버전이나 ini / cnf에 관계없이 구성 파일에 innodb_flush_method설정 SHOW VARIABLES이 없으며 표시되지 않습니다.
— Sithu December

귀하의 업데이트에 감사드립니다. 나는 그것을 얻었습니다. 왜 우리가 그 가치를 볼 수 없는지 궁금했습니다. 내가 그것을 찾을 수 없습니다 때문에 my.ini나 my.cnf하고 동적 변수 아니다, 나는 확실히 그것을 구성하는 방법을 모르겠어요.
— Sithu December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.