Sao chép cơ sở dữ liệu tạo ra sự dự phòng có thể bảo vệ chống lại mất dữ liệu và cho phép tối ưu hóa hiệu suất cho các ứng dụng. Hướng dẫn này sẽ trình bày những điều cơ bản về sao chép cơ sở dữ liệu chính MariaDB 10.0 hiện có sang một hoặc nhiều máy phụ. Trong các ví dụ sau, hệ điều hành máy chủ là Debian 8.
Những hướng dẫn này có thể được áp dụng cho các hệ điều hành khác, nhưng hãy lưu ý rằng một số lệnh và vị trí tệp mặc định sẽ khác nhau. Cụ thể, bạn nên thay thế tên đường dẫn của /etc/mysql/my.cnf, /var/lib/mysql, tên và đường dẫn mặc định của tệp nhật ký nhị phân của bạn và các lệnh để khởi động, dừng và khởi động lại mysqld theo thông số kỹ thuật của hệ thống bạn.
Giá trị của mục log-bin định nghĩa quy ước đặt tên của các tệp nhật ký nhị phân. Trên Debian, các tệp này nằm trong /var/lib. Nếu giá trị của log-bin là (Không có giá trị mặc định), bạn sẽ cần bật ghi nhật ký bằng cách sửa đổi tệp cấu hình my.cnf. Trên Debian, my.cnf nằm trong thư mục /etc/mysql.
Mở /etc/mysql/my.cnf trong trình soạn thảo văn bản và định vị nhóm [mysqld]. Nếu không tồn tại, hãy tạo nó và nhập một dòng chỉ đọc là log-bin.
Bao gồm mục nhập này sẽ kích hoạt ghi nhật ký nhị phân khi mysqld được khởi động lại.
Bạn có thể chọn đặt giá trị cho log-bin, ví dụ: log-bin=filename, để xác định tên tùy chỉnh cho tệp nhật ký nhị phân. Trong hướng dẫn này, chúng tôi sẽ không đặt giá trị và tên tệp nhật ký mặc định sẽ được sử dụng.
Khởi động lại mysqld:
Xác minh rằng thay đổi đã có hiệu lực:
Như được hiển thị ở đây, tên tệp nhật ký nhị phân mặc định trên Debian bắt đầu bằng mysqld-bin, ví dụ: mysqld-bin.nnnnnn.
Cấp cho người dùng này các quyền toàn cục SUPER, RELOAD và REPLICATION SLAVE. Những lệnh này sẽ cho phép người dùng sao chép thực thi các lệnh siêu người dùng, xóa bộ đệm cơ sở dữ liệu và tải các bản cập nhật từ máy chủ chính.
Nhập máy khách MariaDB làm gốc cơ sở dữ liệu:
Tại dấu nhắc MariaDB, nhập lệnh:
Tại đây, ký tự đại diện tên máy chủ '%' cho phép người dùng sao chép kết nối từ bất kỳ máy chủ nào.
Xác minh rằng các quyền đã được cấp:
Trên máy chủ chính:
Bây giờ các bảng đã bị khóa, hãy kiểm tra trạng thái máy chủ chính:
HIỂN THỊ TRẠNG THÁI MÁY CHỦ;
Thông tin của bạn sẽ khác, nhưng hãy ghi lại các giá trị của File và Position. Bạn sẽ sử dụng thông tin này ở bước 7.
Thoát khỏi máy khách MariaDB:
Lệnh này lưu trữ một cơ sở dữ liệu duy nhất. Nếu bạn đang lưu trữ các cơ sở dữ liệu bổ sung, hãy thêm tên đường dẫn đầy đủ của chúng vào lệnh, ví dụ: /var/lib/mysql/dbname1 /var/lib/mysql/dbname2 ...
Bây giờ, với tư cách là username người dùng bình thường, hãy chuyển tệp này đến một tài khoản người dùng bình thường trên máy chủ phụ:
hoặc sử dụng scp:
Sau đó, SSH đến máy chủ phụ:
Với tư cách là root, hãy dừng mysqld trên máy chủ phụ:
...và giải nén tệp lưu trữ:
(Nếu my.cnf không tồn tại trên máy chủ phụ, hãy tạo nó. Nếu nó tồn tại, hãy tìm kiếm mục server-id hiện có và bỏ chú thích/sửa dòng đó).
Trong /etc/mysql/my.cnf trên máy chủ chính:
Trong /etc/mysql/my.cnf trên máy chủ phụ:
7. Mở khóa bảng và bắt đầu/khởi động lại mysqld trên máy chủ chính và máy chủ phụ
Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, hãy mở khóa bảng:
Khởi động lại mysqld trên máy chủ chính:
Và khởi động nó trên máy chủ phụ:
Bạn có thể xác minh rằng giá trị server-id mới đã có hiệu lực trên mỗi máy chủ. Với tư cách là root:
Thực hiện lệnh sau, thay thế các giá trị của MASTER_LOG_FILE và MASTER_LOG_POS bằng tệp nhật ký nhị phân File và Position mà bạn đã ghi lại ở bước 4, và các giá trị của MASTER_HOST, MASTER_USER và MASTER_PASSWORD bằng các giá trị của riêng bạn.
Bây giờ bạn có thể kiểm tra trạng thái của slave:
Nếu có bất kỳ lỗi nào trong quá trình sao chép, bạn sẽ thấy chúng được liệt kê ở đây.
Tạo cơ sở dữ liệu mới:
Tạo bảng và chèn giá trị:
Bây giờ hãy nhập máy khách MariaDB trên máy phụ:
11(a). Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, hãy xóa và khóa các bảng:
Sau khi khóa, hãy hiển thị trạng thái của máy chủ chính:
Ghi lại các giá trị File và Position.
11(b). Trên máy chủ chính, với tư cách là root:
11(c). Trên máy chủ chính, với tư cách là người dùng bình thường:
11(d). Trên máy chủ phụ, với tư cách là root:
11(e). Trong /etc/mysql/my.cnf trên máy chủ phụ, thêm hoặc chỉnh sửa dòng server-id= trong [mysqld] nhóm, trong đó giá trị của server-id là mới và duy nhất:
11(f). Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, mở khóa các bảng:
11(g). Trên máy chủ chính, với tư cách là root, khởi động lại mysqld:
11(h). Trên máy phụ, với tư cách là root, khởi động mysqld:
11(i). Trên máy phụ, trong máy khách MariaDB với tư cách là gốc cơ sở dữ liệu, cấu hình danh tính chính, tên tệp nhật ký nhị phân và vị trí từ bước 10(a):
11(j). Trên slave, trong máy khách MariaDB với tư cách là gốc cơ sở dữ liệu, kích hoạt sao chép:
Nếu kết nối vẫn không hoạt động, hãy đảm bảo rằng máy chủ của bạn đang cho phép kết nối trên cổng 3306. Trên máy chủ chính, hãy liệt kê các bảng tường lửa của hạt nhân:
Bạn có thể tạo một khoản trợ cấp cho các kết nối trên cổng 3306 bằng lệnh sau, thay thế tên thiết bị giao diện mạng của bạn cho eth0 nếu cần:
Những hướng dẫn này có thể được áp dụng cho các hệ điều hành khác, nhưng hãy lưu ý rằng một số lệnh và vị trí tệp mặc định sẽ khác nhau. Cụ thể, bạn nên thay thế tên đường dẫn của /etc/mysql/my.cnf, /var/lib/mysql, tên và đường dẫn mặc định của tệp nhật ký nhị phân của bạn và các lệnh để khởi động, dừng và khởi động lại mysqld theo thông số kỹ thuật của hệ thống bạn.
1. Xác minh kết nối
Trước khi tiến hành, hãy đảm bảo máy chủ chính và máy phụ có thể kết nối với nhau trên mạng và mỗi máy chủ đều có mục nhập cho máy chủ kia trong các tệp /etc/hosts tương ứng của chúng. Mỗi máy chủ phải có thể ping máy chủ kia và bạn phải có thể ssh từ máy chủ này đến máy chủ kia như một người dùng bình thường.2. Bật nhật ký nhị phân mysqld trên máy chủ chính
Trên máy chủ chính, hãy kiểm tra xem nhật ký nhị phân đã được bật chưa. Gọi mysqld bằng các công tắc --verbose --help sẽ hiển thị các giá trị hoạt động cho daemon MariaDB. Với tư cách là root:
Mã:
mysqld --verbose --help | grep log-bin
Mã:
...
log-bin (Không có giá trị mặc định)
...
Mở /etc/mysql/my.cnf trong trình soạn thảo văn bản và định vị nhóm [mysqld]. Nếu không tồn tại, hãy tạo nó và nhập một dòng chỉ đọc là log-bin.
Mã:
[mysqld]
log-bin
Bạn có thể chọn đặt giá trị cho log-bin, ví dụ: log-bin=filename, để xác định tên tùy chỉnh cho tệp nhật ký nhị phân. Trong hướng dẫn này, chúng tôi sẽ không đặt giá trị và tên tệp nhật ký mặc định sẽ được sử dụng.
Khởi động lại mysqld:
Mã:
service mysql restart
Mã:
mysqld --verbose --help | grep log-bin
Mã:
...
log-bin mysqld-bin
...
3. Cấp quyền cho người dùng sao chép
Thực hành tốt nhất là để tất cả các tác vụ sao chép được thực hiện bởi một người dùng sao chép chuyên dụng. Trong các ví dụ này, chúng tôi sẽ đặt tên cho người dùng là repluser và đặt mật khẩu của người dùng này thành chuỗi replpass.Cấp cho người dùng này các quyền toàn cục SUPER, RELOAD và REPLICATION SLAVE. Những lệnh này sẽ cho phép người dùng sao chép thực thi các lệnh siêu người dùng, xóa bộ đệm cơ sở dữ liệu và tải các bản cập nhật từ máy chủ chính.
Nhập máy khách MariaDB làm gốc cơ sở dữ liệu:
Mã:
mysql -u root -p
Mã:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';
Xác minh rằng các quyền đã được cấp:
Mã:
SHOW GRANTS FOR 'repluser'\G;
4. Xả bộ nhớ đệm cơ sở dữ liệu và đặt bảng ở chế độ chỉ đọc
Để chuẩn bị tạo ảnh chụp nhanh cơ sở dữ liệu, hãy xả tất cả các bảng và đặt chúng thành READ LOCK. Việc này cần được thực hiện nhanh chóng, trong giờ thấp điểm hoặc thời gian bảo trì hệ thống.Trên máy chủ chính:
Mã:
XẢ BẢNG CÓ READ LOCK;
HIỂN THỊ TRẠNG THÁI MÁY CHỦ;
Mã:
+-------------------+----------+--------------+-----------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-----------------+
| mysqld-bin.000005 | 995 | |
+-------------------+----------+------------------+------------------+
Thoát khỏi máy khách MariaDB:
Mã:
\q
5. Cơ sở dữ liệu ảnh chụp nhanh cho máy chủ phụ
Tạo kho lưu trữ cơ sở dữ liệu hoặc các cơ sở dữ liệu hiện có trên máy chủ chính mà bạn muốn sao chép. Mỗi cơ sở dữ liệu này có thư mục riêng trong /var/lib/mysql. Trong ví dụ này, chúng ta sẽ tar một cơ sở dữ liệu duy nhất, nằm tại đường dẫn /var/lib/mysql/dbname.Lệnh này lưu trữ một cơ sở dữ liệu duy nhất. Nếu bạn đang lưu trữ các cơ sở dữ liệu bổ sung, hãy thêm tên đường dẫn đầy đủ của chúng vào lệnh, ví dụ: /var/lib/mysql/dbname1 /var/lib/mysql/dbname2 ...
Mã:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
Mã:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
Mã:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
Mã:
ssh [username]@slavehost
Mã:
service mysql stop
Mã:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6. Cấu hình ID máy chủ cho máy chủ chính và máy chủ phụ
Sửa đổi /etc/mysql/my.cnf trên máy chủ chính, thêm mục server-id=n trong nhóm [mysqld], trong đó n là số nguyên duy nhất xác định máy chủ. Thông thường, n=1 đối với máy chủ chính, nhưng n có thể là bất kỳ số nguyên duy nhất nào trong phạm vi [1, 2^32-1]. Chúng ta sẽ đặt máy chủ chính của mình thành server-id=1 và máy chủ phụ của mình thành server-id=100.(Nếu my.cnf không tồn tại trên máy chủ phụ, hãy tạo nó. Nếu nó tồn tại, hãy tìm kiếm mục server-id hiện có và bỏ chú thích/sửa dòng đó).
Trong /etc/mysql/my.cnf trên máy chủ chính:
Mã:
[mysqld]
server-id=1
Mã:
[mysqld]
server-id=100
7. Mở khóa bảng và bắt đầu/khởi động lại mysqld trên máy chủ chính và máy chủ phụ
Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, hãy mở khóa bảng:
Mã:
mysql -u root -p
Mã:
UNLOCK TABLES;
Mã:
\q
Mã:
service mysql restart
Mã:
service mysql start
Mã:
mysqld --verbose --help | grep server-id
8. Cấu hình danh tính của máy chủ chính trên máy chủ phụ
Trên máy chủ phụ, cấu hình danh tính của máy chủ chính. Nhập máy khách MariaDB:
Mã:
mysql -u root -p
Mã:
ĐỔI MASTER THÀNH MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;
9. Kích hoạt slave
Trên slave, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu:
Mã:
START SLAVE;
Mã:
SHOW SLAVE STATUS \G;
Mã:
****************************** 1. hàng ***************************
Slave_IO_State: Đang chờ master gửi sự kiện
Master_Host: masterhost
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000009
Read_Master_Log_Pos: 1330
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 1618
Relay_Master_Log_File: mysqld-bin.000009
Slave_IO_Running: Có
Slave_SQL_Running: Có
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1330
Relay_Log_Space: 2204
Until_Condition: Không có
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Không
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: Không
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
10. Thực hiện thay đổi trên máy chủ chính và xác minh bản sao trên máy phụ
Bạn có thể xác minh rằng bản sao đang diễn ra bằng cách tạo cơ sở dữ liệu mới trên máy chủ chính và xem các thay đổi trên máy phụ.
Mã:
mysql -u root -p
Mã:
CREATE DATABASE repltest;
Mã:
USE repltest
Mã:
CREATE TABLE test (hello VARCHAR(10));
Mã:
INSERT INTO test VALUES ('world');
Mã:
\q
Mã:
mysql -u root -p
Mã:
USE repltest
Mã:
SELECT * FROM test;
Mã:
+-------+
| hello |
+-------+
| world |
+-------+
1 hàng trong tập hợp (0,00 giây)
11. Lặp lại quy trình cho các nô lệ bổ sung
Bạn có thể lặp lại quy trình này cho mỗi nô lệ bổ sung. Cụ thể, hãy thực hiện các bước sau:11(a). Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, hãy xóa và khóa các bảng:
Mã:
FLUSH TABLES WITH READ LOCK;
Mã:
[B][/b]SHOW MASTER STATUS;
11(b). Trên máy chủ chính, với tư cách là root:
Mã:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
Mã:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
Mã:
service mysql stop
Mã:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
Mã:
[mysqld]
server-id=200
Mã:
UNLOCK TABLES;
Mã:
service mysql restart
Mã:
[B][/b]service mysql start
Mã:
THAY ĐỔI MASTER THÀNH MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;
Mã:
KHỞI ĐỘNG SLAVE;
12. Xử lý sự cố: Slave không thể kết nối với master
Kiểm tra /var/mysql/my.cnf trên máy chủ chính để tìm mục bind-address. Nếu bind-address được đặt thành 127.0.0.1, máy chủ sẽ chỉ chấp nhận kết nối từ máy chủ cục bộ. Bình luận dòng này hoặc đặt giá trị thành * để cho phép kết nối từ tất cả các địa chỉ IPv4 và IPv6. Nếu bạn sửa đổi my.cnf, đừng quên khởi động lại mysqld.Nếu kết nối vẫn không hoạt động, hãy đảm bảo rằng máy chủ của bạn đang cho phép kết nối trên cổng 3306. Trên máy chủ chính, hãy liệt kê các bảng tường lửa của hạt nhân:
Mã:
iptables -L
Mã:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT