參考此篇成功完成 配置
?
MySql主從復制(Master-Slave) - 曹振華 - 博客園
MySql主從復制(Master-Slave)
MySql主從復制(Master-Slave)
1.主(master)服務器把數據更改的記錄或者事件記錄到二進制日志里。
2.從(slave)服務器把主服務器的二進制日志復制到自己的中繼日志里。
3.從(slave)服務器根據中繼日志的內容應用到自己的數據上。假設我們的主從復制結構是由3臺服務器構成,1臺master,2臺slave。
文章中的命令行提示符的含義:
123[root@m
/s/s
~]
#? 表示要在master slave slave三臺服務器里都要執行的命令
[root@master ~]
# 表示只在master服務器里執行的命令
[root@s
/s
~]
#??? 表示要在2臺slave服務器里都要執行的命令
第一步,分別在3臺機器上安裝MySql,并使用MySql自帶的my-medium.cnf作為初始配置文件,在3臺服務器里分別執行如下命令。
12[root@m
/s/s
~]
# yum -y install mysql mysql-server
[root@m
/s/s
~]
# \cp -f /usr/share/doc/mysql-server-*/my-medium.cnf /etc/my.cnf
第二步,創建用于復制的賬戶,我們不管主從,在3臺MySql創建相同用戶名密碼的用戶。
1.首先啟動MySql,并設置root密碼,我這里是測試,所以你千萬別把密碼設置的這么簡單。
12[root@m
/s/s
~]
# /etc/init.d/mysqld start
[root@m
/s/s
~]
# /usr/bin/mysqladmin -u root password 'masterpass'
?
2.創建并授權用于從服務器復制的復制賬戶。
12345[root@m
/s/s
~]
# mysql -uroot -p
Enter password:
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO
'repluser'
@'192.168.
0.%
' IDENTIFIED BY '
replpass';
Query OK, 0 rows affected (0.00 sec)
★:如果你了解MySql,可能你會說只需要在主服務器上添加一個從服務器用于復制的賬戶即可,也不需要REPLICATION SLAVE權限,但是我這樣做的好處有2個方面,1是監視和管理復制,2是方便將來主從交換角色。
第三步,配置主(Master)服務器配置文件,此步在主(Master)里操作。
在/etc/my.cnf的[mysqld]域后追加
12345server_id?????????? = 100
log_bin???????????? = mysql-bin
log_bin_index?????? = mysql-bin.index
sync_binlog???????? = 1
max_binlog_size???? = 200M
?
?
12345server_id??????? 服務器ID,不要和別的服務器沖突了,在同一個局域網里,我習慣使用ip的最后一位
log_bin????????? 顯式的指定二進制日志的文件名
log_bin_index??? 注意這里指定的文件名不是記錄的表的索引,而是記錄了二進制日志的文件名
sync_binlog????? 設為1就是把MySql每次發生的修改和事件的日志即時同步到硬盤上
max_binlog_size? 指定二進制日志的大小
添加完設置后,重啟MySql,并確認主服務器狀態。
12345678910[root@master ~]
# /etc/init.d/mysqld restart
[root@master ~]
# mysql -uroot -p
Enter password:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File???????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |?????? 98 |????????????? |????????????????? |
+------------------+----------+--------------+------------------+
1 row
in
set
(0.00 sec)
?
可見,二進制日志已經開啟并生效了,接下來該配置從(Slave)服務器了。
第三步,配置2臺從(Slave)服務器配置文件,此步分別在2臺從(Slave)里操作。
1.在192.168.0.101的/etc/my.cnf的[mysqld]域后追加
12345678910server_id?????????? = 101
log_bin???????????? = mysql-bin
log_bin_index?????? = mysql-bin.index
log_slave_updates?? = 1
relay_log?????????? = mysql-relay-bin
relay_log_index???? = mysql-relay-bin.index
max_binlog_size???? = 200M
read_only?????????? = 1
slave-skip-errors?? = 1062,1053
skip_slave_start??? = 1
?
2.在192.168.0.102的/etc/my.cnf的[mysqld]域后追加
12345678910server_id?????????? = 102
log_bin???????????? = mysql-bin
log_bin_index?????? = mysql-bin.index
log_slave_updates?? = 1
relay_log?????????? = mysql-relay-bin
relay_log_index???? = mysql-relay-bin.index
max_binlog_size???? = 200M
read_only?????????? = 1
slave-skip-errors?? = 1062,1053
skip_slave_start??? = 1
?
前面解釋的參數,這里就不解釋了。
12345log_slave_updates??? 讓從服務器把自身復制的事件和記錄都寫到自己的二進制日志里
relay_log??????????? 中繼日志
read_only??????????? 讓從服務器只讀,可以防止有人誤從服務器插入數據,導致主從數據不一致。
slave-skip-errors??? 在復制過程中忽略一些錯誤,讓復制繼續進行,在這里我忽略了1062和1053號錯誤,如果要忽略所有錯誤就設成all
skip_slave_start???? 防止從服務器在崩潰后自動開啟,以給你足夠的時間修復。
另外,你可能發現我把主(Master)服務器里的一些配置,比如二進制日志的設置也拿過來了,同樣是方便將來不停服務實現主從交換角色。
★:有人肯定要疑問了,為什么在從(Slave)服務器的配置里沒有從主服務器復制的賬戶等相關信息?
回答:直接把這些的信息寫到配置文件是沒有好處的,根據一些高手的經驗,還可以能出不可以預知的錯誤,因此我們將在下一步啟動復制的時候,
在MySql命令行里執行命令來指定這些信息,這樣做還有一個很大的好處,在我們要變換主服務器的時候不需要重啟MySql。
★:關于過濾復制對象的問題,但是如果不是特殊需要,不要使用復制過濾,因為同樣有幾率在一些事件觸發的時候導致一些錯誤。介紹幾種過濾參數。
binlog_do_db 只復制指定的數據庫(主服務器配置文件里設置)
binlog_ignore_db 不復制指定的數據庫(主服務器配置文件里設置)
replicate_ignore_table 不復制指定的表(從服務器配置文件里設置)
replicate_wild_ignore_table 使用wild匹配來不復制的指定表(從服務器配置文件里設置),比如參數設為abc.%,表示不復制abc的所有表。3.在2臺從(Slave)服務器里重啟MySql服務器
1[root@s
/s
~]
# /etc/init.d/mysqld restart
?
★:因為我們是新裝的MySql服務器,所以接下來我們就可以開啟復制了,如果你是給已經有大量數據的MySql服務器添加從(Slave)服務器,那么先從主(Master)服務器把數據導入到從(Slave)服務器里,讓2者的數據一致,然后再開啟復制。最簡單的方法就是關閉主服務器MySql的寫入,用mysqldump工具導出所有主(Master)服務器數據并上傳到從(Slave)服務器:
1234[root@master ~]
# mysqldump -u root -p --all-databases > /tmp/dbbackup.sql
[root@master ~]
# scp /tmp/dbbackup.sql user@192.168.0.101:/tmp/dbbackup.sql
[root@master ~]
# scp /tmp/dbbackup.sql user@192.168.0.102:/tmp/dbbackup.sql
[root@master ~]
# rm -f /tmp/dbbackup.sql
然后把備份導入到從(Slave)服務器里:
12[root@s
/s
~]
# mysql -u root -p < /tmp/dbbackup.sql
[root@s
/s
~]
# rm -f /tmp/dbbackup.sql
如果你要在主服務器MySql正常運行的狀態下進行熱拷貝等方法,我建議你不要用mysqldump這個命令,如果是MyISAM存儲引擎,用mysqlhotcopy進行熱備份會更好,如果是InnoDB存儲引擎,使用ibbacup這樣的工具更好。
第四步,在從(Slave)服務器里開啟復制,次步的操作在2臺從(Slave)服務器里執行。
12345678910111213141516171819202122[root@s
/s
~]
# mysql -uroot -p
Enter password:
mysql> CHANGE MASTER TO MASTER_HOST=
'192.168.0.100'
,
????
-> MASTER_PORT=3306,
????
-> MASTER_USER=
'repluser'
,
????
-> MASTER_PASSWORD=
'replpass'
,
????
-> MASTER_LOG_FILE=
'mysql-bin.000001'
,
????
-> MASTER_LOG_POS=0;
Query OK, 0 rows affected (0.20 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
?????????????
Slave_IO_State: Waiting
for
master to send event
????????????????
Master_Host: 192.168.0.100
????????????????
Master_User: repluser
????????????????
Master_Port: 3306
????????????
............
???????????
Slave_IO_Running: Yes
??????????
Slave_SQL_Running: Yes
????????????
............
1 row
in
set
(0.00 sec)
最后我用了SHOW SLAVE STATUS來查看復制情況,從第一行可以看出從服務器已經在等待主服務器的event了,也可以看到Slave_IO,Slave_SQL線程都正常開啟,最好同時查看從(Slave)服務器的日志/var/log/mysqld.log,確認沒有錯誤信息,接下來你就可以去主服務器進行一些操作看看同步是否正常。
另外,在上面的操作中MASTER_LOG_POS=0,這里0的意思是從日志開頭開始復制的意思,并不是實際的日志里的位置,實際的日志里的開始位置默認應該是4。
★:有人覺得,數據分別保存在2個機器里,就認為備份不需要了,千萬別這么想,只能說有助于備份,絕對不能替代備份。到此為止,簡單的主從配置就完了,但是真正要使用和管理好主從MySql服務器,不是靠這點知識就可以的。
網站計數器
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
