centOS7 부터는 데이터베이스가 MariaDB로 바뀌었다.
그래서 MySQL 을 yum 으로 바로 설치가 불가능하다고 한다.
의존성있는 관련 패키지 설치
# yum -y install gcc g++ libncurses5-dev libxml2-dev openssl libssl-dev curl libcurl4-openssl-dev libjpeg-dev libpng-dev libfreetype6-dev libsasl2-dev autoconf libncurses5-dev
MySQL 계정 만들기
# groupadd mysql
# useradd -g mysql -s /bin/bash -m mysql
cmake 설치
# yum -y install cmake
MySQL 설치
# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.32.tar.gz
# tar zxvf mysql-boost-5.7.32.tar.gz
# cd /root/APP/mysql-5.7.32
# cd mysql-5.7.32
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DMYSQL_TCP_PORT=3306 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=./boost
# make
# make install
cmake 에러 발생할 경우 경로 확인
/root/APP/mysql-5.7.32에서 재실행
my.cnf 파일 수정
# vi /usr/local/mysql57/my.cnf
해당 파일 내용을 삭제하고, 아래 내용을 삽입한다.
[mysqld]
# port=3306
# basedir=/usr/local/mysql57
# datadir=/usr/local/mysql57/data
# pid-file=/usr/local/mysql57/mysqld.pid
# log_error=/usr/local/mysql57/mysql_error.log
# lc-messages-dir=/usr/local/mysql57/share
group_concat_max_len = 15360
event_scheduler = ON
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
chown 명령어를 통해 특정 폴더의 소유자를 mysql로 변경
# chown -R mysql:mysql /usr/local/mysql
데이터베이스 초기화 (mysql 계정으로 실행)
# /usr/local/mysql/bin/mysql_install_db --no-defaults --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
MySQL 서비스 등록
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# vi /etc/init.d/mysqld
아래 내용으로 수정해준다.
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
실행방법
실행방법 1
# systemctl start mysqld.service
# systemctl status mysqld.servic
# systemctl stop mysqld.service
# cd /usr/local/mysql/bin/
# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
#./mysql -u root -p
실행방법 2 (부팅 시 자동실행)
# cp -arp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# chmod 700 /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig --level 3 mysqld on
실행이 안될 경우
mysqld.log에 권한 부여
1월 13 13:27:39 systemd[1]: Starting LSB: start and stop MySQL...
1월 13 13:27:39 mysqld[17186]: Starting MySQL.2023-01-13T04:27:39.660431Z mysqld_safe error: log-error set to '/var/log/mysqld/mysqld.log', however file don't exists. Create wr... user 'mysql'.
1월 13 13:27:40 mysqld[17186]: ERROR! The server quit without updating PID file (/var/lib/mysql/BOL3.pid).
1월 13 13:27:40 systemd[1]: mysqld.service: control process exited, code=exited status=1
1월 13 13:27:40 systemd[1]: Failed to start LSB: start and stop MySQL.
1월 13 13:27:40 systemd[1]: Unit mysqld.service entered failed state.
1월 13 13:27:40 systemd[1]: mysqld.service failed.
[root@localhost mysqld]# touch /var/log/mysqld/mysqld.log
[root@localhost mysqld]# chown mysql.mysql /var/log/mysqld/mysqld.log
권한을 root(관리자)가 아닌 mysql로 주어야한다.
Can't open and lock privilege tables 에러
2023-01-13T04:55:01.465336Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
2023-01-13T04:55:01.465346Z 0 [ERROR] Fatal error: Failed to initialize ACL/grant/time zones structures or failed to remove temporary table files.
2023-01-13T04:55:01.465388Z 0 [ERROR] Aborting
에러는 status 로 보는 것보다, log파일을 보는게 훨씬 정확했다 ! log 파일 오류 해결해주니 바로 mysql 구동됨.
my.cnf파일에서 daradir 경로를 확인 한 후, 해당 디렉토리를 삭제한다.
- my.cnf 파일 확인
vi /etc/my.cnf
- datadir 디렉토리 삭제
rm -rf /var/lib/mysql
참고
https://deeplify.dev/database/troubleshoot/can-not-open-and-lock-privilege-tables
[Mysql] Can’t open and lock privilege tables 에러 해결
“Can’t open and lock privilege tables 에러 해결 하는 방법을 소개해드립니다.”
deeplify.dev
mysqld 실행 확인
mysqld 실행을 확인하고 서비스를 중지시킨다.
# netstat -ntlp | grep mysqld
tcp6 0 0 :::3306 :::* LISTEN 5587/mysqld
# /etc/init.d/mysqld stop
# service mysqld stop
그리고 권한을 부여한 후 서비스를 재시작한다.
# chmod 755 -R /var/lib/mysql
chmod 755 -R /usr/local/mysql/data
# chown mysql:mysql -R /var/lib/mysql
chown mysql:mysql -R /usr/local/mysql
# service mysqld start
MySQL 오류 발생
[오류1] MySQL mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists
mysqld 서비스를 실행할 때 발생한 오류.
해결방법
해당 디렉토리(/var/run/mysqld)가 없어서 발생한 오류이다. 원래는 설치 시에 생성되야한다.
해당 디렉토리를 직접 만들고 서비스를 다시 시작한다.
# mkdir -p /var/run/mysqld
# chown mysql:mysql /var/run/mysqld
📃 출처
[오류2] /usr/local/mysql/bin/mysql_install_db –user=mysql –datadir=/usr/local/mysql/data
[WARNING] mysql_install_db is deprecated. Please consider switching to mysqld ?initialize
[ERROR] Child process: /usr/local/mysql/bin/mysqldterminated prematurely with errno= 32
[ERROR] Failed to execute /usr/local/mysql/bin/mysqld ?bootstrap ?datadir=/usr/local/mysql/data ?lc-messages-dir=/usr/share/mysql ?lc-messages=en_US
mysql이 rpm으로 설치되어있으면, 패키지 의존성에 따라 에러가 발생한 것이다.
해결방법
yum, rpm 으로 mysql이 설치되어있는지 확인한다. mysql 조회 후 나오는 경로를 전체 삭제해준다. (rpm -e)
# rpm -qa | grep mysql
# rpm -e '패키지명'
yum mysql 을 제거해준다.
# yum remove mysql
📃 출처
[오류3] Starting MySQL. ERROR! The server quit without updating PID file (/tmp/mysqld.pid)
# vi /etc/my.cnf
해당 파일을 열어보면 아래와 같이 설정되어 있다.
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
skip
pid-file의 경로를 보면 mariadb로 되어있다. 해당 경로를 mysql 로 바꿔준다.
[mysqld_safe]
log-error=/usr/local/mysql/mysql_error.log
pid-file=/usr/local/mysql/mysqld.pid
주의🚨
그냥 맨처음 my.cnf 파일 설정해 줄때 해당 파일 내용은 전체 삭제하고, 위에 올려둔 내용으로 전체 복사한다😭
MySQL 설치 완료
# systemctl start mysqld
# systemctl status mysqld
MySQL 설치 후 로그인
# /usr/local/mysql/bin/mysql -u root -p
최신 버전의 mysql 최초 실행시 아래 에러가 발생한다.
MySQL root 패스워드가 입력되지 않아 접근이 거부된 것으로, MySQL 최초 설치 후 root 비밀번호는 임시로 자동 생성된다.
# vi /var/log/mysqld.log
[Note] A temporary password is generated for root@localhost: 임시패스워드
[오류] error 1045 mysql 28000 access denied for user 'root'@'localhost' ubuntu 에러 발생
# /usr/local/mysql/bin/mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
입력 후 비밀번호 미 입력후 엔터를 해서 넘어가지지 않거나 위의 에러가 발생하면 mysqld 서비스를 종료한다.
# service mysqld stop
아래 명령어를 실행한다.
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
위 작업 후에는 (서비스 종료) mysql 접속 시에 비밀번호를 입력하지 않고 접속할 수 있다.
# /usr/local/mysql/bin/mysql -u root
위의 방법으로 되지않을 경우, my.cnf 파일에 옵션을 추가해준다.
skip-grant-tables 옵션 추가
[mysqld]
skip-grant-tables
그리고 서비스를 재시작한다.
$ systemctl restart mysqld
$ mysql
.
.
Welcome to MySQL monitor.
Your MySQL connection is 2.
Server version: 5.7.36 MySQL Community Server (GPL)
mysql>
패스워드 변경
# version 5.7.0 ~ 5.7.5
mysql> UPDATE mysql.user SET authentication_string=PASSWORD('패스워드') WHERE user='root' AND Host='localhost';
mysql> FLUSH PRIVILEGES;
접속하여 패스워드를 변경해준다.
mysql> show databases;
mysql> use mysql;
mysql> show tables;
mysql> update user set authentication_string=PASSWORD("비밀번호"), password_expired='N', plugin='mysql_native_password' where User='root';
다시 mysql 에 재접속해준다. (아까 설정한 패스워드로)
# /usr/local/mysql/bin/mysql -u root -p
mysql 데이터베이스를 선택하고, 사용자(user)를 생성해준다.
use mysql;
create user 사용자명@localhost identified by '사용자명';
create user 사용자명@'%' identified by '사용자명';
grant all privileges on *.* to 사용자명@localhost identified by '사용자명';
grant all privileges on *.* to 사용자명@'%' identified by '사용자명';
flush privileges;
exit;
오류 발생 시
아까 위에서 실행해준 옵션(/usr/local/mysql/bin/mysqld_safe --skip-grant-tables &) 때문에 일어나는 오류이다.
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
정상적으로 MySQL을 중지하고 다시 시작하면 해결된다.
# systemctl stop mysql
# systemctl start mysql
# systemctl status mysql
STRICT 모드 끄기
DBMS에서 데이터 무결성을 체크할 수 있다.
예로 CHAR, VARCHAR의 크기를 초과하는 데이터를 입력할 경우 에러를 내지 않고 잘려서 입력된다.
* 데이터 무결성(data integrity)
컴퓨팅 분야에서 완전한 수명 주기를 거치며 데이터의 정확성과 일관성을 유지하고 보증하는 것을 가리키며,
데이터베이스나 RDBMS 시스템의 중요한 기능이다.
데이터의 정확성, 일관성, 유효성이 유지되는 것을 말한다.
MySQL 5.7 부터는 STRICT_MODE가 기본 설정으로 되어있다.
# vi /etc/my.cnf
[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES"
환경변수 설정
mysql 명령어를 어느곳에서든 실행하려면 경로(path)를 설정해줘야한다. mysql 설치 경로를 지정해준다.
# vi /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
# source /etc/profile
MySQL 버전 확인
MySQL 버전 확인에는 여러가지 방법이 있다.
1. 기본
# mysql --version
2. MySQL 접속
# mysql -u root -p
또는
# /usr/local/mysql/bin/mysql -u root -p
3. yum으로 설치한 경우
# yum list installed mysql*
참고
mysql 5.7 install (comfile) / mysql 5.7.9
MYSQL 5.7 INSTALL ( mysql 5.7.9 )O/S : CentOS 6.x (64bit)설치시 문제가 많다는 정보에 의해 내용 일부 수정했습니다.수정날짜 2017/01/311. mysql 5.7.9 버전을 설치하기 위해서는 boost 라이브러리가 필요하다 파
xinet.kr
'Development > MySql' 카테고리의 다른 글
[MySQL] user 생성 및 권한 부여 (0) | 2023.02.23 |
---|---|
[MySql] DATETIME 값 수정하기(update) (0) | 2023.02.13 |
mariaDB 삭제 후 mySQL 설치하기 (0) | 2023.01.13 |
[MySQL] 효과적인 대용량 데이터 처리 방법 (0) | 2022.12.20 |
date 조회 시 유의사항 (0) | 2022.01.18 |