Cài đặt MySQL trên Ubuntu

Điều kiện cần

Để làm theo hướng dẫn này, bạn sẽ cần:

  • Một máy chủ đã được cài đặt Ubuntu phiên bản 20.04 trở về sau
  • Tài khoản người dùng không phải là root với các đặc quyền sudo và tường lửa

Bước 1: Cài đặt MySQL

Trên Ubuntu 20.04, chỉ có phiên bản mới nhất của MySQL được bao gồm trong kho gói APT theo mặc định.

Để cài đặt nó, 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

Điều này sẽ cài đặt MySQL, nhưng sẽ không nhắc 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. Bởi vì điều này khiến cho việc cài đặt MySQL của bạn không an toàn, chúng ta sẽ giải quyết vấn đề này tiếp theo.

Bước 2: Cấu hình MySQL

Để cài đặt mới, bạn sẽ muốn chạy tập lệnh bảo mật đi kèm. Điều này thay đổi một số tùy chọn mặc định kém an toàn hơn cho những thứ như đăng nhập gốc từ xa và người dùng mẫu. Trên các phiên bản cũ hơn của MySQL, bạn cũng cần phải khởi tạo thư mục dữ liệu theo cách thủ công, nhưng việc này được thực hiện tự động ngay bây giờ.

Chạy lệnh bảo mật:

$ sudo mysql_secure_installation

Điều này sẽ đưa bạn qua một loạt các lời nhắc 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ài đặt MySQL của bạn. Lời nhắc đầu tiên sẽ hỏi bạn có muốn cài đặt Plugin xác thực mật khẩu hay không, có thể được sử dụng để kiểm tra độ mạnh của mật khẩu MySQL của bạn hay không. Bất kể lựa chọn của bạn là gì, lời nhắc tiếp theo sẽ là đặt mật khẩu cho người dùng root MySQL. Nhập và sau đó xác nhận mật khẩu an toàn của sự lựa chọn của bạn.

Từ đó, bạn có thể nhấn Y và sau đó ENTER để chấp nhậ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 gốc từ xa và tải 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.

Để khởi tạo thư mục dữ liệu MySQL, bạn sẽ sử dụng mysql_install_db cho các phiên bản trước 5.7.6 và mysqld --initialize cho 5.7.6 trở lên. Tuy nhiên, nếu bạn đã cài đặt MySQL từ bản phân phối Debian, như được mô tả trong Bước 1, thư mục dữ liệu sẽ được khởi tạo tự động; bạn không phải làm gì cả. Nếu bạn vẫn cố chạy lệnh, bạn sẽ thấy lỗi sau:

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 ngay cả khi bạn cài đặt mật khẩu cho người dùng MySQL gốc, người dùng này không được định cấu hình để xác thực bằng mật khẩu khi kết nối với trình bao MySQL. Nếu bạn thích, bạn có thể điều chỉnh cài đặt này bằng cách làm theo bước tiếp theo.

Bước 3 (tuỳ chọn): Điều chỉnh xác thực và đặc quyền người dùng

Trong các hệ thống Ubuntu chạy MySQL 5.7 (và các phiên bản mới hơn), người dùng MySQL gốc được đặt để xác thực bằng cách sử dụng plugin auth_socket theo mặc định thay vì bằng mật khẩu. Điều này cho phép một số bảo mật và khả năng sử dụng cao hơn trong nhiều trường hợp, nhưng nó cũng có thể làm phức tạp mọi thứ khi bạn cần cho phép một chương trình bên ngoài (ví dụ: phpMyAdmin) truy cập người dùng.

Để sử dụng mật khẩu để kết nối với MySQL với quyền root, bạn sẽ cần chuyển phương thức xác thực của nó từ auth_socket sang mysql_native_password. Để làm điều này, hãy mở lời nhắc MySQL từ Terminal của bạn:

$ sudo mysql

Tiếp theo, hãy kiểm tra phương thức xác thực nào mà mỗi tài khoản người dùng MySQL của bạn sử dụng bằng lệnh sau:

mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
# hiển thị
+------------------+-------------------------------------------+-----------------------+-----------+
| 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 người dùng root thực tế xác thực bằng cách sử dụng plugin auth_socket. Để định cấu hình tài khoản root để xác thực bằng mật khẩu, hãy chạy lệnh ALTER USER sau đây. Đảm bảo thay đổi mật khẩu thành mật khẩu mạnh do bạn chọn và lưu ý rằng lệnh này sẽ thay đổi mật khẩu gốc bạn đã đặt trong Bước 2:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Sau đó, chạy FLIV PRIVILEGES để báo cho máy chủ tải lại các bảng cấp và đưa các thay đổi mới của bạn vào hiệu lực:

mysql> FLUSH PRIVILEGES;

Kiểm tra lại các phương thức xác thực được sử dụng bởi mỗi người dùng của bạn một lần nữa để xác nhận rằng root không còn xác thực bằng cách sử dụng plugin auth_socket:

mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
# hiển thị
+------------------+-------------------------------------------+-----------------------+-----------+
| 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 ví dụ đầu ra này, người dùng MySQL gốc hiện 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 riêng bạn, bạn có thể thoát khỏi trình vỏ MySQL:

mysql> exit

Ngoài ra, một số người có thể thấy rằng nó phù hợp hơn với quy trình làm việc của họ để kết nối với MySQL với một người dùng chuyên dụng. Để tạo một người dùng như vậy, hãy mở shell MySQL một lần nữa:

$sudo mysql

Lưu ý: Nếu bạn đã bật xác thực mật khẩu cho root, như được mô tả trong các đoạn trước, bạn sẽ cần sử dụng một lệnh khác để truy cập vào vỏ MySQL. Sau đây sẽ chạy ứng dụng khách MySQL của bạn với các đặc quyền người dùng thông thường và bạn sẽ chỉ nhận được các đặc quyền của quản trị viên trong cơ sở dữ liệu bằng cách xác thực:

$ sudo mysql -u root -p

Từ đó, tạo một người dùng mới và cung cấp cho nó một mật khẩu mạnh:

mysql> CREATE USER 'sinhnx'@'localhost' IDENTIFIED BY 'password';

Sau đó, cấp cho người dùng mới của bạn các đặc quyền thích hợp. Ví dụ: bạn có thể cấp đặc quyền người dùng cho tất cả các bảng trong cơ sở dữ liệu, cũng như sức mạnh để thêm, thay đổi và xóa đặc quyền người dùng, bằng lệnh này:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'sinhnx'@'localhost' WITH GRANT OPTION;

Lưu ý rằng, tại thời điểm này, bạn không cần phải chạy lại lệnh FLUSH PRIVILEGES. Lệnh này chỉ cần thiết khi bạn sửa đổi các bảng cấp bằng cách sử dụng các câu lệnh như INSERT, UPDATE hoặc DELETE. Bởi vì bạn đã tạo một người dùng mới, thay vì sửa đổi một người dùng hiện có, FLIV PRIVILEGES không cần thiết ở đây.

Sau đó, thoát khỏi MySQL Shell:

mysql> exit

Cuối cùng, chuyển sang bước tiếp theo để kiểm thử quá trình cài đặt MySQL.

Bước 4: Kiểm thử MySQL

Bất kể bạn đã cài đặt nó như thế nào, MySQL sẽ bắt đầu chạy tự động. Để kiểm tra điều này, kiểm tra trạng thái của nó.

$ systemctl status mysql.service

Bạn sẽ thấy hiển thị tương tự như sau:

● 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 không chạy, bạn có thể khởi động nó bằng lệnh sau:

$ sudo systemctl start mysql

Để kiểm tra bổ sung, bạn có thể thử kết nối với cơ sở dữ liệu bằng công cụ mysqladmin, đây là ứng dụng khách cho phép bạn chạy các lệnh quản trị. Ví dụ, lệnh này nói để kết nối với MySQL dưới dạng root (-u root), nhắc nhập mật khẩu (-p) và trả về phiên bản

$ sudo mysqladmin -p -u root version

Bạn sẽ thấy hiển thị tương tự như sau:

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 đang hoạt động.

Kết luận

Bây giờ bạn đã cài đặt MySQL cơ bản trên máy chủ của mình