master slave mysql_Mysql---Master-slave复制方案 - dba成长之路- 博客频道 - CSDN.NET
準(zhǔn)備環(huán)節(jié):
主、從服務(wù)器 操作系統(tǒng)、mysql版本必須一致
一、環(huán)境
主機(jī):
master操作系統(tǒng):centos 5.5? 64位
IP:192.168.3.28
MySQL版本:5.5.17
從機(jī):
slave操作系統(tǒng):centos 5.5? 64位
IP:192.168.3.108
MySQL版本:5.7.17
二、master機(jī)和slave機(jī)的相關(guān)配置
1、創(chuàng)建一個(gè)復(fù)制用戶,具有replication slave 權(quán)限。
mysql>grant replication slave on *.* to ‘wxl’@’192.168.3.108′ identified by ‘123456’
2、修改master機(jī)器中mysql配置文件my.cnf,該文件在/etc目錄下
如果/etc/目錄下沒有my.cnf配置文件,請(qǐng)到/usr/share/mysql/找到my-medium*.cnf文件,拷貝到/etc/并改名為my.cnf
命令如:# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
在[mysqld]配置段添加如下字段
log-bin???????? = mysql-bin
log-bin-index?? = mysql-bin.index
binlog_format?? = row
server-id?????? = 38
sync-binlog???? = 1
character-set-server = utf8
說(shuō)明:
log-bin――設(shè)置二進(jìn)制日志文件的基本名;
log-bin-index設(shè)置二進(jìn)制日志索引文件名。
binlog_format――控制二進(jìn)制日志格式,進(jìn)而控制了復(fù)制類型,三個(gè)可選值,STATEMENT:語(yǔ)句復(fù)制,類似Oracle的邏輯DG;
ROW:行復(fù)制,類似Oracle的物理DG;
MIXED:混和復(fù)制,默認(rèn)選項(xiàng)。為避免出現(xiàn)主從數(shù)據(jù)不一致,建議將其修改為ROW。
server-id――為服務(wù)器設(shè)置唯一ID,默認(rèn)為1,推薦取IP最后部分;
sync-binlog――默認(rèn)為0,為保證不會(huì)丟失數(shù)據(jù),需設(shè)置為1,用于強(qiáng)制每次提交事務(wù)時(shí),同步二進(jìn)制日志到磁盤上。
注:這幾個(gè)參數(shù)是必須的,其他更多參數(shù)請(qǐng)參考相關(guān)文檔
3、重啟master機(jī)的mysql服務(wù):service mysqld restart
若Master庫(kù)可以停機(jī),則可直接拷貝所有數(shù)據(jù)庫(kù)文件;若Master庫(kù)是在線生產(chǎn)庫(kù),不能停機(jī),則可采用多種方法對(duì)其進(jìn)行完全備份,最好采用mysqldump,因?yàn)樗鼘?duì)所有存儲(chǔ)引擎均可使用。
――為了獲取一個(gè)一致性的快照,需對(duì)所有表設(shè)置讀鎖
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
――獲取二進(jìn)制日志的偏移量
mysql> show master status;
+------------------+----------+--------------+------------------+
| File???????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |????? 107 |????????????? |????????????????? |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
――備份數(shù)據(jù)庫(kù)
對(duì)于事務(wù)性引擎(如:InnoDB),可使用--single-transaction參數(shù)獲取一個(gè)一致性快照。
# mysqldump -uroot -proot123 --all-database -e --single-transaction --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384>/data/all_db.sql
對(duì)于MyISAM引擎,或多引擎混合的數(shù)據(jù)庫(kù),可使用-l參數(shù)鎖定表,獲取一致性備份
# mysqldump -uroot --all-database -e -l --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384>/data/all_db.sql
注:因?yàn)槲覀兲崆笆褂胒lush tables with read lock命令給所有表加了讀鎖,所以此處也不必使用-l參數(shù)再加鎖。
――備份完成后,將備份文件拷貝到Slave端
# scp all_db.sql root@192.168.3.108:/data/
――恢復(fù)Master庫(kù)的寫操作
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
其實(shí)mysqldump還提供了一個(gè)--master-data參數(shù),備份文件中包含了change master to語(yǔ)句,為了清晰了解主從復(fù)制的過程,我們不采用這個(gè)參數(shù)。
二、從服務(wù)器
1、編輯my.cnf文件 在[mysqld]組添加以下設(shè)置
log-bin???????????? = /data/mysql/mysql-bin
binlog_format?????? = row
log-slave-updates?? = 1
server-id?????????? = 108
relay-log?????????? = mysql-relay-bin
relay-log-index???? = mysql-relay-bin.index
read-only?????????? = 1
slave_net_timeout?? =10
說(shuō)明:
1)relay-log――設(shè)置中繼日志文件基本名;relay-log-index設(shè)置中繼日志索引文件名。
2)read-only――設(shè)置Slave為只讀,但具有super權(quán)限的用戶仍然可寫。
3)log-slave-updates――該參數(shù)用來(lái)控制Slave上的更新是否寫入二進(jìn)制日志,默認(rèn)為0;若Slave只作為從服務(wù)器,則不必啟用;若Slave作為其他服務(wù)器的Master,則需啟用,啟用時(shí)需和log-bin、binlog-format一起使用,這樣Slave從主庫(kù)讀取日志并重做,然后記錄到自己的二進(jìn)制日志中。
4)slave_net_timeout――設(shè)置網(wǎng)絡(luò)超時(shí)時(shí)間,即多長(zhǎng)時(shí)間測(cè)試一下主從是否連接,默認(rèn)為3600秒,即1小時(shí),這個(gè)值在生產(chǎn)環(huán)境過大,我們將其修改為10秒,即若主從中斷10秒,則觸發(fā)重新連接動(dòng)作。
2、恢復(fù)slave
將Master庫(kù)的備份恢復(fù)到Slave庫(kù),方法比較簡(jiǎn)單,直接執(zhí)行即可。
# mysql -uroot -proot123
說(shuō)明:skip-slave-start作用是啟動(dòng)從庫(kù)但不立即啟動(dòng)從庫(kù)的復(fù)制進(jìn)程,以便對(duì)從庫(kù)進(jìn)行進(jìn)一步的設(shè)置。
2、啟動(dòng)從數(shù)據(jù)庫(kù)
service mysql restart
3、對(duì)從數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)設(shè)置
#如果出現(xiàn)出現(xiàn)這個(gè)錯(cuò)誤: ERROR 1201 (HY000): Could not initialize master!需停止slave進(jìn)程
mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected,(0.00 sec)
mysql> change master to
-> master_host='192.168.3.28',
-> master_user='wxl',
-> master_password='123456',
-> master_log_file='mysql-bin.000003',
-> master_log_pos=107;
Query OK, 0 rows affected (0.01 sec)
4、啟動(dòng)從服務(wù)器slave線程
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
執(zhí)行show processlist命令顯示以下進(jìn)程:
mysql> show processlist \G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 3
User: system user
Host:
db: NULL
Command: Connect
Time: 21
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 4
User: system user
Host:
db: NULL
Command: Connect
Time: 21
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3 rows in set (0.00 sec)
5、查看slave線程狀態(tài)
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.28
Master_User: wxl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 107
Relay_Log_File: mysql-relay-bin.000014
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000009
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: 107
Relay_Log_Space: 452
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: 28
1 row in set (0.00 sec)
說(shuō)明:
Slave_IO_Running――此進(jìn)程負(fù)責(zé)從Slave從Master上讀取binlog日志,并寫入Slave上的中繼日志。
Slave_SQL_Running――此進(jìn)程負(fù)責(zé)讀取并執(zhí)行中繼日志中的binlog日志。
這兩個(gè)進(jìn)程的狀態(tài)需全部為YES,只要有一個(gè)為NO,則復(fù)制就會(huì)停止。
當(dāng)Slave中Relay_Master_Log_File和Master_Log_File相同且Read_Master_Log_Pos和Exec_Master_Log_Pos完全相同時(shí),則表明Slave和Master處于完全同步的狀態(tài)。
三、測(cè)試
1、在master庫(kù)創(chuàng)建一個(gè)測(cè)試表,并插入數(shù)據(jù);
mysql> create table test3 as select * from test2;
2、然后在slave庫(kù)查看是否正確復(fù)制
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test1????????? |
| test2????????? |
| test3????????? |
+----------------+
3 rows in set (0.00 sec)
mysql> select * from test3;
+-----------+----------+
| user_name | user_pwd |
+-----------+----------+
| zhangsan? | 123456?? |
| lisi????? | 123456?? |
| wangwu??? | 123456?? |
| zhaoliu?? | 123456?? |
| xiaoqian? | 123456?? |
+-----------+----------+
5 rows in set (0.00 sec)
說(shuō)明:
1)可見從服務(wù)器已經(jīng)正確復(fù)制了主服務(wù)器的數(shù)據(jù),主從復(fù)制正確配置成功。
2)但是read-only參數(shù)沒有起作用,這是因?yàn)槲覀兪怯胷oot賬戶登陸的,它具有super權(quán)限,換成普通賬戶test,即未授予super或all權(quán)限的賬戶,測(cè)試如下:
mysql> use test
Database changed
mysql> select * from test;
+------+--------+
| id?? | name?? |
+------+--------+
|??? 6 | ffffff |
|??? 7 | gggggg |
|??? 8 | hhhhhh |
+------+--------+
3 rows in set (0.00 sec)
mysql> delete from test;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
可見提示為只讀,不能刪除。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的master slave mysql_Mysql---Master-slave复制方案 - dba成长之路- 博客频道 - CSDN.NET的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos安装mysql5.7.19_
- 下一篇: mysql blob图片_使用mysql