mysql 설치 와 기본 설정 (on Ubuntu)
Ubuntu에 mysql을 설치해 보겠습니다.
언제나 그렇듯이 Ubuntu 버전부터 살펴보겠습니다.
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.2 LTS Release: 18.04 Codename: bionic
이제 설치해 보겠습니다.
apt-get을 먼저 update하고 mysql-server를 설치합니다.
$ sudo apt-get update $ sudo apt-get install mysql-server
만약 iptable이 실행되고 있다면 외부에서 접속할 수 있도록 mysql 포트(3306)를 열어줘야 합니다.
$ sudo ufw allow mysql Rules updated Rules updated (v6)
mysql이 설치되었다면 실행해 줍니다.
$ sudo systemctl start mysql
Ubuntu 서버가 재시작 되더라도 mysql이 자동 시작되도록 등록합니다.
$ sudo systemctl enable mysql
sql에 접속해 보겠습니다.
$ sudo /usr/bin/mysql -u root -p
접속이 되었다면 아래처럼 sql 프롬프트가 보일 겁니다.
mysql>
mysql에 접속할때 root 계정에 패스워드 없이 접속했습니다. root 계정에 패스워드를 추가해 보겠습니다.
패스워드를 변경하는 쿼리는 mysql 버전별로 조금 다릅니다. 그래서 버전을 먼저 확인해 보겠습니다.
mysql> SHOW VARIABLES LIKE "%version%"; +-------------------------+-------------------------+ | Variable_name | Value | +-------------------------+-------------------------+ | innodb_version | 5.7.25 | | protocol_version | 10 | | slave_type_conversions | | | tls_version | TLSv1,TLSv1.1 | | version | 5.7.25-0ubuntu0.18.04.2 | | version_comment | (Ubuntu) | | version_compile_machine | x86_64 | | version_compile_os | Linux | +-------------------------+-------------------------+ 8 rows in set (0.00 sec)
제가 설치한 mysql 버전은 5.7.25입니다.
5.7.6 이후 버전이라면 아래와 같이 쿼리를 실행합니다. 저는 패스워드를 ngle1234로 했습니다.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'ngle1234';
만약 5.7.6 이전 버전이라면 아래와 같이 쿼리를 실행하면 됩니다.
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('ngle1234');
저는 최신 버전이라 그런지 위 두 쿼리 모두 적용됩니다.
이제 mysql을 사용할 계정을 만들어 주겠습니다. 웹 서버 등과 연결해 사용할 때는 root 계정을 사용하는 것 보다 계정을 만들고 권한을 부여해 사용하는 것이 좋습니다.
먼저 현재 mysql의 계정(User) 정보를 확인하겠습니다.
mysql> SELECT User, Host, authentication_string FROM mysql.user; +------------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +------------------+-----------+-------------------------------------------+ | root | localhost | | | mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | debian-sys-maint | localhost | *C2EEC6ACB4C3DB2D30B48BF59A5D3F646CB56828 | +------------------+-----------+-------------------------------------------+ 4 rows in set (0.00 sec)
database를 만들고 database에 계정을 추가해 보도록 하겠습니다.
아래와 같이 ngletutor라는 database를 만듭니다.
mysql> CREATE DATABASE ngletutor; Query OK, 1 row affected (0.00 sec)
잘 만들어 졌는지 database 리스트를 확인해 보겠습니다.
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | ngletutor | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
ngletutor라고 database가 있는걸 확인할 수 있습니다.
이번에는 ngletutor를 사용하는 계정을 만들겠습니다.
mysql> CREATE USER 'tongchun'@'localhost' IDENTIFIED BY 'ngle1234'; Query OK, 1 row affected, 1 warning (0.00 sec)
계정은 tongchun이고 Host는 localhost, 그리고 패스워드는 ngle1234로 만들었습니다.
mysql의 user 테이블에 추가하거나 변경이 있을 경우 flush privileges 쿼리를 실행해 줍니다.
아래 쿼리가 대문자인 것은 mysql의 예약어(select, update 등)은 대문자로 하는 것이 관례(convention)입니다.
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
계정이 잘 만들어 졌는지 user 정보도 다시 확인해 봅니다.
mysql> SELECT User, Host, authentication_string FROM mysql.user; +------------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +------------------+-----------+-------------------------------------------+ | root | localhost | | | mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | debian-sys-maint | localhost | *C2EEC6ACB4C3DB2D30B48BF59A5D3F646CB56828 | | tongchun | localhost | *B11B32CCCB8A2E22F00E0527161BDDC4EF9BA2E5 | +------------------+-----------+-------------------------------------------+ 5 rows in set (0.00 sec)
이제 tongchun 계정에 ngletutor DB를 사용할 수 있도록 권한을 부여합니다.
mysql> GRANT ALL PRIVILEGES ON ngletutor.* to tongchun@localhost; Query OK, 0 rows affected (0.00 sec)
database의 권한을 변경했으니 flush privileges 쿼리를 다시 해줍니다.
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
이번에는 tongchun계정이 localhost에서 어떤 권한을 가지고 있는지 확인해 보겠습니다.
mysql> SHOW GRANTS FOR 'tongchun'@'localhost'; +-----------------------------------------------------------------+ | Grants for tongchun@localhost | +-----------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'tongchun'@'localhost' | | GRANT ALL PRIVILEGES ON `ngletutor`.* TO 'tongchun'@'localhost' | +-----------------------------------------------------------------+ 2 rows in set (0.00 sec)
위 쿼리 결과로 나온 두 건 중 첫 번째에 GRANT USAGE ON *.* TO가 있습니다. 이건 *.*는 아무 권한이 없다는 의미 입니다. 현제 tongchun 계정은 ngletutor DB만 모든 권한을 가지고 있고 mysql의 admin이나 system을 접근할 수 있는 권한은 없다는 것을 의미합니다.
계정 뒤에 붙은 @localhost는 해당 계정이 localhost 즉 mysql이 설치된 pc에서만 접속할 수 있다는 의미입니다. 만약 다른 서버(remote)에서 접속하고 싶다면 접속하려는 서버의 IP로 계정을 새로 만들어 줘야 합니다.
예를 들어 192.168.0.10에서 접속하고 싶다면 아래와 같이 쿼리를 실행하면 됩니다.
CREATE USER 'root'@'192.168.0.10' IDENTIFIED BY 'ngle1234';
GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.0.10' WITH GRANT OPTION;
FLUSH PRIVILEGES;
만약 특정 PC(192.168.0.10)이 아닌 어디서든 접속하려면 IP대신 %로 해주면 됩니다.
CREATE USER 'root'@'%' IDENTIFIED BY 'ngle1234';
GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
위 쿼리로 어디에서든 접속 가능하게 %로 계정을 추가했습니다.
계정 리스트를 다시 보면 root@% 계정이 추가된걸 확인할 수 있습니다.
mysql> SELECT User, Host, authentication_string FROM mysql.user; +------------------+-----------+-------------------------------------------+ | User | Host | authentication_string | +------------------+-----------+-------------------------------------------+ | root | localhost | | | mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | debian-sys-maint | localhost | *C2EEC6ACB4C3DB2D30B48BF59A5D3F646CB56828 | | tongchun | localhost | *B11B32CCCB8A2E22F00E0527161BDDC4EF9BA2E5 | | root | % | *B11B32CCCB8A2E22F00E0527161BDDC4EF9BA2E5 | +------------------+-----------+-------------------------------------------+ 6 rows in set (0.00 sec)
마찬가지로 tongchun계정도 remote 접속이 필요하다면 아래와 같이 쿼리를 실행해 줍니다.
CREATE USER 'tongchun'@'%' IDENTIFIED BY 'ngle1234';
GRANT ALL PRIVILEGES ON ngletutor.* TO 'tongchun'@'%';
FLUSH PRIVILEGES;