Motive

내가 사용하는 대부분의 머신이 우분투 버전 18에서 20으로 넘어왔다. 그런데 MySQL의 버전이 우분투 버전이 올라감에 따라 같이 올라와서 기존 글의 내용이 최신 버전과 달라졌다. Ubuntu 20.04에서는 패키지 매니저 상의 MySQL 버전이 8.0이다. 8.0을 기준으로 다시 노트를 적어봄.

Environment

  • Node: Odroid-N2 4GB
  • OS: Ubuntu 20.042 LTS (GNU/Linux 4.9.241-113 aarch64)
  • MySQL Version: 8.0.23-0ubuntu0.20.04.1 for Linux on aarch64 (Ubuntu)

Installation

$ sudo apt install mysql mysql-client

접속

기억할 것은, 옛날엔 처음 설치할 때 root 패스워드 설정을 했던 것 같은데 이제는 그냥 설치가 끝났다. 단순히 root 계정으로 접속을 시도하면

$ mysql -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

라는 에러 메세지와 함께 접속이 안되고, 혹은

$ mysql -u root -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

와 같이 패스워드를 안치고 그냥 엔터를 쳐도 접속이 안된다. 이는 구글링을 해보면 이 버전의 “MySQL root는 인증 방식을 local에 있는 Unix Domain socket으로 하기때문에 root 권한이 있어야만 연결이 가능하”기 때문이라고 함. 물론

$ sudo mysql

을 치면 (따로 비밀번호 입력 없이도) 문제 없이 root 계정으로 로그인이 된다.

root Password 설정

기존의 방식 대로 인증을 하고 싶다면 설정을 바꾸어 주어야 한다. 우선 sudo mysql을 하면

$ sudo mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.23-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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>

로 서버 접속이 된다. 이제 막 설치를 했으므로 별다른 DB는 아직 없다.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

아래 명령어로 인증 모드를 확인하면,

mysql> SELECT user,plugin,host FROM mysql.user;
+------------------+-----------------------+-----------+
| user             | plugin                | host      |
+------------------+-----------------------+-----------+
| debian-sys-maint | caching_sha2_password | localhost |
| mysql.infoschema | caching_sha2_password | localhost |
| mysql.session    | caching_sha2_password | localhost |
| mysql.sys        | caching_sha2_password | localhost |
| root             | auth_socket           | localhost |
+------------------+-----------------------+-----------+
5 rows in set (0.00 sec)

root 계정은 비밀번호 인증이 아니라 socket 인증 방식을 쓰고 있음을 알 수 있다. 비밀번호 인증 모드로 변경은

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀~';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

로 한다. ‘비밀~’ 자리에 원하는 비밀번호를 작성한다. 이제 다시 인증 모드를 확인하면,

mysql> SELECT user,plugin,host FROM mysql.user;
+------------------+-----------------------+-----------+
| user             | plugin                | host      |
+------------------+-----------------------+-----------+
| debian-sys-maint | caching_sha2_password | localhost |
| mysql.infoschema | caching_sha2_password | localhost |
| mysql.session    | caching_sha2_password | localhost |
| mysql.sys        | caching_sha2_password | localhost |
| root             | mysql_native_password | localhost |
+------------------+-----------------------+-----------+
5 rows in set (0.00 sec)

와 같이 비밀번호 방식으로 바뀐 것을 확인할 수 있다. 이후의 root 계정 로그인은

$ mysql -u root -p

로 가능하다.

관리자 계정 생성

root는 시스템 관리자가 복수인 경우 공용으로 쓰는 느낌이 강하고, 나는 나만의 강력한 관리자 계정을 만들기 원한다. 우선 계정은

mysql> create user 'myAccount'@'%' identified by 'myPasswd';
Query OK, 0 rows affected (0.00 sec)

로 만들 수 있다. myAccount라는 이름의 계정을 생성하는 데, 어디서든 접속이 가능하고, (‘%’) 비밀번호는 myPasswd이다. 만들어진 계정은 앞에서와 같은 방식인

mysql> SELECT user,plugin,host FROM mysql.user;
+------------------+-----------------------+-----------+
| user             | plugin                | host      |
+------------------+-----------------------+-----------+
| myAccount        | caching_sha2_password | %         |
| debian-sys-maint | caching_sha2_password | localhost |
| mysql.infoschema | caching_sha2_password | localhost |
| mysql.session    | caching_sha2_password | localhost |
| mysql.sys        | caching_sha2_password | localhost |
| root             | mysql_native_password | localhost |
+------------------+-----------------------+-----------+
6 rows in set (0.00 sec)

으로 확인 가능하다. 이제 모든 권한을 내 계정에 부여한다.

mysql> grant all privileges on *.* to 'myAccount'@'%';
Query OK, 0 rows affected (0.01 sec)

내 계정은 무적이 되었다.

일반 계정 생성

특정 DB 입출력용 일반 계정도 하나 만들어 보자. 방식은 앞과 유사하되 권한만 제한하면 된다.

mysql> create user 'abcd'@'localhost' identified by 'efgh';
Query OK, 0 rows affected (0.01 sec)

이 계정은 로컬에서만 쓰일 것이라 호스트는 localhost로 제한한다. 이제 DB를 하나 만들어 주고,

mysql> create database abcd_db;
Query OK, 1 row affected (0.01 sec)

계정 abcd에게 이 DB의 권한만 부여한다.

mysql> grant all privileges on adcd_db.* to 'abcd'@'localhost';
Query OK, 0 rows affected (0.00 sec)

이 계정의 권한은

mysql> show grants for 'abcd'@'localhost';
+-----------------------------------------------------------+
| Grants for abcd@localhost                                 |
+-----------------------------------------------------------+
| GRANT USAGE ON *.* TO `abcd`@`localhost`                  |
| GRANT ALL PRIVILEGES ON `abcd_db`.* TO `abcd`@`localhost` |
+-----------------------------------------------------------+
2 rows in set (0.00 sec)

로 확인할 수 있다.

카테고리: DB

0개의 댓글

답글 남기기

Avatar placeholder