루트 비밀번호를 잊어버렸습니다. 어떻게 해야 할까요? 저는 mysql 8.0.21 for ubuntu를 쓰고 있습니다. 제일 현명한 방법은 공식 문서를 보는 것입니다.

 


 setting 파일에 skip-grant-tables를 추가해 봅시다.

 

 

 그리고 난 다음에, 다시 mysql 서버를 재시작 하겠습니다.

 

 

 그러면, 어떠한 인증 없이도 로그인이 가능합니다. 셋팅 상황을 정리해 봅시다. 저는 skip-grant-tables 옵션을 주었습니다. 이것이 무엇을 하는지를 알아야 할 텐데요. 쉽게 말해서, system 스키마에 있는 grant table을 읽지 않고, 권한 시스템 없이 시작합니다. 얼마나 위험하면, 공식 문서에도 꽤 길게 강조를 하는데요.

 

 

 cho로 접속해 보았습니다. databases를 모두 보면 아래와 같습니다.

 

 

 여러 가지 데이터 베이스 정보들이 보입니다. 이 중에서, testU도 보입니다.

 

 

  testU 데이터베이스를 사용해 보겠습니다. 이 안에는 new_table이 있습니다. 여기에 있는 레코드들을 모두 조회하겠습니다.

 

 잘 나오네요. 그런데 문제는, testU는 cho가 읽을 권한 조차 없는 데이터 베이스입니다. 그런데, 거기를 접근했다는 이야기는, 권한도 없는 유저가 제 마음대로 남의 데이터베이스를 휘젓고 다닐 수 있다는 의미입니다. 그래서 사실, skip-grant-tables는 매우 조심해서 써야 합니다. 공식 다큐멘트에서도 그 점을 매우 강조하고 있습니다.

 

 


  계속 진행해 보겠습니다. mysql 8.0.21에서 유저의 비밀번호를 바꾸려면, alter user ~ identified with ~ by ~ 요래 써야 합니다. 문제는, 서버가 --skip-grant-table 옵션을 가지고 실행되었기 때문에, 해당 쿼리는 실패해 버립니다.

 

 

  그러면 어떻게 해야 할까요? 쿼리를 실행하기 전에 flush privileges를 수행하면 됩니다. 그리고, 비밀 번호를 바꾼 후에 다시 flush privileges 쿼리를 수행합니다. 그 다음에 종료하시면 됩니다.

 

 

 variable을 보면 skip_networking이 ON으로 동작하고 있습니다. 이는 skip_grant_tables가 켜져 있기 때문입니다.

 


 이제 setting 파일에서 skip-grant-tables 부분을 주석 처리하겠습니다.

 

 그리고 mysql 서버를 다시 시작해 보겠습니다.

 

 cho로 접속해 보았는데요. 아까와는 다르게 2개의 디비만 보입니다.

 

 

 use testU는 실패합니다. 이는, 유저 cho에게 testU로 접근할 권한이 없기 때문입니다.

 

 

그리고 skip_networking 변수를 보겠습니다. 그러면 OFF가 되어 있는 것을 볼 수 있습니다. 이 포스트에서 언급을 한 두 개의 옵션은 잘 봐두실 필요가 있는데요. 공식 문서에 잘 설명되어 있으니, 읽어보시는 것도 좋겠습니다. 그것을 안 읽어서, skip-grant-tables 옵션을 키고, 스킵 네트워킹 옵션을 끄는 방법을 한참동안 찾았습니다.