개발하다보면 테스트 등을 위해 로컬 DB를 사용할 일이 생긴다.
맥에는 homebrew라는 패키지 관리자가 있어 쉽고 편하게 패키지들을 관리할 수 있다.
맥에 기본적으로 되장되어 있는 패키지 매니저는 아니기 때문에 따로 설치해주어야 한다.
https://brew.sh/index_ko
homebrew 공식 홈페이지에 자세한 설명이 나와있다.
homebrew를 이용해 mysql을 설치해보자
$ brew update
$ brew install mysql
설치가 완료되면 다음과 같은 안내문들이 나온다.
설치가 되었고, 기본적으로 localhost에서만 접속이 가능하며 root 계정의 패스워드가 지정되어 있지 않으니 보안을 위해서 비밀번호 설정을 하라는 얘기
We've installed your MySQL database without a root password. To secure it run:
mysql_secure_installation
MySQL is configured to only allow connections from localhost by default
To connect run:
mysql -uroot
To restart mysql after an upgrade:
brew services restart mysql
Or, if you don't want/need a background service you can just run:
/usr/local/opt/mysql/bin/mysqld_safe --datadir=/usr/local/var/mysql
설치 확인을 위해 버전 체크를 해보았다.
$ mysql --version
mysql Ver 8.0.27 for macos11.6 on x86_64 (Homebrew)
권장하는대로 mysql_secure_installation을 입력해보면 다음과 같이 root계정 패스워드를 지정할 수 있다.
Securing the MySQL server deployment.
Enter password for user root:
비밀번호를 지정하지 않고 접속했을 경우 따로 지정해줄 수 있다.
(MYSQL5에선 비밀번호 변경 방법이 다르므로 버전을 먼저 체크하자)
mysql> alter user root identified with mysql_native_password by 'PASSWORD';
alter user 구문의 경우 CREATE USER 또는 mysql 시스템 DB에 대한 UPDATE 권한이 필요한데, 이들은 global 권한으로 SUPER 권한이기 때문에 일반유저로 접속 시 사용하는 것은 권장되지 않으며 root계정에서 실행하는 것이 좋다. 일반유저로 실행시 기본적으로 access denied 오류와 함께 실행되지 않으며 grant를 이용해 권한을 설정해주어야 사용가능하다.
데이터의 안전한 사용/관리를 위해 root계정으로 mysql을 이용하는 것 보다는 특정 서비스 데이터를 관리할 계정을 생성해서 사용하도록 한다.
// 비밀번호가 지정되어 있지 않을 때
$ mysql -u root
// 비밀번호가 지정되어 있을 때
$ mysql -u root -p DBNAME(optional)
Enter password:PASSWORD
mysql> create user 'USERNAME' identified by 'PASSWORD';
mysql> select user, host from mysql.user; //mysql DB의 user테이블에서 새로 생성된 유저 정보 확인
mysql> alter user USERNAME identified by 'PASSWORD'; // root에서 USERNAME 계정 비밀번호 변경
mysql> alter user current_user() identified by 'PASSWORD'; // USERNAME 계정 자체 비밀번호 변경
생성한 USERNAME 계정에서 특정 DB에 접근할 수 있도록 권한을 준다.
이 때 생성된 USERNAME에는 특정 DB에 권한을 지정할 수 있는 권한이 없으므로 root계정에서 실행한다.
권한을 줄 당시에 DBNAME이라는 DB가 실제 존재하지 않아도 괜찮다.
mysql> grant ALL PRIVILEGES on DBNAME.* to USERNAME
권한을 지정해줬으면 해당 USERNAME으로 접속하여 DB 사용이 가능한지 테스트한다.
mysql> create database DBNAME;
Query OK, 1 row affected (0.01 sec)