"Nginx 설치과정 정리"와 “LEMP : PHP 7.2 설치과정 정리”에 이어...

MySQL 대신 MaridDB를 설치하는 과정을 정리하겠습니다.

 

PHP-MySQL 연동 모듈은 PHP 설치하면서 함께 설치했으므로, 이 글에서는 따로 언급하지 않습니다.

 

 

1. 운영체제 구성요소(패키지)를 최신 상태로 업그레이드

 

터미널 창을 열어서

sudo apt-get update

sudo apt-get upgrade

등의 명령어를 입력하여 패키지를 최신 것으로 유지합니다.

(경우에 따라서는 sudo apt-get dist-upgrade 도 동원.)

 

 

2. MariaDB 설치

 

▲ 터미널 창에서

sudo apt-get install mariadb-server

라고 입력하고 y를 누릅니다. 글 작성일 기준으로 10.1 버전과 의존성 패키지들이 깔리네요.

 

▲ 터미널 창에서 sudo gedit /etc/mysql/mariadb.conf.d/50-server.cnf 처럼 입력하여

50-server.cnf 파일을 루트 권한으로 연 다음, Ctrl+F로 Character sets를 찾습니다.

[mysqld] 항목 아래에 Character sets 가 있는 겁니다.)

character-set-server = utf8mb4 가 있는지 확인하고(없으면 추가할 것),

collation-server = utf8mb4_general_ci 를 주석처리하고,

collation-server = utf8mb4_unicode_ci 라고 추가한 다음 저장+빠져나옵니다.

터미널 창에서 sudo systemctl restart mysql 이라고 입력하여 적용해줍니다.

(참고로 [mysql] 항목에 대한 캐릭터셋 설정값은 /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf 파일에 있었습니다. [client] 항목에 대한 캐릭터셋 설정값은 /etc/mysql/mariadb.conf.d/50-client.cnf 파일에 있었고요.)

 

utf8mb4_general_ci(기본값)을 사용할경우 정렬 속도가 utf8mb4_unicode_ci 에 비해 약간 빠르다고 하는데(거의 차이 없음), 한글/일본어 같은 비 라틴계 언어들의 정렬이 조금 어색한 경우가 있다고 합니다. 그래서 utf8mb4_unicode_ci를 사용하는 것이 더 좋다네요.

 

▲ sudo mysql_secure_installation

이라고 입력합니다. 아래에 적은 설명들을 참고하면서 진행합니다. 잘 모르겠으면 비밀번호만 설정하고(Set root password?) 나머지는 엔터 치셔도 됩니다. 엔터는 Y로 처리되거든요. 그리고 잘못 선택한 것 같으면 위 명령어를 다시 실행해서 세팅하면 되니까 쫄지 맙시다.

 

Enter current password for root (enter or none) => MariaDB의 root 계정은 쉘인증이 기본적으로 설정되어 있습니다. 그래서 우분투 root 계정으로 실행됐다면 MariaDB root 계정은 비밀번호 입력 없이도 통과됩니다. 엔터키를 치면 자동으로 넘어가집니다. 그리고 MariaDB를 처음 설치한 경우 패스워드가 설정되어있지 않다는 점도 알아둘 필요가 있습니다.

 

Set root password? [Y/n] => 그래도 y를 입력해서 DB 루트 계정의 패스워드를 설정해두는 게 좋겠죠. 설정해놓고 잊지 않도록 신경씁시다.

New password: => 패스워드를 결정해서 입력합니다.

Re-enter new password: =>  패스워드를 한 번 더 입력해서 확인한다.

 

Remove anonymous users? [Y/n] => y를 입력합니다. 익명 사용자는 좋을 게 없으니까.

 

Disallow root login remotely? [Y/n] => n을 입력합니다. 저는 원격 접속 시에도 제어하고 싶으니까요.

Remove test database and access to it? [Y/n] => y를 입력합니다. 테스트DB는 따로 만들어서 테스트해보죠.

Reload privilege tables now? [Y/n] => y를 입력합니다. 권한 테이블을 reload하면 지금까지 입력했던 게 적용되겠죠?

 

---------------------------------------------------------

※ ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory") 해결 방법
 

먼저 터미널 창에서sudo apt --purge remove mariadb*(Remove all MariaDB databases? 대화창에서 Yes 선택)sudo apt autoremove --purge이라고 쳐서 마리아DB 및 의존성 패키지들을 완전 삭제합니다. 그러면 /var/run/mysqld/ 디렉토리가 자동으로 삭제될 겁니다. 그리고sudo apt install mariadb-server명령어로 MariaDB를 재설치하면 /var/run/mysqld/ 디렉토리가 생성되면서 /var/run/mysqld/mysqld.sock 파일이 생깁니다. 이제sudo mysql_secure_installation쳐보면 이상 없이 진행될 거예요.MySQL이나 MariaDB는 이상 생겼을 때 완전삭제+재설치로 증상이 해결되는 경우가 의외로 많았습니다.
이렇게 했는데도 /var/run/mysqld/mysqld.sock 파일이 없다고 ERROR 2002 (HY000)가 뜨면 아래처럼 대처합니다. 임시 방편이긴 한데 에러는 안 뜨게 됩니다.

 

▲ 현재 root 패스워드 입력 중 위 스크린샷처럼 2002 에러가 뜰 수 있습니다.

 

▲ MariaDB가 정상적으로 설치됐다면 위 스샷처럼 mysqld.sock 파일이 mysql소유자+mysql그룹+777권한으로 생성되었어야 하는데, ERROR 2002 (HY000)가 뜨는 상황에선 /var/run/mysqld/에 해당 파일이 없었습니다.

 

https://third9.tistory.com/275

https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run

▲ 위 링크들에 해결의 실마리가 있었습니다.

 

sudo touch /var/run/mysqld/mysqld.sock

sudo chown mysql:mysql /var/run/mysqld/mysqld.sock

sudo chmod 777 /var/run/mysqld/mysqld.sock

이렇게 해서 비어있는 mysqld.sock 파일을 만들고

sudo systemctl restart mysql.service

mysql 서비스를 재시작하면 해결이 될 겁니다.

sudo mysql_secure_installation

입력해서 진행해보세요.

 

ERROR 2002 (HY000) 해결법 설명 끝.

---------------------------------------------------------

 

 

3. MariaDB root 계정 쉘인증 우회

 

설레는 마음으로 원격지에서 SSH 터미널 창으로 mariadb 접속을 시도했습니다.

당연히 우분투 계정은 루트가 아니었고요.

 

▲  mysql -u root -p

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

(비밀번호 입력했는데 왜 접근 거부냐! ㅠㅠ)

 

검색해보니까 마리아DB 루트 계정에 기본 적용된 unix_socket 인증 플러그인 때문인 것 같습니다.

mysql_secure_installation 진행할 때 쉘인증이 돼서 편했는데, 이게 계륵일 줄이야.

비밀번호 인증을 통과하지 못한다는 것은 phpMyAdmin 같은 툴도 root 계정으로 접근이 불가능하다는 것을 의미합니다.

 

▲ 확인사살.

sudo mysql -u root

라고 쳐서 루트 쉘인증으로 MariaDB에 접근하여

SELECT User, Host, Plugin FROM mysql.user;

라고 넣어봤더니 Plugin에 unix_socket이 딱~

 

https://blog.lael.be/post/73

라엘 님께서는 root 계정의 unix_socket 플러그인을 해제하는 방식으로 문제를 해결하셨더군요.

 

MariaDB [(none)]> use mysql;

MariaDB [mysql]> update user set plugin='' where User='root';

MariaDB [mysql]> flush privileges;

MariaDB [mysql]> exit;

 

▲ 이렇게요.

쉘인증을 포기하고 비밀번호 인증을 얻겠다는 뜻인데...

 

저는 쉘인증 써보니까 편하고 좋더라고요?ㅋ

그래서 root 계정 쉘인증은 그대로 놔둘 겁니다.

대신 Root 계정이랑 읽기/쓰기를 똑같이(비슷하게) 할 수 있는 세컨드 DB 계정을 추가로 만들면 되지 않겠습니까? ^^;

 

먼저, root 계정의 권한이 어떻게 되어 있는지 확인해봤습니다.

 

 use mysql;

SHOW GRANTS FOR CURRENT_USER;

이라고 쳐봤더니,

"모든 권한(ALL PRIVILEGES) / 모든 DB.모든 테이블 조작 가능(*.*) / 로컬접속만 가능한 root 계정 / unix_socket 인증" 정도가 눈에 들어오네요.

 

▲ 클릭하면 원본 크기로 볼 수 있습니다.

GRANT ALL PRIVILEGES ON *.* TO '계정명'@'%' IDENTIFIED BY '비밀번호

REQUIRE NONE WITH GRANT OPTION

;

형식으로 입력하여 계정 생성 + (root처럼) 모든 권한을 부여해줬습니다.

비밀번호는 최대한 어렵게 설정하세요. 루트계정 대신하는 거라, 뚫리면 피해가 클 겁니다.

(참고로 계정명 옆의 % 옵션은 원격지에서의 접속도 허용하겠다는 의미입니다. % 대신 localhost 라고 넣으면 원격접속 불허.)

SELECT User, Host, Plugin FROM mysql.user;

라고 쳐보니까 aaa 계정이 추가된 것이 보이네요.

show grants for aaa;

라고 쳐보니까 root 계정처럼 ALL PRIVILEGES 라고 뜨네요. 성공한 듯합니다.

 

생성한 세컨드 DB 계정으로 접속 테스트 해봤습니다.

 

▲ GRANT를 썼을 때는 flush privileges; 안해도 된다고 하는데, 혹시 몰라서 flush privileges; 돌렸습니다.

\q (또는 exit)를 쳐서 MaridDB 빠져나온 다음,

mysql -u 계정명 -p 형태로 입력하고 패스워드를 넣었더니

접속이 되네요! 성공~

 

root계정처럼 작동하는지 확인하려면

생성한 계정으로 접속하여 제3의 계정을 만들어보면 되겠죠?

이번에는 CREATE 명령어를 써보겠습니다.

 

▲ CREATE USER 'bbb(계정명)'@'localhost' IDENTIFIED BY 'bbb(비밀번호)';

라고 쳤더니 오류 없이 통과!

SELECT User, Host, Plugin FROM mysql.user;

라고 쳤더니 bbb 계정이 확인되네요.

 

root 계정처럼 작동하는군요!

 

 

테스트 끝났으니 생성했던 계정 삭제하겠습니다(딱히 쓸모가 없음.).

 

▲ drop user 'bbb'@'localhost';

 SELECT User, Host, Plugin FROM mysql.user; 라고 입력하여 잘 지워졌는지 확인.

flush privileges; 라고 입력하여 적용.

exit 라고 입력하여 MariaDB를 빠져나옵니다.

 

root 계정 쉘인증 우회 작업은 이것으로 끝.

 

MariaDB 설치 과정 정리도 끝.

DB/테이블 생성 및 PHP 연동 테스트는 phpMyAdmin 설치하면서 진행하겠습니다.

다음 글에서 이어갈게요.

 

 

※ 추가 : MariaDB 계정 비밀번호 변경 방법

 

우분투 18.04의 패키지 저장소로부터 설치되는 마리아DB 10.1.29 버전에서는 SET PASSWORD 명령어를 이용해서 패스워드를 변경할 수 있는 것 같습니다. 아래 스샷을 참고하시고...

MySQL 5.7부터 ALTER USER 'aaa'@'%' IDENTIFIED BY 'bbb'; 형태로 비밀번호 변경 방식이 바뀌었는데, MariaDB 10.1.29에는 아직 적용되지 않은 듯하네요.

 

▲ SET PASSWORD = PASSWORD('bbb');

처럼 입력해도 됩니다. FOR 구문 생략하고.

 

 

▲ 켈리 클락슨. 시원스런 캐롤 한 곡 듣고 가세요.

반응형