23.11.07 - 뷰, 권한, master & slave

임연진·2023년 11월 8일

11월 7일

프론트엔드와 백엔드를 구분짓는것
: 프론트엔드코드는 클라이언트가 접근가능, 백엔드는 클라이언트가 접근불가능(누구 컴퓨터에서 실행이되냐가 중요함. 클라이언트코드는 윈도우던 어플리케이션이던 클라이언트 컴퓨터에서 다운되서 실행되는데, 서버는 걔네들 컴퓨터에서 실행되는 거기 떄문에 접근이 어려움. 백엔드는 남의 컴퓨터에서 실행되니까!)

회원 테이블
idx, email, password, name

회원 가입 SQL
INSERT INTO 회원 (email, password, name)
VALUES('test01@test.com','qwer1234','test01');

회원 가입한 계정 로그인 SQL
SELCT email, password, name
FROM 회원
WHERE email='test01@test.com' AND password='qwer1234'; -> sql 인젝션

#위에 걸로하면 안되고 밑에 걸로 해야함.
SELCT name, password
FROM 회원
WHERE email='test01@test.com';

회원 가입한 계정 패스워드 변경 SQL
UPDATE 회원 SET password='1234qwer' WHERE email='test01@test.com';

회원 가입한 계정 탈퇴 SQL
UPDATE 회원 SET password='1234qwer' WHERE email='test01@test.com';

뷰 = 가상의 테이블, 일반적으로 select만 사용, 틀만 있는 표. 조회하는 용. 먼저 하나 만들어놓으면 다음부터는 쉽게 사용 가능, 성능 개선보다는 간편하게 쓰기위함, 보안적인 용도도 있음. 수정이 안되서 수정하고싶다면 DROP해야함
장점 - 복잡한 쿼리를 단순화, 쿼리 재사용 가능
단점 - 보여주는것에만 특화되어있어서 삽입,삭제, 갱신 작업에는 제한사항이 있다.

#각 사원의 풀네임과 부서 이름과 급여를 조회하는 SQL
#employees에서 풀네임, dept_emp에서 사원의 부서 정보를 가져오고
#가져온 부서 정보에 해당하는 부서 이름을 department에서 가져오고
#급여는 salaries에서 가져온다.

SELECT employees.emp_no, first_name, last_name, dept_name, salary
FROM employees
LEFT OUTER JOIN dept_emp
ON employees.emp_no = dept_emp.emp_no
LEFT OUTER JOIN departments
ON departments.dept_no = dept_emp.dept_no
LEFT OUTER JOIN salaries
ON employees.emp_no = salaries.emp_no;

조회하는 SQL을 뷰로 만들기

CREATE VIEW employees_info AS
SELECT employees.emp_no, first_name, last_name, dept_name, salary
FROM employees
LEFT OUTER JOIN dept_emp
ON employees.emp_no = dept_emp.emp_no
LEFT OUTER JOIN departments
ON departments.dept_no = dept_emp.dept_no
LEFT OUTER JOIN salaries
ON employees.emp_no = salaries.emp_no;

#뷰를 통해서 데이터 조회
#뷰를 해놓으면 이렇게만 해도 위 명령어수식과 같이 볼수있음
SELECT * FROM employees_info;

원본의 데이터가 변경되면 뷰의 데이터도 변경

UPDATE employees SET first_name='abc' WHERE emp_no=10001;

SELECT * FROM employees_info;

인덱스 = (해석하면 색인, 목차)
원하는 정보만 찾아서 조회, 원하는 정보를 빨리 찾아서 볼수있게 해줌.
DB는 모든 행을 하나하나 다 살펴보는데 인덱스를 미리 만들어놓으면 성능이 좀 더 빨라짐.

RDB(oracle, myssql, mssql)=ssql 로 검색? x

nosql (= 검색만을 위해 만들어짐)
elastic search -> 역색인, 요즘 왠만하면 검색기능은 다 elastic search로 함.

redis

mongo

DCL 데이터를 제어한다

#;붙은건 리눅스에 mysqlworkbench에서!

GRANT ALL PRIVILEGES ON web.* TO 'lyj'@'%';
= GRANT 권한 ON DB이름.테이블이름 TO 'lyj'@'%';

권한은 리눅스에서설정
mysql -u root -p
show databases;
use mysql;
show tables;
SELECT * FROM mysql.user\G(하면 표로 나와야되는 내용들을 이쁘게 정리해줌)
SLECT user, host FROM mysql.user;(DB에서 사용할 수 있는 사용자 정보를 볼수있음)

(% = 모든문자를 다 대체함)

< 권한 >

CREATE DATABASE limmt(DB이름,원래쌤은smt);(맨앞에 내 성L)
USE limmt(원래쌤은smt);
CREATE TABLE member (
idx int auto_increment primary key,
email varchar(30),
password varchar(200),
name varchar(30)
);

특정 사용자의 권한 확인

SHOW GRANTS FOR 'lyj'@'%';

권한 주는 설정

GRANT 권한 ON DB 이름.테이블이름 TO 'lyj'@'%' 옵션;

권한 뺏는 설정

REVOKE 권한 ON DB이름.테이블이름 FROM 'lyj'@'%' 옵션; # CASCADR, RESTRICT

#워크벤치가서 select * from member;해서 되는지안되는지(권한이 부여됐는지안됐는지확인해보기)

#권한 SELECT, INSERT, UPDATE, DELETE,
#CREATE, ALTER, DROP, GRANT, REVOKE

#옵션 WITH GRANT OPTION


mysql -u root -p (root 가서 A,B 만들어줘야함)

사용자 A와 B를 어디에서나 접속할 수 있게 추가

CREATE USER 'A'@'%' IDENTIFIED BY 'qwer1234';
CREATE USER 'B'@'%' IDENTIFIED BY 'qwer1234';

관리자가 A에게 권한을 부여할 수 있는 권한과 함께 SELECT 권한을 준다.

GRANT SELECT ON limmt.member TO 'A'@'%' WITH GRANT OPTION;

A가 B에게 SELECT 권한을 준다.

exit;
mysql -u A -p (나가서 내가 A가 되야함)
GRANT SELECT ON limmt.member TO 'B'@'%';

만약에 A의 권한을 뺏으면 B는 어떻게 될까?

권한을 부여 받은 사람의 권한까지 뺏어가지는 않는다

REVOKE SELECT ON limmt.member FROM 'A'@'%';

A의 권한을 뺏는다고 B의 권한까지 뺏어가지는 않는데 그걸 확인하려면

SHOW GRANTS FOR 'B'@'%'; (리눅스에서확인)
여기서 'B'=내가확인하려고하는것

아니면 워크벤치 A나 B중 확인 하고싶은 것으로 열어서
SELECT * FROM member;(테이블이름)

요구사항분석 -> 개념설계(ERD다이어그램) -> 논리설계(워크벤치에서 ERD그려서 속성하나하나 지정하는것, 표형태로 매핑) -> 물리설계(어떻게 DB에 저장할것인가)

물리설계
서버를 한대만 쓸것인가
여러대를 쓸것인가
Replication(=복제,복사)/ 원본=master, 복제본=slave
Cluster

저장프로시저

리눅스컴퓨터 2대
ip설정
mysql-server 설치

#으로 시작되면 주석, 설명하는것. 모든프로그램이 그렇지는 않음

수정할때는 vi

리눅스에 DB 시작

  1. centOS 더블클릭

  2. IP 설정 vi /etc/sysconfig/network-scripts/ifcfg-ens160

BOOTPROTO=static -> 변경

ONBOOT=yes ->변경

IPADDR=10.10.10.10 (이렇게 하면 내 가상머신 아이피 지정)

NETMASK=255.255.255.0

GATEWAY=10.10.10.2

DNS1=8.8.8.8

  1. network 설정 systemctl restart NetworkManager

  2. init 6 재부팅

  3. ip addr

  4. systemctl stop firewalld

  5. setenforce 0

  6. network 설정됐는지 확인 ping 8.8.8.8 (구글 DNS), ping www.naver.com(이게 안되면 DNS설정문제)

  7. DB 설치 yum install -y mysql-server

  8. msql서버 설치확인 rpm -qa | grep mysql

  9. mysql 서버실행 systemctl start mysqld

실행확인(프로세스, 포트, 서비스 확인)
ps -ef | grep mysql PID, mysql꺼 잘있는지
netstat -anlp | grep 3306 LISTEN, 3306포트 상태확인

  1. systemctl status mysqld active(running)확인

  2. 초기설정 mysql_secure_installation
    no (원래는 yes가 맞지만 지금은 간단한 비번 qwer1234사용 위해서)
    y
    y
    y
    y

  3. mysql 로그인(서버접속) mysql -u root -p

  4. DB생성 CREATE DATABASE web;

  5. 사용자 생성 CREATE USER 'lyj'@'%' IDENTIFIED BY 'qwer1234';

  6. 권한부여 GRANT ALL PRIVILEGES ON web.* TO'lyj'@'%';

  7. exit

  8. 워크벤치가서 +눌러서 생성(리눅스 해당 ip랑 포트번호 3306넣고)

master - insert, update, delete
slave - select

  1. DB 이중화
    (1) 네트워크 설정(2) 방화벽 설정
    setenforce 0
    systemctl stop firewalld

(3) MySQL 설치 및 실행
yum install mysql-server

systemctl restart mysqld

(4) MySQL 초기 설정
mysql_secure_installation
No
패스워드 입력
패스워드 입력
y
y
y
y

(5) Master 설정 (MySQL1)
1) vi /etc/my.cnf.d/mysql-server.cnf 파일 수정
[mysqld] 밑에 다음 내용을 추가한다.
server-id = 1
log-bin = mysql-bin

systemctl restart mysqld

2) Master 상태 확인

mysql -u root -p 로그인 후
show master status;

	*[]는 쓰는게 아니고 저자리에 저게들어간다~


3) Replication할 때 사용할 계정 생성 및 권한 부여
CREATE USER '[이니셜]'@'[MySQL2의 IP주소]' IDENTIFIED BY '[패스워드]';

GRANT REPLICATION SLAVE ON *.*  TO '[이니셜]'@'[MySQL2의 IP주소]';



select * from mysql.user where user='[이니셜]'\G
	Repl_slave_priv 속성이 Y로 되어있는지 확인

(6) Slave 설정 (MySQL2)
1) vi /etc/my.cnf.d/mysql-server.cnf 파일 수정
[mysqld]밑에 다음 내용을 추가한다.

server-id = 2

( 만약에 있으면 log-bin = mysql-bin 줄 지우기)



systemctl restart mysqld

2) Master 지정
mysql -u root -p
change master to
master_host='[마스터 컴퓨터의 IP 주소]',
master_user='[마스터에서 만든 slave용 계정 이름]',
master_password='[마스터에서 만든 slave용 계정의 PW]',
master_log_file='mysql-bin.[마스터의 로그 번호]',
master_log_pos=[마스터의 포지션 번호];

change master to
master_host='10.10.10.110',
master_user='woof',
master_password='qwer1234',
master_log_file='mysql-bin.000001',
master_log_pos=681;

(show master status; -> 로그번호, 포지션번호 볼수있음)

3) 동기화 시작
start slave;

4) Slave 상태 확인
show slave status;

	또는

show slave status\G

Slave_IO_Running: Yes	(connecting으로 되어있으면 user의 ip설정이 반대로 되어있어서 그런듯)	
Slave_SQL_Running: Yes
Slave_SQL_Running_State 등 확인
  1. 동기화 안될 때
    (1) 슬레이브
    stop slave;

    (2) 마스터
    마스터 상태 확인

    (3) 슬레이브
    change master to 명령어로 설정

    	start slave;
  1. 동작 확인
    (1) 마스터, 슬레이브에서 DB 확인
    show databases;

    (2) 마스터에서 DB 생성
    CREATE DATABASE [DB이름];

    (3) 마스터, 슬레이브 에서 DB 확인
    show databases;

    	이 때 양쪽에 DB가 생성되어 있어야 한다.

0개의 댓글