많은 사람들에게 MySQL Achilles의 발 뒤꿈치는 암묵적인 커밋입니다.
이 책 의 418 페이지 3 단락에 따르면
다음 명령은 트랜잭션을 중단시킬 수 있습니다
ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
LOCK TABLES
UNLOCK TABLES
SET AUTOCOMMIT = 1
START TRANSACTION
암시
MySQL과 관련하여 구성하는 CI (ContinuousIntegration) / SelfService 작업은 항상 트랜잭션 작업과 DDL 스크립트를 상호 배타적으로 만들어야합니다.
이것은 당신에게 패러다임을 만들 기회를 제공합니다
START TRANSACTION/COMMIT
블록 으로 올바르게 격리 된 트랜잭션 지원
- DDL을 직접 스크립팅하여 생성자 또는 소멸자와 같은 DDL을 실행하여 DDL 제어
- 생성자 : 새로운 디자인으로 테이블을 만드는 DDL
- 소멸자 : 테이블을 이전 디자인으로 되 돌리는 DDL
- 한 작업에서 이러한 작업을 결합하지 마십시오
경고 : MyISAM을 사용하는 경우 암묵적 커밋이 아니라 롤백이 발생 해야하는 데이터 일관성 측면에서 트랜잭션을 중단시킬 수있는 항목 목록에 MyISAM을 추가 할 수 있습니다. 필요합니다.
왜 LVM이 아닙니까?
LVM 스냅 샷은 훌륭하며 많은 SQL 처리를 수행하지 않고 전체 데이터베이스 인스턴스를 복원하는 것이 이상적입니다. 그러나 MySQL의 경우 InnoDB와 MyISAM의 두 가지 스토리지 엔진을 고려해야합니다.
모든 InnoDB 데이터베이스
InnoDB 아키텍처 살펴보기 (Percona CTO Vadim Tkachenko의 사진 제공)
InnoDB에는 많은 움직이는 부분이 있습니다
- 시스템 테이블 스페이스
- 데이터 사전
- 이중 쓰기 버퍼 (데이터 일관성 지원, 응급 복구에 사용)
- 버퍼 삽입 (2 차 비 고유 인덱스에 대한 버퍼 변경)
- 롤백 세그먼트
- Undo Space (가장 통제되지 않은 성장이 일어날 수있는 곳)
- InnoDB 버퍼 풀
- 더티 데이터 페이지
- 더티 인덱스 페이지
- 비 고유 인덱스 변경
- 다른 중요한 메모리 캐시
버퍼 풀 및 메모리 캐시에 커밋되지 않은 변경 사항이있는 all-InnoDB 데이터베이스의 LVM 스냅 샷을 생성하면 LUN이 복원되고 mysqld가 시작되면 InnoDB 응급 복구가 필요한 데이터 세트가 생성됩니다.
ALL-InnoDB를위한 제안
스냅 샷을 작성하기 전에 MySQL을 종료 할 수있는 경우
- 운영
SET GLOBAL innodb_fast_shutdown = 0;
- 운영
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- 운영
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Innodb_buffer_pool_pages_dirty 가 0이거나 가능한 한 0에 가까워 질 때까지 3 단계를 반복 하십시오.
service mysql stop
- LVM 스냅 샷 생성
service mysql stop
종료 할 수 없지만 MySQL Live로 스냅 샷을 찍는 경우
- 운영
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- 운영
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Innodb_buffer_pool_pages_dirty 가 0 또는 가능한 0에 가까워 질 때까지 2 단계를 반복 하십시오.
- LVM 스냅 샷 생성
- 운영
SET GLOBAL innodb_max_dirty_pages_pct = 75;
모든 MyISAM 데이터베이스 또는 InnoDB / MyISAM 믹스
MyISAM은 액세스 할 때 열려있는 파일 핸들 수를 유지합니다. MySQL이 충돌하면 열린 파일 핸들 수가> 0 인 MyISAM 테이블이 충돌로 표시되고 데이터가 아무 문제가없는 경우에도 복구가 필요합니다.
MyISAM 테이블이 사용중인 데이터베이스의 LVM 스냅 샷을 작성하면 스냅 샷이 복원되고 mysqld가 시작될 때 하나 이상의 MyISAM 테이블을 복구해야합니다.
All-MyISAM 또는 InnoDB / MyISAM 믹스 제안
스냅 샷을 작성하기 전에 MySQL을 종료 할 수있는 경우
- 운영
SET GLOBAL innodb_fast_shutdown = 0;
- 운영
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- 운영
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Innodb_buffer_pool_pages_dirty 가 0이거나 가능한 한 0에 가까워 질 때까지 3 단계를 반복 하십시오.
service mysql stop
- LVM 스냅 샷 생성
service mysql stop
종료 할 수 없지만 MySQL Live로 스냅 샷을 찍는 경우
특정 InnoDB 테이블을 플러시 할 수 있습니다
- 운영
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- 운영
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- Innodb_buffer_pool_pages_dirty 가 0 또는 가능한 0에 가까워 질 때까지 2 단계를 반복 하십시오.
FLUSH TABLES innodb_tbl1,... FOR EXPORT;
중요한 InnoDB 테이블에서 실행
- 운영
FLUSH TABLES WITH READ LOCK;
- LVM 스냅 샷 생성
- 운영
UNLOCK TABLES;
- 운영
SET GLOBAL innodb_max_dirty_pages_pct = 75;
MySQL 복제가 도움이 될 수 있습니까?
하나의 LVM 스냅 샷을 두 개의 서버로 복원하고 MySQL 마스터 / 슬레이브 복제를 설정할 수 있지만, 스냅 샷을 복원 할 때 추가적인 하우스 정리 소스가됩니다.
마스터에서 CI 작업을 실행하고 해당 작업이 적은 경우 특정 상황에서 복제가 시간을 절약 할 수 있습니다. STOP SLAVE;
Slave에서 실행 하고 Master에서 CI 작업을 시작 START SLAVE;
하고 Master의 데이터가 인증되면 Slave에서 실행할 수 있습니다.
CI 작업이 너무 많은 데이터를 경고하면 LVM 스냅 샷을 복원하고 복제를 처음부터 복원 할 수 있습니다. 이 작업을 자주 수행하는 경우 MySQL 복제를 설정하면됩니다.
마지막 생각들
- 여러 DB 서버 (3 이상)를 사용하여 복원 및 회귀 테스트를 수행하는 것이 가장 좋습니다.
- MyISAM을 유지할 필요가없는 경우 나머지 MyISAM 테이블을 InnoDB로 변환하십시오.
- 데이터 내용이 민감한 경우 테스트를 시작하기 전에 스냅 샷을 복원 한 후 CI 작업을 실행하여 데이터를 제거해야합니다. 또는 이미 스크러빙 한 데이터를 사용하여 MySQL의 스냅 샷을 만들 수도 있습니다.