# Cài đặt MySQL Docker và gán quyền cho user.
###### tags: `mysql`, `docker`, `install`
## :memo: Cài đặt MySQL
Sử dụng mysql-server để tạo một MySQL server trên máy local của chúng ta. Nó có ích khi chúng ta đang thử một thứ gì đó liên quan đến databse nhưng lại không có quyền cài đặt database hoặc truy cập một database nào đó bên ngoài.
```bash=
docker pull mysql/mysql-server
docker run --name=local_mysql -p 3306:3306 -d mysql/mysql-server
docker logs local_mysql 2>&1 | grep GENERATED
```
Chúng ta sẽ thấy mật khẩu của tài khoản root được sinh ra tự động trong kết quả. Cần sử dụng mật khẩu này để đăng nhập lại tài khoản root để thực hiện các thao tác kế tiếp.
```
p47y/#,cw,E89Pc7.&*SoRBMgc0h@4C7
```
Bây giờ đăng nhập lại tài khoản root để đổi mật khẩu mặt định sinh ra bên trên.
```bash=
docker exec -it local_mysql mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '123$%^789';
```
## Đăng nhập lần đầu
Ở phần trên mật khẩu đã được đổi thành `123$%^789`. Do đó bây giờ có thể hoàn toàn đăng nhập tài khoản root với mật khẩu này.
```bash=
docker exec -it local_mysql mysql -uroot -p
# nhập mật khẩu khi được hỏi.
```
## Thêm tài khoản và cho gán quyền
Tài khoản mà ta đăng nhập được tạo `root@localhost`. Nó đồng nghĩa với tài khoản root chỉ được đăng nhập database khi ở trong môi trường localhost. Nhưng do MySQL là docker container nên localhost của nó không có ai truy cập mà chúng ta cần truy cập nó từ bên ngoài container. Nên lúc này `localhost` trên máy chúng ta không có quyền truy cập vào `localhost` của MySQL container.
Vậy cần tạo một tài khoản mới `'root'@'%'`. Với `%` có ý nghĩa là cho phép mọi ip address, domain gọi tới điều được vào nếu đúng tên người dùng và mật khẩu.
```bash=
docker exec -it local_mysql mysql -uroot -p
# nhập mật khẩu
# sau khi vào được giao diện của mysql client console.
CREATE USER 'root'@'%' IDENTIFIED BY '123$%^789';
# Nếu mật khẩu không đủ bảo mật thì chúng ta dùng mysql_native_password
# để không bị cảnh báo. (chỉ dùng dòng trên hoặc bên dưới. Không dùng cả 2.)
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
```
:::warning
Sau khi một tài khoản mới được tạo trên domain `%` nhưng vẫn chưa thể truy cập. Vì tài khoản chỉ mới cho phép mọi domain truy cập chứ chưa gán quyền.
:::
```bash=
# gán chi tiết
GRANT PRIVILEGE ON database.table TO 'root'@'%';
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, \
REFERENCES, RELOAD on *.* TO 'root'@'%' WITH GRANT OPTION;
# gán quyền tất cả. quyền cao nhất.
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
# lệnh cuối cùng cần thiết để giúp lệnh gán quyền có hiệu lực.
FLUSH PRIVILEGES;
```
Và thế là chúng ta có thể đăng nhập vào MySQL với tài khoản root tại máy chúng ta với địa chỉ localhost với mật khẩu `123%%^789`.
## Tài liệu tham khảo
1. mysql/mysql-server - https://hub.docker.com/r/mysql/mysql-server
2. How To Create a New User and Grant Permissions in MySQL - https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql