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

으로 테이블 복구 후 해당 테이블만 백업해서 복구