Giới thiệu
MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở (open-source database management system), thường được cài đặt như một phần của bộ LAMP (Linux, Apache, MySQL, PHP/Python/Perl) phổ biến. Nó triển khai mô hình quan hệ và sử dụng Ngôn ngữ Truy vấn Cấu trúc (SQL) để quản lý dữ liệu.
Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt MySQL phiên bản 8.0 trên máy chủ Ubuntu 20.04. Sau khi hoàn thành, bạn sẽ có một cơ sở dữ liệu quan hệ hoạt động mà bạn có thể sử dụng để xây dựng trang web hoặc ứng dụng tiếp theo của mình.
Yêu cầu
Để theo dõi hướng dẫn này, bạn sẽ cần:
- Một máy chủ hệ điều hành Ubuntu 20.04
Bước 1 — Cài đặt MySQL
Trên Ubuntu 20.04, bạn có thể cài đặt MySQL bằng cách sử dụng kho gói APT. Vào thời điểm viết bài này, phiên bản MySQL có sẵn trong kho gói mặc định của Ubuntu là phiên bản 8.0.27. Để cài đặt, cập nhật chỉ mục gói trên máy chủ của bạn nếu bạn chưa làm việc này gần đây:
sudo apt updateSau đó, cài đặt gói mysql-server:
sudo apt install mysql-serverĐảm bảo rằng máy chủ đang chạy bằng lệnh systemctl start:
sudo systemctl start mysql.serviceNhững lệnh này sẽ cài đặt và khởi động MySQL, nhưng sẽ không yêu cầu bạn thiết lập 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 để lại cài đặt MySQL không an toàn, chúng ta sẽ giải quyết vấn đề này trong bước tiếp theo.
Bước 2 — Cấu hình MySQL
Đối với các cài đặt mới của MySQL, bạn nên chạy kịch bản bảo mật đi kèm của DBMS. Kịch bản này thay đổi một số tùy chọn mặc định không an toàn đối với các thứ như đăng nhập root từ xa và người dùng mẫu.
Cảnh báo: Tính đến tháng 7 năm 2022, khi bạn chạy kịch bản mysql_secure_installation, sẽ xảy ra lỗi nếu không thực hiện một số cấu hình trước. Lý do là kịch bản này sẽ cố gắng thiết lập mật khẩu cho tài khoản root MySQL của cài đặt, nhưng mặc định trên các cài đặt Ubuntu, tài khoản này không được cấu hình để kết nối bằng mật khẩu.
Trước tháng 7 năm 2022, kịch bản này sẽ âm thầm thất bại sau khi cố gắng thiết lập mật khẩu cho tài khoản root và tiếp tục với các câu hỏi tiếp theo. Tuy nhiên, hiện tại, kịch bản sẽ trả về lỗi sau khi bạn nhập và xác nhận mật khẩu:
Đầu ra: ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.
Mật khẩu mới:
Điều này sẽ dẫn đến kịch bản bị lặp lại trong một vòng lặp vô tận mà bạn chỉ có thể thoát ra bằng cách đóng cửa sổ terminal của mình.
Vì kịch bản mysql_secure_installation thực hiện một số hành động hữu ích để giữ cho cài đặt MySQL của bạn an toàn, nên vẫn nên chạy nó trước khi bạn bắt đầu sử dụng MySQL để quản lý dữ liệu. Tuy nhiên, để tránh vào vòng lặp vô tận này, bạn cần điều chỉnh cách thức xác thực của người dùng root MySQL trước.
Đầu tiên, mở prompt MySQL:
sudo mysqlSau đó, chạy lệnh ALTER USER sau để thay đổi phương thức xác thực của người dùng root sang phương thức sử dụng mật khẩu. Ví dụ sau đây thay đổi phương thức xác thực sang mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';Sau khi thực hiện thay đổi này, thoát khỏi prompt MySQL:
exitTiếp theo, bạn có thể chạy lại kịch bản mysql_secure_installation mà không gặp vấn đề gì.
Khi kịch bản bảo mật hoàn tất, bạn có thể mở lại MySQL và thay đổi lại phương thức xác thực của người dùng root về mặc định, auth_socket. Để xác thực dưới dạng người dùng root MySQL bằng mật khẩu, hãy chạy lệnh sau:
mysql -u root -pSau đó, quay lại sử dụng phương thức xác thực mặc định bằng lệnh:
ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;Điều này có nghĩa là bạn có thể một lần nữa kết nối với MySQL dưới dạng người dùng root sử dụng lệnh sudo mysql.
Chạy kịch bản bảo mật với sudo:
sudo mysql_secure_installationKịch bản này sẽ đưa bạn qua một loạt các câu hỏi, nơi bạn có thể thực hiện một số thay đổi đối với các tùy 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 Plugin Kiểm tra Mật khẩu hay không, cái có thể được dùng để kiểm tra độ mạnh của mật khẩu các người dùng MySQL mới trước khi coi chúng là hợp lệ.
Nếu bạn chọn thiết lập Plugin Kiểm tra Mật khẩu, mọi người dùng MySQL mà bạn tạo ra và xác thực bằng mật khẩu sẽ phải có mật khẩu đáp ứng chính sách bạn chọn. Chính sách mạnh nhất — mà bạn có thể chọn bằng cách nhập 2 — sẽ yêu cầu mật khẩu ít nhất dài 8 ký tự và bao gồm sự kết hợp của chữ hoa, chữ thường, chữ số và ký tự đặc biệt.
Output
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
2Bất kể bạn có chọn thiết lập Plugin Kiểm tra Mật khẩu hay không, câu hỏi tiếp theo sẽ yêu cầu bạn thiết lập mật khẩu cho người dùng root MySQL. Nhập và xác nhận một mật khẩu an toàn mà bạn chọn:
Output
Please set the password for root here.
New password:Re-enter new password:
Lưu ý rằng mặc dù bạn đã thiết lập mật khẩu cho người dùng root MySQL, nhưng người dùng này hiện không được cấu hình để xác thực bằng mật khẩu khi kết nối vào shell MySQL.
Nếu bạn đã sử dụng Plugin Kiểm tra Mật khẩu, bạn sẽ nhận được phản hồi về độ mạnh của mật khẩu mới. Sau đó, kịch bản sẽ hỏi bạn có muốn tiếp tục với mật khẩu đã nhập hay nhập mật khẩu mới. Nếu bạn hài lòng với độ mạnh của mật khẩu, hãy nhấn Y để tiếp tục kịch bản:
Output
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : YTừ đó, bạn có thể nhấn Y và ENTER để chấp nhận các tùy chọn mặc định cho tất cả các câu hỏi tiếp theo. Điều này sẽ xóa một số người dùng ẩn danh và cơ sở dữ liệu thử nghiệm, vô hiệu hóa đăng nhập root từ xa và áp dụng các quy tắc mới này để MySQL ngay lập tức tôn trọng các thay đổi bạn đã thực hiện.
Khi kịch bản hoàn tất, cài đặt MySQL của bạn sẽ được bảo mật. Bạn có thể tiếp tục tạo người dùng cơ sở dữ liệu riêng biệt với MySQL client.
Bước 3 — Tạo Người Dùng MySQL Riêng và Cấp Quyền
Sau khi cài đặt, MySQL sẽ tạo một tài khoản người dùng root mà bạn có thể sử dụng để quản lý cơ sở dữ liệu. Người dùng này có quyền hạn đầy đủ đối với máy chủ MySQL, có nghĩa là nó có quyền kiểm soát hoàn toàn mọi cơ sở dữ liệu, bảng, người dùng, v.v. Vì lý do này, tốt nhất là tránh sử dụng tài khoản này ngoài các chức năng quản trị. Bước này sẽ hướng dẫn bạn cách sử dụng người dùng root MySQL để tạo một tài khoản người dùng mới và cấp quyền cho tài khoản đó.
Trong các hệ thống Ubuntu chạy MySQL 5.7 (và các phiên bản sau), người dùng root MySQL được cấu hình để xác thực qua plugin auth_socket mặc định thay vì bằng mật khẩu. Plugin này yêu cầu tên người dùng hệ điều hành gọi MySQL phải khớp với tên người dùng MySQL trong lệnh, vì vậy bạn phải gọi mysql với quyền sudo để truy cập vào người dùng root MySQL:
sudo mysqlLưu ý: Nếu bạn đã cài đặt MySQL theo một hướng dẫn khác và đã kích hoạt xác thực mật khẩu cho root, bạn sẽ cần sử dụng một lệnh khác để truy cập vào giao diện MySQL. Lệnh sau sẽ chạy MySQL client với quyền người dùng thông thường, và bạn chỉ có thể có quyền quản trị trong cơ sở dữ liệu sau khi xác thực:
mysql -u root -pKhi đã truy cập vào lời nhắc MySQL, bạn có thể tạo một người dùng mới bằng lệnh CREATE USER. Cú pháp tổng quát của lệnh này là:
CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';Sau CREATE USER, bạn chỉ định tên người dùng. Tên này sẽ được theo sau bởi ký hiệu @ và tên máy chủ mà người dùng này sẽ kết nối. Nếu bạn chỉ định kết nối người dùng này từ máy chủ Ubuntu của mình, bạn có thể sử dụng localhost. Việc bọc cả tên người dùng và máy chủ trong dấu nháy đơn không phải lúc nào cũng cần thiết, nhưng việc này có thể giúp tránh lỗi.
Bạn có nhiều tùy chọn khi chọn plugin xác thực cho người dùng của mình. Plugin auth_socket đã đề cập trước đây có thể tiện lợi vì nó cung cấp bảo mật mạnh mà không yêu cầu người dùng nhập mật khẩu để truy cập cơ sở dữ liệu. Tuy nhiên, nó cũng ngăn chặn các kết nối từ xa, điều này có thể gây rắc rối khi các chương trình bên ngoài cần tương tác với MySQL.
Một lựa chọn khác là bạn có thể bỏ phần WITH authentication_plugin hoàn toàn trong cú pháp, để người dùng xác thực bằng plugin mặc định của MySQL, caching_sha2_password. Tài liệu MySQL khuyến nghị plugin này cho những người dùng muốn đăng nhập bằng mật khẩu nhờ vào tính năng bảo mật mạnh mẽ của nó.
Chạy lệnh sau để tạo một người dùng xác thực bằng caching_sha2_password. Đảm bảo thay "sammy" bằng tên người dùng bạn chọn và mật khẩu bằng một mật khẩu mạnh mà bạn chọn:
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';Lưu ý: Có một vấn đề đã biết với một số phiên bản PHP gây ra sự cố với caching_sha2_password. Nếu bạn dự định sử dụng cơ sở dữ liệu này với một ứng dụng PHP — như phpMyAdmin, ví dụ — bạn có thể muốn tạo một người dùng sẽ xác thực bằng plugin mysql_native_password cũ hơn, mặc dù vẫn bảo mật:
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';Nếu bạn không chắc chắn, bạn có thể luôn tạo người dùng xác thực với caching_sha2_plugin và sau đó thay đổi nó sau này bằng lệnh này:
ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';Sau khi tạo người dùng mới, bạn có thể cấp quyền thích hợp cho họ. Cú pháp tổng quát để cấp quyền cho người dùng là:
GRANT PRIVILEGE ON database.table TO 'username'@'host';Giá trị PRIVILEGE trong cú pháp này xác định các hành động mà người dùng được phép thực hiện trên cơ sở dữ liệu và bảng đã chỉ định. Bạn có thể cấp nhiều quyền cho cùng một người dùng trong một lệnh bằng cách phân tách mỗi quyền bằng dấu phẩy. Bạn cũng có thể cấp quyền cho người dùng trên toàn cầu bằng cách sử dụng dấu hoa thị (*) thay cho tên cơ sở dữ liệu và bảng. Trong SQL, dấu hoa thị là ký tự đặc biệt dùng để đại diện cho "tất cả" cơ sở dữ liệu hoặc bảng.
Để minh họa, lệnh sau sẽ cấp quyền toàn cầu cho người dùng để TẠO, SỬA, và XÓA cơ sở dữ liệu, bảng và người dùng, cũng như quyền INSERT, UPDATE, và DELETE dữ liệu từ bất kỳ bảng nào trên máy chủ. Nó cũng cấp cho người dùng khả năng truy vấn dữ liệu với SELECT, tạo khóa ngoại với từ khóa REFERENCES và thực hiện các thao tác FLUSH với quyền RELOAD. Tuy nhiên, bạn chỉ nên cấp quyền cho người dùng những gì họ cần, vì vậy bạn có thể điều chỉnh quyền cho người dùng của mình nếu cần.
Bạn có thể tìm thấy danh sách đầy đủ các quyền có sẵn trong tài liệu chính thức của MySQL.
Chạy câu lệnh GRANT này, thay thế "sammy" bằng tên người dùng MySQL của bạn, để cấp quyền cho người dùng của bạn:
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, INDEX, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;Lưu ý rằng câu lệnh này cũng bao gồm WITH GRANT OPTION. Điều này sẽ cho phép người dùng MySQL của bạn cấp bất kỳ quyền nào mà họ có cho các người dùng khác trên hệ thống.
Cảnh báo: Một số người dùng có thể muốn cấp quyền ALL PRIVILEGES cho người dùng MySQL của họ, điều này sẽ cung cấp quyền siêu người dùng rộng rãi tương tự như quyền của người dùng root, như sau:
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;Các quyền rộng như vậy không nên được cấp một cách nhẹ nhàng, vì bất kỳ ai có quyền truy cập vào người dùng MySQL này sẽ có toàn quyền kiểm soát mọi cơ sở dữ liệu trên máy chủ.
Sau đó, nên chạy lệnh FLUSH PRIVILEGES. Điều này sẽ giải phóng bất kỳ bộ nhớ nào mà máy chủ đã lưu trữ do các lệnh CREATE USER và GRANT trước đó:
FLUSH PRIVILEGES;Sau đó, bạn có thể thoát khỏi MySQL client:
exitTrong tương lai, để đăng nhập với người dùng MySQL mới của bạn, bạn sẽ sử dụng lệnh sau:
mysql -u sammy -pCờ -p sẽ yêu cầu MySQL client yêu cầu mật khẩu của người dùng MySQL để xác thực.
Cuối cùng, hãy kiểm tra cài đặt MySQL.
Bước 4 — Kiểm tra MySQL
Dù bạn đã cài đặt MySQL theo cách nào, MySQL sẽ tự động bắt đầu chạy. Để kiểm tra điều này, hãy kiểm tra trạng thái của nó.
systemctl status mysql.serviceBạ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: enabled)
Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
Main PID: 10382 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 1137)
Memory: 370.0M
CGroup: /system.slice/mysql.service
└─10382 /usr/sbin/mysqldNếu MySQL không chạy, bạn có thể khởi động lại bằng lệnh sudo systemctl start mysql.
Để kiểm tra thêm, bạn có thể thử kết nối với cơ sở dữ liệu bằng công cụ mysqladmin, một công cụ cho phép bạn chạy các lệnh quản trị. Ví dụ, lệnh này yêu cầu kết nối với người dùng MySQL có tên sammy (-u sammy), yêu cầu mật khẩu (-p), và trả về phiên bản. Hãy chắc chắn thay "sammy" bằng tên người dùng MySQL của bạn và nhập mật khẩu của người dùng đó khi được yêu cầu:
sudo mysqladmin -p -u sammy versionBạn sẽ thấy kết quả tương tự như sau:
Output
mysqladmin Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle là thương hiệu đã đăng ký của Oracle Corporation và/hoặc các công ty liên kết của họ. Các tên khác có thể là thương hiệu của các chủ sở hữu tương ứng.
Server version 8.0.19-0ubuntu5
Protocol version 10
Connection Localhost qua UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 10 phút 44 giây
Threads: 2 Questions: 25 Slow queries: 0 Opens: 149 Flush tables: 3 Open tables: 69 Queries per
second avg: 0.038Điều này có nghĩa là MySQL đang hoạt động.
Kết luận
Bây giờ bạn đã cài đặt thành công MySQL cơ bản trên máy chủ của mình. Dưới đây là một vài ví dụ về các bước tiếp theo bạn có thể thực hiện:

