這篇博客會(huì)詳細(xì)介紹如何配置主從配置懒豹,但重點(diǎn)是想分享如何當(dāng)配置未成功時(shí)蔽挠,如何調(diào)試闸婴。
原文連接(推薦這個(gè)看 比較清晰)
https://www.liutao1995.top/mysql-zhu-cong-pei-zhi-shang/
>相信在很多其他地方也已經(jīng)有關(guān)于如何配置MySQL的相關(guān)知識(shí)介紹栅迄,這里私杜,我也會(huì)把自己配置成功的過(guò)程介紹一下:
一 作用
MySQL主從配置其實(shí)是一個(gè)MySQL增量熱備份技術(shù)号俐。要知道泌豆,MySQL的查詢壓力一般大于寫入壓力,那可以用數(shù)據(jù)庫(kù)主從配置做數(shù)據(jù)分離或者緩存吏饿∽傥#可以用于查詢優(yōu)化。
?二 配置過(guò)程
> 這里我用的是ubuntu14.04版本猪落,mysql的版本是5.7贞远。
?2.1 主從同步前提
1)在做主從同步前必須保證mysql版本兼容(版本相同或者從庫(kù)版本大于主庫(kù))
2)保證同步前數(shù)據(jù)庫(kù)文件必須一致
注釋:從庫(kù)版本大于主庫(kù)版本,這是因?yàn)閿?shù)據(jù)庫(kù)在升級(jí)時(shí)笨忌,有向下兼容蓝仲,所以一般高版本的數(shù)據(jù)可以兼容低版本數(shù)據(jù)庫(kù),反之則不然。但是袱结,這里在做主從同步時(shí)亮隙,最好保證是版本相同,因?yàn)椴⒉灰欢ǜ甙姹揪屯耆嫒莸桶姹緮?shù)據(jù)庫(kù)垢夹,可以自行去數(shù)據(jù)庫(kù)官網(wǎng)查詢溢吻。但是,如果做數(shù)據(jù)遷移時(shí)果元,很有可能就會(huì)一定要求從庫(kù)的版本高于主庫(kù)促王,那么需要事先測(cè)試。
2.2? 開始同步----主數(shù)據(jù)庫(kù)操作
這里為了保證主從數(shù)據(jù)庫(kù)環(huán)境一致而晒,所以我采用vagrant搭建的環(huán)境:ubuntu14.04蝇狼,mysql5.7。
`vagrant init`初始化兩個(gè)虛擬機(jī)欣硼,ip地址分別為:
`192.168.10.2`和`192.168.10.3`题翰,前者是主數(shù)據(jù)庫(kù)所在服務(wù)器,后者是從數(shù)據(jù)庫(kù)所在服務(wù)器诈胜。
1.修改主數(shù)據(jù)庫(kù)的配置文件:(我將主數(shù)據(jù)庫(kù)服務(wù)器名為S2)
找到mysql的配置文件:
```
root@S2:cd /etc/mysql/mysql.conf.d/
root@S2:/etc/mysql/mysql.conf.d# vi mysqld.cnf
```
這里具體的mysql.cnf文件豹障,版本不同,文件名會(huì)有不同焦匈。找到正確的mysql配置修改即可血公。
2 添加配置(如果有被注釋的,直接去掉注釋開啟即可)
[mysqld]下的選項(xiàng)為服務(wù)器端的配置內(nèi)容
```
[mysqld]
pid-file? ? ? ? = /var/run/mysqld/mysqld.pid
socket? ? ? ? ? = /var/run/mysqld/mysqld.sock
datadir? ? ? ? = /var/lib/mysql
log-error? ? ? = /var/log/mysql/error.log
# By default we only accept connections from localhost
#將標(biāo)準(zhǔn)IP地址127.0.0.1 替換為服務(wù)器的IP地址
bind-address? ? = 192.168.10.2
server-id = 1000
log_bin = /var/log/mysql/mysql-bin.log
#表示只備份testdb
binlog_do_db = testdb
```
解釋:
`pid-file`:存放進(jìn)程的pid
`socket`:socket連接
`datadir`:數(shù)據(jù)庫(kù)的目錄文件
`log-error`:錯(cuò)誤日志的路徑
`bind-address`:這臺(tái)服務(wù)器綁定的ip地址(之前已經(jīng)說(shuō)了缓熟,主數(shù)據(jù)庫(kù)服務(wù)器的ip地址是192.168.10.2)
`server-id`:選項(xiàng)標(biāo)識(shí)累魔,當(dāng)前數(shù)據(jù)庫(kù)在集群中的id,范圍從1-2321,主庫(kù)從庫(kù)都必須設(shè)置id够滑,且id不同
`log_bin`:所有在主數(shù)據(jù)庫(kù)中的變更操作都會(huì)被記錄在該文件里垦写,然后從庫(kù)會(huì)將主庫(kù)里的所有變更操作復(fù)制,再在從庫(kù)里執(zhí)行以此達(dá)到和主庫(kù)的數(shù)據(jù)一致
`binlog_do_db `:指定將從主服務(wù)器上復(fù)制的數(shù)據(jù)庫(kù)彰触。您可以通過(guò)為所需的所有數(shù)據(jù)庫(kù)重復(fù)此行來(lái)包含多個(gè)數(shù)據(jù)庫(kù)梯投。當(dāng)然還有很多其他配置情況,具體自行查看
3.退出保存 重啟mysql
完成所有更改后况毅,繼續(xù)保存并退出配置文件,刷新MySQL分蓖。
`sudo service mysql restart`
4.為從庫(kù)配置賬號(hào)和賦予賬號(hào)權(quán)限
打開shell,進(jìn)入mysql中:
`mysql -u root -p`
```
...
//create user '用戶名'@'從庫(kù)ip地址' identified by '用戶密碼';? 創(chuàng)建用戶及密碼
> create user 'slave_1'@'192.168.10.3' identified by 'slave_1';
//grant replication slave on *.* to '上面配置的用戶名'@'上面配置的從庫(kù)ip地址' identified by '上面配置的密碼';? 賦予權(quán)限
>grant replication slave on *.* to 'slave_1'@'192.168.10.3' identified by 'slave_1';
```
?5.刷新MySQL的系統(tǒng)權(quán)限相關(guān)表尔许,否則會(huì)出現(xiàn)拒絕訪問(wèn)
```
mysql>? FLUSH PRIVILEGES;
```
?6.鎖定表么鹤,將主庫(kù)的testdb數(shù)據(jù)庫(kù)導(dǎo)出.sql文件到從庫(kù)中,解鎖
下面提供一種思路:
進(jìn)入主庫(kù)的mysql中:
```
mysql> use testdb;? //進(jìn)入testdb庫(kù)
mysql> FLUSH TABLES WITH READ LOCK;//鎖定數(shù)據(jù)庫(kù)以防止任何新的更改:
```
退出mysql命令行味廊,導(dǎo)出想要導(dǎo)出的數(shù)據(jù)庫(kù)并生成.sql文件:
```
系統(tǒng)命令行
mysqldump -uusername -ppassword --databases testdb>testdb.sql
```
就可以看到當(dāng)前目錄下有一個(gè)testdb.sql文件蒸甜,之后將這個(gè)文件通過(guò)scp的方式傳送到從數(shù)據(jù)庫(kù)所在的服務(wù)器(例如:scp path/newdatabase.sql admin@128.xxx:/tmp)
導(dǎo)出數(shù)據(jù)后棠耕,重新進(jìn)入mysql命令行,完成解鎖
```
> use testdb;
>UNLOCK TABLES;
```
這里需要先完成鎖表再導(dǎo)處數(shù)據(jù)柠新,一是為了保證數(shù)據(jù)的完整性昧辽,不然很有可能部分?jǐn)?shù)據(jù)丟失,二是為了防止被惡意攻擊登颓。
好了,以上就是主數(shù)據(jù)庫(kù)的主要操作了红氯,接下來(lái)看從數(shù)據(jù)庫(kù)如何配置框咙。
2.3? 開始同步----從數(shù)據(jù)庫(kù)操作
> 從數(shù)據(jù)庫(kù)的配置也差不多,需要修改從服務(wù)器上的數(shù)據(jù)庫(kù)配置文件痢甘,然后將從主庫(kù)上的數(shù)據(jù)庫(kù)導(dǎo)入從庫(kù)喇嘱。
我們先把數(shù)據(jù)庫(kù)導(dǎo)入從庫(kù):
1. 進(jìn)入mysql命令行
```
mysql> CREATE DATABASE testdb;//創(chuàng)建數(shù)據(jù)庫(kù)
```
退出命令行模式,系統(tǒng)下運(yùn)行
```
//將之前通過(guò)scp傳過(guò)來(lái)的.sql文件添加到新創(chuàng)建的數(shù)據(jù)庫(kù)中
mysql -u uusername -ppassword testdb CHANGE MASTER TO MASTER_HOST = '192.168.10.2'塞栅,MASTER_USER ='slave_1'者铜,MASTER_PASSWORD ='slave_1',MASTER_LOG_FILE ='mysql-bin.000001'放椰,MASTER_LOG_POS = 107;
```
解釋:
`MASTER_HOST `:主庫(kù)ip地址
`MASTER_USER`:當(dāng)初主庫(kù)給從庫(kù)設(shè)置的訪問(wèn)賬號(hào)
`MASTER_PASSWORD `:訪問(wèn)賬號(hào)密碼
`MASTER_LOG_FILE`:主庫(kù)的log_file(需要查看主庫(kù)的master狀態(tài))
`MASTER_LOG_POS`:主庫(kù)的log_pos(需要查看主庫(kù)的master狀態(tài))
此處的`MASTER_LOG_FILE`和`MASTER_LOG_POS`是主庫(kù)的master狀態(tài)作烟,所以我們需要到主庫(kù)去查看。
* 到主庫(kù)去,進(jìn)入mysql:
mysql> SHOW MASTER STATUS;//查看主數(shù)據(jù)庫(kù)的狀態(tài),之后可以看到下面這個(gè)表
```
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |? ? ? 107 | newdatabase? |? ? ? ? ? ? ? ? ? |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
```
可以看到砾医,F(xiàn)ile的值就是我們需要在從庫(kù)設(shè)置的MASTER_LOG_FILE拿撩,Position 的值就是我們需要在從庫(kù)設(shè)置的MASTER_LOG_POS
好了,在完成上述change命令后如蚜,它就將當(dāng)前服務(wù)器指定為主服務(wù)器的從屬压恒。通過(guò)用戶名和密碼為從服務(wù)器數(shù)據(jù)庫(kù)提供正確的登錄主服務(wù)器數(shù)據(jù)庫(kù)的憑據(jù) 最后,它讓從服務(wù)器知道從日志文件的哪里開始復(fù)制; 主日志文件和日志位置來(lái)自我們以前記錄的數(shù)字错邦。 有了這個(gè)探赫,你已經(jīng)配置了一個(gè)主服務(wù)器和從服務(wù)器。
接下來(lái)可以去主數(shù)據(jù)庫(kù)中任何為一個(gè)數(shù)據(jù)表添加記錄撬呢,然后查看從數(shù)據(jù)庫(kù)里的數(shù)據(jù)表是否會(huì)產(chǎn)生相應(yīng)的記錄伦吠。
-----------------------------------------------
上面是介紹如何配置主從數(shù)據(jù)庫(kù)的教程。但是大多數(shù)人相信第一次都不一定會(huì)成功倾芝,那么如何解決呢讨勤?下面是排錯(cuò)思路:
之前在進(jìn)入數(shù)據(jù)庫(kù)的配置文件中,相信看到了`log-error? ? ? = /var/log/mysql/error.log`這么一個(gè)選項(xiàng)晨另,所以潭千,當(dāng)發(fā)現(xiàn)經(jīng)過(guò)上面的配置,從庫(kù)沒(méi)有產(chǎn)生正確的響應(yīng)借尿。就去`/var/log/mysql/error.log`文件查看刨晴,下面是我在配置中遇到過(guò)的幾個(gè)問(wèn)題屉来,例如:
```
> cat /var/log/mysql/error.log
```
1130錯(cuò)誤碼:
```
2017-09-21T08:36:51.637972Z 9 [ERROR] Slave I/O for channel '': error connecting to master 'slave_1@192.168.10.2:3306' - retry-time: 60? retries: 32, Error_code: 1130
```
2003錯(cuò)誤碼:
```
2017-09-21T08:25:51.605374Z 9 [ERROR] Slave I/O for channel '': error connecting to master 'slave_1@192.168.10.2:3306' - retry-time: 60? retries: 21, Error_code: 2003
```
1593錯(cuò)誤碼
```
[ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593
```
之后,對(duì)應(yīng)相應(yīng)的錯(cuò)誤碼就可以去google或者百度一下了狈癞。如果你也遇到跟我一樣的錯(cuò)誤茄靠,那么網(wǎng)上肯定已經(jīng)有相應(yīng)的解決方法,如果你還沒(méi)有找到的話蝶桶,可以通過(guò)qq找到我慨绳。
還有一種查看錯(cuò)誤信息的方式:
在從庫(kù)里,
```
mysql> show slave status\G;
```
可以看到下面這兩行信息:
```
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 192.168.1.107
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000045
Read_Master_Log_Pos: 107
Relay_Log_File: CENTOS6-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000045
Slave_IO_Running: Connecting
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: 107
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
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 1045
Last_IO_Error: error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60? retries: 86400
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
row in set (0.00 sec)
```
在
```
Last_IO_Errno: 1045
Last_IO_Error:error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60? retries: 86400
```
就可以看到了錯(cuò)誤碼是1045了真竖。