[과제] NHN Cloud 인스턴스에 MySQL 설치

강세준·2023년 1월 13일
0

nhn

목록 보기
4/7

 인스턴스 환경

OS 버전아키텍처
CentOS 7.9x86_64

1. 압축파일을 이용한 설치(Binary Install)


1) NHN Cloud 인스턴스 생성 및 접속

인스턴스 생성 관련 링크

#접속
ssh -i [키 페어 이름.pem] centos@1[floating IP]

2) 알맞는 버전의 설치 파일 가져오기


MySQL설치에서 CentOS는 Red Hat Linux의 버전을 따르고 있다.

3) 설치 및 설정

#3-1) 설치하기
# wget은 웹에서 파일 다운로드하기 위한 리눅스 커맨드라인 유틸리티이다.
$ wget (tar 설치파일 링크)

#3-2) 압축해제
$ tar -xvf (tar파일)

#3-3) libaio 설치
# mysql은 libaio 라이브러리 dependency가 존재하므로 서버 시작단계에서 실패하지 않기 위해 설치가 필요하다.
$ sudo yum install libaio

#3-4) 이름변경
$ mv mysql-8.0....(mysql폴더명) mysql

#3-5) mysql 파일 소유권 변경 
# NHN cloud(CentOS Instance) 사용자 centos가 파일의 소유권한을 갖게 한다.
$ chown -R centos:centos mysql

#3-6) mysql 설정파일 설정
#mysql폴더 안에 my.cnf를 생성한다
$ cd mysql
$ vi my.cnf
#설정파일 작성 mysql 실행시 파일 경로에 접근할 수 있게끔 설정한다.
[client]
port=3306
socket=/home/centos/mysql/mysql.sock
[mysqld]
socket=/home/centos/mysql/mysql.sock
basedir=/home/centos/mysql
datadir=/home/centos/mysql/data
pid-file=/home/centos/mysql/mysqld.pid
log-error=/home/centos/mysql/mysql-logs/mysqld.log
:wq

#3-7) 데이터, 로그 폴더 생성
# 데이터 파일과 로그가 기록될 수 있게끔 폴더, 파일을 생성한다.
$ mkdir data
$ mkdir mysql-logs
$ cd mysql-logs
$ touch mysqld.log

#3-8) 설정파일 경로 지정
# mysql 실행시 필요한 설정파일의 경로를 지정 해준다.
$ /home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf --initialize

4) MySQL 실행

#4-1) mysql 실행
$ /home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf &

#4-2) 임시 비밀번호 찾기
# mysql을 실행하면 root에 초기 임시 비밀번호가 생성되어 로그에 남게된다. 해당 비밀번호를 가지고 루트에 로그인 한다.
$ cat mysql-logs/mysqld.log

# 4-3) 루트 계정으로 로그인
$ /home/centos/mysql/bin/mysql -u root -p --socket 
/home/centos/mysql/mysql.sock

임시 비밀번호 추출 커맨드(파일 경로 주의)
grep 'temporary password' /home/centos/mysql/mysql-logs/mysqld.log | cut -d ':' -f4 | sed 's/^ *//' | tail -1

Error

mysql 로그인시 소켓에러가 발생할때 default socket위치(/tmp/mysql.sock)으로 소켓을 찾기 때문에 --socket 옵션을 통해 로그인시에 소켓의 경로를 넣어주면 해결 가능하다.


5) PATH 설정
mysql의 명령어를 찾아 일일이 경로를 적어주는 것 보다는 경로를 한번 등록하고 사용하는 것이 편하다.

# .bashrc 파일 끝(shift+g)에 경로를 등록한다.
vi ~/.bashrc

export PATH=$PATH:/home/centos/mysql/bin/
  • 셸 상에서 ~(물결)은 로그인 한 유저의 홈 디렉토리를 의미한다.
  • bashrc : bash가 수행될 때 실행되는 함수 (해당 사용자에게만 한정됨)

2. yum을 이용한 설치

  • RPM
    RPM은 리눅스 소프트웨어 패키지를 설치, 삭제, 관리등을 수행하는 프로그램입니다,
  • yum
    yum은 CentOs에서 패키지를 관리해주는 명령어로 RPM설치 시 발생하는 의존성 문제를 해결해줍니다.

1) NHN Cloud 인스턴스 생성 및 접속

2) 알맞는 버전의 설치 파일 가져오기

3) mysql 설치 및 실행

#3-1) mysql yum repository 추가
# yum -y 옵션을 통해 패키지 설치 과정에 묻는 모든 질문에 yes를 입력하도록 한다.
$ sudo yum -y install [mysql version].noarch.rpm

#3-2) 설치 확인 및 설치 가능한 패키지 목록 확인
$ yum repolistenabled | grep "mysql.*-community.*"

#3-3) 설치할 패키지 및 버전 설정
$ yum repolit all | grep mysql
$ sudo yum-config-manager (--disable | --enable) mysql(version)-community

#3-4) mysql 설치
$ sudo yum -y install mysql-community-server

#3-5) mysql 서버 실행
$ systemctl start mysqld

#3-6) mysql 서버 상태 확인
$ systemctl status mysqld

#3-7) root 계정 임시 비밀번호 확인
$ sudo grep 'temporary password' /var/log/mysqld.log

#3-8 ) root 계정 로그인
$ mysql -uroot -p

#3-9 ) root 비밀번호 변경
mysql> alter user 'root'@'localhost' identified by '[비밀번호]'

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 관련 해결법

1) systemctl status mysql 확인

	Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
	Active: inactive (dead)

삭제 후 재 설치시 서버가 구동되어 있지 않을 경우

2) sudo systemctl status mysqld 명령어로 서버 재실행

   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running)

서버 동작 확인후 root 계정 로그인 실행

yum 설치 임시 비밀번호 추출 커맨드(파일 경로 주의)
sudo grep 'temporary password' /var/log/mysqld.log | cut -d ':' -f4 | sed 's/^ *//' | tail -1


3. MySQL 동작 실습

1) db 생성

mysql> create database [database 이름];

2) user 생성, 권한 부여

#2-1) user 생성
mysql> create user '[user 이름]'@'[접근 허용 범위]' identifed by '[password]'

#2-2) 권한 부여
grant [권한] [database 이름].[테이블] to [user 이름]@[접근 허용 범위];
# 테이블이 .*로 표시될 경우 db안 모든 테이블에 해당 권한 부여 

접근 허용 범위

접근 허용 범위설명
localhost내부(mysql이 설치된 로컬 환경) IP만 접근 허용
%외부의 접근 허용
IP특정 IP에서 접근 허용

3) 테이블 생성

#테이블 생성
create table [table 이름] (칼럼이름 및 설정);

4) 데이터 입출력

#데이터 입력
insert into [table 이름] (column1, column2 ...) values (value1, value2), (value1, value2)...;

#데이터 출력(확인)
select [column 이름] from [table 이름];

5) mysql config 내용 확인

#yum으로 설치할 경우
cat /etc/my.cnf


4. 추가 학습

1) inno_db_buffer_pool_size

buffer pool은 inno DB에서 인덱스 데이터나 테이블을 캐싱하기 위해 사용되는 메인메모리 안의 영역이다.
자주 사용하는 데이터를 메모리에 직접 액세스 할 수 있게 하여 속도를 높히는 캐시와 같은 역할을 수
행한다.
다른 프로세스들이 쓸만큼의 공간은 남겨준체 대부분의 메모리 공간을 innodb의 버퍼 풀로 할당하는 것이 가장 좋고 버퍼풀의 크기가 크면 in-memory db처럼 innodb가 동작하게 된다.

2) mysql_ssl_rsa_setup

MySQL은 SSL을 사용해 암호화된 연결을 지원하고 암호화되지 않은 연결에서 RSA을 사용하여 보안 암호를 교환할 수 있게끔 하는 SSL 인증서 및 키파일과 RSA의 키파일을 생성할 수 있도록 기능을 제공한다.
mysql_ssl_rsa_setup커맨드를 사용하면 수동으로 SSL 및 RSA파일을 생성할 수 있다.

  • Open SSL을 사용하여 컴파일된 MySQL 배포판은 서버 시작시 누락된 SSL 및 RSA를 자동으로 생성하는 기능이 존재한다.
  • Unix계열 시스템에서 인증서는 누구나 읽을 수 있지만, 키는 서버를 실행하는 계정에서만 액세스 가능하다.
  • SHOW STATUS LIKE 'Ssl_server-not%';쿼리를 통해 SSL 인증서 만료 정보도 확인할 수 있다.

3) mysqld_safe --skip-grant-tables &

초기 비밀번호 없이 root 비밀번호를 변경하는 방법

mysqld_safe : 안전모드로 Mysql 데몬을 실행한다.
--skip-grant-tables : 인증 과정을 생략한다
& : 백그라운드로 커맨드를 실행한다.

Error : mysqld_safe: command not found
최신 버전의 MySQL에서 mysqld_safe 유틸리티를 제공하지 않아서 발생하는 에러

해결 순서

nhn cloud centOS 7.9환경 기준

#mysqld 데몬 종료후 --skip-grant-tables옵션 추가 후 실행
$ sudo systemctl stop mysqld
$ sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
$ sudo systemctl start mysqld

#mysql 접속 후 권한을 불러온 후(flush privileges) 비밀번호 변경
$ mysql -u root

mysql> flush privileges;
mysql> alter user 'root'@'localhost' identified by [password];
mysql> flush privileges;
mysql> quit

#서버 종료 후 mysqld 설정 초기화(--skip-grant-tables 옵션 제거)
$sudo systemctl stop mysqld
$sudo systemctl unset-environment MYSQLD_OPTS

#mysql 재시작
$ mysql -u root -p

flsuh privileges : 사용중인 MySQL 서버의 캐쉬를 삭제하고 grant tabl을 reload한다.

transaction isolation levels

isolation(격리성) : 데이터 조작을 다수의 사용자가 동시에 실행해도 모순 없이 실행 되는 것을 보장하는 것.
고립수준은 직렬화(Serializable)에서 커밋되지 읽기(Read uncommitted) 쪽으로 갈수록 완화되는 구조를 가지고 있다.

1)Serializable

  • 항상 동시 동작하는 트랜잭션이 1개의 이미지가 되어 성능면에서 실용적이지 않다.
  • 더러운 데이터(아직 커밋되지 않은 데이터)를 읽지 않는다.
  • Phantom read 및 반복 불가능한 읽기(nonrepeatable reads)를 방지한다.

2)Repeatable read

  • 더러운 데이터를 읽지 않는다.
  • 트랜잭션은 어플리케이션에 반환하는 모든 행에 대해 read lock을 보유하고, 업데이트하거나 삭제할때 write lock을 보유한다.
  • 트랜잭션이 커밋되거나 롤백될 떄 lock을 해제하고 반복 불가능한 읽기를 방지한다.

3)Read committed

  • 더러운 데이터를 읽지 않는다.
  • 트랜잭션은 현재 행에 대해서 읽을 때는 read lock, 업데이트하거나 삭제할때 write lock을 유지하여 다른 트랜잭션이 해당 행을 업데이트하거나 삭제되지 못하도록 한다.
  • 트랜잭션이 현재 행에 벗어날 때 read lock이 해제되고 커밋되거나 롤백될 때까지 write lock을 유지한다.

4)Read uncommitted

  • 트랜잭션은 서로 격리되지 않는다.
  • 다른 트랜잭션에 부정적인 영향이 가지 않도록 Read uncommitted는 주로 읽기 전용 트랜잭션들이 사용한다.
Dirty Reads

트랜잭션이 다른 트랜잭션이 커밋하지 않고 변경한 데이터들을 읽을 때 발생한다.

Nonrepeatable Reads

트랜잭션이 이전에 읽어 들인 데이터를 다시 읽어 들일 때 결과가 다른 현상이다

phantoms(Phantom read)

트랜잭션이 읽을 때 선택할 수 있는 데이터가 나타나거나 사라지는 현상이다

정리

"O" : 해당 현상이 나타날 수 도 있다.

transaction isolation levelDirty ReadsNonrepeatable Readsphantoms
Read uncommittedOOO
Read committedOO
Repeatable readO
Serializable

참고

MySQL 공식 문서 : https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/linux-installation.html
mysqld_safe 명령어가 없을 때 : https://www.infracody.com/2022/06/mysql-root-password-reset.html
권한 변경 관련 공식 문서 : https://dev.mysql.com/doc/refman/8.0/en/privilege-changes.html
트랜잭션 isolation level : https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/transaction-isolation-levels?view=sql-server-ver16
데이터베이스 첫걸음 : http://www.yes24.com/Product/Goods/32613394

profile
데이터를 탐구하는 개발자

0개의 댓글