如果有多臺mysql資料庫伺服器需要需要做資料同步,或者讀寫分離的時候。就需要做一個資料庫的主從複製,操作起來也比較簡單。
如下:
主伺服器x.x.x.233
從伺服器x.x.x.234
首先需要在主資料庫配置一下my.cnf
開啟binlog增加serverid
server-id = 1
log-bin = bin-log
重啟服務後生效
登陸資料庫
建立一個使用者臺tmpcopy,密碼為mysq,並授權這個使用者可以從x.x.x.234這個IP以replication的許可權登陸
1 |
mysq> update mysql.user set user= `tmpcopy` where password=password( "mysql" );
|
2 |
Query OK, 1 row affected (0.48 sec) |
3 |
Rows matched: 1 Changed: 1 Warnings: 0 |
5 |
mysq> flush privileges; |
6 |
Query OK, 0 rows affected (0.03 sec) |
8 |
mysq> grant replication slave on *.* to tmpcopy@x.x.x.234 identified by `mysql` ;
|
9 |
Query OK, 0 rows affected (0.06 sec) |
鎖住主伺服器的資料寫入(防止下面記錄bonlog的位置後,產生新的資料)
1 |
mysql>flush tables with read lock;
|
然後檢視一下主伺服器的狀態
1 |
mysq> show master status; |
2 |
+----------------+----------+--------------+------------------+ |
3 |
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | |
4 |
+----------------+----------+--------------+------------------+ |
5 |
| bin-log.000001 | 41582 | | | |
6 |
+----------------+----------+--------------+------------------+ |
當前的binlog檔案是bin-log.000001,位置是41582
這時候需要手工做一次同步,讓主伺服器和從伺服器資料保持一致。
複製datadir或者從主伺服器mysqldump匯出sql檔案再匯入從伺服器,這裡不再累贅。
同步後目前兩臺伺服器資料是一致的
然後配置一下從伺服器的my.cnf
增加server-id=2
然後重啟服務,登陸
切換從伺服器的master,並配置當前資料所處的binlog檔案以及位置
1 |
mysq> change master to master_host= `x.x.x.1` ,master_user= `tmpcopy` ,master_password= `mysql` ,master_log_file= `bin-log.000001` ,master_log_pos=41582;
|
2 |
Query OK, 0 rows affected (0.01 sec) |
啟動主從
2 |
Query OK, 0 rows affected (0.00 sec) |
檢視一下從伺服器的狀態
01 |
mysq> show slave statusG |
02 |
*************************** 1. row *************************** |
03 |
Slave_IO_State: Waiting for master to send event
|
04 |
Master_Host: x.x.x.233 |
08 |
Master_Log_File: bin-log.000001 |
09 |
Read_Master_Log_Pos: 98925 |
10 |
Relay_Log_File: mysqld-relay-bin.000002 |
12 |
Relay_Master_Log_File: bin-log.000001 |
14 |
Slave_SQL_Running: Yes |
18 |
Replicate_Ignore_Table: |
19 |
Replicate_Wild_Do_Table: |
20 |
Replicate_Wild_Ignore_Table: |
24 |
Exec_Master_Log_Pos: 98925 |
25 |
Relay_Log_Space: 57751 |
29 |
Master_SSL_Allowed: No |
35 |
Seconds_Behind_Master: 0 |
36 |
Master_SSL_Verify_Server_Cert: No |
41 |
Replicate_Ignore_Server_Ids: |
43 |
1 row in set (0.01 sec)
|
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
這兩個狀態執行了就已經配置完成了
測試一下:
建立資料庫testdb
1 |
mysq> create database testdb; |
2 |
Query OK, 1 row affected (0.00 sec) |
選擇資料庫testdb並建立表test_tables以及兩個欄位id和test
3 |
mysq> create table test_table ( id int(3), test char (10));
|
4 |
Query OK, 0 rows affected (0.01 sec) |
插入資料
1 |
mysq> insert test_table values( `1` , `test-data` );
|
2 |
Query OK, 1 row affected (0.01 sec) |
我們再到從伺服器看一下:
02 |
+--------------------+ |
04 |
+--------------------+ |
08 |
+--------------------+ |
09 |
15 rows in set (0.08 sec)mysq> use testdb;
|
11 |
mysq> select * from test_table;
|
17 |
1 row in set (0.00 sec)
|
新建立的資料庫,表,表內的資料都已經同步了。
主從複製完成
如果需要一主多從,從伺服器的配置再到別的伺服器上配置一個不通的server-id重複操作一次即可。