Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- mysql
- vacuum
- zabbix
- NCP
- online ddl
- jmeter
- postgresql
- ncloud
- REDIS
- Replication
- opensource
- RDS
- 6.2.7
- mongo
- autovacuum
- MyISAM
- 성능테스트
- Cloud DB for MySQL
- cdb
- DML
- OD
- NOSQL
- Connection
- RDBMS
- slack
- Maria
- maxclients
- InnoDB
- ROLLBACK
- Docker
Archives
- Today
- Total
개인 공부
[ MySQL ] innodb_onlin_alter_log_max_size 중요성 본문
반응형
MySQL 5.7 이후부는 Online DDL을 지원하게 되었습니다. Online DDL시 장애를 줄이기 위해서 알아두면 좋은 환경설정에 대해 포스트팅 해보도록 하겠습니다.
■ Online DDL시 아래 작업들이 발생하게 됩니다.
- online ddl시 row log buffer에 DDL이후의 데이터 변경사항을 저장하게 된다.
- row log buffer는 sort_buffer_size 시스템 변수에 정의된 크기만큼씩 할당하며, 최대 innodb_online_alter_log_max_size 만큼 증가하게 된다.
- innodb_online_alter_log_max_size ⇒ ONLINE DDL 중 DML문을 적재하는 Size 이다. 대부분 ONLINE DDL 중 해당 파라미터를 1G로 설정하고 진행한다.
■ Innodb_online_alter_log_max_size Defautl Value
MariaDB [test]> show variables like '%innodb_online_alter_log_max_size%';
+----------------------------------+------------+
| Variable_name | Value |
+----------------------------------+------------+
| innodb_online_alter_log_max_size | 134217728 |
+----------------------------------+------------+
■ 테스트 Table 생성
- Online DDL시 발생하는 Error를 보기위해서 Test Table을 생성
echo "create database IF NOT EXISTS test" | mysql -uroot -proot
echo "DROP TABLE IF EXISTS test.dup_error; CREATE TABLE test.dup_error(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, uid INT NOT NULL, v DATETIME, UNIQUE KEY ux_uid(uid));" | mysql -u root -proot
■ 테이블 용량을 올리기위해 칼럼 추가
seq -f "ALTER TABLE test.dup_error ADD COLUMN c%02.0f CHAR(255) DEFAULT '';" 1 30 | mysql -u root -proot
■ 테스트 데이터 적재 ( 빠른 적재를 위해 sql_log_bin / commit 관련 파라미터 수정 )
for n in {1..200000}; do printf "INSERT INTO test.dup_error (id, uid) VALUES (%d, %d);\n" $n $n; done | mysql -u root -proot --init-command="SET sql_log_bin=off; SET GLOBAL innodb_flush_log_at_trx_commit=0;"
■ ONLINE DDL
ALTER TABLE test.dup_error
DROP PRIMARY KEY,
DROP INDEX ux_uid,
ADD UNIQUE INDEX ux_id(id),
ADD PRIMARY KEY(uid),
ALGORITHM=inplace, LOCK=none;
■ innodb_online_alter_log_max_size를 넘어가도록 Test 데이터 적재
for n in {200001..600000}; do printf "INSERT INTO test.dup_error (id, uid) VALUES (%d, %d);\n" $n $n; done | mysql -u root -proot --init-command="SET sql_log_bin=off; SET GLOBAL innodb_flush_log_at_trx_commit=0;"
■ ONLINE DDL ERROR 발생
ERROR 1799 (HY000): Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again
반응형
'MySQL & Maria' 카테고리의 다른 글
[ MySQL ] MyISAM to InnoDB (14) | 2023.05.26 |
---|---|
[ MySQL ] CPU 부하 Query 모니터링 (10) | 2023.03.10 |
[ MySQL ] MySQL 데이터 디렉토리 변경 (22) | 2023.02.21 |
[ MySQL ] Openging Table 상태 (3) | 2023.02.17 |
[ MySQL ] Container DB Replication ( Using. Docker-compose ) (2) | 2023.02.15 |