MySQL

[MySQL] 설치 및 데이터 디렉토리 구조

bbugge 2019. 5. 24. 17:54

 # MySQL 설치 (v.8.0.12)

     - Yum을 이용한 설치 (Red-Hat)

1.

 

// MySQL YUM repository 설치

$ yum localinstall https://dev.mysql.com/get/mysql80-community-release-el6-1.noarch.rpm





// MySQL 8.0.15 버전 설치 or 업데이트

$ yum install mysql-community-server

// MySQL 5.7.24 버전 설치 or 업데이트

$ yum --disablerepo=mysql80-community --enablerepo=mysql57-community install mysql-community-server





//MySQL 서버 시작과 부팅 시 자동 시작 설정

$ systemctl start mysqld

$ systemctl enable mysqld





// 생성된 root 임시 비밀번호 확인

$ grep 'A temporary password is generated for root@localhost' /var/log/mysqld.log | tail -1





// MySQL 보안 설치

$ /usr/bin/mysql_secure_installation     // 보안 설치 시작

Enter password for user root: [임시 비밀번호]    //임시 비밀번호를 입력한다.





// MySQL 접속

$ mysql -u root -p



## OR ##

$ mysql -h localhost -u root -p





// 방화벽을 사용한다면, 방화벽 새 조건 추가

$ firewall-cmd --permanent --zone=public --add-service=mysql



## OR ##

$ firewall-cmd --permanent --zone=public --add-port=3306/tcp

2.

// 설치하고 싶은 버전의 mysql tar.gz 파일을 받아온다.

wget http://www.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-8.0/mysql-8.0.15.tar.gz





// 받아온 tar.gz 파일을 압축 해제한다.

tar zxvf mysql-8.0.15.tar.gz





// yum 명령어를 이용하여 localinstall

yum localinstall mysql*


     - Complie 설치 

// 설치할 버전의 mysql tar.gz 을 wget으로 다운받는다. (8.0.15 버전은 컴파일 설치 시 문제가 있는 듯함.)

$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.12.tar.gz



// gcc 5.3.0 설치 (mysql에서 gcc 버전을 일정 버전이상으로 맞춰줘야한다고 함.)

$ wget https://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz

// gcc-5.3.0 루트 디렉토리에서 패키지들 설치

$ ./contrib/download_prerequisites





// 빌드전 configure 파일 만들기 (c,c++)

$ ./configure --prefix=/usr/local/gcc-5.3.0 --enable-checking=release --enable-languages=c,c++ --disable-multilib





// make

$ make





error = configure: error: error verifying int64_t uses long long

make[2]: *** [configure-stage1-gcc] Error 1

make[2]: Leaving directory `......`

make[1]: *** [stage1-bubble] Error 2

make[1]: Leaving directory `......`

make: *** [all] Error 2





if error then

  $ yum install -y gcc-c++

fi





// make install

$ make install





// gcc 5.3.0    configure 할 떄 prefix를 /usr 위치로 잡아주면 안해줘도 될 것 같음.

// $ ./configure --enable-languages=c,c++ --prefix=/usr --disable-bootstrap --disable-multilib

$ vi /etc/profile

// 맨 밑줄에 추가

export GCC=/usr/local/gcc-5.3.0

export C_INCLUDE_PATH=$GCC/include/c++/5.3.0/

export LD_LIBRARY_PATH=$GCC/lib64:$PPL/lib:$LD_LIBRARY_PATH



export PATH=$GCC/bin:$PATH





// 환경변수 적용

$ source /etc/profile





// 버전 확인

$ gcc --version





// cmake 버전 3.0 이상 설치 ?? (필수 인지 모르겠으나 필자 같은 경우 3.14.0 설치함.)





// openssl yum으로 설치

$ yum install -y openssl*









// cmake yum으로 설치

$ yum install -y cmake









// MySQL 계정 생성

$ groupadd mysql

$ useradd -M -g mysql mysql









// 설치에 필요한 디렉토리 생성

$ mkdir -p /usr/local/mysql/data







// wget으로 받은 mysql-8.0.12.tar.gz을 /var/lib에 압축을 푼다.

$ tar -zxvf mysql-8.0.12.tar.gz -C /var/lib









// 압축 풀린 디렉토리로 이동하여 컴파일 진행한다.

// 8.0.15 버전에서는 cmake시 cmake를 설치 디렉토리에서 명령을 할 수 없게 해서 -DFORCE_INSOURCE_BUILD=1 옵션 추가해서 실행
/*
yum install centos-release-scl
yum install devtoolset-8*

yum install gcc gcc-c++ libtermcap-devel gdbm-devel zlib* libxml* freetype* libpng* libjpeg* iconv flex gmp cmake ncurses-devel openssl*

[mariadb 10.3↑]yum -y install cmake make gcc gcc-c++ ncurses-devel libevent openssl openssl-devel gnutls-devel libxml2 libxml2-devel bison wget


*/

$ cd /var/lib/mysql-8.0.12/

// cmake 명령어 실행 시 파일 또는 디렉터리를 찾을 수 없다는 에러가 날 때가 있음 cmake 뒤에 디렉터리 설정 하고 옵션 설정 후 재실행할 것!
$ cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/usr/local/mysql\
-DDEFAULT_CHARSET=utf8 \
-DWITH_SSL=system \
-DMYSQL_TCP_PORT=3306 \
-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DDOWNLOAD_BOOST=1 \                             //boost는 파일을 따로 구할 필요 없음. cmake 시 다운로드 해옴.
-DWITH_BOOST=/usr/local/mysql/boost           

$ make

$ make install





// 디렉토리의 소유권 바꿔주기

$ chown -R mysql:mysql /usr/local/mysql







//환경설정

$ vi /usr/local/mysql/my.cnf

[mysqld]

bind-address=0.0.0.0   # bind할 주소 입력?

port=3306

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/usr/local/mysql/mysql.socket

# pid-file=/usr/local/mysql/mysqld.pid

# log_error=/usr/local/mysql/mysql_error.log

# lc-messages-dir=/usr/local/mysql/share

init_connect=SET collation_connection = utf8_general_ci

init_connect=SET NAMES utf8

character-set-server=utf8

collation-server=utf8_general_ci

# table_cache=1024

max_connections=2048

max_user_connections=500

max_connect_errors=10000

wait_timeout=300

# query_cache_type = 1

# query_cache_size = 128M

# query_cache_limit = 5M

slow_query_log

long_query_time=3

max_allowed_packet=16M

sort_buffer_size = 2M

# skip-innodb

skip-name-resolve

# sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION





[mysql]

default-character-set=utf8





[client]

default-character-set=utf8

socket=/usr/local/mysql/mysql.socket



//mysql 구동 시 필요한 디렉토리 및 파일 생성

//root계정으로

$ mkdir /var/log/mariadb/

$ vi /var/log/mariadb/mariadb.log

$ chown -R mysql:mysql /var/log/mariadb





$ mkdir /var/run/mariadb

$ chown -R mysql:mysql /var/run/mariadb









//MySQL 데이터베이스 초기화

$ /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my.cnf --initialize --console --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql









//root 암호 초기화

$ /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &

$ /usr/local/mysql/bin/mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 7

Server version: 8.0.12 Source distribution



Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.



Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.



Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.



mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.03 sec)



mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '설정할 비밀번호';

Query OK, 0 rows affected (0.08 sec)



mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.01 sec)



mysql> quit

Bye









// MySQL 서비스 등록

$ cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld





// mysqld 수정

$ vi /etc/init.d/mysqld

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data









// mysqld 서비스 등록

$ systemctl enable mysqld

  # MySQL 데이터 디렉토리 구조 (Yum으로 설치 시)

     my.cnf : 초기 환경 설정을 하는 파일

     - ib_logfile (InnoDB Redo log)

          + 리두 로그는 하나의 데이터베이스에 전역적으로 1개만 존재함.

          + 리두 로그는 여러 개의 파일 그룹으로 구성되며, 최소 2개 이상으로 구성되며, 순환적으로 사용됨.

          + 리두 로그 파일의 헤더에는 마지막 체크 포인트 값이 관리됨.

          + 리두 로그는 페이지 형태로 관리되지 않고 레코드 단위로 관리됨.

          + 하나의 리두 로그 레코드는 512 바이트 단위로 할당되며, 이는 디스크의 섹터 크기와 동일한 크기임.

          + 작은 트랜잭션이 많은 경우(리두 로그정보가 512바이트보다 많이 작은 경우), 로그의 나머지 공간은 낭비됨.

          + 리두 로그는 변경 후의 데이터만 관리함 (변경 전의 데이터는 가지지 않음)

     - ibdata (InnoDB data) : InnoDB 데이터 파일

     - binlog 

          + 업데이트 로그(5.0 이후 사용하지 않음) 를 대체함.

          + 데이터를 지금 또는 나중에 업데이트하는 모든 명령문이 기록됨. (event 형태로 저장)

          + 각 명령문이 데이터를 업데이트하는 소비 시간 정보도 가지고 있음.

          + 모든 명령문을 트랜젝션-세이프 (transaction-safe) 형태로 가지고 있음.

          + InnoDB에 영향을 미치는 명령문과 트랜젝션만이 InnoDB 크래시를 복구하는 시점에 바이너리 로그에서 제거됨.

          + 복구 시점에 MySQL 서버가 가지고 있어야 하는 바이너리 로그보다 짧은 것을 발견하게 되면 'binary log is shorter than its expected size.'

             라는 에러 메시지를 출력한다. 이러한 일을 발생하지 않게 하기위해 디스크/파일시스템이 실제로 동기화를 하는 sync_binlog=1 설정을 한다?

     - ib_buffer_pool (ver.5.7 이상)

          + 서버 재 시작할 때 시작하자마자 계속 운영된 것처럼 Buffer Pool에 페이지 정보가 저장되어 사용할 수 있게 하는 시간을 줄이기 위해 자주 사용되는 페이지 정보를 저장하도록 하기위한 파일

          + 저장해야 할 정도로 사용량이 많은 페이지를 가늠하는 기준을 innodb_buffer_pool_dump_at_shutdown 파라메터를 통해 설정이 가능함.

          + 실제 메모리 상태를 저장할 때는 메모리 내용을 전부 저장하는 것이 아닌, Tablespace ID와 Page ID만 저장되서 실제 저장 내용이 크지 않음.

          + Buffer Pool의 내용을 dump하고 load하는 작업은 모두 백그라운드 스레드로 진행되어 서비스에 영향을 주는 일은 거의 없음.

'MySQL' 카테고리의 다른 글

[MySQL] Sysbench & Percona 설치 및 사용 (yum install)  (0) 2020.05.24
[MySQL] Create Function  (0) 2020.04.14
[MySQL] Replication Master To Slave  (0) 2019.07.02
[MySQL] Replication Master To Master  (0) 2019.07.02
[MySQL] MySQL 아키텍처  (0) 2019.05.24