아래 예시의 appdb, app, <password>, 10.0.0.x 는 실제 값으로 바꿔서 쓴다.
1. 설치
|
1 2 |
sudo apt install mariadb-server mariadb-client sudo mariadb-secure-installation |
2. DB, 계정, 권한
|
1 2 3 4 5 6 7 8 9 10 |
CREATE DATABASE appdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'app'@'%' IDENTIFIED BY '<password>'; GRANT ALL PRIVILEGES ON appdb.* TO 'app'@'%'; -- 특정 뷰만 읽게 하는 계정 CREATE USER 'report'@'%' IDENTIFIED BY '<password>'; GRANT SELECT ON appdb.view_users TO 'report'@'%'; SHOW GRANTS FOR 'app'@'%'; |
root@'%' 처럼 root 를 외부에 여는 것은 피하고, 서비스마다 필요한 DB 에만 권한을 준 계정을 따로 만든다. GRANT 와 CREATE USER 를 쓰면 FLUSH PRIVILEGES 는 필요 없다.
3. 백업과 복원
|
1 2 3 4 5 6 7 8 |
# 백업 (InnoDB 는 --single-transaction 으로 잠금 없이 일관된 백업) mysqldump -u app -p --single-transaction --routines --triggers appdb | gzip -9 > appdb.sql.gz # 복원 gunzip < appdb.sql.gz | mysql -u app -p appdb # 다른 서버로 바로 복원 mysqldump -h 127.0.0.1 -u app -p --single-transaction appdb | mysql -h 10.0.0.12 -u app -p appdb |
-p비밀번호 처럼 명령줄에 비밀번호를 쓰면 프로세스 목록과 쉘 히스토리에 남는다. 자동 백업에는 ~/.my.cnf(권한 600)에 넣어 둔다.
|
1 2 3 |
[client] user=app password=<password> |
4. 복제(Replication) 구성
master – /etc/mysql/mariadb.conf.d/50-server.cnf
|
1 2 3 4 5 6 |
[mysqld] server-id = 1 log_bin = mysql-bin binlog_format = ROW expire_logs_days = 2 bind-address = 0.0.0.0 |
|
1 2 3 |
CREATE USER 'repl'@'10.0.0.%' IDENTIFIED BY '<password>'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.%'; SHOW MASTER STATUS; -- File 과 Position 을 적어 둔다 |
slave – /etc/mysql/mariadb.conf.d/50-server.cnf
|
1 2 3 4 5 6 |
[mysqld] server-id = 2 log_bin = mysql-bin relay_log = relay-bin read_only = 1 replicate-do-db = appdb # 특정 DB 만 복제할 때 |
|
1 2 3 4 5 6 7 8 9 |
CHANGE MASTER TO MASTER_HOST='10.0.0.11', MASTER_USER='repl', MASTER_PASSWORD='<password>', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', -- SHOW MASTER STATUS 의 File MASTER_LOG_POS=1234; -- SHOW MASTER STATUS 의 Position START SLAVE; SHOW SLAVE STATUS\G |
Slave_IO_Running 과 Slave_SQL_Running 이 둘 다 Yes 이고 Seconds_Behind_Master 가 0 에 가까우면 정상이다. master 쪽에서는 SHOW PROCESSLIST\G 로 복제 연결을 볼 수 있다. 예전 자료처럼 my.cnf 에 master-host 를 적는 방식은 지금 버전에서 동작하지 않으니 CHANGE MASTER TO 를 쓴다.
5. 복제가 깨졌을 때
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-- 문제 되는 쿼리 하나만 건너뛰기 STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE; -- 위치를 다시 지정하기 STOP SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=149868127; START SLAVE; -- 복제 설정을 완전히 지우기 STOP SLAVE; RESET SLAVE ALL; |
건너뛰기는 데이터가 어긋날 수 있으니 원인을 확인한 뒤에만 쓴다.
6. 복제 지연 줄이기 (병렬 복제)
|
1 2 3 4 |
STOP SLAVE; SET GLOBAL slave_parallel_threads = 8; SET GLOBAL slave_parallel_mode = 'optimistic'; START SLAVE; |
MariaDB 의 변수 이름이다. MySQL 에서는 replica_parallel_workers, replica_parallel_type='LOGICAL_CLOCK' 으로 이름이 다르다.
7. 성능 점검
MySQLTuner 를 받아 실행하면 현재 사용량을 보고 설정값을 추천해 준다.
관련 글: MySQL 튜닝 (from 나프다)

Leave a Reply