建立基本的主從復制可以總結為以下三個步驟:
配置一個master服務器
配置一個slave服務器
將slave連接至master闪水。
1)浦辨、配置master服務器:
要求master服務器開啟二進制日志(binary log)和唯一的服務器ID。二進制日志記錄了master上的所有變更渐白,并且可以在其他服務器重新執(zhí)行。服務器ID用于區(qū)分服務器。這兩部分內容都是需要更改/etc/my.cnf文件拄踪,需要停止mysql服務器。
在[mysqld]小節(jié)增加如下內容:
log_bin=master-bin#binlog日志文件的基本名
log_bin_index=master-bin-index#binlog日志文件的索引文件名拳魁。
expire_logs_days=14#binlog文件保留的天數(shù)惶桐。0代表永不刪除
skip_slave_start#指定復制進程就不會隨著數(shù)據庫的啟動而啟動
sync_binlog=1#指定binlog文件多久軍民一致一次磁盤,值實際為事務提交的次數(shù)。
slave_net_timeout=60#設置在多久沒收到數(shù)據后認為網絡超時姚糊,之后Slave的IO線程會重新連接Maste
server_id=165
在master創(chuàng)建一個復制用戶
mysql> grant replication slave on *.* to"repl_user"@'192.168.10.%' identified by "123456";
2)贿衍、配置slave服務器
在slave服務器上,常規(guī)情況下我們只需要配置一個唯一的serverID,然后分別使用relay-log和relay-log-index選項配置中繼日志文件和中繼日志索引文件即可叛拷。在slave服務器上停止mysql服務舌厨,編輯slave服務器的/etc/my.cnf文件。
在[mysqld]小節(jié)增加如下內容:
server-id=166
relay_log=slave-relay-bin
relay_log_index=slave-relay-bin-index
log_slave_updates=1
配置主從服務器的配置后忿薇,重新啟動兩個服務器上的mysqld服務裙椭。
3)、同步數(shù)據
在正式開啟主從復制前署浩,需要保證master與slave服務器上的數(shù)據是一致揉燃,我們需要在master上備份數(shù)據庫,然后在slave上恢復數(shù)據庫筋栋,并記錄下master上當前相關二進制日志的信息炊汤。
mysql> flush tables withread lock;
Query OK, 0 rows affected (0.00sec)
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File| Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 |334 ||||
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
鎖定數(shù)據庫,并記錄二進制文件在位置
[root@linux-node1 ~]#mysqldump-uroot –p123456 -A -B –events --default-character-set>/opt/$(date +%F).sql
[root@linux-node1 ~]# ll/opt/2017-03-31.sql
-rw-r--r-- 1 root root 203 Mar31 16:53 /opt/2017-03-31.sql
[root@linux-node1 ~]#
備份所有庫弊攘,這里使用了mysqldump命令抢腐,有很多參數(shù),具體大家可以查閱相關資料襟交,其中有一個參數(shù)比較有用迈倍,--master-data選項使mysqldump產生change master to語句,值為1時捣域,產生可用的change master to完整語句啼染,為2時,該語句被注釋焕梅。
mysql> unlock tables;
Query OK, 0 rows affected (0.00sec)
mysql>
解鎖主庫
[root@linux-node2 ~]# mysql-uroot -p123456
Warning: Using a password onthe command line interface can be insecure.
[root@linux-node2 ~]#
使用主庫的備份文件在從庫上恢復數(shù)據庫迹鹅,這樣master與slave上的數(shù)據就是相同的了。
4)贞言、slave連接master并啟動主從復制
mysql>change?master to master_host = '192.168.10.71',master_port = 3306,master_user = 'repl_user',master_password = '123456',master_log_file ='master-bin.000002',master_log_pos = 334;
mysql> start slave;
Query OK, 0 rows affected (0.01sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G;
*************************** 1. row***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.71
Master_User: repl_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000002
Read_Master_Log_Pos: 334
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 284
Relay_Master_Log_File: master-bin.000002
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: 334
Relay_Log_Space: 457
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: 165
Master_UUID:0e9896a7-14f7-11e7-a0e6-000c2900551e
Master_Info_File: /usr/local/mysql-5.6.35/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for theslave 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>
當紅色部分出現(xiàn)兩個yes之后斜棚,說明我們的主從配置正確,并且順利啟動该窗。
我們可以通過使用show
processlist\G命令來查看master及slave上線程的狀態(tài):
mysql>show processlist\G;
*************************** 1. row***************************
Id: 2
User: root
Host: localhost
db: NULL
Command: Sleep
Time: 2644
State:
Info: NULL
*************************** 2. row***************************
Id: 5
User: repl_user
Host: 192.168.10.72:18886
db: NULL
Command: Binlog Dump
Time: 924
State: Master has sent all binlog to slave; waiting for binlog to beupdated
Info: NULL
*************************** 3. row***************************
Id: 6
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: init
Info: showprocesslist
3 rows in set (0.00 sec)
ERROR:
No query specified
mysql>
紅色部分為處理slave的I/O線程的連接
mysql>show processlist\G;
*************************** 1. row***************************
Id: 3
User: system user
Host:
db: NULL
Command: Connect
Time: 846
State: Waiting for master to send event
Info: NULL
*************************** 2. row***************************
Id: 4
User: system user
Host:
db: NULL
Command: Connect
Time: 846
State: Slave has read all relay log; waiting for the slave I/O thread toupdate it
Info: NULL
*************************** 3. row***************************
Id: 5
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: init
Info: showprocesslist
3 rows in set (0.00 sec)
ERROR:
No query specified
紅色部分為I/O線程的狀態(tài)打肝,藍色部分為SQL線程的狀態(tài)