기타/Hibernate일지

[Hibernate] Hibernate연결을 위한 MySQL세팅하기(+ERROR 1698 (28000): Access denied for user 'root'@'localhost' 해결)

코드아키택트 2021. 8. 8. 17:46
반응형

백엔드 개발을 시작한지 꽤나 많은 시간이 지났습니다. 하지만 이미 설정되어있는 백엔드 작업에 들어가서 기능을 추가하다보니 제 자신에게 여러가지 한계가 느껴져 나름 공부하고 고민하던 것들을 조금씩 남겨보려고 합니다. 제가 느꼈던 한계는 크게 두가지입니다. 

1. 새로운 프로젝트 세팅을 할떄 상당히 버벅인다

2. Hibernate에 대한 지식이 부족한 편이다.

 저는 ORM?인가를 위해서 교육때는 MyBatis를 배웠지만, 현재 하는 곳에서는 Hibernate를 사용합니다. 둘을 비교하면 Hibernate가 훨씬 간편해보입니다. 이유는 SQL문을 따로 쓰지 않아도 대부분의 패턴들은 작동하기 때문입니다. 물론 커스텀 쿼리문을 써야하는 경우엔 많이 버벅일 수 있겠지만 전체적인 생산성으론 Hibernate가 훨씬 쉬웠습니다. 어쨋든 MySQL세팅을 해보겠습니다.

구성환경

Ubuntu 20.04 / Eclipse

설치하기

 apt-get을 이용해서 설치한다

만약 완전삭제 재설치를 원하시는 분들은 아래의 링크를 첨부합니다

https://stackoverflow.com/questions/28687787/ubuntu-mysql-uninstall-reinstall

 

Ubuntu Mysql Uninstall / Reinstall

I have a Mysql installation I'd like to remove and reinstall, running Ubuntu 14.04 on a LAMP stack. The passwords are all messed up, phpmyadmin isn't installing correctly... I just want a restart...

stackoverflow.com

sudo apt-get remove --purge mysql-server mysql-client mysql-common
sudo apt-get autoremove
sudo apt-get install -f mysql-server
sudo systemctl start mysql
systemctl status mysql

코드 흐름만 정리하면 위와 같습니다.

 

처음 설치하시는 분들이라면

shell> sudo apt-get update
shell> sudo apt-get install mysql-server
shell> systemctl status mysql

위 두가지면 설치가 될것입니다.

공식문서에서는 이쯤에서 임시 root비밀번호가 나와야한다고 합니다. 하지만 저는 어떤 문제에서인지 잘 안되었고, 시행착오로 해결한 부분을 첨부하겠습니다.

 

ERROR 1698 (28000) 해결하기

원인은 Ubuntu mysql이 시스템의 Id/password로 로그인 시도를 하는 것

위 오류는 mysql을 최초 설정한 root와 root비밀번호로 들어가려고 했을때 보시는 분들이 있을 것입니다. 원인은 mysql이 현재 시스템에 로그인된 유저정보를 기반으로 mysql접근에 대한 Authorization을 한다는 것이라고 합니다. 제 경우가 위와 같았고, 이게 어떤 상태이고 해결하는지 흐름은 다음과 같습니다.

코드흐름

heejinchae@riceMachine:~$ sudo mysql
[sudo] password for heejinchae:
mysql> Use mysql
mysql> SELECT user,host,plugin FROM user;

위에 보시면 root의 plugin만 auth_socket으로 되어 있는 것을 볼 수 있습니다. 제가 원래 참조한 사이트에서 다른 user의 plugin은 mysql_native_password으로 되어있어야 하는데, 제가 뭔가 설정해서 비밀번호 암호화에 걸려버린거 같습니다.

 

플러그인 변경

플러그인 변경을 통해 id / pwd로 로그인 해보는 과정

코드흐름은 다음과 같습니다.

mysql> UPDATE user SET plugin='caching_sha2_password' WHERE user='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ sudo service mysql restart

root의 plugin을 변경하고 권한들을 FLUSH합니다. FLUSH의 의미는 좀더 찾아봐야겠네요. 이렇게 설정한 후에, mysql을 다시 시작해줍니다.

 

Root로 로그인 시도

다시 root로 로그인 시도해봅니다.
heejinchae@riceMachine:~$ mysql -u root

위와같이 정상적으로 root로 들어온 것을 볼 수 있습니다. 근데 비밀번호를 요구하진 않네요. 밑에서 비밀번호도 설정해보겠습니다.

user와 plugin확인

mysql> Use mysql
mysql> SELECT user,host,plugin FROM user;

plugin이 변경된 것을 볼 수 있습니다.

 

비밀번호 설정하기

root비밀번호 설정하기

 혼자서 공부하는 수준에선 root비밀번호가 없는것이 더 편할것이지만, 좀더 실무적인 방향에선 비밀번호가 있을때 어떻게 하는지 배우는 것이 좋을거 같아 비밀번호 설정하는 법을 다뤄봅니다

 

현재 비밀번호 확인하기

mysql> SELECT user,host,authentication_string FROM user;

위의 비밀번호가 요상하게 써있는것은 아마 hash가 들어가서 그런 것 같습니다.

 

비밀번호 설정하기1: 현재 Mysql버전 확인하기

MySQL8기준으로 Syntax가 다르다고 합니다.

(base) heejinchae@riceMachine:~$ mysql -V
mysql  Ver 8.0.26-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))

저는 8버전이 설치되어 있어 8기준으로 쓰겠습니다.

 

비밀번호 설정하기2: 비밀번호 변경하기

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

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

mysql> exit
Bye

위와같이 root의 비밀번호를 변경 할 수 있습니다.

 

비밀번호 설정하기3: 변경된 비밀번호로 로그인 시도

(base) heejinchae@riceMachine:~$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
(base) heejinchae@riceMachine:~$ mysql -u root -p
Enter password:

비밀번호 없이 로그인하려고할때 안되는 것을 볼 수 있음

 

코드만 요약

heejinchae@riceMachine:~$ sudo mysql
[sudo] password for heejinchae:
mysql> Use mysql
mysql> SELECT user,host,plugin FROM user;

mysql> UPDATE user SET plugin='caching_sha2_password' WHERE user='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ sudo service mysql restart

heejinchae@riceMachine:~$ mysql -u root

mysql> Use mysql
mysql> SELECT user,host,plugin FROM user;

mysql> SELECT user,host,authentication_string FROM user;

(base) heejinchae@riceMachine:~$ mysql -V
mysql  Ver 8.0.26-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu))

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

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

mysql> exit
Bye

(base) heejinchae@riceMachine:~$ mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
(base) heejinchae@riceMachine:~$ mysql -u root -p
Enter password:

 

ERROR 1410 (42000): You are not allowed to create a user with GRANT 해결

Hibernate(Spring App)에서 MySQL에 접근할 아이디를 만들기 위해

다음은 Hibernate를 사용하는 SpringApp에서 MySQL에 접근하기 위한 아이디를 만들고, 권한 설정을 해보겠습니다. 우선 해결책 부터 얘기하자면, 권한 설정시에는 'root@'%'가 있어야 한다고 합니다

유저 생성하기

mysqlDB이동 -> user 생성
(base) heejinchae@riceMachine:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.26-0ubuntu0.20.04.2 (Ubuntu)

mysql> use mysql
Reading table information for completion of table and column names

mysql> CREATE USER 'springApp'@'localhost' IDENTIFIED BY '1234';

위의 코드는 크게 3덩어리로, mysql root로 접속 / mysql사용(이곳에 user table있음) / user생성 입니다. 지금 상태에서 유저에게 권한을 주려고 하면 에러가 뜰 것입니다. 해결법은 '%'를 host로 가지는 'root'유저를 또 생성하는 것입니다.

mysql> create user 'root'@'%' identified by '1234';

비밀번호는 아무거나 하셔도 됩니다. %의 의미는 localhost이외에도 외부에서 root로 접속 할 수 있는 옵션이라고 하는데, 보안상 권장되는 방법은 아니라고 합니다. user privilege설정 후에 위 root는 삭제합니다. 

 

유저 권한 설정하기

mysql> GRANT ALL PRIVILEGES ON *.* to 'springApp'@'localhost';
Query OK, 0 rows affected (0.01 sec)

저는 위와같이 하였습니다. ON 다음에 *자리에는 원래 특정 DB만 써야하는 것으로 알고있지만, 편의상 *를 사용하였습니다.

 

설정확인

mysql> show grants for 'springApp'@'localhost';


+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for springApp@localhost                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `springApp`@`localhost`                                                                                                                                                                                                                    |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `springApp`@`localhost` |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

설정 후에 보면 위와같은 메세지를 볼 수 잇을 것입니다.

 

'root'드랍

mysql> drop user 'root'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT user,host FROM user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| cos              | %         |
| debian-sys-maint | localhost |
| heejinchae       | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| springApp        | localhost |
+------------------+-----------+
8 rows in set (0.00 sec)

mysql>

root는 드랍하도록 합시다.

 

코드만 요약

(base) heejinchae@riceMachine:~$ mysql -u root -p
Enter password: 

mysql> use mysql

mysql> CREATE USER 'springApp'@'localhost' IDENTIFIED BY '1234';

mysql> create user 'root'@'%' identified by '1234';

mysql> GRANT ALL PRIVILEGES ON *.* to 'springApp'@'localhost';

mysql> show grants for 'springApp'@'localhost';

mysql> drop user 'root'@'%';

mysql> SELECT user,host FROM user;

 

 위와같이 한다면 mysql에 접근 가능한 아이디가 생성됬을 것입니다. 사실상 root와 같은 권한을 가지고 있어서 좋은 방법이라고 볼 수는 없지만, 초점은 Hibernate 및 Spring App과 연결이기 때문에 일단은 넘어가고 나중에 좀더 실무적인 내용을 알게 된다면 보충하도록 하겠습니다.

 


참고 사이트

https://devanswers.co/how-to-reset-mysql-root-password-ubuntu/ - root 비밀번호 재설정

https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost - 1698에러 해결 Stack Overflow

https://velog.io/@inhalin/MySQL-ERROR-1410-42000 - 1410에러 해결

https://blog.devart.com/how-to-create-a-new-user-and-grant-privileges.html?gclid=CjwKCAjwgb6IBhAREiwAgMYKRqng5TF-rn1NKUfIq4A_1HN_-Qa6Z1dUVm-v99ZN2wN9a5t5nyGxOBoCoBMQAvD_BwE - Privilege설정

https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/ - MySQL apt설치

반응형