mysql replication(Rocky 9 Linux)
dnf -y updatednf -y upgradednf -y install mysql-servermaster 서버에서/etc/my.cnf.d/mysql-server.cnf에 아래 내용 추가server-id=1(고유한 번호 -> 중복되면 안됨)log_bin=/var/log/mysql/mysql-bin.logbinlog_do_db=DB이름 입력복
dnf -y update
dnf -y upgrade
dnf -y install mysql-server
master 서버에서
/etc/my.cnf.d/mysql-server.cnf에 아래 내용 추가
server-id=1(고유한 번호 -> 중복되면 안됨)
log_bin=/var/log/mysql/mysql-bin.log
binlog_do_db=DB이름 입력
복제하고 싶은 DB가 여러 개면 해당 갯수만큼
binlog_do_db 줄 갯수 추가
log_bin=/var/log/mysql/mysql-bin.log
/var/log/mysql 디렉토리까지만 있으면 됨 없으면 생성하거나 mysql이 정상적으로
설치 되었는지 확인
mysql-bin.log 파일은 알아서 생성 됨
chown mysql:mysql /var/log/mysql
이 명렁어로 디렉토리 소유권 바꾸기
주로 쓰는 설정(SSL 인증 X)
ALTER USER 'repl'@'슬레이브 ip' IDENTIFIED WITH mysql_native_password BY 'repl비밀번호';
FLUSH PRIVILEGES;
ssl 없이 로그인할 수 있도록 설정하는 방법
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='HOST_IP 입력',
SOURCE_USER='repl',
SOURCE_PASSWORD='repl비밀번호',
SOURCE_LOG_FILE='mysql-bin.000001',
SOURCE_LOG_POS=1050;
START REPLICA;
입력
SHOW REPLICA STATUS\G
슬레이브 확인
---------------------------------------------------------------
보안 연결을 위한 SSL 인증
키 파일이 저장될 디렉토리 생성
mkdir -p /etc/mysql/ssl
cd /etc/mysql/ssl
openssl genrsa 4096 > ca-key.pem
openssl req -new -x509 -nodes -days 3650 \
-key ca-key.pem -out ca.pem \
-subj "/CN=MySQL-CA.example.com"
-> -subj "/CN=MySQL-CA.example.com"
이 부분에 도메인이 들어가는게 좋지만 다른 이름도 상관 없음 임의대로 설정 가능
CA 인증서 생성
openssl req -> SSL 인증서 생성 및 요청
-new = 새로운 인증서 생성
-x509 = 개인 키, csr(certificate signing request) 생성
CA가 CSR을 검증해서 인증서 발급
-nodes = 키 파일을 만들 때 비밀번호 적용하지 말고 바로 사용가능
-days 3650 = 인증서의 유효기간
-key ca-key.pem = 생성한 CA 개인키를 사용해 인증서 발급
-subj "/CN=MySQL-CA.example.com" = CA 인증서 이름
Master용 서버 인증서 생성
openssl genrsa 4096 > server-key.pem
openssl req -new -key server-key.pem -out server.csr \
-subj "/CN=mysql.sy123.store"
openssl x509 -req -in server.csr -days 3650 \
-CA ca.pem -CAkey ca-key.pem -set_serial 1 \
-out server-cert.pem
chmod 600 server-key.pem
chonw mysql:mysql *.pem
vim /etc/my.cnf.d/mysql-server.cnf
ssl_ca=/etc/mysql/ssl/ca.pem
ssl_cert=/etc/mysql/ssl/server-cert.pem
ssl_key=/etc/mysql/ssl/server-key.pem
내용 추가 후 변경사항 적용
Master 서버에서 Replication 전용 계정 만들기
CREATE USER 'repl'@'슬레이브_IP'IDENTIFIED WITH caching_sha2_password BY '복제계정비밀번호';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'슬레이브_IP';
ALTER USER 'repl'@'슬레이브_IP' REQUIRE SSL;
FLUSH PRIVILEGES;
-> SSL로만 접속하게 강제 설정
SHOW VARIABLES LIKE 'have_ssl';
SHOW VARIABLES LIKE 'ssl_%';
에 Variable_name에 have_ssl | Value에 YES가 뜨고
키 디렉토리가 알맞게 보이면 적용 성공
FLUSH TABLES WITH READ LOCK;
마스터 서버에 테이블 읽기 전용으로 상태를 바꿔 데이터의 변경을 막는 역할
SHOW MASTER STATUS;
마스터의 binlog의 현재 위치 확인
@@@@@@@@@@@@@@@@@@@@--slave 서버 설정--@@@@@@@@@@@@@@@@@@@@@@@@@@@
mysql-server.cnf 원본을 복사해 백업본을 생성한 후
vim /etc/my.cnf.d/mysql-server.cnf
server-id=2
relay_log=relay-bin
log_bin=/var/log/mysql/mysql-bin.log
내용 추가
systemctl restart mysqld로 설정 내용 적용
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='Master_IP',
SOURCE_PORT=3306,
SOURCE_USER='repl',
SOURCE_PASSWORD='복제계정비밀번호',
SOURCE_LOG_FILE='binlog.000001',
SOURCE_LOG_POS=1050,
SOURCE_SSL=1,
SOURCE_SSL_CA='/etc/mysql/ssl/ca.pem
설정 후
START REPLICA;
SHOW REPLICA STATUS\G
연동 확인
슬레이브 서버에서
mysql -h master_IP -u repl -p --ssl-mode=REQUIRED --ssl-ca=/etc/mysql/ssl/ca.pem
을 입력해 마스터 서버로 접속한 후
SHOW SESSION STATUS LIKE 'Ssl_cipher';
를 입력했을 때 값이 나온다면 SSL로 암호화 연결이 정상 작동
----------------------------------------------------------------
MASTER 서버에서 DATABASE를 만들어 줬지만 슬레이브에는 자동으로 안생김
따라서 슬레이브 서버에 따로 만들어주거나 import 해줘야함
MASTER 서버에서
mysqldump -u root -p --databases DB이름 > /tmp/DB.sql
-> 생성한 데이터배이스를 SQL 파일로 덤프(백업)을 하여
/tmp 디렉토리에 DB.sql 파일로 저장
-->databases가 들어가면 백업 본 맨 앞에 DB 생성과 해당 DB를 사용한다는
내용이 포함
따라서 복구용 파일을 만들 때는 --databases 옵션을 뺀
mysqldump -u root -p DB이름 > /tmp/DB.sql
이 명령어를 통해 백업본을 생성해야 한다.
scp /tmp/DB.sql root@slave_ip:/tmp/
-> 슬레이브 서버로 DB.sql 파일 보내기
mysql -u root -p < /tmp/DB.sql
-> MASTER에서 받아온 sql 파일을 mysql 프로그램에 복구
-------------------------------------------------------------
전체 복구는 백업 파일이 있을 경우
mysql -u root -p < 백업파일 디렉토리
로 넣을 수 있지만 특정 부분을 복구하려면 복구할 테이블을 찾고
전체 백업 파일을 새로운 DB를 생성하여 거기에 복구한다
CREATE DATABSE tmp_restore;
백업하기 전 덤프파일을 생성할 때 들어갔던 옵션 한번 더 확인하기
기억 안나면
mysqldump -u root -p DB이름 > /tmp/DB.sql
로 다시 덤프파일 생성하기
mysql -u root -p tmp_restore < 백업 파일 디렉토리
-> 백업 전용 DB에 백업 파일 복구
mysqldump -u root -p tmp_restore 망실된 테이블 명 > 파일 디렉토리/파일 이름.sql
mysql -u root -p DB이름 < 복구할 파일.sql
으로 백업 후 생성한 백업 전용 DB 삭제
DROP DATABASE tmp_restore;
mysql -u root -p DB이름 < /tmp/lost_table.sql
특정 table을 명령어를 통해 복구
--------------------------------------------------------------
UNLOCK TABLES;
-> read lock 푸는 방법
=========================================================================
binlog로 백업하기
마스터 서버에서 log 파일 확인 하는 방법
SHOW BINARY LOGS;
로그 파일이 나오면
mysql> SHOW BINARY LOGS;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 180 | No |
| mysql-bin.000002 | 12677 | No |
| mysql-bin.000003 | 853 | No |
+------------------+-----------+-----------+
3 rows in set (0.00 sec)
시간 순으로 bin 파일 생성
먼저 저장되어있는 백업 파일로 새 DB에 복구
mysqlbinlog --no-defaults /var/log/mysql/bin 파일명 | less
으로 테이블을 삭제하거나 DB를 삭제한 시간 확인 후
mysqlbinlog --no-defaults --start-datetime="(백업한 시간)" --stop-datetime="(실수하기 1초전 시간)" --rewrite-db='DB이름->DB_recover' /var/log/mysql/mysql-bin.000002 /var/log/mysql/mysql-bin.000003 | mysql -u root -p
으로 테이블 복구 후 해당 테이블만 백업해서 복구