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_methodmy.ini(하지 my.cnf). 서버 정보
-Apache

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

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