Ubuntu 18.04에 MySQL을 설치하는 방법
이 튜토리얼의 이전 버전은 Hazel Virdó가 작성했습니다
소개
LAMP(Linux, Apache, MySQL, PHP/Python/Perl) 스택. 관계형 데이터베이스와 SQL(Structured Query Language)을 사용하여 데이터를 관리합니다.
짧은 버전의 설치는 간단합니다. 패키지 인덱스를 업데이트하고 mysql-server
패키지를 설치한 다음 포함된 보안 스크립트를 실행합니다.
- sudo apt update
- sudo apt install mysql-server
- sudo mysql_secure_installation
이 튜토리얼에서는 Ubuntu 18.04 서버에 MySQL 버전 5.7을 설치하는 방법을 설명합니다. 그러나 기존 MySQL 설치를 버전 5.7로 업데이트하려는 경우 대신 이 MySQL 5.7 업데이트 가이드를 읽을 수 있습니다.
전제 조건
이 자습서를 따르려면 다음이 필요합니다.
sudo
권한과 방화벽이 있는 루트가 아닌 사용자를 포함하여 이 초기 서버 설정 가이드에 따라 설정된 Ubuntu 18.04 서버 1대.
1단계 - MySQL 설치
Ubuntu 18.04에서는 기본적으로 최신 버전의 MySQL만 APT 패키지 리포지토리에 포함됩니다. 작성 당시에는 MySQL 5.7이었습니다.
설치하려면 서버의 패키지 색인을 apt
로 업데이트하세요.
- sudo apt update
그런 다음 기본 패키지를 설치합니다.
- sudo apt install mysql-server
systemctl start
명령을 사용하여 서버가 실행 중인지 확인합니다.
- sudo systemctl start mysql.service
이 명령은 MySQL을 설치하고 시작하지만 암호를 설정하거나 다른 구성을 변경하라는 메시지를 표시하지 않습니다. 이렇게 하면 MySQL 설치가 안전하지 않게 되기 때문에 다음에 이 문제를 다룰 것입니다.
2단계 - MySQL 구성
새로 설치하려면 포함된 보안 스크립트를 실행해야 합니다. 이렇게 하면 원격 루트 로그인 및 샘플 사용자와 같은 보안 수준이 낮은 일부 기본 옵션이 변경됩니다. 이전 버전의 MySQL에서는 데이터 디렉터리도 수동으로 초기화해야 했지만 이제는 자동으로 수행됩니다.
보안 스크립트를 실행합니다.
- sudo mysql_secure_installation
이렇게 하면 MySQL 설치의 보안 옵션을 변경할 수 있는 일련의 프롬프트가 표시됩니다. 첫 번째 프롬프트는 MySQL 암호의 강도를 테스트하는 데 사용할 수 있는 암호 유효성 검사 플러그인을 설정할 것인지 묻습니다. 선택에 관계없이 다음 프롬프트는 MySQL 루트 사용자의 비밀번호를 설정하는 것입니다. 원하는 보안 암호를 입력하고 확인하십시오.
여기에서 Y
를 누른 다음 ENTER
를 눌러 모든 후속 질문에 대한 기본값을 수락할 수 있습니다. 이렇게 하면 일부 익명 사용자와 테스트 데이터베이스가 제거되고 원격 루트 로그인이 비활성화되며 이러한 새 규칙이 로드되어 MySQL이 변경 사항을 즉시 적용합니다.
MySQL 데이터 디렉터리를 초기화하려면 5.7.6 이전 버전의 경우 mysql_install_db
를 사용하고 5.7.6 이상 버전의 경우 mysqld --initialize
를 사용합니다. 그러나 1단계에서 설명한 대로 Debian 배포판에서 MySQL을 설치한 경우 데이터 디렉터리가 자동으로 초기화되었습니다. 당신은 아무것도 할 필요가 없습니다. 그래도 명령을 실행하려고 하면 다음 오류가 표시됩니다.
mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)
. . .
2018-04-23T13:48:00.572066Z 0 [ERROR] Aborting
루트 MySQL 사용자의 암호를 설정했더라도 이 사용자는 MySQL 셸에 연결할 때 암호로 인증하도록 구성되지 않았습니다. 원하는 경우 3단계에 따라 이 설정을 조정할 수 있습니다.
3단계 - (선택 사항) 사용자 인증 및 권한 조정
MySQL 5.7(및 이후 버전)을 실행하는 Ubuntu 시스템에서 루트 MySQL 사용자는 기본적으로 비밀번호가 아닌 auth_socket
플러그인을 사용하여 인증하도록 설정됩니다. 이것은 많은 경우에 더 큰 보안과 유용성을 허용하지만 외부 프로그램(예: phpMyAdmin)이 사용자에 액세스하도록 허용해야 하는 경우 상황을 복잡하게 만들 수도 있습니다.
암호를 사용하여 MySQL에 루트로 연결하려면 인증 방법을 auth_socket
에서 mysql_native_password
로 전환해야 합니다. 이렇게 하려면 터미널에서 MySQL 프롬프트를 엽니다.
- sudo mysql
다음으로 다음 명령을 사용하여 각 MySQL 사용자 계정이 사용하는 인증 방법을 확인합니다.
- SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | | auth_socket | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
이 예에서 루트 사용자가 실제로 auth_socket
플러그인을 사용하여 인증하는 것을 볼 수 있습니다. 암호로 인증하도록 루트 계정을 구성하려면 다음 ALTER USER
명령을 실행합니다. password
를 선택한 강력한 암호로 변경해야 하며 이 명령은 2단계에서 설정한 루트 암호를 변경합니다.
- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
그런 다음 FLUSH PRIVILEGES
를 실행하여 권한 부여 테이블을 다시 로드하고 새 변경 사항을 적용하도록 서버에 지시합니다.
- FLUSH PRIVILEGES;
루트가 더 이상 auth_socket
플러그인을 사용하여 인증하지 않는지 확인하려면 각 사용자가 사용하는 인증 방법을 다시 확인하십시오.
- SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
이 예제 출력에서 이제 루트 MySQL 사용자가 암호를 사용하여 인증하는 것을 볼 수 있습니다. 자신의 서버에서 이를 확인하면 MySQL 셸을 종료할 수 있습니다.
- exit
또는 일부는 전용 사용자와 함께 MySQL에 연결하는 작업 흐름이 더 적합하다는 것을 알 수 있습니다. 이러한 사용자를 생성하려면 MySQL 셸을 다시 한 번 엽니다.
- sudo mysql
참고: 이전 단락에서 설명한 대로 루트에 대해 암호 인증을 활성화한 경우 MySQL 셸에 액세스하려면 다른 명령을 사용해야 합니다. 다음은 일반 사용자 권한으로 MySQL 클라이언트를 실행하며 인증을 통해서만 데이터베이스 내에서 관리자 권한을 얻습니다.
- mysql -u root -p
거기에서 새 사용자를 만들고 강력한 암호를 지정하십시오.
- CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
그런 다음 새 사용자에게 적절한 권한을 부여합니다. 예를 들어 다음 명령을 사용하여 데이터베이스 내의 모든 테이블에 대한 사용자 권한과 사용자 권한을 추가, 변경 및 제거할 수 있는 권한을 부여할 수 있습니다.
- GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
이 시점에서 FLUSH PRIVILEGES
명령을 다시 실행할 필요가 없습니다. 이 명령은 INSERT
, UPDATE
또는 DELETE
와 같은 문을 사용하여 권한 부여 테이블을 수정할 때만 필요합니다. 새 사용자를 만들었기 때문에 기존 사용자를 수정하는 대신 FLUSH PRIVILEGES
는 여기서 필요하지 않습니다.
그런 다음 MySQL 셸을 종료합니다.
- exit
마지막으로 MySQL 설치를 테스트해 보겠습니다.
4단계 - MySQL 테스트
설치 방법에 관계없이 MySQL은 자동으로 실행되기 시작해야 합니다. 이를 테스트하려면 상태를 확인하십시오.
- systemctl status mysql.service
다음과 유사한 출력이 표시됩니다.
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
Active: active (running) since Wed 2018-04-23 21:21:25 UTC; 30min ago
Main PID: 3754 (mysqld)
Tasks: 28
Memory: 142.3M
CPU: 1.994s
CGroup: /system.slice/mysql.service
└─3754 /usr/sbin/mysqld
MySQL이 실행되고 있지 않으면 sudo systemctl start mysql
로 시작할 수 있습니다.
추가 확인을 위해 관리 명령을 실행할 수 있는 클라이언트인 mysqladmin
도구를 사용하여 데이터베이스에 연결을 시도할 수 있습니다. 예를 들어 이 명령은 MySQL에 루트(-u root
)로 연결하고 암호를 묻는 메시지를 표시하고(-p
) 버전을 반환하도록 지시합니다.
- sudo mysqladmin -p -u root version
다음과 유사한 출력이 표시되어야 합니다.
mysqladmin Ver 8.42 Distrib 5.7.21, for Linux on x86_64
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 5.7.21-1ubuntu1
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 30 min 54 sec
Threads: 1 Questions: 12 Slow queries: 0 Opens: 115 Flush tables: 1 Open tables: 34 Queries per second avg: 0.006
이는 MySQL이 실행 중임을 의미합니다.
결론
이제 서버에 기본 MySQL 설정이 설치되었습니다. 다음은 수행할 수 있는 다음 단계의 몇 가지 예입니다.
- 일부 추가 보안 조치 구현
- 데이터 디렉토리 재배치
- SaltStack으로 MySQL 서버 관리