Cách chuyển MySQL Database sang một Server mới trên Ubuntu 14.04
Giới thiệu
Nếu bạn đang sử dụng một ứng dụng web với database, chẳng hạn như LAMP stack, trên một VPS đơn lẻ, bạn đôi khi sẽ phải mở rộng hệ thống để có thể xử lí nhiều yêu cầu hơn. Một cách khá hiệu quả để làm việc này là chuyển database server của bạn sang một VPS riêng biệt khác trên cùng một datacenter.
Hướng dẫn này sé giúp bạn dịch chuyển một MySQL database ra khỏi application server của bạn. Vì mọi ứng dụng đều có cấu hình riêng với các kết nối đến database, ta sẽ ví dụ với quá trình dịch chuyển database với WordPress, nhưng bạn có thể thực hiện tương tự với các ứng dụng web sử dụng MySQL.
Note: Nếu muốn thực hiện các thiết lập ban đầu với một database server riêng, để database được tách khỏi application server, bạn nên tham khảo Cách thiết lập Remote Database để tối ưu hiệu suất của trang web sử dụng MySQL.
Yêu cầu
Giả sử rằng web application và database của bạn đang được lưu trữ trên cùng một server, như sơ đồ sau:
Một ví dụ cho kiểu thiết lập này được đề cập trong bài viết: Cách cài đặt Wordpress trên Ubuntu 14.04
Để cho ngắn, từ giờ hãy gọi server của bạn là lamp-1.
Bạn sẽ cần tạo thêm một VPS cho MySQL server riêng của bạn. Ta sẽ gọi server này là mysql-1.
Mục tiêu
Sau khi hoàn thành hướng dẫn này, database của bạn sẽ được chuyển từ lamp-1 sang một server mới là mysql-1 ,như sau:
Các công việc cần làm
Để hoàn thành mục tiêu ở trên, ta cần làm 2 việc:
- Chuyển database sang server mới .
- Cấu hình lại application server để làm việc với database mới.
Chuyển Database ở Server hiện tại sang Server mới
Tạo MySQL VPS mới
Ở bước này ta sẽ tạo ra một VPS mới để chứa database là mysql-1. Nếu chưa biết cách cấu hình cơ bản cho một server mới, tham khảo bài viết: Thiết lập ban đầu với server Ubuntu 14.04
Cài đặt và cấu hình MySQL Server
Sau khi tạo một database VPS mới, ta sẽ kết nối đến nó để cài đặt MySQL Server.
Trên mysql-1, update apt với lệnh:
sudo apt-get update
Sau đó cài MySQL server:
sudo apt-get install mysql-server
Nhập vào root password để xác nhận quá trình cài đặt ( chính là root password của lamp-1).
Sau đó chạy lệnh sau để tạo ra một bảng mặc định của MySQL:
sudo mysql_install_db
Kết thúc quá trình cài đặt với lệnh:
sudo mysql_secure_installation
Trả lời "no" với yêu cầu reset lại root password và Yes cho mọi yêu cầu khác.
Hiện tại MySQL database được cấu hình để chỉ nghe trên localhost (hay 127.0.0.1 ). Ta cần phải cấu hình lại database server để nghe trên private IP address của nó, vì vậy application server, lamp-1, có thể kết nối đến nó.
Mở file cấu hình của MySQL:
sudo vi /etc/mysql/my.cnf
Tìm đến dòng bind-address.
bind-address = 127.0.0.1
Thay thế 127.0.0.1
bằng private IP address của database server:
bind-address = mysql_1_private_IP
Chỉnh sửa những cấu hình riêng mà bạn đã cài trên lamp-1 cho khớp, sau đó lưu và đóng file và restart mysql:
sudo service mysql restart
Export file Backup của Database gốc
Bạn có thể dừng application server để tránh việc thay đổi database trong quá trình dịch chuyển nếu muốn. Mặc dù database chắc chắn sẽ bị khóa lại, nhưng bạn vẫn nên dừng xử lí để đảm bảo không có lỗi xảy ra.
Tiếp theo ta sẽ export ra một bản backup của database gốc, và chuyển nó đến database mới. Trước khi tiến hành dịch chuyển ta cần khóa database.
Note: Khóa database sẽ chặn tất cả bản ghi lên nó, nên bạn chỉ có thể đọc dữ liệu trên database mà không thể ghi đến khi nó được mở khóa.
Trên lamp-1, vào MySQL console:
mysql -u root -p
Để khóa database trên lamp-1, chạy lệnh sau từ MySQL console:
FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT
Export database ra file dump.sql
với lệnh:
mysqldump --lock-all-tables -u root -p --all-databases > dump.sql
Copy file dump.sql đến mysql-1, sử dụng lệnh scp:
scp dump.sql user@mysql_1_private_IP:/tmp
Vì không cần sử dụng đến MySQL trên server gốc nữa, ta có thể để nó ở chế độ khóa. Nếu muốn mở khóa database, chạy lệnh sau trên MySQL Console:
SET GLOBAL read_only = OFF;
UNLOCK TABLES;
Import Database gốc vào Server mới
Trên mysql-1, chạy lệnh sau để dump.sql
file:
mysql -u root -p < /tmp/dump.sql
Đến đây, tất cả dữ liệu trong database và user gốc đã được copy đến mysql-1. Bước tiếp theo là tạo một user cho database mới với những quyền tương tự với user ở database gốc.
Tạo các User để Cho phép Kết nối từ Web Application Server
Vì MySQL quản lí các user của nó dựa trên username và các hosst pair nguồn, bạn sẽ phải tạo một user mới với giá trị "host" khớp với private IP address của web server.
Vào MySQL console trên mysql-1:
mysql -u root -p
Dùng lệnh sau để hiển thị các user và host:
SELECT user,host FROM mysql.user;
Example Output: +------------------+-----------+ | user | host | +------------------+-----------+ | root | 127.0.0.1 | | root | ::1 | | debian-sys-maint | localhost | | root | localhost | | wordpressuser | localhost | +------------------+-----------+ 5 rows in set (0.00 sec)
Chú ý và user tên wordpressuser
với host nguồn là localhost
. Giả sử "wordpressuser" là người dùng web. Vì ứng dụng web và database nằm trên hai server riêng biệt, ứng dụng web sẽ không thể kết nối đến "localhost". Ta cần tạo một user mới tên là wordpressuser
với giá trị host là private IP address của application server, lamp-1, để cho phép kết nối.
Lệnh sau giúp bạn tạo một user như ở trên đã đề cập. Đảm bảo rằng "password" khớp với mật khẩu của user gốc.
CREATE USER 'wordpressuser'@'lamp_1_private_IP' IDENTIFIED BY 'password';
Với mỗi user muốn tạo, chạy lệnh sau để kiểm tran các quyền được cấp cho user đấy.
SHOW GRANTS FOR wordpressuser@localhost;
Output:
Chú ý vào ( những) dòng nằm sau GRANT USAGE ON *.*
vì bạn sẽ chỉnh sửa nó một chút để dùng cho user mới. Ví dụ, dựa trên những quyền của user gốc, ta sẽ chạy lệnh sau để gán quyền cho user mới (ở đây là wordpress
). Dùng lệnh trên nhưng thay localhost
thành private IP address của lamp-1:
GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'lamp_1_private_IP';
Kiểm tra lại các quyền được cấp cho user mới:
SHOW GRANTS FOR wordpressuser@lamp_1_private_IP;
Output:
Sau khi các lệnh trên chạy đúng, dùng lệnh sau để lưu các thay đổi và thoát khỏi console:
FLUSH PRIVILEGES;
EXIT
Update Cấu hình cho Ứng dụng
Bước cuối cùng là update cấu hình cho ứng dụng đẻ trỏ tới database server mới tạo ( mysql-1). Vị trí file cấu hình cảu mỗi ứng dụng khác nhau là khác nhau tùy thuộc vào quá trình cài đặt ứng dụng, ở đây ta sẽ dùng WordPress làm ví dụ.
Ví dụ về cách cấu hình cho WordPress
WordPress lưu những cấu hình cho việc kết nối đến database tại file wp-config.php trong thư mục cài đặt của nó ( ở đây là /var/www/html/
).
Mở file cấu hình:
sudo vi /var/www/html/wp-config.php
Tìm đến những dòng:
/** MySQL hostname */
define('DB_HOST', 'localhost');
Thay thế localhost
bằng private IP address của database server, mysql-1. Sau khi edit ta thu được:
define('DB_HOST', 'mysql_1_private_IP');
Lưu và thoát. Thử kết nối như bình thường ( dùng public IP address hoặc domain name của lamp-1 ). Sẽ không có gì thay đổi trừ việc database của bạn được lưu ở một nơi khác là mysql-1.
Với các ứng dụng khác
Với các ứng dụng khác, ta đơn giản chỉ cần lặp lại các bước trên với private IP address hoặc domain name của database server thay cho "localhost" và "127.0.0.1". Tùy vào những ứng dụng khác nhau, bạn có thể sẽ phải restart lại server để lưu thay đổi.
Tắt MySQL trên Web Application Server
Sau khi việc truy cập đã diễn ra bình thường, ta sẽ tiến hành tắt kết nối trên web server vì nó không cong cần thiết nữa.
Trên lamp-1: chạy những dòng lệnh sau để dừng MySQL và không cho phép nó tự khởi động cùng hệ thống.
sudo service mysql stop
sudo sh -c "echo 'manual' > /etc/init/mysql.override"
Tổng kết
Giờ thì database server đã được tách khỏi application server, hệ thống của bạn đã có thể xử lí lưu lượng truy cập lớn hơn vì lượng tài nguyên sẵn sàng cung cấp nhiều hơn. Bên cạnh nó cũng sẵn sàng cho các cấu hình nâng cao khác như load balancing( cân bằng tải) và database replication ( nhân bản database server với quan hệ Master- Slave. Xem bài hướng dẫn: Cách cài đặt Master Slave Replication trong MySQL.