Thế nào là MySQL Replication?
Là quá trình cho bạn dễ dàng tạo ra nhiều bản sao lưu của MySQL Database bằng cách sao chép chúng một cách từ động từ Master đến Slave. Điều này là rất hữu ích vì nhiều lý do, bao gồm cả việc tạo cho bạn một bản sao lưu dữ liệu dự phọng cho trường hợp rủi ro xảy ra; cũng là một cách để bạn có thể phân tích dữ liệu mà không sử dụng cơ sở dữ liệu chính (Master) làm ảnh hưởng đến system performance hoặc đơn giản như một phượng tiện để mở rộng quy mô.
Hướng dẫn này giới thiệu tới bạn cấu hình MySQL Replication với 01 Master và 01 Slave.
Tài liệu tham khảo
Để viết bài này, tôi đã sử dụng các tài liệu tham khảo
https://dev.mysql.com/doc/refman/5.7/en/replication-problems.html
https://dev.mysql.com/doc/refman/5.7/en/replication-administration-status.html
https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql
https://dev.mysql.com/doc/refman/5.7/en/replication-problems.html
https://dev.mysql.com/doc/refman/5.7/en/replication-administration-status.html
https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql
Làm thế nào để cấu hình MySQL Replication?
Bài viết sử dụng 02 máy chủ có địa chỉ IP:
- 10.10.10.1 - Master Database
- 10.10.10.2 - Slave Database
- CentOS 6.6
Cấu hình MySQL Master
Bước 1: cài đặt MySQL
sudo yum install mysql-server mysql-client
Bước 2: tạo bản sao lưu dự phòng cho file cấu hình gốc MySQL
/etc/my.conf
cp /etc/my.conf /etc/my.conf.orig
Bước 3: bắt đầu cấu hình MySQL Master, thay đổi cấu hình này nằm ở phần [mysqld]. Bạn có thể chọn bất kỳ một con số tự nhiên nào cho
server-id
và đây là con số duy nhất, không trùng với server-id trong MySQL Replication của bạn. Tôi khuyến nghị bạn chọn 1
- Đây là số tự nhiên đầu tiên, nó thích hợp một cách tự nhiên và dễ nhớ để bắt đầu.
- Sẽ khó bị quên hơn với 1 là server-id của MySQL Master. Từ sau đó là server-id của Slave
- Bạn là người đầu tiên lolz
Thêm đoạn sau vào phần [mysqld]
# Enable binary logging & Replication
server_id = 1
log_bin = /home/mysql/data/mysql-bin.log
Đây là phần gốc rễ để sao lưu Database từ MySQL Master tới MySQL Slave. MySQLSlave sẽ sao chép tất cả những thay đổi có trong log_bin.
Nếu muốn lựa chọn Database sẽ sao chép sang MySQL Slave. Bạn cần thêm dòng sau
Bạn có thể thêm nhiều hơn một database bằng cách lặp lại dòng này cho tất cả Database bạn cần sao lưu.
binlog_do_db = newdatabase
Bạn có thể thêm nhiều hơn một database bằng cách lặp lại dòng này cho tất cả Database bạn cần sao lưu.
Bước 4: Để áp dụng thay đổi, bạn cần restart MySQL Service
$sudo service mysqld restart
Bước 5: Giờ là lúc mở MySQL shell để làm tiếp
mysql -uroot -p
Bước 6: Bạn cần phân quyền cho MySQL Slave bằng cách tạo một
slave_user
và phân quyền cho slave_user
này.GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'10.10.10.2' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
Bước 7: Cần một chút tinh xảo từ bạn, và cẩn thận. Bạn mở một cửa sổ terminal mới, đăng nhập vào MySQL Master, đăng nhập vào MySQL shell.
Tại đây, do Database được chọn là
newdatabase
nên bạn cần chuyển tới newdatabase
USE newdatabase;
Tiếp theo, bạn
lock database
để ngăn chặn bất kỳ thay đổi có thể xảy ra với newdatabase
FLUSH TABLES WITH READ LOCK;
Tiếp theo, bạn gõ:
SHOW MASTER STATUS;
Bạn sẽ nhìn thấy một bảng thông tin tương tự như dưới
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+----------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set
+------------------+----------+--------------+------------------+----------------+
| mysql-bin.003894 | 44121282 | | |
+------------------+----------+--------------+------------------+----------------+
1 row in set (0.00 sec)
mysql>
Đây là log_bin và vị trí mà MySQL Slave sẽ bắt đầu sao lưu. Bạn cần ghi lại hai thông số
File
và Position
. Lát nữa bạn sẽ dùng chúng.
Nếu bạn có bất kỳ thay đổi, gõ lệnh nào ở cửa sổ MySQL shell này, Database sẽ tự động
unlock
. Do đó, bạn cần mở tiếp một cửa sổ mới cho bước tiếp theo.
Bước 8: Bạn sẽ
export database
sử dụng mysqldump
ở cửa sổ terminal mới. Hãy đảm bảo bạn đang ở bash shell terminal, không phải MySQL shell.mysqldump -uroot -p --default-character-set=utf8 --opt newdatabase > newdatabase.sql
Bước 9: Giờ là lúc bạn quay lại cửa sổ MySQL shell mà bạn
FLUSH TABLES WITH READ LOCK;
, gõ vào lệnh sau để unlock
UNLOCK TABLES;
và
QUIT;
Tới đây bạn đã hoàn thành cấu hình MySQL Master Database.
Cấu hình MySQL Slave
Bước 1: Bạn login vào máy chủ MySQL Slave, và mở cửa sổ MySQL shell. Bạn tạo mới
newdatabase
. Đây là Database bạn sẽ sao chép từ MySQL MasterCREATE DATABASE newdatabase CHARACTER SET utf8;
EXIT;
Bước 2:
Import database
mà bạn đã Export
ở Bước 8: của Cấu hình MySQL Mastermysql -uroot -p --default-character-set=utf8 newdatabase
$sudo cp /etc/my.conf /etc/my.conf.orig
Bước 4: cấu hình MySQL Slave. Tôi đã nói với bạn về
server-id
ở Bước 3: của Cấu hình MySQL Master. Và gán server-id
của MySQL Master là 1
, giờ bạn gán 2
cho MySQL Slave vào phần [mysqld]server-id = 2
Bước 5: thêm những dòng sau vào sau
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = newdatabase
Bước 6:
restart
MySQL Service để áp dụng thay đổi.$sudo service mysqld restart
Bước 7: tiếp theo, bạn mở cửa sổ MySQL shell. Và gõ vào đó dòng sau đây
CHANGE MASTER TO MASTER_HOST='10.10.10.1',MASTER_PORT=3307,MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.003894', MASTER_LOG_POS= 44121282;
Dòng trên làm những việc sau:
- Nó chỉ định máy chủ hiện tại là MySQL Slave của MySQL Master (IP 10.10.10.1)
- Nó cung cấp thông tin đăng nhập vào MySQL Master
- Cuối cùng, nó cho MySQL Slave biết vị trí để bắt đầu sao chép
Bước 8:
activate
MySQL Slave.START SLAVE;
Bước 9: giờ là lúc bạn xem MySQL Slave vừa cấu hình đã hoạt động chưa? hoạt động thế nào? Bạn mở cửa sổ MySQL shell và gõ lệnh
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.10.1
Master_User: slave_user
Master_Port: 3307
Connect_Retry: 60
Master_Log_File: mysql-bin.003908
Read_Master_Log_Pos: 70419921
Relay_Log_File: mysqld-relay-bin.000028
Relay_Log_Pos: 70420084
Relay_Master_Log_File: mysql-bin.003908
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
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: 70419921
Relay_Log_Space: 70420305
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
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: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 97fcc20f-9ed8-11e6-9eaa-0025903d1878
Master_Info_File: /home/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
Những lỗi có thể xảy ra
Trong quá trình replication giữa MySQL Master và MySQL Slave có thể bị gián đoạn vì lỗi sao lưu dữ liệu. Một số lỗi xảy ra như
1062, 1452, 1050, 1146, 1356, 1054, 1060, 1406
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.10.1
Master_User: slave_user
Master_Port: 3307
Connect_Retry: 60
Master_Log_File: mysql-bin.003895
Read_Master_Log_Pos: 1965103
Relay_Log_File: mysqld-relay-bin.000394
Relay_Log_Pos: 83593238
Relay_Master_Log_File: mysql-bin.003892
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1406
Last_Error: Error 'Data too long for column 'id1' at row 1' on query. Default database: 'newdatabase'
Skip_Counter: 0
Exec_Master_Log_Pos: 83593075
Relay_Log_Space: 316678540
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
No comments:
Post a Comment