
MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở, thường được cài đặt như một phần trong stack LAMP phổ biến (Linux, Apache, MySQL, PHP/Python/Perl). Nó sử dụng cơ sở dữ liệu quan hệ và ngôn ngữ SQL (Structured Query Language) để quản lý dữ liệu.
Tóm tắt quá trình cài đặt rất đơn giản: cập nhật chỉ mục gói, cài đặt gói mysql-server, rồi chạy script bảo mật đi kèm.
$ sudo apt update
$ sudo apt install mysql-server
$ sudo mysql_secure_installation
Bài viết này sẽ hướng dẫn chi tiết cách cài đặt MySQL trên Ubuntu 18.04. (Bài viết sử dụng phiên bản MySQL 5.7)
Yêu cầu trước khi bắt đầu
Để làm theo hướng dẫn này, bạn cần:
- Một máy chủ Ubuntu 18.04 đã được cấu hình theo hướng dẫn thiết lập máy chủ ban đầu, bao gồm một người dùng không phải root có quyền
sudovà đã cấu hình tường lửa.
-> Bài viết liên quan: So sánh SQLite, MySQL và PostgreSQL
Các bước cài đặt MySQL trên Ubuntu 18.04
Bước 1 – Cài đặt MySQL
Trên Ubuntu 18.04, kho APT mặc định chỉ bao gồm phiên bản mới nhất của MySQL. Tại thời điểm viết bài, đó là MySQL 5.7.
Để cài đặt, hãy cập nhật chỉ mục gói trên máy chủ của bạn bằng apt:
$ sudo apt update
Sau đó, cài đặt gói mặc định:
$ sudo apt install mysql-server
Đảm bảo rằng máy chủ đang chạy bằng cách sử dụng lệnh systemctl start:
$ sudo systemctl start mysql.service
Các lệnh này sẽ cài đặt và khởi động MySQL, nhưng sẽ không yêu cầu bạn đặt mật khẩu hoặc thực hiện bất kỳ thay đổi cấu hình nào khác. Vì điều này khiến cài đặt MySQL của bạn không an toàn, chúng ta sẽ xử lý vấn đề này ở bước tiếp theo.
Bước 2 – Cấu hình MySQL
Với các bản cài đặt mới, bạn nên chạy script bảo mật đi kèm. Script này sẽ thay đổi một số tuỳ chọn mặc định kém an toàn, chẳng hạn như cho phép root đăng nhập từ xa hoặc tồn tại các người dùng mẫu. Trên các phiên bản MySQL cũ hơn, bạn còn phải tự khởi tạo thư mục dữ liệu, nhưng giờ đây việc này đã được thực hiện tự động.
Chạy script bảo mật:
$ sudo mysql_secure_installation
Bạn sẽ được hướng dẫn qua một loạt câu hỏi cho phép thay đổi một số tuỳ chọn bảo mật của cài đặt MySQL. Câu hỏi đầu tiên sẽ hỏi bạn có muốn thiết lập Validate Password Plugin hay không – plugin này dùng để kiểm tra độ mạnh của mật khẩu MySQL. Dù bạn chọn bật hay không, bước tiếp theo sẽ yêu cầu bạn đặt mật khẩu cho tài khoản root của MySQL. Hãy nhập và xác nhận một mật khẩu mạnh theo ý bạn.
Tại các bước tiếp theo, bạn có thể nhấn Y rồi ENTER để chấp nhận các thiết lập mặc định cho tất cả câu hỏi còn lại. Việc này sẽ xóa một số người dùng ẩn danh và cơ sở dữ liệu dùng để thử nghiệm, tắt quyền đăng nhập từ xa của tài khoản root, và nạp các quy tắc mới để MySQL áp dụng ngay những thay đổi bạn đã thực hiện.
Để khởi tạo thư mục dữ liệu của MySQL, bạn sẽ dùng mysql_install_db đối với các phiên bản trước 5.7.6, và mysqld --initialize cho phiên bản 5.7.6 trở đi. Tuy nhiên, nếu bạn đã cài đặt MySQL từ bản phân phối Debian như đã mô tả ở Bước 1, thì thư mục dữ liệu đã được khởi tạo tự động; bạn không cần làm gì thêm. Nếu bạn vẫn thử chạy lệnh này, bạn sẽ gặp lỗi sau:
Output
mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)
. . .
2018-04-23T13:48:00.572066Z 0 [ERROR] Aborting
Lưu ý rằng mặc dù bạn đã đặt mật khẩu cho tài khoản root của MySQL, nhưng tài khoản này không được cấu hình để xác thực bằng mật khẩu khi kết nối vào MySQL shell. Nếu muốn, bạn có thể điều chỉnh thiết lập này bằng cách thực hiện theo Bước 3.
Bước 3 – (Tuỳ chọn) Điều chỉnh xác thực và quyền người dùng
Trên các hệ thống Ubuntu sử dụng MySQL 5.7 (và các phiên bản mới hơn), tài khoản root của MySQL mặc định được cấu hình xác thực bằng plugin auth_socket thay vì sử dụng mật khẩu. Điều này giúp tăng cường bảo mật và thuận tiện trong nhiều trường hợp, nhưng cũng có thể gây khó khăn nếu bạn cần cho phép một chương trình bên ngoài (ví dụ: phpMyAdmin) truy cập vào tài khoản này.
Để có thể sử dụng mật khẩu để kết nối vào MySQL với tài khoản root, bạn cần chuyển phương thức xác thực từ auth_socket sang mysql_native_password. Để thực hiện điều này, hãy mở MySQL prompt từ terminal của bạn:
$ sudo mysql
Tiếp theo, hãy kiểm tra phương thức xác thực mà mỗi tài khoản người dùng MySQL đang sử dụng bằng lệnh sau:
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)
Trong ví dụ này, bạn có thể thấy rằng tài khoản root thực sự đang xác thực bằng plugin auth_socket. Để cấu hình lại tài khoản root sử dụng xác thực bằng mật khẩu, hãy chạy lệnh ALTER USER sau. Hãy chắc chắn thay thế password bằng một mật khẩu mạnh do bạn lựa chọn, và lưu ý rằng lệnh này sẽ thay đổi mật khẩu root mà bạn đã đặt ở Bước 2:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Sau đó, chạy lệnh FLUSH PRIVILEGES để yêu cầu máy chủ tải lại bảng phân quyền (grant tables) và áp dụng các thay đổi bạn vừa thực hiện:
mysql> FLUSH PRIVILEGES;
Kiểm tra lại phương thức xác thực được sử dụng bởi từng tài khoản người dùng để xác nhận rằng tài khoản root không còn xác thực bằng plugin: auth_socket:
mysql> 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)
Bạn có thể thấy trong kết quả ví dụ rằng tài khoản root của MySQL hiện đang xác thực bằng mật khẩu. Khi bạn đã xác nhận điều này trên máy chủ của mình, bạn có thể thoát khỏi MySQL shell:
mysql> exit
Ngoài ra, một số người có thể thấy rằng cách làm việc của họ sẽ thuận tiện hơn nếu kết nối vào MySQL bằng một tài khoản người dùng riêng biệt. Để tạo tài khoản như vậy, hãy mở lại MySQL shell:
$ sudo mysql
Lưu ý: Nếu bạn đã bật xác thực bằng mật khẩu cho tài khoản root như đã đề cập ở các phần trước, bạn sẽ cần sử dụng một lệnh khác để truy cập vào MySQL shell. Lệnh sau sẽ chạy MySQL client với quyền người dùng thông thường, và bạn sẽ chỉ có được quyền quản trị trong cơ sở dữ liệu sau khi xác thực:
$ mysql -u root -p
Từ đó, hãy tạo một người dùng mới và đặt cho người đó một mật khẩu mạnh:
mysql> CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
Tiếp theo, hãy cấp các quyền phù hợp cho người dùng mới. Ví dụ, bạn có thể cấp quyền truy cập tất cả các bảng trong cơ sở dữ liệu, cũng như quyền thêm, sửa đổi và xoá quyền của người dùng khác bằng lệnh sau:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
Lưu ý rằng tại thời điểm này, bạn không cần chạy lại lệnh FLUSH PRIVILEGES. Lệnh này chỉ cần thiết khi bạn chỉnh sửa bảng phân quyền trực tiếp bằng các câu lệnh như INSERT, UPDATE hoặc DELETE. Vì bạn đã tạo một người dùng mới thay vì sửa đổi người dùng hiện có, nên FLUSH PRIVILEGES là không cần thiết trong trường hợp này.
Sau đó, thoát khỏi MySQL shell:
mysql> exit
Cuối cùng, hãy kiểm tra xem MySQL đã được cài đặt.
Bước 4 – Kiểm tra MySQL
Dù bạn đã cài đặt MySQL bằng phương pháp nào, dịch vụ này thường sẽ tự động chạy sau khi cài đặt. Để kiểm tra, hãy xem trạng thái của nó.
$ systemctl status mysql.service
Bạn sẽ thấy kết quả tương tự như sau:
Output
● 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
Nếu MySQL chưa chạy, bạn có thể khởi động nó bằng lệnh sudo systemctl start mysql.
Để kiểm tra kỹ hơn, bạn có thể thử kết nối vào cơ sở dữ liệu bằng công cụ mysqladmin, một client cho phép thực hiện các lệnh quản trị. Ví dụ, lệnh sau sẽ kết nối với MySQL bằng tài khoản root (-u root), yêu cầu nhập mật khẩu (-p) và hiển thị phiên bản MySQL.
$ sudo mysqladmin -p -u root version
Bạn sẽ thấy kết quả đầu ra tương tự như sau:
Output
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
Điều này có nghĩa là MySQL đã được cài đặt thành công và đang hoạt động.
Kết luận
Bạn đã hoàn tất việc cài đặt MySQL trên máy chủ của mình. Dưới đây là một số bước tiếp theo bạn có thể thực hiện:
- Triển khai thêm các biện pháp bảo mật nâng cao
- Di chuyển thư mục dữ liệu sang vị trí khác
- Quản lý các máy chủ MySQL bằng SaltStack