Wednesday, 16 January 2013

Cài đặt, cấu hình, quản trị mysql-server

Bài viết thực hiện trên :

➜ hvn@lappy  ~  uname -ir && lsb_release -d
3.2.0-30-generic x86_64
Description:    Ubuntu 12.04.1 LTS

Sau khi luyện xong các lệnh trong bài này, bạn có thể tự chạy và quản lý 1 mysql-server cho các sản phẩm của mình, hoàn toàn không cần dùng thêm phpmyadmin.

Cài đặt:
➜ hvn@lappy  ~  sudo apt-get install mysql-server mysql-client
(sẽ cần nhập password cho user root)

Nếu gặp lỗi
Errors were encountered while processing:
 mysql-server-5.5
 mysql-server

Hãy gõ các lệnh sau để sửa:

    dpkg --remove mysql-server
    sudo apt-get purge -f mysql-server mysql-common
    sudo apt-get install mysql-server mysql-common

Cài xong là chạy luôn, không cần thiết phải config.


File config:
Sau khi cài xong hãy đọc lướt qua file config chính của mysql-server, nằm ở `/etc/mysql/my.cnf`:
có rất nhiều option nhưng 1 option bạn nên chú ý là dòng:
bind-address            = 127.0.0.1
nếu muốn truy cập mysql-server từ ngoài, bạn phải chuyển địa chỉ này thành 0.0.0.0

Đăng nhập
với tài khoản root và password đã nhập lúc cài:
➜ hvn@lappy  ~  mysql -u root -p
nếu muốn đăng nhập vào mysql ở 1 địa chỉ nào, bạn có thể dùng option -h
➜ hvn@lappy  ~  mysql -h dev.vccloud.vn -u hvn -p

NOTE: câu lệnh của mysql không phân biệt chữ HOA-thường.
Kiểm tra các user có sẵn sau khi cài đặt:
mysql> SHOW DATABASES;

mysql> use mysql;
mysql> SHOW TABLES;
...
Database changed
mysql> select user,host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | 127.0.0.1 |
| root             | ::1       |
|                  | lappy     |
| root             | lappy     |
|                  | localhost |
| debian-sys-maint | localhost |
| root             | localhost |
+------------------+-----------+
7 rows in set (0.00 sec)


Xem user hiện tại:
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

Tạo user mới:
mysql> create user 'hvn'@'%' identified by 'passwordkute';
Query OK, 0 rows affected (0.00 sec)

Xóa user:
mysql> DROP USER 'glance'@'%';
Query OK, 0 rows affected (0.00 sec)

Đổi password:
mysql> set password for 'hvn'@'%' = password('123457');
Query OK, 0 rows affected (0.00 sec)

Xem grants (quyền):
mysql> show grants for 'root'@'localhost';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*1E3D084DE8C16153E70B831F0357A73430BE2C7C' WITH GRANT OPTION |
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                          
2 rows in set (0.00 sec)

Gán quyền cho user vừa tạo:
mysql> GRANT ALL PRIVILEGES ON `hvn\_%`.* TO 'hvn'@'%'
Câu này gán tất cả các quyền cho user 'hvn'@'%' tại các db bắt đầu bằng hvn_


'hvn'@'%' : ở đây hvn là tên user, '%' là tên host. bạn có thể chạy lại câu lệnh select phía trên để xem các user, host đang tồn tại.
'%' là một ký hiệu đặc biệt, nó giống như ký hiệu * trong bash, hay có thể nói là tất cả các host. Tức là cho phép user hvn truy cập từ tất cả các host (tất nhiên phải có passwd). Nếu muốn bạn có thể thay bằng 'hvn'@'domain_tuy_y' để giới hạn truy cập đến từ host đó. Nếu chỉ muốn các user đăng nhập từ máy cài server, bạn hãy để host là localhost.

mysql sử dụng cặp 'user'@'host' để xác định 1 "tài khoản", khi bạn không chỉ rõ host, nó sẽ coi như bạn ám chỉ host '%'

Sau khi tạo user và gán quyền như trên, bạn có thể login vào mysql từ các server ngoài, nhưng ngay tại máy đó sẽ không được.

Để login được bạn phải xóa 2 user ‘’ ban đầu đi rồi flush:
mysql> delete from user where user='';
Query OK, 2 rows affected (0.00 s)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

Bây giờ bạn đã có thể đăng nhập vào từ bất cứ đâu.

Backup
Backup 1 db:
# mysqldump -u root -p ten_db > filebkp.sql
Backup tất cả database:
# mysqldump -u root -p --all-databases > /tmp/all-database.sql

Backup tự động:
Cài thêm gói automysqlbackup là xong.
# sudo apt-get install automysqlbackup

File config /etc/default/automysqlbackup
Các file backup nằm ở BACKUPDIR="/var/lib/automysqlbackup"

Bạn không cần làm gì sau khi cài đặt, bởi automysqlbackup tự động đọc root user, password từ file /etc/mysql/debian.cnf


Import database:
# mysql -u user -p < file.sql

Gỡ
(vẫn còn mấy file config ở /etc/mysql và file database ở /var/lib/mysql, phải xóa tay)
➜ hvn@lappy  ~  sudo apt-get purge mysql-server-core-5.5
...
The following packages will be REMOVED:
  mysql-server* mysql-server-5.5* mysql-server-core-5.5*

SEO: cài đặt mysql, đổi pass mysql, lỗi mysql, cai dat mysql, doi pass mysql, tao user mysql, tạo user mysql.

6 comments:

  1. UPDATE: việc xóa 2 user default ‘’ giúp các user @'%' có thể login vào được cả từ local. Một cách khác để thực hiện việc này là với mỗi user cần truy cập từ localhost, ta tạo một user@localhost. VD: muốn user hvn login được từ localhost, ta tạo tài khỏan 'hvn'@'localhost' với password của 'hvn'@'%'. Cách này được openstack sử dụng, họ giải thích như sau:

    By default, MySQL will create entries in the user table with User='' and Host='localhost'. The User='' acts as a wildcard, matching all users. If you do not have the 'keystone'@'localhost' account, and you try to log in as the keystone user, the precedence rules of MySQL will match against the User='' Host='localhost account before it matches against the User='keystone' Host='%' account. This will result in an error message that looks like:

    ERROR 1045 (28000): Access denied for user 'keystone'@'localhost' (using password: YES)

    Thus, we create a separate User='keystone' Host='localhost' entry that will match with higher precedence.

    ReplyDelete
  2. Xóa nhiều database bằng 3 dòng bash script:
    https://gist.github.com/4593285

    ReplyDelete
  3. Lợi ích của việc sử dụng thành thạo mysql client quá rõ ràng. Không bao giờ cần tới phpmyadmin, có thể tự động hóa công việc bằng shell script...
    Hiểu thêm về mysql mỗi khi gõ lệnh.
    Với giao diện web, ít khi bạn để ý đến engine hay charset và cũng ko biết gõ nó thế nào. Đây là một ví dụ để tạo 1 table sử dụng engine là innodb và charset là utf8;

    mysql>
    CREATE TABLE `virtual_domains` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    ReplyDelete
    Replies
    1. NOTE: các tên bảng tên cột nên có dấu backstick `` bao quanh để tránh việc trùng với từ khóa. VD khi muốn tạo cột tên là type, phải sử dụng `type`

      Delete
  4. Thử nghiệm với mariadb 5.5.30(opensource software phát triển từ mysql, sau khi oracle mua mysql, đóng vai trò thay thế cho mysql của oracle, mọi thứ đều giống hệt ngoài các tính năng cải tiến) thấy client có hỗ trợ autocomplete tên các database, table, field

    ReplyDelete